Compare commits

...

1092 Commits

Author SHA1 Message Date
Pierre Goiffon
b60fb4fb99 N°3892 Setup : fix license text display
iTop license was the only one to contain HTML, so every other one needed to be contained in a "<pre>" tag :/ And... That wasn't true :(
Now iTop license is back in text (like in the license.txt file in this repo), and the `<pre>` tag is added in WizStepLicense::Display
2021-04-06 15:09:30 +02:00
Molkobain
8fb5a9acd0 N°3887 - Set max. height for autocomplete results list 2021-04-06 14:50:31 +02:00
Molkobain
4c289edac7 N°3887 - Harmonize number of autocomplete displayed results throughout the app 2021-04-06 14:50:31 +02:00
Molkobain
f6be3736fd N°3887 - Add config. param. "max_autocomplete_results" 2021-04-06 14:50:31 +02:00
Pierre Goiffon
f8f9c2d7bb 📄 Update Font Awesome license
Was duplicated...
And also not the correct license !
Source for new license text : https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt
2021-04-06 14:39:21 +02:00
Molkobain
94fdc79be5 Update precompiled stylesheet for "test-red" theme 2021-04-06 08:53:43 +02:00
Molkobain
5fa2caac29 Mentions: Show initials when no picture for contact 2021-04-06 00:02:13 +02:00
Molkobain
8b25679df8 Extract function to get a person's initials to a dedicated ToAcronym function in \utils 2021-04-05 21:05:46 +02:00
Molkobain
a67bff3959 Reorder some methods by theme 2021-04-05 20:44:39 +02:00
Molkobain
24eec4aa21 PHPDoc 2021-04-05 17:44:37 +02:00
Molkobain
978e64d66c Button: Improve fix from 54b718e7 2021-04-05 14:58:18 +02:00
Molkobain
3dad90dbcf Update precompiled theme 2021-04-04 23:14:42 +02:00
Molkobain
17c4a18c94 Fix date picker icon floating around instead of being within the input 2021-04-04 23:12:07 +02:00
Molkobain
c8f709a4e6 Fix z-index for external key dropdown arrow 2021-04-04 23:12:07 +02:00
Molkobain
90cc08b920 Refactor IsElementVisibleToTheUser() JS helper within CombodoGlobalToolbox 2021-04-04 23:12:07 +02:00
Molkobain
54b718e7cd Button: Force content (icon + text) to be on 1 line 2021-04-04 23:12:06 +02:00
Molkobain
0bc2f2c818 Fix autocomplete / set attributes' dropdown being cut by its container 2021-04-04 23:12:06 +02:00
odain
c0b1581f0c fix ci: datasynchro test 2021-04-02 23:00:14 +02:00
odain-cbd
bf793fd989 fix temporarly ci: comment broken datasynchro tests 2021-04-02 20:23:05 +02:00
odain
711fe5607b ci: increase DataSynchro test coverage 2021-04-02 17:54:25 +02:00
odain
4fa259af14 ci: increase DataSynchro test coverage 2021-04-02 17:23:03 +02:00
odain
49fe8d0a0f N°2982 - small enhancement to fetch images in themes 2021-04-02 10:44:43 +02:00
Pierre Goiffon
e492d713c4 ThemeHandlerTest : add Windows compat 2021-04-02 10:39:09 +02:00
odain
77962d73eb N°2982 - fix provided precompiled styles 2021-04-02 08:53:52 +02:00
Pierre Goiffon
e53cab0d1d 🎨 fix param order for \CMDBSource::IsSameFieldTypes call + code formatting 2021-04-02 08:22:36 +02:00
odain
5816b22639 N°2982 - fix testthat validates provided precompiled stylesheets 2021-04-02 07:30:45 +02:00
Molkobain
5f8eb26bff Object details: Fix tabs left padding when class has no medallion icon 2021-04-01 23:37:45 +02:00
Molkobain
8b894bf96b Dashboard: Improve fix from previous commit as sListId can be null (which crashes the sanitize filter) 2021-04-01 23:22:27 +02:00
Molkobain
96021274cc Dashboard: Fix JS error on custom dashboard when trying to create a variable with dash in its name 2021-04-01 22:15:16 +02:00
odain
5f3fda95fc ci enhance DatasynchroTest 2021-04-01 18:32:02 +02:00
odain
3afa783ba8 PR #188 make sure data synchro does not change enum db type (default value) 2021-04-01 18:29:45 +02:00
denis.flaven@combodo.com
a997e528ec Internal regression, enum fields not created in data synchro tables 2021-04-01 18:13:24 +02:00
odain
9177982592 PR #188 add testcase to cover data synchro regression 2021-04-01 18:11:24 +02:00
odain
d32bfa3ef4 N°2982 - Speed up SCSS themes compilation during setup - preventive check before looping 2021-04-01 14:59:41 +02:00
Denis
78d82528fc Fix DBSchema update fails when an ENUM column contains values which are not / no longer part of the field definition (#188) 2021-04-01 12:13:52 +02:00
odain
216489ab2d fix ci temporarly 2021-04-01 10:25:21 +02:00
odain
d3d2820b4e 580 - DatasynchroTest fixed both in http and cli modes 2021-04-01 00:04:40 +02:00
odain
f75c660a45 2982 - restore precompiled styles in datamodel 2021-03-31 23:49:50 +02:00
odain
cb91d6f3c4 N°2982 - Speed up SCSS themes compilation during setup - fix infite loop when n signature inside precompiled file 2021-03-31 23:37:29 +02:00
Pierre Goiffon
6744147bf9 PHP syntax check for dictionnaries : change wrong file ext to avoid having errors in the IDE
I was hoping a @noinspection annotation could be the answer but I didn't find any corresponding inspection key to disable :/
2021-03-31 17:40:21 +02:00
Molkobain
fcb84423ea N°3634 - Lists: Fix list margin with its container panel when rendered as a dashlet 2021-03-31 17:32:57 +02:00
Pierre Goiffon
fa92c12b5a PHP syntax check for dictionnaries : execute beforeSetup 2021-03-31 17:27:08 +02:00
Eric
d3a857d9d3 N°580 - Fix CI temporarily 2021-03-31 17:00:38 +02:00
Pierre Goiffon
c843e13c58 New tests to check syntax of all dict files
We had some issues last week with invalid PHP syntax in dict files. The CI detects some of these, but having a larger check with a clearer message that is run immediately at commit will ease fixing such issues !
2021-03-31 16:49:50 +02:00
Eric
131ecd5e3b N°3251 - Restore 2.7 behaviour of ExecITopScript (hide passwords from commandline arguments) and allow tests to provide credentials 2021-03-31 16:36:40 +02:00
Molkobain
7a95ea407b N°2982 - Revert temporarily precompiled stylesheets from datamodel as it puts the setup in an infinite loop 2021-03-31 12:14:41 +02:00
acognet
efeedcad30 N°3868 - "Error: Invalid filter parameter" on mass update 2021-03-31 11:32:35 +02:00
Molkobain
5be3496c8f N°2982 - Restore precompiled stylesheets files 2021-03-31 10:22:54 +02:00
Molkobain
d465bf10fd N°2591 - Restore lost deprecation comment 2021-03-31 10:22:54 +02:00
acognet
2265d1641e N°3868 - "Error: Invalid filter parameter" on mass update 2021-03-31 09:20:53 +02:00
acognet
6f9b5b7c64 N°2737 - Migrate table to DataTables plugin in display objects 2021-03-31 09:20:53 +02:00
acognet
7d92ff65a2 N°3650 - fix image display when creating an object 2021-03-31 09:20:52 +02:00
acognet
1260a09c05 N°3582 - Migrate backoffice pages to new UIBlock system : Import CSV fix vertical tabs 2021-03-31 09:20:51 +02:00
Molkobain
95f328d2af N°3634 - Lists: Fix shortcut not being added "live" to navigation menu on creation 2021-03-30 18:19:51 +02:00
Molkobain
0c87bd9aad TwigHelper: Add constant for backoffice's templates base folder
Note: We might add more in the future for other GUIs
2021-03-30 18:19:51 +02:00
Molkobain
99f09127ea Shortcuts: Fix dialog's buttons style 2021-03-30 18:19:51 +02:00
vdumas
87987e1c2f N°463 - Load localized Query Phrases at Setup (German version) 2021-03-30 16:24:56 +02:00
Molkobain
9d98a494cb Update setup XML licenses file following 5940578e 2021-03-30 16:10:16 +02:00
Molkobain
4d74371e8e Advanced search: Add comment on its SCSS partial 2021-03-30 15:59:32 +02:00
Molkobain
20e41f21d9 N°3634 - Advanced search: Fix opened criterion display 2021-03-30 15:56:47 +02:00
Molkobain
5940578e3a Update setup licenses for NPM libs 2021-03-30 15:56:47 +02:00
Eric
94b52f8d9f N°580 - Check parent class config 2021-03-30 14:40:42 +02:00
Pierre Goiffon
8674ebb137 📝 updateLicenses.php : add solution for JQ on Windows, and also a known bug 2021-03-30 11:43:08 +02:00
odain
71e64cd1dc N°2713 - Allow read access to synchro errors for users with non-admin profile - fix when object not allowed 2021-03-30 10:34:44 +02:00
Pierre Goiffon
d0ea5e9e1c N°2330 Change MySQL min version
Reasons :
* the min version was announced on a public wiki page (https://www.itophub.io/wiki/page?id=2_7_0%3Ainstall%3Ainstalling_itop#software_requirements)
* MySQL 5.6 end of life was reached in feb. 2021 (https://endoflife.software/applications/databases/mysql)
2021-03-30 10:28:59 +02:00
Molkobain
d9ed2e6de9 Dashboard: Push file missing from last commit 2021-03-30 09:55:10 +02:00
Purple Grape
8a4372762e 🌐 ZH translations for iTop 3.0 (#198)
Many thanks @purplegrape !
2021-03-30 09:42:31 +02:00
Molkobain
82e67f27f7 Dashboard: Rename class to better match conventions 2021-03-30 09:36:20 +02:00
Molkobain
8124bea16f Lists: Fix JS error when dataTables widget is destroyed 2021-03-30 09:36:20 +02:00
odain
62165a2a0d N°2713 - Allow read access to synchro errors for users with non-admin profile - take into account allowed read action 2021-03-29 18:40:06 +02:00
Molkobain
31f6558710 N°3634 - Lists: Improve rendering to better match mockups and feedbacks from alpha version 2021-03-29 18:13:30 +02:00
Pierre Goiffon
afd9ddf46d ⬇️ Restore php-parser to its original version as tests are failing :/ 2021-03-29 16:51:10 +02:00
Pierre Goiffon
d62825c99b Improve test error message 2021-03-29 16:49:55 +02:00
Pierre Goiffon
a7e7e62245 ⬆️ Upgrade lib : nikic/php-parser
We were on v3 that is no longer maintained and compatibility is annonced for PHP 7.2.
v4 is active and supports PHP up to 8.0
No problem to update as this is only used in the config editor (\Combodo\iTop\Config\Validator\iTopConfigAstValidator)
2021-03-29 16:35:30 +02:00
Molkobain
c11fd4f0ab NPM libs: Update embedded package to avoid their dependencies to be retrieved as they are already their 2021-03-29 11:11:52 +02:00
Molkobain
a29dac2c60 NPM libs: Restore web.config file 2021-03-29 11:11:50 +02:00
Pierre Goiffon
8846a42bf4 👥 README : add DudekArtur
Submitted polish translations : #194, #195
Many thanks to him !
2021-03-29 10:30:54 +02:00
Pierre Goiffon
72805e5da9 🎨 Formatting for licenses file 2021-03-29 09:07:42 +02:00
Pierre Goiffon
8bbcf542b6 📄 Update licenses for Datatables
Added using NPM in 6f659a34
2021-03-29 09:07:03 +02:00
Pierre Goiffon
f01109bd18 💡 Fix command for additional NPM licenses 2021-03-29 08:56:11 +02:00
Molkobain
6f659a3431 Improve dataTables integration within the app:
- Manage lib through NPM
- Move portal / Bootstrap files back to the itop-portal-base module (not managed through NPM yet)
- Fix SCSS classes for the backoffice as it was based on the bootstrap CSS classes which are not there anymore

Note: jQuery is included as a dependency, will check with the team if we can force it not to be retrieved
2021-03-26 17:46:13 +01:00
Molkobain
2e8c0346d3 Fix NPM package.json not present in the repository 2021-03-26 17:44:23 +01:00
Molkobain
fbd46609ff Button: Revert "Improve display when text doesn't fit in the button's width" 2021-03-26 16:29:11 +01:00
vdumas
70620b96bc Revert "N°463 - Load localized Query Phrases at Setup (2)"
This reverts commit 6b5cbfb6
2021-03-26 16:05:56 +01:00
vdumas
daebfdd54b N°463 - Load localized Query Phrases at Setup (3) 2021-03-26 15:43:47 +01:00
vdumas
6b5cbfb64e N°463 - Load localized Query Phrases at Setup (2) 2021-03-26 15:43:47 +01:00
Pierre Goiffon
8fa9147dc1 📄 Add licenses for NPM packages
Our tooling isn't ready yet and will be updated with N°3862
I added a dedicated JSON file to ease comparisons in next releases
2021-03-26 12:18:50 +01:00
Pierre Goiffon
30542f6b27 ✏️ README fix typo 2021-03-26 11:34:54 +01:00
Pierre Goiffon
c2c0b6a1b0 👥 README : update contributor's list
- larhip was duplicated
- added Super-Visions
- added links to companies websites
- minor formatting changes
2021-03-26 11:09:33 +01:00
Stephen Abello
c2ffe58070 N°3857 Add French translation and replace 'iTop' by application constant 2021-03-26 10:46:51 +01:00
Molkobain
daa039cb85 Update polish translations to use app. name instead of "iTop" 2021-03-26 10:40:45 +01:00
Molkobain
6028a3e419 Update PHPDoc 2021-03-26 10:34:26 +01:00
Pierre Goiffon
082592fc22 ✏️ CONTRIBUTING : fix typo on branch model 2021-03-26 10:25:52 +01:00
Pierre Goiffon
5baa157d42 ✏️ CONTRIBUTING : fix typo 2021-03-26 10:24:15 +01:00
Pierre Goiffon
adafcabbb8 💚 Add missing dictionary language in DictionariesConsistencyTest
PL was added with 8f8e86a4 (#194)
2021-03-26 10:07:21 +01:00
Molkobain
9312fdb573 User picture: Fix wrong image displayed on other users without a contact 2021-03-26 10:03:13 +01:00
Molkobain
ba33cf98e3 User preferences: Open APIa bit so developer can retrieve a pref. from any user, not only the current one. 2021-03-26 10:03:13 +01:00
Eric
649bd2a170 Fix loading classes with apc extension 2021-03-26 10:02:01 +01:00
DudekArtur
8f8e86a4eb 🌐 Polish translations for 3.0.0 (#194)
Many thanks @DudekArtur !
2021-03-26 09:55:41 +01:00
Molkobain
532672b5d1 Fix ProblemManagement menu's icon 2021-03-26 08:54:47 +01:00
Molkobain
34c61f812a Button: Improve display when text doesn't fit in the button's width 2021-03-26 08:54:46 +01:00
Molkobain
b782f2f9b2 Move utils::GetUserPictureAbsUrl() with other user methods 2021-03-26 08:54:46 +01:00
Molkobain
58d2b1d3f4 Rename utils::GetContactPictureAbsUrl() to utils::GetUserPictureAbsUrl() 2021-03-26 08:54:46 +01:00
odain
7d1f5c91a7 N°463 - fix broken setup 2021-03-26 08:06:25 +01:00
vdumas
f53abf9a45 N°463 - Load localized Query Phrases at Setup 2021-03-25 18:41:00 +01:00
odain
407a651e44 N°2713 - Allow read accès to synchro errors for users with non-admin profile - removing comment 2021-03-25 18:05:59 +01:00
acognet
992541ed99 N°3582 - Migrate backoffice pages to new UIBlock system : Import CSV fix advanced mode 2021-03-25 17:59:45 +01:00
Eric
3a9228d8d3 N°3569 - Fix DB Tools queries display 2021-03-25 16:36:43 +01:00
Molkobain
aa9632a41b User picture: Use placeholder image from preferences when no contact attached to the user 2021-03-25 15:59:45 +01:00
Molkobain
ba994c91fc User picture: Update contact's image attribute with preferences' placeholder so it can be used elsewhere 2021-03-25 15:59:45 +01:00
Molkobain
5d3a829f65 Update PHPDoc 2021-03-25 15:59:44 +01:00
azana38
d4d1b8f513 N°3852 - Translate new keys in FR 2021-03-25 15:56:42 +01:00
Eric
67141eaeac N°3856 - Fix DisplayBlock error 2021-03-25 14:39:48 +01:00
Molkobain
43671629f0 Button group: Fix spacing with other siblings 2021-03-25 14:10:26 +01:00
acognet
66f7406148 N°3582 - Migrate backoffice pages to new UIBlock system : Import CSV fix config popup 2021-03-25 12:08:16 +01:00
acognet
dc0006bd76 N°3801 - Some queries not loaded in KPI with new datatable mode 2021-03-25 12:08:15 +01:00
acognet
0ab2f03064 Fix display header when there is an alert message 2021-03-25 12:08:15 +01:00
odain
89205a66ad N°2713 - Allow read accès to synchro errors for users with non-admin profile 2021-03-25 11:28:07 +01:00
azana38
50af948c9f N°3852 - Translate new keys in FR 2021-03-25 10:35:04 +01:00
Molkobain
5da5f5ac42 Activity panel: Try to improve "transitions" filter french dict. entry so it all fits nicely in the toolbar
Note: As there is a tooltip, the label can be relatively short. Any doubts from the user will be dismissed when they see the tooltip
2021-03-25 09:35:29 +01:00
Molkobain
0e062f51e9 Tests: Update render all blocks page 2021-03-25 00:04:38 +01:00
Molkobain
e0a655e102 Button factory: Fix name param. being mandatory on some methods 2021-03-24 23:59:47 +01:00
Molkobain
a5a771b242 Button group: Fix buttons' corners when 3+ elements 2021-03-24 23:56:56 +01:00
Molkobain
11f330cff6 Update dictionaries 2021-03-24 23:39:12 +01:00
Molkobain
e0b744183a Activity panel: Try other dict. entries that fit on the line 2021-03-24 20:09:15 +01:00
Molkobain
f6db3d5700 Activity panel: Fix transitions button not being disable during entries submission 2021-03-24 20:04:38 +01:00
Molkobain
94601efed2 Update dictionnaries 2021-03-24 19:48:39 +01:00
Molkobain
573a6d82fe N°3649 - Activity panel: Add transitions to the save button using the button group 2021-03-24 19:43:35 +01:00
Molkobain
318d8ce3c9 Add ButtonGroup block 2021-03-24 19:43:35 +01:00
Pierre Goiffon
85d3cc92c4 🌐 Align all dictionnaries with keys in EN dict
Was done in 0fd3cb01 but some new keys were added after :
* db-tools 69994471
* UI:WelcomeMenu:Text in dictionaries/en.dictionary.itop.ui.php with 8204dbb6
2021-03-24 18:52:18 +01:00
Pierre Goiffon
7aa0694eac 🌐 Remove propositions added in 4124e44a as keys were translated in b6b6d11a and 58018687 2021-03-24 18:37:02 +01:00
Pierre Goiffon
20af4921f8 💡 📝 updateLicenses.php : more documentation 2021-03-24 18:04:45 +01:00
Stephen Abello
8204dbb6ae N°3857 Replace old welcome popup 2021-03-24 17:18:55 +01:00
Pierre Goiffon
e759124bd8 🔖 Prepare 3.0.0-beta 2021-03-24 17:05:17 +01:00
azana38
41fc8de9c5 Fix grammatical mistake 2021-03-24 16:57:09 +01:00
Molkobain
b54a63a5f7 Update contributors list 2021-03-24 16:33:28 +01:00
Molkobain
a27eb8c63b Popover menu: Add SetTogglerFromId() and SetTogglerFromBlock() methods as shortcuts 2021-03-24 16:33:28 +01:00
Eric
572fce041b Fix core-update blank page 2021-03-24 16:30:08 +01:00
Stephen Abello
456f7f7c7d Rename test-red variables 2021-03-24 11:29:43 +01:00
Stephen Abello
5d6194e679 Revert new method in itopdesignformat 2021-03-24 11:29:43 +01:00
Stephen Abello
1d0da38d40 N°3593 Fix file import variable usage in theme compilation 2021-03-24 11:29:43 +01:00
acognet
b63f720e5d Add factory for MultiColumn and Column 2021-03-24 11:18:55 +01:00
Molkobain
64d5f52eae Activity panel: Remove markup committed by mistake 2021-03-24 11:07:05 +01:00
Molkobain
c1af4de1d4 Add icons8, unDraw and Freepik to embedded libs. licenses 2021-03-24 10:58:08 +01:00
Pierre Goiffon
7f72088736 💚 Fix syntax error in dict 2021-03-24 10:19:08 +01:00
azana38
38956503e1 N°3852 - Translate new keys in FR 2021-03-24 10:03:17 +01:00
azana38
47ff93cb5d N°3852 - Translate new keys in FR 2021-03-24 10:02:25 +01:00
Pierre Goiffon
212e34feac 💡 📝 Documentation of the update licenses script 2021-03-24 09:52:03 +01:00
azana38
f5ff1ce80b N°3852 - Translate new keys in FR 2021-03-24 09:39:15 +01:00
azana38
db4eefb759 N°3852 - Translate new keys in FR 2021-03-24 08:57:13 +01:00
azana38
58018687dd N°3852 - Translate new keys in FR 2021-03-24 08:53:31 +01:00
azana38
ec1fb06106 N°3852 - Translate new keys in FR 2021-03-24 08:44:38 +01:00
azana38
b6b6d11abc N°3852 - Translate new keys in FR 2021-03-24 08:40:03 +01:00
acognet
094a86cbbf N°3582 - Migrate backoffice pages to new UIBlock system : Improved display 2021-03-24 07:57:24 +01:00
Pierre Goiffon
fdf01b770a 🚚 Move dict files to dictionaries subdirectory
Affected modules in datamodels/2.x :
    - itop-bridge-cmdb-ticket
    - itop-portal
    - itop-structure
2021-03-23 19:12:13 +01:00
odain
262a815457 N°3805 - Collectors not working on itop 3.0 - activate data synchro test in ci + cover current bug with a specific one 2021-03-23 19:07:38 +01:00
Eric
699944711b N°3569 - Migrate backoffice pages to new UIBlock system : DB Tools 2021-03-23 18:30:40 +01:00
Eric
c7425558e7 Fix core-update blank page 2021-03-23 18:28:19 +01:00
Pierre Goiffon
4124e44a8d 🌐 Prepare 3.0.0-beta : FR translations for some of the new keys
2 keys were left untranslated but added in comment a proposition :
* UI:Layout:ActivityPanel:ComposeButton:Tooltip in dictionaries/ui/layouts/fr.dictionary.itop.activity-panel.php
* UI:Preferences:ActivityPanel:EntryFormOpened+ in dictionaries/ui/pages/fr.dictionary.itop.preferences.php
As I'm not sure yet of what will be adopted for "log" for example
2021-03-23 18:16:28 +01:00
Pierre Goiffon
41e8ce1c74 🌐 Update error.php message for beta and beyond
Note that this message only appears on certain conditions (see \ErrorPage::error)
2021-03-23 18:16:28 +01:00
Pierre Goiffon
238036ef48 🌐 No translation for shortcuts ! 2021-03-23 18:16:28 +01:00
Pierre Goiffon
da0ca3d440 🌐 Fix auto dict updates
Keys were added for enum values in EN and all corresponding files, although they were already declared !
See N°3850
2021-03-23 18:16:28 +01:00
Pierre Goiffon
0fd3cb01cf 🌐 Prepare 3.0.0-beta : align all dictionnaries with keys in EN dict 2021-03-23 18:16:27 +01:00
Molkobain
ab7cf49de0 N°3810 - Avoid syntax highlighting that shouldn't take place 2021-03-23 16:48:44 +01:00
Molkobain
cf5dffcd80 Merge remote-tracking branch 'origin/support/2.7' into develop
# Conflicts:
#	application/itopwebpage.class.inc.php
2021-03-23 16:48:14 +01:00
Molkobain
9af4846372 N°3810 - Avoid syntax highlighting that shouldn't take place 2021-03-23 16:39:22 +01:00
acognet
2834c2f86c N°3582 - Migrate backoffice pages to new UIBlock system : Import CSV fix buttons style 2021-03-23 16:18:53 +01:00
Molkobain
7bf1ef355f Panel factory: Remove SetClassColor() method as it has been move directly in the panel in a previous commit 2021-03-23 15:06:35 +01:00
odain
34c12b61cc N°2982 - Speed up SCSS themes compilation during setup - add method visibility 2021-03-23 14:41:32 +01:00
Eric
fc0bac6726 N°2982 - Speed up SCSS themes compilation during setup (removed dev bypass) 2021-03-23 14:38:08 +01:00
Eric
4534944b08 N°3536 - revert function and use GetSubBlocks() instead 2021-03-23 14:26:17 +01:00
Molkobain
1d6ad94694 N°3649 - Activity panel: Add menu to compose button to select the target log when on a readonly tab (activity, read only case log) 2021-03-23 12:09:37 +01:00
Molkobain
367197357c Popover menu: Add HTML data attributes in templates 2021-03-23 12:09:37 +01:00
Molkobain
ae416f2769 Popover menu: Add HasSection() and HasItems() methods 2021-03-23 12:09:37 +01:00
Molkobain
a19df34b79 UIBlock: Add hasDataAttributes() method 2021-03-23 12:09:37 +01:00
odain
7127c70ed6 N°2982 - Speed up SCSS themes compilation during setup - fix included files with same name and folder 2021-03-23 11:33:00 +01:00
acognet
80cc850112 N°3582 - Migrate backoffice pages to new UIBlock system : Import CSV 2021-03-23 11:23:55 +01:00
acognet
dfbb362330 N°3746 - Migrate modal to new UIBlock system - update fields when change class selection 2021-03-23 11:08:11 +01:00
acognet
ab5e5a7f4a Remove danger zone 2021-03-23 11:03:49 +01:00
Molkobain
a123f764e6 Fix crash introduced in 574d089c due to missing classes in autoloader 2021-03-22 18:57:35 +01:00
Molkobain
65ed5b3fce Popover menu: Refactor to remove the necessity of coupling JS and PHP code to instantiate it correctly 2021-03-22 18:53:15 +01:00
Molkobain
e8656e8504 Popover menu: Fix JS widget instantiation, now done automatically but the UIBlock system 2021-03-22 18:49:41 +01:00
Molkobain
86c614d56d Add HTML meta data to TWIG templates 2021-03-22 18:49:41 +01:00
Molkobain
093194f326 N°2844 - Object details: Improve transitions menu's tooltip depending on the presence of favorites or not 2021-03-22 18:49:41 +01:00
Molkobain
d3eaf6030d SCSS: Remove jQuery UI helper classes from vendor overloading to prevent them from messing with our reset 2021-03-22 18:49:34 +01:00
Eric
574d089c20 N°3536 - Dashboard: Add title, toggler and menu to AttributeDashboard 2021-03-22 16:46:45 +01:00
Pierre Goiffon
3a141def49 📝 js/README update recommendation text for leading semicolon
Thanks @Hipska !
2021-03-22 12:17:12 +01:00
Molkobain
8dac0a56c9 Hot fix: Temp. removal of this line as it crashed the menus closing on body click 2021-03-19 19:57:47 +01:00
Molkobain
8fade400b7 N°2844 - Object details: Add visual hint on the transition buttons' menu 2021-03-19 19:50:51 +01:00
Molkobain
8334b68285 Popover menu: Introduce option to add a visual hint on the menu toggler
This adds a visual hint (caret down) on the toggler to help the user understand that clicking on the toggler won't do something right away, but will open a menu instead
2021-03-19 19:50:50 +01:00
Molkobain
482bf2e523 N°2844 - Object details: Add separator between regular and transition buttons 2021-03-19 19:50:50 +01:00
Molkobain
10bdb57391 Introduce vertical separator for toolbar blocks 2021-03-19 19:50:50 +01:00
Molkobain
8717d6d75e N°2844 - Object details: Move transition buttons in front of all others 2021-03-19 19:50:49 +01:00
Molkobain
c2339dcb5c N°2844 - Object details: Extract transitions from the "other actions" menu to a dedicated "transitions" menu 2021-03-19 19:50:49 +01:00
Pierre Goiffon
de7ac4ba31 N°3833 Fix DashletBadge in Ajax causing JS error
* switch dashlet_badge widget init from js_template to js_on_ready_template
* add phpdoc on UIBlock::DEFAULT_JS_FILES_REL_PATH
* remove old code in \AjaxPage::output (after the return statement) that is already handled with the new Twig rendering
2021-03-19 11:49:39 +01:00
Molkobain
f1d05ae9b5 Fix missing use statement 2021-03-19 11:38:24 +01:00
Molkobain
2f73256c94 Improve PHPDoc on cmdbAbstractObject::GetShortcutActions() to flag it as an API to overload the 'shortcut_actions' config. param. 2021-03-19 11:19:02 +01:00
Stephen Abello
a353b1fdc1 N°3530 Fix "No new message" dict entry call 2021-03-19 10:35:28 +01:00
Eric
7d3992eeaf N°2677 - Datamodel: Consider hierarchy for classes style 2021-03-19 10:23:29 +01:00
Molkobain
7b8e551662 N°3581 - Dashlet badge: Add HTML tooltip to ease readability on truncated text 2021-03-19 09:42:23 +01:00
Molkobain
075470dabb Add title to config. management dashboard 2021-03-19 09:25:13 +01:00
Molkobain
f567f581c3 N°3581 - Dashlet plain text: Fix line returns while keeping XSS protection 2021-03-18 20:22:55 +01:00
Molkobain
b3e3a27555 Add title to welcome dashboard 2021-03-18 20:06:45 +01:00
Molkobain
28dcfcffd0 N°3581 - Dashlet header static: Fix separators length 2021-03-18 18:21:21 +01:00
acognet
c214d09e84 N°2841 - Error when trying to delete a user with a no admin 2021-03-18 18:20:34 +01:00
Pierre Goiffon
46680d3854 🎨 ITopCounter : use KeyValueStore::class where possible instead of class name hardcoded in a string 2021-03-18 17:50:39 +01:00
Molkobain
9a0ea60cd7 N°3581 - Dashlet: Fix max. width for DashletBadge 2021-03-18 17:10:59 +01:00
Molkobain
3d14aedcd8 N°3581 - Dashlet: Fix double-encoding on DashletPlainText 2021-03-18 16:50:33 +01:00
Molkobain
a28c9c896d N°3581 - Dashlet: Remove coupling with DashletText in DashletHeaderStatic 2021-03-18 16:50:33 +01:00
Molkobain
912f6bb376 N°3581 - Dashlet: Add dedicated block for DashletText 2021-03-18 16:50:33 +01:00
Stephen Abello
e23b60c203 Set maximum height/width on global search results class icons 2021-03-18 16:14:15 +01:00
Molkobain
547038aae8 N°3581 - Dashlet: Rename DashletHeaderStatic template to match conventions 2021-03-18 15:59:23 +01:00
Molkobain
8137bc0ca9 N°3581 - Dashlet: Rework header static look to match tabs separator 2021-03-18 15:59:22 +01:00
Pierre Goiffon
7a67218ad1 📦 Update setup.css 2021-03-18 15:45:46 +01:00
Stephen Abello
8471bdeffe N°3542 Separate JS buttons from URL buttons 2021-03-18 15:39:19 +01:00
acognet
82a5ab5aef N°3823 - Error on "Header with statistics dashlet" with autorefresh and filter on organization 2021-03-18 14:50:18 +01:00
Pierre Goiffon
3959ed505b 🎨 dashlet-badge.js : restore leading semicolon
See added info in js/README.md on reason why this semicolon has to be there
2021-03-18 12:12:08 +01:00
Molkobain
5320f3f5fd N°3581 - Panel: Fix titles font 2021-03-18 11:55:01 +01:00
Molkobain
72b2feb697 N°3581 - Dashlet: Add max-width and tooltip on pills 2021-03-18 11:55:01 +01:00
Molkobain
ac91bc8898 N°3581 - Dashlet: Fix pill not being completely clickable 2021-03-18 11:55:00 +01:00
Molkobain
ca2c66733c N°3581 - Dashlet: Rename Badge block to Pill as it can contain just a simple text and to avoid confusion with the DashletBadge 2021-03-18 11:55:00 +01:00
Molkobain
8ce2e43780 PHPDoc 2021-03-18 11:55:00 +01:00
Eric
118d6ff837 N°3648 - Fix Bulk modify 2021-03-18 11:41:57 +01:00
Eric
5869591167 N°2847 - Transform old itop datatable to jquery DataTable (fix dictionaries) 2021-03-18 10:51:55 +01:00
Eric
de5efe19b2 N°3536 - Dashboard: Finish integration of in the TopBar (rollback old css) 2021-03-18 10:42:45 +01:00
Stephen Abello
33d8bf07b1 Destroy previous tooltip when force initializing a new one 2021-03-18 10:41:59 +01:00
Eric
818690dba8 N°3825 - Export.php and export-v2.php errors on Excel 2021-03-18 10:27:21 +01:00
Eric
e35076f682 N°3536 - Button order in object details 2021-03-18 09:28:12 +01:00
Pierre Goiffon
de8761ea61 💡 Fix PHPDoc errors made in cd170be4
* fix typo in used-by (thanks @Molkobain !)
* add class before method name as needed for our phpdoc generator (see .doc/README.md)
2021-03-17 19:09:42 +01:00
Pierre Goiffon
0ad65691d3 🚧 AjaxPage::output add TODO 3.0.0 as there is lot of code we have disabled in 410a637598 2021-03-17 18:22:44 +01:00
Pierre Goiffon
cd170be44e 💡 Add UIBlock::Get*FilesRelPaths PHPDoc to indicate consumer 2021-03-17 18:22:44 +01:00
Stephen Abello
ecc9733623 N°3530 Correctly place the popup and limit its height 2021-03-17 17:35:16 +01:00
Stephen Abello
bab2febb24 N°3530 Replace hardcoded newsroom message indicator and add tooltip when menu is collapsed 2021-03-17 17:35:16 +01:00
Pierre Goiffon
610ff6494a Fix typo 2021-03-17 17:06:44 +01:00
Molkobain
be4012ea5d Fix missing images for jQuery treeview lib 2021-03-17 16:44:41 +01:00
Molkobain
7fec31e775 PHPDoc 2021-03-17 16:05:33 +01:00
BenGrenoble
52a939578c N°3814 add DashboardMenuNode delta if_exists in datamodel.itop-config-mgmt.xml 2021-03-17 15:51:55 +01:00
odain
8fce088e6f Merge branch 'support/2.7' into develop 2021-03-17 15:26:19 +01:00
Molkobain
5452286d8d Fix utils::GetClassesForInterface() not working on Windows env. (courtesy from @Steffunky) 2021-03-17 13:13:57 +01:00
Pierre Goiffon
50fc7f753e N°3566 Migrate Hub Connector land.php
* add html allowing to create send request
* change popup positionning (setup container was resized in 3.0.0 from 600px to 800px, with different padding/borders in children boxes)
2021-03-17 11:02:11 +01:00
Pierre Goiffon
8c2d54e6d3 🎨 code format : Hub connector land.php 2021-03-17 11:02:11 +01:00
Stephen Abello
a8ede8b857 N°3524 Add keyboard shortcuts to global actions 2021-03-17 11:00:16 +01:00
Stephen Abello
8dd8f98b61 Migrate method to get classes implementing specified interface to utils 2021-03-17 10:57:26 +01:00
Stephen Abello
fac6d1741e Allow inputs to be disabled and readonly 2021-03-17 10:57:26 +01:00
Stephen Abello
6b6db02567 Fix UIblock class extending interface collection 2021-03-17 10:57:26 +01:00
Molkobain
2a1b58e2c1 Deprecated old history APIs 2021-03-17 10:30:46 +01:00
Molkobain
19d61300bb Object details: Fix object class displayed as code instead of label 2021-03-17 10:10:22 +01:00
Molkobain
599c838fd9 Fix code highlighting instantiation for async (XHR) markup 2021-03-17 10:07:24 +01:00
Molkobain
b97e2839c5 N°3531 - Activity panel: Restore possibility to load extra history entries asynchroniously 2021-03-17 10:07:24 +01:00
Molkobain
190ac1a65a Fix tooltips instantiation for async (XHR) markup 2021-03-17 10:07:23 +01:00
Molkobain
6bc2d241fd Activity panel: Rename controller's method 2021-03-17 10:07:23 +01:00
acognet
a15903b5ef N°3823 - Error on "Header with statistics dashlet" with autorefresh and filter on organization 2021-03-17 09:57:03 +01:00
bruno-ds
91fc2d2e2b N°3671 - reformat tests 2021-03-17 08:46:41 +01:00
Pierre Goiffon
2432ff77a3 💡 More details in PHPDoc for \utils::RealPath 2021-03-17 08:34:25 +01:00
Eric
0da945ee29 N°3536 - Dashboard: Finish integration of in the TopBar 2021-03-16 18:28:18 +01:00
Molkobain
d2f6ac5015 Activity panel: Refactor to use the new JsonPage and a dedicated controller for more readability 👌 2021-03-16 16:40:34 +01:00
Molkobain
0d7302d530 JsonPage: Overload constructor to avoid passing a title 2021-03-16 16:40:34 +01:00
acognet
f02c8e94d7 Add comment on code 2021-03-16 14:17:42 +01:00
acognet
1aeee8b671 functions MakeForSelect and MakeForSelectWithLabel placed in SelectUIBlockFactory 2021-03-16 14:17:42 +01:00
Molkobain
4bcf03c6a1 Activity panel: Fix only showing the first of multiple edition in a linked set 2021-03-16 11:02:29 +01:00
Eric
7c8349f4f5 N°3804 - auto refresh on group by dashlet (and dashlet badge) lost user preferences on showing obsolete data 2021-03-16 10:25:18 +01:00
odain
d229e08f02 prepare iTop release 2.7.4 2021-03-16 09:00:06 +01:00
odain
168d3c5b75 fix ci after merge from branch 'feature/3588-precompil-fix' 2021-03-16 08:46:48 +01:00
Molkobain
0d020bb706 Fix dashboard editor SCSS classes 2021-03-15 20:08:22 +01:00
Molkobain
5e5277f38e N°3534 - Dashboard: Add missing HTML meta data 2021-03-15 20:08:22 +01:00
vdumas
11fb507df3 N°3822 - Datamodel: caselogs reordering for UserRequest and Incident 2021-03-15 19:15:05 +01:00
odain
b5adb2e82b N°3671: fix and make test more lisible 2021-03-15 19:01:09 +01:00
vdumas
d68e208325 N°3821 - UserRequest:OnInsert in full ITIL calls the parent's method 2021-03-15 17:56:18 +01:00
odain
3afc4e8185 Merge branch 'feature/3588-precompil-fix' into develop 2021-03-15 17:44:10 +01:00
vdumas
85935eb5fd N°3274 - Add "Service family" menu in Service Management for Providers 2021-03-15 17:16:52 +01:00
odain
fcbb691c0a fix tests 2021-03-15 16:25:57 +01:00
BenGrenoble
20c6b72a0c N°3440 Fix Known Error Banner. 2021-03-15 16:21:19 +01:00
odain
9abd8eb223 fix merge 2.7.4 2021-03-15 16:06:50 +01:00
odain
eacdfa4088 Merge branch 'support/2.7' into develop 2021-03-15 16:06:20 +01:00
Molkobain
a15cc8718e N°3626 - Remove Attachment class from the "quick create" autocomplete 2021-03-15 15:56:36 +01:00
Molkobain
21321c0599 Fix regression introduced in 370c08cd 2021-03-15 15:48:37 +01:00
odain
386c90c601 N°3668 - URL direct error: renamed trust_proxies<-behind_reverse_proxy 2021-03-15 14:56:16 +01:00
Pierre Goiffon
fccc57458c N°3522 Fix IssueLog on Twig error in a Ajax context 2021-03-15 14:53:24 +01:00
Pierre Goiffon
8b47536835 N°3522 Handle twig errors nicely for AJAX calls
Whereas when called directly we are throwing an exception, in a Ajax context we are printing the error message and logging
2021-03-15 14:42:28 +01:00
odain
5d0c61178b N°3671 : persist absolute URL when setup context (force trustproxy enabled) 2021-03-15 14:34:56 +01:00
odain
3bcae734e5 N°3671 : persist absolute URL when setup context (force trustproxy enabled) 2021-03-15 12:27:05 +01:00
Molkobain
8dd96ea636 Copyright year bump 2021-03-15 09:29:45 +01:00
Molkobain
04d7980789 N°3657 - Replace calls to deprecate jQuery methods (".keyup(callback)" to ".on('keyup', callback)") 2021-03-15 09:29:26 +01:00
Molkobain
370c08cd68 N°3657 - Replace calls to deprecate jQuery methods (".click(callback)" to ".on('click', callback)") 2021-03-15 09:29:09 +01:00
Molkobain
e143fa5e33 N°3657 - Replace calls to deprecate jQuery methods (".submit(callback)" to ".on('submit', callback)") 2021-03-15 09:28:44 +01:00
Molkobain
614ba55819 N°3657 - Replace calls to deprecate jQuery methods (".blur(callback)" to ".on('blur', callback)") 2021-03-15 09:28:22 +01:00
Molkobain
f1613c62a4 N°3657 - Replace calls to deprecate jQuery methods (".bind" and ".unbind") 2021-03-15 09:28:06 +01:00
Molkobain
ca7a9bdbe2 N°2847 - Fix (raw) text field size & style 2021-03-13 18:16:27 +01:00
Molkobain
1caa9a3e15 Code format on inputs 2021-03-13 18:01:53 +01:00
Molkobain
c3140c2db3 Copyright year bump 2021-03-12 18:48:46 +01:00
Molkobain
ebada5e866 N°2844 - Document file: Fix object details not displaying correctly 2021-03-12 18:32:56 +01:00
Molkobain
0902f2c32b Update TODO 2021-03-12 18:04:11 +01:00
Molkobain
dfa85df39c Set attribute: Fix items display 2021-03-12 16:31:06 +01:00
Molkobain
d175bca3cc Set attribute: Fix field always displayed in error in edition
Note: As mentioned in the commit introducing this, this attribute type does not fit well in the error reporting mechanism
2021-03-12 14:21:19 +01:00
Molkobain
1aa61fe29b N°3748 - Deprecation: old tooltip libs in the backoffice and the portal 2021-03-12 11:15:04 +01:00
Molkobain
c1eee655dd Activity panel: Improve debug messages 2021-03-12 10:35:06 +01:00
Molkobain
6b8acc4b2f Sample data: Add Lotfi and Nicolas, welcome aboard! 👋 2021-03-12 10:24:34 +01:00
Molkobain
4ab6ace9fd Sample data: Format code 2021-03-12 10:20:32 +01:00
Molkobain
ed04836a8d Sample data: Change Stephen's avatar and name 2021-03-12 10:06:06 +01:00
Molkobain
3e92e6675d Sample data: Fix persons' email 2021-03-12 09:57:04 +01:00
Molkobain
2710f945d8 PHPDoc 2021-03-12 09:48:35 +01:00
Molkobain
bdc8fe9db3 Session messages: Introduce severity constants 2021-03-12 09:46:34 +01:00
Molkobain
33d72890fa Fix warning session message colors 2021-03-12 09:35:54 +01:00
Molkobain
59b5092e3b Login: Fix forms' inputs width (reset pwd & change pwd) 2021-03-12 09:21:55 +01:00
Molkobain
9daaf4a9f7 Code cleanup 2021-03-12 09:02:29 +01:00
Molkobain
40d002d9e8 N°3649 - Activity panel: Add notifications 2021-03-12 09:02:29 +01:00
Molkobain
3380b8896a Fix UserRights::GetUserInitials() for login starting with a lower case letter 2021-03-12 09:02:29 +01:00
Molkobain
c1564fdcc6 Activity panel: Log debug message if an entry could not be created from a CMDBChangeOp 2021-03-12 09:02:29 +01:00
Molkobain
d7bab12542 Activity panel: Improve OQL to not process case log entries twice 2021-03-12 09:02:29 +01:00
Pierre Goiffon
21a6be1bda 🔊 N°3811 UI.php : update error log
We had 2 catch blocks that were doing almost the same thing... But the last IssueLog call !

Now we have only one catch block, and the last IssueLog call is for Debug instead of Error : ErrorPage::error is already doing IssueLog::Error, so those extra info are now logged only for debugging purpose (in the 'console' channel)
2021-03-11 15:21:32 +01:00
Pierre Goiffon
e49b0db58d N°3522 Handle twig errors nicely
Revert what was done in c5021721 : I then added a panel to be rendered instead of throwing an Exception. This was done because the exception was displayed in a blank page... But this was caused simply by a missing `use Exception` !!

So now we're back at throwing an exception, so that the standard mechanism for throwing the error page is triggered.

Handling Twig recursion is mandatory, and done in the beginning of the \Combodo\iTop\Application\TwigBase\Twig\TwigHelper::RenderTemplate catch block to avoid adding on each stack level a useless exception.
2021-03-11 15:20:41 +01:00
acognet
4932a2cfbd N°2284 - Manage button Clear and add placeholder 2021-03-11 10:41:41 +01:00
acognet
e376f13263 N°3787 - Use data loader for auto refresh 2021-03-11 10:40:04 +01:00
acognet
fe5d5f3869 N°3648 - FIx size of DataTable 2021-03-11 10:32:52 +01:00
acognet
710e6e49a8 Dict entries 2021-03-11 10:29:14 +01:00
acognet
ba1cc00d03 N°3787 - Use data loader for auto refresh 2021-03-11 10:07:48 +01:00
Pierre Goiffon
bd7837b14c N°3566 Hub connector migrate to UiBlock : launch page
Reset some iTop core styles to get back the previous rendering
Also use iTop classes for title and buttons
2021-03-10 18:15:14 +01:00
Pierre Goiffon
3ef307fada 🎨 HubConnectorPage : code formatting 2021-03-10 17:17:28 +01:00
Pierre Goiffon
979e73e376 N°3566 Hub connector migrate to UiBlock : deployed extensions page
Add Hub icon to the button 🤩
2021-03-10 17:02:27 +01:00
Pierre Goiffon
fe70db9af6 💡 PHPDoc : replace link by see
Thanks @Molkobain !
I wrote to much JavaDoc where it is the opposite :/
PhpDoc ref :
https://docs.phpdoc.org/3.0/guide/references/phpdoc/index.html
2021-03-10 15:59:33 +01:00
odain
842e8f9e01 php doc 2021-03-10 15:32:44 +01:00
Pierre Goiffon
3501d39877 💡 N°3522 PHPDoc 2021-03-10 14:41:03 +01:00
Stephen Abello
233efa43c7 N°3560 Fix Impact analysis export popup menu 2021-03-10 11:24:03 +01:00
Stephen Abello
725e635016 N°3560 Fix Impact analysis focus indicator 2021-03-10 11:23:59 +01:00
Pierre Goiffon
a948c3c54e N°3566 Hub connector migrate to UiBlock : deployed extensions page
Hub button is back between fieldsets. it is also now primary and has a specific css class applied
2021-03-10 11:15:42 +01:00
Pierre Goiffon
a763ecbfc5 N°3566 Hub connector migrate to UiBlock : deployed extensions page
Change layout when no Hub extension present
Use warning alert for the no extension message, split the corersponding dict key
2021-03-10 11:07:37 +01:00
Pierre Goiffon
fab1c0bcf8 N°3566 Hub connector migrate to UiBlock : deployed extensions page
Notable changes :
* extensions lists were originally UL/LI but I replaced them with Alert neutral, collapsed by default
* the "Get extensions from iTop Hub..." button was located between both fieldset. I moved it on top of the page, just below page title
2021-03-09 17:53:59 +01:00
odain
377120aead fix merge 2021-03-09 15:48:34 +01:00
odain
577ae34b50 Merge branch 'support/2.7' into develop 2021-03-09 15:40:30 +01:00
Pierre Goiffon
fa7d316dbf N°3803 Fix error when opening dashboard page with non admin user 2021-03-09 12:32:18 +01:00
odain
52cd4f7c5e N°3788 - timeout/excessive duration during MTP - fix PostDbCreation 2021-03-09 11:44:25 +01:00
Pierre Goiffon
570b012000 N°3750 fix body data-ready-scripts attribute not visible
Was using .data() instead of .attr :(
Was already changed in 8efc688f for other attributes, but I forgot this one :/
2021-03-09 11:16:21 +01:00
Pierre Goiffon
9f06e82171 🎨 N°3566 Hub connector : code format 2021-03-09 09:56:06 +01:00
odain
995619af9b N°3788 - timeout/excessive duration during MTP - increase timeout from 5 to 30s 2021-03-09 08:27:33 +01:00
odain
c842162fe2 N°3788 - timeout/excessive duration during MTP 2021-03-09 08:13:57 +01:00
acognet
0f3df3a436 N°3746 - Fix CSV export 2021-03-08 17:00:41 +01:00
Pierre Goiffon
c5021721c6 N°3522 Display error alert for twig rendering errors 2021-03-08 16:41:58 +01:00
Pierre Goiffon
1a3e8c59c7 💡 Update PHPDoc for enums in \Combodo\iTop\Renderer\BlockRenderer::RenderJsInline 2021-03-08 16:41:58 +01:00
Pierre Goiffon
210051c12d 💡 Update deprecated comment in SetupPage
Just removed the unnecessary "since"
See https://docs.phpdoc.org/latest/guide/references/phpdoc/tags/deprecated.html#deprecated
2021-03-08 16:41:58 +01:00
Pierre Goiffon
998c3208f6 RenderAllUiBlocks : new alert collapsible but not closable 2021-03-08 16:41:57 +01:00
Stephen Abello
9c8b2328db N°3578 Display all attributes without pagination in datamodel viewer table 2021-03-08 16:15:18 +01:00
Stephen Abello
b300b76783 Add display options to static datatables 2021-03-08 16:15:17 +01:00
Stephen Abello
ef871fba7f N°3515 Update some classes icon to match 3.0 UI 2021-03-08 16:15:17 +01:00
Eric
1f90ccdb1f PHPDoc 2021-03-08 15:00:40 +01:00
odain
83f99642e0 N°3793 - Cleanup of orphan CMDBChange can hang the setup 2021-03-08 11:38:20 +01:00
acognet
5f217d75bb N°3746 - Migrate modal to new UIBlock system 2021-03-05 17:43:45 +01:00
bruno-ds
ae6a264d6d N°3671 - fix typo in HTTP header name 2021-03-05 16:57:03 +01:00
Stephen Abello
a4d8fb0b4c Fix method name 2021-03-05 16:33:59 +01:00
Stephen Abello
fe0f57c00d Correct type hint and update PhpDoc 2021-03-05 16:33:59 +01:00
acognet
57bd868580 N°3746 - Migrate modal to new UIBlock system 2021-03-05 14:57:51 +01:00
acognet
e1b50c1dcd N°2844 - Fix Title display 2021-03-05 14:57:51 +01:00
Molkobain
256c01dff4 Panel: Fix panel icon being wrongly displayed as medallion when within a panel with in fact a medallion icon 2021-03-05 12:53:03 +01:00
Molkobain
085855cdc5 Revert fix for tooltips in AjaxPage as pages with "application/json" content type actually return the HTML templates... 🤦‍♂️(eg. breaks the autocomplete results)
- Fix only for ext. key modal
2021-03-05 12:40:19 +01:00
Molkobain
bbbc5e966b Fix tooltips not activated in AjaxPage 2021-03-05 12:33:24 +01:00
Molkobain
18d4685007 Code format 2021-03-05 12:29:57 +01:00
Stephen Abello
7f1b1ca662 N°3515 Update some classes icon to match 3.0 UI 2021-03-05 11:59:50 +01:00
Molkobain
b54918bb5e N°3649 - Fix object form display in modals 2021-03-05 11:57:40 +01:00
Molkobain
56b27897cf AjaxPage: Fix tabs handling UIBlocks incorrectly (put at the end of the flow, not in the tab container)
Note: Big part of the code was duplicated and still is... This should be but in a trait maybe to avoid this kind of error in the future?
2021-03-05 11:51:20 +01:00
Molkobain
1beae731bf Advanced search: Fix class selection dropdown displayed in raw HTML 2021-03-05 10:58:00 +01:00
Molkobain
30b691243b Panel: Fix type declaration for title and subtitle 2021-03-05 10:57:15 +01:00
Molkobain
4cb9cc7d68 Panel: Refactor title as a block container (like subtitle) 2021-03-05 10:53:24 +01:00
Molkobain
fc98bc781b Panel: Add SetSubtitleBlock() 2021-03-05 10:16:16 +01:00
Molkobain
a1b6f09115 Panel: Code formatting 2021-03-05 10:15:39 +01:00
Molkobain
642bb8b131 Object details: Fix "Call to a member function GetMainColor() on null" 2021-03-05 09:50:44 +01:00
Molkobain
1eae57a401 Code cleanup 2021-03-05 09:50:43 +01:00
acognet
5a18bfbd6f N°2844 - Fix Title display 2021-03-05 09:38:29 +01:00
Pierre Goiffon
bedc997c3f 📦 Update setup.css 2021-03-05 09:36:26 +01:00
Stephen Abello
fd991c951e Missing class import in portal's attachments 2021-03-05 09:27:11 +01:00
bruno-ds
a06bf6ea7c coding convention (thanks @molkobain) 2021-03-05 09:20:04 +01:00
acognet
45beda3f26 N°2284 - Add tooltips on buttons in select and autocomplete box 2021-03-05 09:17:50 +01:00
acognet
7b4b9fb68c N°2284 - Add tooltips on buttons in select and autocomplete box 2021-03-05 09:17:08 +01:00
Molkobain
71db321570 N°3792 - Deprecate "buttons_position" config. param. 2021-03-04 19:27:25 +01:00
Molkobain
29bf4561e5 Change default color for classes (global pass will be done during beta) 2021-03-04 18:55:02 +01:00
Molkobain
377eb36509 Update PHPDoc and add todo for R&D review 2021-03-04 18:29:06 +01:00
Molkobain
2afbae9c89 Update autoloaders 2021-03-04 18:16:45 +01:00
Molkobain
1e64e0c741 Panel: Remove PanelEnhanced as the Panel now has all the necessary options 2021-03-04 18:16:45 +01:00
Molkobain
3bc130c802 Fix object details' panel highlight color 2021-03-04 18:00:28 +01:00
Molkobain
99295634a6 Migrate abstract class creation page 2021-03-04 18:00:27 +01:00
Molkobain
1d7bc7c8f7 N°2844 - Refactor Panel to include a configurable header
- TitleForObjectDetails no longer exists, use the ObjectDetails's properties instead
2021-03-04 18:00:26 +01:00
Molkobain
4e22906180 Move vertical tab container SCSS into blocks integration partial 2021-03-04 17:59:34 +01:00
Molkobain
9bdccb0fb3 N°2847 - Add method to add several blocks at once to a content area (tUIContentAreas) 2021-03-04 17:59:34 +01:00
Molkobain
cf956099ac N°2844 - Add iUIContentBlock::HasSubBlocks() helper 2021-03-04 17:59:34 +01:00
Molkobain
101a100c1f N°2844 - Toolbar: Remove margins from SCSS partial as they will be part of the block integration (post beta) 2021-03-04 17:59:34 +01:00
Molkobain
824fc19323 Code format 2021-03-04 17:59:33 +01:00
Molkobain
6c20f74b90 Code cleanup 2021-03-04 17:59:33 +01:00
Eric
b4ce1b7ae6 N°3790 - Class selection not working on UniversalSearch and Tags Configuration pages 2021-03-04 17:21:50 +01:00
Eric
e397cee40d N°3785 - Use DownloadPage to download documents 2021-03-04 17:15:25 +01:00
Eric
e3b7914759 N°3785 - Use DownloadPage to download documents 2021-03-04 17:00:17 +01:00
Pierre Goiffon
8efc688ff8 N°3750 data-input-type Ajax refresh : use .attr() only
This attributes value must be get using `.attr()` only, and never .data()
This is what we adopted in the rest of the application.

The `.data()` method must only be used when dealing with large data structure. When having only strings like here, it is OK to store them in the DOM
2021-03-04 16:57:39 +01:00
Eric
622b486d1f N°3785 - Use DownloadPage to download documents 2021-03-04 16:37:33 +01:00
Stephen Abello
226c301d92 N°3722 Hide field description tooltip if it has the same content as field label 2021-03-04 16:32:46 +01:00
Stephen Abello
61a7822db3 N°3560 Only zoom into impact analysis when it has mouse focus 2021-03-04 16:13:14 +01:00
Stephen Abello
9b15750b02 N°3560 Fix Impact analysis altering tabs height 2021-03-04 16:13:14 +01:00
Stephen Abello
64754f982c N°3560 Fix Impact analysis size flickering when refreshing 2021-03-04 16:13:13 +01:00
Pierre Goiffon
675dcda86d N°3750 Fix data-input-type modification not visible in the DOM 2021-03-04 15:52:48 +01:00
Pierre Goiffon
5748ea3a74 N°3750 Fix data-input-type refreshed to "" for autocomplete
The $sInputType var init was commited in 6a5c4788 but removed by accident in b2050a88
2021-03-04 15:44:40 +01:00
Eric
5ccd229092 N°3648 - Fix "Configure this list..." 2021-03-04 15:37:13 +01:00
Stephen Abello
88e502ad7a N°3706 Unescape fieldset labels 2021-03-04 14:46:02 +01:00
acognet
72f6305320 N°3648 - FIx click on link in datatable and display of buttons in search form 2021-03-04 11:47:49 +01:00
Stephen Abello
45981c1941 N°3571 Handle errors in Audit Category and Audit Rule in audit page 2021-03-04 11:42:12 +01:00
Stephen Abello
4d660cc3c8 N°3578 Migrate Datamodel viewer to new style 2021-03-04 10:55:23 +01:00
Stephen Abello
f231fa47a0 Add max height to panelenhanced icon 2021-03-04 10:55:23 +01:00
Stephen Abello
40ceccda46 Add jquery treeview style to vendors directory 2021-03-04 10:55:23 +01:00
Stephen Abello
866d6e829b Allow to add Html to side panel block 2021-03-04 10:55:23 +01:00
Stephen Abello
6d7d6e9531 Hide icon in Panel enhanced if no icon is provided 2021-03-04 10:55:22 +01:00
Stephen Abello
ad0fdfe921 Allow Select options to be disabled 2021-03-04 10:55:22 +01:00
bruno-ds
bb8d4a92cb fix an indentation problem (thanks @Hipska) 2021-03-04 09:56:05 +01:00
bruno-ds
1429792690 N°3668 - fix an improper redirection to the homepage when iTop is behind a reverse proxy 2021-03-04 09:39:48 +01:00
bruno-ds
1f26b59d90 N°3671 - add an API endpoint (it will be used by N°3668 and N°3760) + some code cleanup asked by @molkobain 2021-03-04 09:32:13 +01:00
Pierre Goiffon
c2c69d9f43 💡 N°3750 PHPDoc 2021-03-04 09:32:02 +01:00
Molkobain
133e5003cd Reorder some config. params. 2021-03-03 16:26:08 +01:00
Molkobain
f97eb794ba Rename config. param. "display_menus_count" to "navigation_menu.show_menus_count" 2021-03-03 16:24:49 +01:00
Molkobain
7a8a3cbce8 N°3649 - Activity panel: Show confirmation dialog when leaving page with draft entries 2021-03-03 15:59:12 +01:00
acognet
2fb8f21b58 Fix Css problems 2021-03-03 12:01:37 +01:00
bruno-ds
7b093a6bba N°3671 - app_root_url: handle reverse proxies during the setup and preserve existing configuration during an upgrade. 2021-03-03 11:55:18 +01:00
acognet
c631f28e53 N°3528 - Finish silo selection migration - fix css of button 2021-03-03 10:59:24 +01:00
Stephen Abello
66909ce19a Fix typo in last partial import 2021-03-03 10:40:07 +01:00
Stephen Abello
eca3782bda Fix typo in SCSS partial name 2021-03-03 10:27:38 +01:00
Stephen Abello
a5c2e20a02 N°3570 Migrate Synchro replica page 2021-03-03 10:22:52 +01:00
Stephen Abello
05fff3b8aa Fix external key hyperlinks in datatables when outside of /pages directory 2021-03-03 10:22:52 +01:00
Stephen Abello
175aebaa14 N°3570 Migrate Synchro data source page 2021-03-03 10:22:52 +01:00
Molkobain
cf4e023695 Fix SCSS partial name 2021-03-03 10:12:34 +01:00
acognet
1d58e7d6f8 N°3634 - Remove orange arrow 2021-03-02 18:36:51 +01:00
Molkobain
282842fa2c Object details: Fix image being squashed 2021-03-02 18:30:02 +01:00
Molkobain
748a22c728 Fix SCSS compile error due to wrong import 2021-03-02 18:30:02 +01:00
acognet
bd47ca34df N°3634 - Add count for results 2021-03-02 17:22:11 +01:00
acognet
e27b6b2dde N°3785 - Fix corrupted attribute file on download 2021-03-02 16:39:51 +01:00
acognet
9a7074bcba N°2284 - Fix manual clear of autocomplete field. 2021-03-02 16:39:50 +01:00
Stephen Abello
bedd6b5fcc N°3571 Forgot to commit icons (again 🤦) 2021-03-02 16:28:24 +01:00
Stephen Abello
0638f79c2b Remove changes commited with abcf73f that were only meant to test obsolete/archived behavior 2021-03-02 16:00:18 +01:00
Stephen Abello
abcf73f233 N°2844 N°3570 Bring back Synchronized, Obsolete and Archived tags next to object name 2021-03-02 15:56:31 +01:00
Molkobain
52113233b8 N°2844 - Restore table style on final page of an object deletion 2021-03-02 14:50:35 +01:00
bruno-ds
9cbaced1f3 Merge remote-tracking branch 'origin/support/2.7' into develop
# Conflicts:
#	core/config.class.inc.php
#	datamodels/2.x/itop-core-update/view/SelectUpdateFile.html.twig
#	datamodels/2.x/itop-core-update/view/SelectUpdateFile.ready.js.twig
#	setup/setuputils.class.inc.php
#	test/setup/SetupUtilsTest.php
2021-03-02 14:34:19 +01:00
Pierre Goiffon
77d4613bd8 N°3750 Allow to detect when ready scripts are done processing
In iTop 3.0.0 there are sometimes lots of scripts launched after domReady, so we needed something to know when those scripts are done !
2021-03-02 12:18:45 +01:00
Pierre Goiffon
225c176f71 N°3750 data-input-type : change XHR detection method
I added WebPage::IsAjaxPage, but this wasn't a good idea as XHR isn't really related to the Page impl used !
Instead we're now using the new method \utils::IsXmlHttpRequest which is a copy of \Symfony\Component\HttpFoundation\Request::isXmlHttpRequest
Many thanks @Molkobain !
2021-03-02 12:13:27 +01:00
Stephen Abello
a850d3b67c N°3571 Fix audit errors title 2021-03-02 12:09:29 +01:00
Stephen Abello
74a434ab04 N°3571 Migrate audit page to new style 2021-03-02 12:04:56 +01:00
Stephen Abello
f8e0a28134 N°3650 Datatable within panels take all available space 2021-03-02 12:04:45 +01:00
Stephen Abello
d7d156303f Fix static datatables width not using available space 2021-03-02 12:04:32 +01:00
Stephen Abello
c30b1dd379 Add padding to title block 2021-03-02 12:02:09 +01:00
Stephen Abello
2daa1d93e9 Add style to block csv 2021-03-02 12:02:09 +01:00
Stephen Abello
556388f2f4 Delete unused scss file 2021-03-02 12:02:09 +01:00
Stephen Abello
752508b724 Make panels collapsible 2021-03-02 12:02:09 +01:00
Molkobain
cf72c2ef8f N°3649 - Activity panel: Add conf. param. 'activity_panel.entry_form_opened_by_default' as a default value for the user pref. 2021-03-02 11:33:52 +01:00
Molkobain
3b40728701 N°3649 - Activity panel: Add user pref. to define whether the entry form should be opened by default 2021-03-02 09:32:06 +01:00
Molkobain
e3015a284b N°3629 - Activity panel: Add possibility to close the panel 2021-03-02 09:32:06 +01:00
Molkobain
1cdedec33d Portal: Fix typo in log messages 2021-03-02 09:32:06 +01:00
odain
d4607ee815 N°3065 - Failed enum comparison when values contains parenthesis : add a warning 2021-03-02 07:33:36 +01:00
acognet
291e1d0c30 N°3634 - Feedback alpha 3.0 : finish list - Fix css 2021-03-01 18:19:23 +01:00
acognet
c2dc2c6100 N°2284 - display results on first click on down arrow for autocomplete 2021-03-01 18:19:23 +01:00
acognet
65dbaf427c N°2284 - Fix select when there is only one option 2021-03-01 18:19:23 +01:00
acognet
0e146bf341 N°3634 - Feedback alpha 3.0 : finish list - add menu 2021-03-01 18:19:23 +01:00
acognet
fbb4455250 N°3634 - Feedback alpha 3.0 : finish list - order of buttons 2021-03-01 18:19:23 +01:00
acognet
b2050a8895 N°3648 - Feedback alpha 3.0 : finish relation edition - tabulation 2021-03-01 18:19:23 +01:00
acognet
d601e9608c N°3746 - Migrate modal to new UIBlock system 2021-03-01 18:19:22 +01:00
odain
5c0e92d51a N°3065 - Failed enum comparison when values contains parenthesis 2021-03-01 17:06:49 +01:00
Pierre Goiffon
c679318d16 N°3750 data-input-type : refresh attribute on AJAX refresh 2021-03-01 16:48:12 +01:00
bruno-ds
cd4b3fdaab N°3764 - fix CI 2021-03-01 16:27:40 +01:00
bruno-ds
0030d5c2b8 N°3764 - add transactions_gc_threshold in order to tune CSRF token GC load 2021-03-01 15:30:40 +01:00
bruno-ds
95a0efedcf N°3728 - security hardening 2021-03-01 15:28:34 +01:00
Pierre Goiffon
7a8a78d348 🙈 Add README files to exclude for build 2021-03-01 11:44:37 +01:00
acognet
cebbc215d7 N°3746 - Migrate modal to new UIBlock system 2021-03-01 09:07:09 +01:00
Pierre Goiffon
1060c0ca94 N°3750 Set input type for linkedset 2021-03-01 08:58:36 +01:00
Eric
fb321fa034 Fix ContextTag usage, and add some explanations on the declaration of ContextTag 2021-02-26 16:47:02 +01:00
Eric
925e45782c Fix indexation script and protection for concurrency with cron 2021-02-26 14:05:26 +01:00
Pierre Goiffon
6a5c47887a N°3750 New data-input-typeattribute to fields container
This will allow easiest DOM manipulation in BeHat tests !
2021-02-26 12:16:29 +01:00
bruno-ds
13a1d32f56 N°3453 - portal export header fields are now localized 2021-02-26 11:47:34 +01:00
Pierre Goiffon
267f3ec7ca 🎨 \UIExtKeyWidget 2021-02-26 11:13:54 +01:00
Pierre Goiffon
9907e4af58 Fix TODO 3.0 2021-02-26 11:01:41 +01:00
Stephen Abello
a505902ed5 Add string subtitle to panels 2021-02-26 10:27:49 +01:00
Stephen Abello
25c840e036 Rename subtitle block variable in PanelEnhanced 2021-02-26 10:27:49 +01:00
Pierre Goiffon
35155e4b7a 💡 N°3065 comments modifications 2021-02-26 10:06:29 +01:00
Eric
da4cf8b661 N°3739 - Change dashboard menu entries (Fix dashboard edition) 2021-02-26 09:33:56 +01:00
Eric
77710f1613 Revert "#1946 Fix Twig templates logging too much"
This reverts commit 2763b991
2021-02-25 17:57:39 +01:00
Stephen Abello
a7fde78105 Fix unmigrated Attachment constant in portal 2021-02-25 17:45:46 +01:00
Eric
39f30a059b N°3739 - Change dashboard menu entries 2021-02-25 16:29:25 +01:00
vdumas
a6f4b30004 N°3735 - New method AddValue on DBObject for Designer users 2021-02-25 16:09:21 +01:00
Eric
2763b99142 #1946 Fix Twig templates logging too much 2021-02-25 14:44:16 +01:00
Stephen Abello
4ce3631e4b Rename some vendors variables to keep consistency 2021-02-25 10:09:06 +01:00
Stephen Abello
7ed906f1c3 Fix medallion image class name 2021-02-25 10:09:05 +01:00
Stephen Abello
1a43d5afd7 Move blocklist and medallion icon integration in a dedicated file 2021-02-25 10:09:05 +01:00
Molkobain
db0c796218 Activity panel: Fix click on "compose" button doing nothing when on a "read-only" case log tab
Note: The behavior is not implemented yet, but it's the following the same path as when the user is on the "activity" tab
2021-02-25 09:52:18 +01:00
Molkobain
1c7f72d1f8 Activity panel: Fix typos (thanks @jbostoen) 2021-02-25 09:52:18 +01:00
Molkobain
5770000e65 Caselog entry form: Fix event name 2021-02-25 09:52:18 +01:00
Molkobain
ad7b78b871 Activity panel: Set focus in input when clicking on "Compose" button 2021-02-25 09:52:17 +01:00
Pierre Goiffon
4d78f4b535 N°3750 Fix syntax for array key
Thanks @Molkobain !
2021-02-24 20:09:32 +01:00
Pierre Goiffon
30cddeae2d N°3750 Fix no data-input-id attribute for status attribute 2021-02-24 18:42:59 +01:00
bruno-ds
db13c105ad N°3473 - PHPdoc
as requested by @piRGoif
2021-02-24 17:38:54 +01:00
Pierre Goiffon
c8911f1fa9 N°3750 Add data-input-id to field container
This will allow easiest DOM manipulation in BeHat tests
2021-02-24 17:19:55 +01:00
Molkobain
8295920c3c Preferences: Update translations 2021-02-24 17:01:12 +01:00
bruno-ds
2276539f24 N°3430 - code cleanup 2021-02-24 16:50:14 +01:00
bruno-ds
9b7cd20d47 N°3473 - security hardening 2021-02-24 16:50:13 +01:00
Molkobain
a284087460 Impact analysis: Use new tooltip API to allow interactions with their hyperlinks 2021-02-24 16:23:35 +01:00
Molkobain
c5a6f441aa CombodoTooltip: Improve API
- Add "data-tooltip-interaction-enabled" to allow user to interact with the tooltip content (select, click). Possible values "true"|"false"
- Add "data-tooltip-append-to" to choose to which element the tooltip should be append. Possible values "body"|"parent"|<JQUERY_SELECTOR>
2021-02-24 16:17:12 +01:00
Molkobain
9dc0a052bf Activity panel: Fix hard-coded localized sentence 2021-02-24 14:55:19 +01:00
Stephen Abello
61b5a3924e N°2844 Migrate Impact Analysis to new design 2021-02-24 14:46:17 +01:00
Stephen Abello
99cb5ffb37 Add sliders to jqueryui style 2021-02-24 14:46:17 +01:00
Stephen Abello
e0ae2706de Migrate jQuery multiselect style to 3.0 design 2021-02-24 14:46:17 +01:00
Stephen Abello
8dfdc4761e N°2844 Fix Impact Analysis pdf export 2021-02-24 14:46:16 +01:00
Molkobain
9723a346b6 Activity panel: Change "case log" to "log" in dictionary (fits best the general cases, not just the helpdesk world) 2021-02-24 14:26:44 +01:00
Molkobain
1667a0a6df Fix spacing / sizing for "obsolescence" icon on external keys 2021-02-24 13:28:39 +01:00
Molkobain
cdfdfc75ab Preferences: Regroup preferences relative to the UI into a single panel 2021-02-24 13:10:34 +01:00
bruno-ds
e1d644c33b Merge remote-tracking branch 'origin/support/2.7' into support/2.7 2021-02-24 12:06:40 +01:00
bruno-ds
c601082a5e 3548 - disable core update if a file integrity problem is detected 2021-02-24 12:05:11 +01:00
Molkobain
a33b1303d2 CombodoTooltip: Enable interaction with tootlip's content (selection, click, ...) 2021-02-24 11:23:56 +01:00
Molkobain
5836be7131 Fix unit test 2021-02-24 09:49:16 +01:00
Molkobain
6f40bb4c35 Change check level to "warning" in order to keep consistency with the others 2021-02-24 09:29:42 +01:00
Molkobain
56a1a82ec8 Fix typo 2021-02-24 09:00:33 +01:00
Molkobain
22ffb4ecee PanelFactory: Fix neutral panel default to color to proper constant 2021-02-23 19:39:23 +01:00
Molkobain
ad93d6dd41 N°3629 - Activity panel: Add "activity_panel.show_author_name_below_entries" config. param. to show the author friendlyname under the last entry 2021-02-23 15:24:20 +01:00
Molkobain
affb869116 Reformat parameter 2021-02-23 13:28:34 +01:00
Molkobain
fa39846cc8 N°3629 - Activity panel: Add "activity_panel.datetimes_reformat_limit" config. param. to define the limit after which all dates / times should be displayed in absolute format 2021-02-23 13:25:19 +01:00
Molkobain
3d4e63416f N°2847 - Title: Fix empty space on the left of the subtitle when no status 2021-02-23 13:11:56 +01:00
Molkobain
9586bd7dea N°3629 - Activity panel: Fix state attribute changes on a class without transition is now displayed as a "state change" instead of an "edit" 2021-02-23 13:05:52 +01:00
Molkobain
0f3eb53554 Update deprecation comment 2021-02-23 13:05:52 +01:00
Stephen Abello
c757b5051e Simplify medallion icon calls in cmdbabstract and fix an issue with notifications 2021-02-23 11:31:09 +01:00
Stephen Abello
fbe173444e Fix object details width when using vertical tabs 2021-02-23 11:26:46 +01:00
Stephen Abello
770d96cdec Fix medallion icon block scss variables 2021-02-23 11:23:21 +01:00
Stephen Abello
b0a1371122 Fix class icon being too big in displaybarerelations 2021-02-23 10:48:58 +01:00
Stephen Abello
defa1e40e1 Add medallion icon block 2021-02-23 10:48:58 +01:00
bruno-ds
c3cb4fbe75 Fix merge wrongfully performed
(thanks @molkobain & @piRGoif & @odain-cbd)
2021-02-23 10:24:49 +01:00
Molkobain
88f45a69b1 N°3649 - Activity panel: Show warning message when lock expired (/ was removed by an admin.) 2021-02-23 09:39:57 +01:00
Molkobain
1a44406d70 N°3649 - Activity panel: Fix compose button being under entries 2021-02-23 09:39:56 +01:00
Molkobain
837d1824b1 Code cleanup: Remove useless code 2021-02-23 09:39:56 +01:00
Molkobain
2bf23f0618 N°3629 - Activity panel: Fix case logs not saved during object creation 2021-02-23 09:39:56 +01:00
bruno-ds
26bbdc1a57 Merge remote-tracking branch 'origin/support/2.7' into develop
# Conflicts:
#	application/cmdbabstract.class.inc.php
#	application/utils.inc.php
#	dictionaries/en.dictionary.itop.core.php
#	dictionaries/fr.dictionary.itop.core.php
#	setup/setuputils.class.inc.php
2021-02-23 08:58:29 +01:00
Molkobain
933bddebe3 Image attribute: Migrate deprecated jQuery methods in JS widget 2021-02-22 16:25:55 +01:00
Molkobain
9c0966ff42 Image attribute: Add upload button 2021-02-22 16:23:45 +01:00
Molkobain
0b60079c07 Fix typo 2021-02-22 15:08:21 +01:00
Molkobain
083f50a5d4 Fix typo 2021-02-22 13:53:41 +01:00
Stephen Abello
c8ede0e8da Fix forced CombodoTooltip::InitAllNonInstantiatedTooltips instantiation when tooltip has already been instantiated 2021-02-22 13:42:28 +01:00
Stephen Abello
2b69ca2f04 Change da77439 events to use DataTables builtin events instead of custom ones 2021-02-22 13:37:35 +01:00
Molkobain
9bbec47976 Move tooltips JS helpers to dedicated class "CombodoGlobalToolbox => CombodoTooltip" 2021-02-22 13:02:52 +01:00
Molkobain
5bde218076 Code cleanup: Remove obsolete IE JS polyfills 2021-02-22 12:56:20 +01:00
Stephen Abello
a4a88cd63a Fix placeholder wrong nodes 2021-02-22 10:27:00 +01:00
Stephen Abello
da77439e1e Fix tooltips in datatables and add events to datatables init and draw actions 2021-02-22 09:51:12 +01:00
bruno-ds
241bd1cdeb N°3430 - code cleanup
- during the code review @dflaven preferred the reference rather than the return alternative
 - typo
2021-02-22 09:43:42 +01:00
Stephen Abello
f61ec3179a Placeholders now keep their aspect ratio even when displaying in large screen 2021-02-20 10:53:03 +01:00
Molkobain
147e240035 Code cleanup: Remove migrated SCSS rules 2021-02-19 22:17:58 +01:00
Molkobain
cc747ebef7 Move style properties to SCSS variables 2021-02-19 22:15:14 +01:00
Molkobain
5e86183d40 Fix email/phone attribute decoration's spacing (whole thing still needs rework though) 2021-02-19 22:12:02 +01:00
Molkobain
f04a5dbfef N°2844 - Fix image attribute display and editing 2021-02-19 22:01:51 +01:00
Molkobain
1c0177f711 Add possibility to force tooltip re-instantiation on CombodoGlobalToolbox.InitAllNonInstantiatedTooltips() 2021-02-19 20:53:05 +01:00
Molkobain
a1893a115f Tabs: Fix scrollable tab's skeleton on very wide screens 2021-02-19 19:23:29 +01:00
Molkobain
4a227c7ed2 Tabs: Fix scrollable tab's separator width on very large screen 2021-02-19 19:14:09 +01:00
Molkobain
5e21ec03cd Rename constants according to @steffunky 's advice (better DX) 2021-02-19 18:35:20 +01:00
Stephen Abello
ea502e9c81 Allow to set a customized placeholder for ajax tabs in scrollable mode 2021-02-19 17:38:47 +01:00
Molkobain
e5d8c885bc N°2844 - Object details: Refine object's name, class and status size and placement 2021-02-19 16:21:35 +01:00
Stephen Abello
7327025aac N°3670 Move dictionary entry back to module 2021-02-19 14:42:15 +01:00
Stephen Abello
952280ecc6 N°3670 Fix drag and drop glitching in Chrome 2021-02-19 13:57:14 +01:00
Molkobain
4d8930832e N°3649 - Activity panel: Add concurrent lock mechanism 2021-02-19 12:34:42 +01:00
Molkobain
c59301ebc6 Attachments: Fix SSL certificate warning on edition 2021-02-19 12:34:42 +01:00
Molkobain
cb338e1ce5 Case log form entry: Protection against general form not found when in bridge mode 2021-02-19 12:34:42 +01:00
Molkobain
146089e021 Button: Add default name attribute for cancel button 2021-02-19 12:34:42 +01:00
Molkobain
6634f3981e Concurrent lock: Fix modal's button to match new convention 2021-02-19 12:34:41 +01:00
Molkobain
38c6f8c76f Concurrent lock: Fix ownership handler in the backoffice
- Lost lock message will only be displayed once instead of being stacked every 60s 🤪
- Action buttons (except "Cancel") are disabled when the lock expires (regression from 3.0.0)
- Modal window is now larger
2021-02-19 12:34:41 +01:00
Stephen Abello
00008528a6 N°3560 Remove useless code 2021-02-19 12:31:39 +01:00
Stephen Abello
cc4727ad95 N°3560 Avoid reloading remote tabs when clicking multiple times on its tab 2021-02-19 11:54:25 +01:00
Stephen Abello
e650297ded N°3560 Add placeholder and a button to load remote tabs in scroll mode 2021-02-19 11:45:06 +01:00
Molkobain
71c5f47cd8 PHPDoc 2021-02-19 09:37:53 +01:00
odain
74246a8278 N°3065 - Failed enum comparison when values contains parenthesis - enhance db model parsing used during setup comparison with expected one to generate SQL migration queries 2021-02-18 18:24:09 +01:00
bruno-ds
c450c9426c Merge remote-tracking branch 'origin/support/2.7' into support/2.7 2021-02-18 16:29:44 +01:00
odain
46f9fe743c fix ci: adapt test to make sure config date_and_time is set properly before 2021-02-18 16:27:38 +01:00
Stephen Abello
be38bca83d Fix bad HTML markup when having OnDisplayRelations in objects 2021-02-18 16:17:35 +01:00
odain
c31df5fff3 fix ci: adapt test to make sure config date_and_time is set properly before 2021-02-18 16:07:37 +01:00
Stephen Abello
8a13cdbcff Fix badly escaped line return 2021-02-18 15:41:12 +01:00
acognet
27ee6fec70 N°3634 - Feedback alpha 3.0 : finish list 2021-02-18 15:39:38 +01:00
acognet
4e0c21a2ac N°3634 - Feedback alpha 3.0 : finish list 2021-02-18 14:49:28 +01:00
Pierre Goiffon
6e0af1a3b7 💡 Add variable typing 2021-02-18 13:21:06 +01:00
bruno-ds
e9e18513be N°3430 - fix preference page's warning and add missing token generation
- fix the warning (ajax call interrupted) if preference form ajax call is way faster than the one of the 2 other by adding a new timeout_duration option before the redirect.
2021-02-18 12:18:38 +01:00
Molkobain
1e18a5ce07 Revert line that wasn't supposed to be commited yet 🙈 2021-02-18 09:34:01 +01:00
Molkobain
10d5ca50fc Add "error" colors to the semantic palette 2021-02-18 09:10:59 +01:00
Molkobain
4770123be5 N°3549 - Activity panel: Fix crash when cancelling object modification 2021-02-17 18:10:14 +01:00
Stephen Abello
a6daa577e8 N°3560 Fix object's tabs not opening tab specified in url's hash 2021-02-17 17:34:27 +01:00
Stephen Abello
b7c7b05243 Fix dashlet sanitization 2021-02-17 17:34:27 +01:00
Molkobain
acf721befa Fix object's tabs IDs in the URL (regression introduced by 1fc54edf) 2021-02-17 17:24:22 +01:00
Molkobain
f297cdb8b2 N°3549 - Activity panel: Fix inline images in caselogs 2021-02-17 12:47:24 +01:00
Molkobain
b39b09c33c Code cleanup 2021-02-17 12:42:55 +01:00
Stephen Abello
bdec220d7e N°3723 Restyle attachment drag and drop and add a better user experience 2021-02-17 11:04:38 +01:00
Stephen Abello
666d0d418f Rename MAX_SIZE_FOR_PREVIEW const to DEFAULT_MAX_SIZE_FOR_PREVIEW 2021-02-17 10:54:17 +01:00
Molkobain
9d2fc883b8 Fix test name 2021-02-17 10:31:59 +01:00
Stephen Abello
ea04a6e1c9 Add semicolon to button js 2021-02-17 10:24:44 +01:00
odain
913ea0cef2 N°3412 - Command Injection vulnerability in the Setup Wizard - renaming 2021-02-17 10:22:21 +01:00
odain
82ba7f25b0 N°3412 - Command Injection vulnerability in the Setup Wizard - do not use escapeshellcmd before execution in Windows envt 2021-02-17 10:18:28 +01:00
odain
bb877a244b N°3412 - Command Injection vulnerability in the Setup Wizard - do not use escapeshellcmd before execution in Windows envt 2021-02-17 10:09:39 +01:00
Stephen Abello
5e56a08768 Fix not showing filename next to upload buttons 2021-02-17 09:54:42 +01:00
odain
a12959d60e N°3412 - Command Injection vulnerability in the Setup Wizard - handle empty path 2021-02-17 07:50:18 +01:00
bruno-ds
83434b5506 N°3430 - add translations 2021-02-16 17:42:11 +01:00
bruno-ds
dcd4abe72b N°3430 - security hardening 2021-02-16 17:33:49 +01:00
odain
571520815a N°3412 - Command Injection vulnerability in the Setup Wizard - include test to CI 2021-02-16 17:25:45 +01:00
odain
e9cff0920b N°3412 - Command Injection vulnerability in the Setup Wizard - fix test and code 2021-02-16 17:12:41 +01:00
odain
905ee19519 N°3412 - Command Injection vulnerability in the Setup Wizard 2021-02-16 15:57:12 +01:00
acognet
6879cd762c N°2598 - When refreshing a list, loosing page and order - improvement of code 2021-02-16 15:05:06 +01:00
Stephen Abello
8f0e665c68 Refactor "sanitize_identifier" and "sanitize_variable_name"custom TWIG functions to "sanitize(FOO)" 2021-02-16 10:32:03 +01:00
bruno-ds
0b95220d1b N°3466 - Add (missing) translations 2021-02-16 09:46:04 +01:00
Stephen Abello
aa326a1276 Revert wrongfully deleted file in 003d9107 2021-02-16 09:23:48 +01:00
Stephen Abello
e0127d330a N°3670 Remove tiff file from attachment previewable filetypes 2021-02-16 09:22:26 +01:00
acognet
32469b3421 Refactor "sanitize_identifier" and "sanitize_variable_name"custom TWIG functions to "sanitize(FOO)" 2021-02-16 09:16:19 +01:00
acognet
4cafd41944 Refactor "sanitize_identifier" and "sanitize_variable_name"custom TWIG functions to "sanitize(FOO)" 2021-02-16 09:09:02 +01:00
acognet
4f7760ed86 N°3540 - Migrate printable version of an object 2021-02-15 18:17:32 +01:00
bruno-ds
e1b2a767f5 N°3142 - fix typos 2021-02-15 17:49:25 +01:00
acognet
c039d0f81d 2284 - Replace JQuery Autocompleter plugin by JQuery UI Autocomplete widget - Cleanup tableHover 2021-02-15 17:43:36 +01:00
odain
4870893fc2 N°2982 - Speed up SCSS themes compilation during setup : fix precompiled css theme generated 2021-02-15 17:26:17 +01:00
odain
e2940150c3 N°2982 - Speed up SCSS themes compilation during setup : create a php file dedicated to CompileCSSService/FindStylesheetObject 2021-02-15 17:26:17 +01:00
bruno-ds
3058b2eb00 N°3142 - Add (missing) translations 2021-02-15 17:08:47 +01:00
acognet
dbe747ea23 N°2598 - When refreshing a list, loosing page and order - change of dashboard refresh mecanism 2021-02-15 16:55:03 +01:00
acognet
4c23f1f32b N°3648 - Feedback alpha 3.0 : finish relation edition 2021-02-15 16:55:03 +01:00
acognet
c1c8fad97e N°3648 - Feedback alpha 3.0 : finish relation edition 2021-02-15 16:55:03 +01:00
Stephen Abello
bcdb6bdac8 N°3670 Display filetype icons in portal attachment display 2021-02-15 16:52:21 +01:00
Stephen Abello
36991a3d5b N°3670 Add more filetype to be displayed as preview icon 2021-02-15 16:52:21 +01:00
Stephen Abello
003d9107a4 N°3670 Remove attachment legacy filetype icons 2021-02-15 16:52:21 +01:00
Stephen Abello
e8f26bdf18 N°3670 Add a parameter to chose max file size to be displayed as a preview icon 2021-02-15 16:52:21 +01:00
Stephen Abello
a53485d08f N°3670 Replace attachment "delete" button with an icon button 2021-02-15 16:52:21 +01:00
Stephen Abello
7e46054f8b Add a destructive icon link factory for Button block 2021-02-15 16:52:20 +01:00
Stephen Abello
789ee8e2d1 N°3670 Revert tooltip preview behavior back to 2.7 one 2021-02-15 16:52:20 +01:00
Molkobain
eea8ceda63 Refactor "sanitize_identifier" and "sanitize_variable_name"custom TWIG functions to "sanitize(FOO)"
Note: FOO is one of \utils::ENUM_SANITIZATION_FILTER_XXX
2021-02-15 16:28:34 +01:00
Molkobain
44587663bb Add "get_module_setting" as a custom TWIG function 2021-02-15 16:21:39 +01:00
odain
c36d650d61 N°2982 - Speed up SCSS themes compilation during setup : fix broken style 3.0 after setup 2021-02-15 15:20:31 +01:00
Molkobain
f716e42672 Rename 'variable_name' TWIG filter to 'sanitize_variable_name' to keep consistency with other filters (eg. 'sanitize_identifier') 2021-02-15 13:50:57 +01:00
Molkobain
3b288ce5d6 Typo 2021-02-15 13:50:56 +01:00
Molkobain
e485853b08 N°3549 - Activity panel: Fix drag / drop of images during object edition 2021-02-15 13:50:56 +01:00
Molkobain
38bc2d9d58 🔧 Change max line length in .editorConfig 2021-02-15 13:49:39 +01:00
Eric
244de6915d N°3700 - Restyle SessionMessage 2021-02-12 17:40:31 +01:00
vdumas
874f2f63a8 Merge remote-tracking branch 'origin/develop' into develop 2021-02-12 11:25:59 +01:00
odain
71a65606a1 Revert "N°2982 - Speed up SCSS themes compilation during setup : take cascaded included imports in theme precompilation + class/method documentation cleanup"
This reverts commit c8dd19c22f.
2021-02-12 11:24:14 +01:00
vdumas
a8c834b1e9 N°3495 WorkOrder: on closure set end_date only if empty 2021-02-12 11:05:39 +01:00
odain
c8dd19c22f N°2982 - Speed up SCSS themes compilation during setup : take cascaded included imports in theme precompilation + class/method documentation cleanup 2021-02-12 09:46:30 +01:00
Eric
9ad204244a N°3565 - Migrate backoffice pages to new UIBlock system : Setup (fix some fonts) 2021-02-11 18:02:34 +01:00
Eric
c8e8778d7b N°3468 - Fix extension.xml preventing extensions installation
(cherry picked from commit 92c8af1b19)
2021-02-11 17:48:29 +01:00
nv35
a5052ef42b 🔊 Print data source id in synchro_exec output (#183)
As it is possible to execute multiple data source sync in one command run, print the corresponding data source name before its output.
2021-02-11 16:47:10 +01:00
Eric
68f7880d42 Force theme compilation in development environment 2021-02-11 14:31:52 +01:00
Eric
f4241142c5 Fix crash when a module is removed and some classes remains in the creation history 2021-02-11 14:31:52 +01:00
Pierre Goiffon
1cc48c8d8e 💄 iTop 3.0.0 badge dashlet : make whole badge clickable (#191)
Would be better to have only one handler on the dashboard side but we want to respect code responsibility !
So until we have a system for components to print "static" code (that will be printed only once whatever number of component instances we have in the page), we are doing it the "old" way : calling a JQuery widget in the component JS Twig.
2021-02-11 12:09:06 +01:00
Molkobain
ebb80a9b05 N°3649 - Activity panel: Fix case log entries truncated to first character in edit mode 2021-02-10 21:30:02 +01:00
Molkobain
8d8f6f7ed5 Typo 2021-02-10 21:17:49 +01:00
Molkobain
e6c0333915 N°3545 - Activity panel: Change caselogs order so it's defined by the details zlist 2021-02-10 18:20:04 +01:00
Stephen Abello
3be360dfb9 N°3670 Add new file upload button 2021-02-10 17:19:40 +01:00
Stephen Abello
d08adc43c1 N°3670 Fix useless slashes in tooltip 2021-02-10 17:19:39 +01:00
Stephen Abello
3361c9de29 PHPDoc 2021-02-10 17:19:39 +01:00
Eric
0eff37844b Add UIBlocks to twig (Fix deprecation warning) 2021-02-10 16:21:11 +01:00
vdumas
5f3d5a593c N°2639 - Enrich dictionary for notify flag on Contact 2021-02-10 16:17:57 +01:00
Stephen Abello
e74ee179af N°3670 Replace/add new Attachment type icons 2021-02-10 15:52:56 +01:00
Stephen Abello
d8006b160c N°3670 Migrate Attachment list to new UI 2021-02-10 15:52:56 +01:00
bruno-ds
f328e58c02 N°3721 - toolkit's "update iTop" with the "Create symbolic links" option checked now empty the compiled directory as expected 2021-02-10 15:35:38 +01:00
bruno-ds
656fa3208a N°3721 - revert the feature (will only be available on the 3.0) 2021-02-10 15:33:01 +01:00
bruno-ds
f647ce61c2 N°3721 - toolkit's "update iTop" with the "Create symbolic links" option checked now empty the compiled directory as expected 2021-02-10 14:34:21 +01:00
Eric
19270a9dde N°3563 - Migrate backoffice pages to new UIBlock system : Preferences (partial fix for favorite organizations and shortcuts) 2021-02-10 14:31:19 +01:00
Eric
91fd69e0bd N°3563 - Migrate backoffice pages to new UIBlock system : Preferences (fix newsroom icon) 2021-02-10 10:53:01 +01:00
Eric
3b220b6050 N°3676 - Fix Subnet creation (missing default values) 2021-02-10 09:21:33 +01:00
Eric
4ceccb3c41 Add setup.css for initial setup 2021-02-10 09:01:03 +01:00
Eric
47fdc47d33 enhance Application Updater 2021-02-09 18:18:11 +01:00
Eric
ed4cf4ff05 Fix File Select widget 2021-02-09 18:18:11 +01:00
Eric
d332787deb Provide font CSS classes 2021-02-09 18:18:11 +01:00
Eric
55a6f85252 Fix toolbar spacer 2021-02-09 18:18:11 +01:00
vdumas
aacf3700f4 Merge remote-tracking branch 'origin/develop' into develop 2021-02-09 17:48:04 +01:00
Eric
9ed2127530 Add File Select widget 2021-02-09 17:24:27 +01:00
vdumas
eac9d7adfb N°3495 - Simplify WorkOrder Data model 2021-02-09 16:51:42 +01:00
Eric
3c60e4f765 Add Toolbar factory, Use new factory entry for cancel buttons, better check of twig errors, fix fatal error page 2021-02-09 14:43:46 +01:00
Molkobain
e11252a2d6 PHPDoc 2021-02-08 22:41:45 +01:00
Molkobain
99564d75b7 N°3560 - Fix AJAX tabs not having correct spacing 2021-02-08 22:40:21 +01:00
Molkobain
26e54b8796 Typo 2021-02-08 19:17:07 +01:00
Eric
eaa507bc70 N°3245 - Move filter of trigger on object update after object update (fix attribute change detection) 2021-02-08 16:21:35 +01:00
Eric
91752b4068 N°3565 - Migrate backoffice pages to new UIBlock system : Setup (fix bad escaping) 2021-02-08 14:20:12 +01:00
Molkobain
82b7854d46 N°3649 - Activity panel: Refactor the way we access the CKEditor instance 2021-02-08 12:24:05 +01:00
Molkobain
08ea82cf05 N°3649 - Activity panel: Fix entries not being filtered on initialization 2021-02-08 12:24:05 +01:00
Molkobain
6e99701c47 N°3649 - Case log entry form: Change buttons text and style
- Change "Save" button to "Send"
- Change "Cancel" button to the new convention
2021-02-08 12:24:05 +01:00
Molkobain
aa0fb2b8f7 N°3649 - Activity panel: Move case log entry form above toolbar's actions 2021-02-08 12:24:05 +01:00
Molkobain
6710ffa334 N°3649 - Activity panel: Improve colors separation for case logs 2021-02-08 12:24:04 +01:00
Molkobain
0664a42f99 N°3649 - Activity panel: Fix toolbar wrapping with large labels 2021-02-08 12:24:04 +01:00
Molkobain
73f6c697b9 N°3649 - Activity panel: Fix wrong elapsed time displayed under entries after a new entry has been added 2021-02-08 12:24:04 +01:00
Molkobain
15c5a22d11 N°3649 - Activity panel: Add tooltip on compose button 2021-02-08 12:24:04 +01:00
Molkobain
40c112d47a N°3649 - Activity panel: Show confirmation dialog on multiple case logs entries submission 2021-02-08 12:24:04 +01:00
Molkobain
4a2cbc9be3 N°2847 - Navigation menu: Change default expanded/collapsed behavior
- Keep previous value (iTop 2.7 and older) if present
- Otherwise, collapsed by default
- Also renamed the user pref. to match new conventions
2021-02-08 12:24:04 +01:00
Molkobain
a91b6dbca3 Fix URL with special chars being output wrong (completes c98881671) 2021-02-08 12:24:03 +01:00
Molkobain
5c85af10c5 N°3649 - Activity panel: Reorganized methods for more readability 2021-02-08 12:24:03 +01:00
Molkobain
8026965915 N°3649 - Activity panel: Work on multiple caselogs edition at once 2021-02-08 12:24:03 +01:00
Molkobain
5f00362805 Add CombodoJSConsole JS helper to output messages in the different console channels without having to check it exists before.
Note: This could be used later as an entry point to manipulate the log and do something with it (format, persist, ...)
2021-02-08 12:24:03 +01:00
Molkobain
648a3cc430 N°3649 - Activity panel: Improve UX on "indeterminated" filters' checkboxes 2021-02-08 12:24:03 +01:00
Molkobain
977d1d0246 N°3649 - Activity panel: Continue improvement following the alpha feedbacks
- Add possibility to choose which caselogs are displayed in any tab
- Change case log entry form submit button label from "Add entry" to "Save"
2021-02-08 12:24:02 +01:00
Molkobain
222fab27d1 N°3649 - Activity panel: Continue improvement following the alpha feedbacks
- Update messages counters globally (not per caselog)
- Hide messages counter when no caselog
2021-02-08 12:24:02 +01:00
Molkobain
a48d850721 N°3649 - Activity panel: Code cleanup 2021-02-08 12:24:02 +01:00
Molkobain
599c4ebad8 N°3649 - Activity panel: Continue improvement following the alpha feedbacks
- Change caselog entry form, now 1 per caselog
- Remove entry form from activity tab
- Change entries filters, now present on all tabs but states are specific to each tab
2021-02-08 12:24:02 +01:00
Molkobain
4f9d133670 Activity panel: Rename some variables/methods for a better meaning 2021-02-08 12:24:01 +01:00
Molkobain
9a4f956153 N°3649 - Activity panel: Code cleanup
- Move entry form toggler SCSS to proper file
- Rename entry form toggler
2021-02-08 12:24:01 +01:00
Molkobain
927fd980f6 N°2844 - Make activity panel and object details scroll independently (generic page layout) 2021-02-08 12:24:01 +01:00
Molkobain
446512793b N°2847 - Simplify SCSS rules according to guidelines 2021-02-08 12:24:01 +01:00
Molkobain
7f55fd4bf6 N°3649 - Activity panel: Continue improvement following the alpha feedbacks
- Fix compose button visible when no editable caselog
- Fix "states" filter visible on object with no state attribute
- All tabs now have all the actions / filters
- Initial active tab is now the first one (caselog or activity)
2021-02-08 12:24:01 +01:00
Eric
0c7925cdfb N°3565 - Migrate backoffice pages to new UIBlock system : Setup (fix bad escaping) 2021-02-08 11:58:52 +01:00
Eric
96faad7539 N°3565 - Migrate backoffice pages to new UIBlock system : Setup (fix some fonts) 2021-02-08 11:30:25 +01:00
Eric
69189ab41a Merge branch 'support/2.7' into develop 2021-02-08 10:42:19 +01:00
Eric
6b76e5a853 N°3618 - Count on union with different conditions fails (php doc) 2021-02-08 09:39:24 +01:00
Eric
dbb6e43751 N°3618 - Count on union with different conditions fails (Fix unit tests) 2021-02-05 11:28:40 +01:00
Eric
f07f0ba1c7 N°3618 - Count on union with different conditions fails (Fix multi-column attributes sql generation) 2021-02-05 10:15:14 +01:00
bruno-ds
2ddeebdc78 Readonly alert now has an id
in order to be interacted with (browser side).
2021-02-05 09:59:52 +01:00
Pierre Goiffon
d312bf74b9 N°3537 run_query : fix fatal error class not found when running query with parameters
Factory weren't renamed in this file :/
Regression brought by 5fe8ca17
2021-02-04 16:08:59 +01:00
Pierre Goiffon
f83f606d92 💄 N°3227 Change Query.is_template look
From list to radio_horizontal
2021-02-04 15:57:00 +01:00
odain
857ae5fd95 N°2982: code cleanup following review 2021-02-04 15:44:14 +01:00
odain
265b5dd969 ci/testing work: categorize tests via phpunit @group tags 2021-02-04 15:28:36 +01:00
odain
d7c7ef8332 ci/testing work: categorize tests via phpunit @group tags 2021-02-04 15:07:44 +01:00
odain
54f8ef924f N°2982: theme precompilation fix work even when coming from /extensions or /datamodels/X.x 2021-02-04 14:20:35 +01:00
Pierre Goiffon
2e2b7f96f2 N°2334 Fix unable to display finalClass on remote class in view/edit lnk relations
Don't filter finalClass anymore when viewing object in \MetaModel::GetZListAttDefsFilteredForIndirectRemoteClass
Also added some type hinting
2021-02-04 11:57:02 +01:00
Pierre Goiffon
a5894c1a4c Rename \Combodo\iTop\Test\UnitTest\ItopTestCase::InvokeInvisible* to InvokeNonPublic* 2021-02-04 09:41:56 +01:00
Eric
e06996a2e4 N°3660 - Fix JOIN without condition on child joined table is ignored (check done in optimizer) 2021-02-03 15:58:54 +01:00
acognet
34d9eb2d96 Fix js files loading 2021-02-03 11:59:50 +01:00
acognet
f5d89de177 N°2737 - Migrate table to DataTables plugin to be iso with the end-users portal - fix popup direct link 2021-02-03 11:55:27 +01:00
acognet
53c4c14522 Fix js files loading 2021-02-03 11:07:07 +01:00
acognet
ff44fcdfe0 N°331 - L'ordre de tri des tickets change au rechargement auto - add ability to give to Menu how to refresh the panel 2021-02-03 11:07:07 +01:00
Eric
2f0e7c6d29 N°3586 - Fix login window not correctly displayed 2021-02-03 09:15:56 +01:00
Eric
7115a6ae7d N°3660 - Fix JOIN without condition on child joined table is ignored (remove unnecessary check) 2021-02-03 09:07:59 +01:00
vdumas
2eae1e81d1 Enrich dictionary for notify flag on Contact 2021-02-02 18:59:52 +01:00
Pierre Goiffon
ecd282faf1 N°3253 setup redirection : update to be more accessible
Was only doing a redirection using JS
Now we also have a message with a link, plus a meta refresh.

JS redirection was kept as this is quicker than meta refresh (message isn't visible, whereas it is when having meta refresh only)
2021-02-02 18:16:46 +01:00
Pierre Goiffon
765560d1f5 ItopTestCase : helpers to call invisble methods 2021-02-02 17:57:40 +01:00
Eric
bc024d9ed0 N°3660 - Fix JOIN without condition on child joined table is ignored 2021-02-02 17:30:03 +01:00
Stephen Abello
f1d047becf Add a Factory for 'Cancel' buttons, make 'Cancel' buttons alternative, make buttons uppercase 2021-02-02 16:17:03 +01:00
Stephen Abello
50af5d9af1 Add semi bold font to typography 2021-02-02 16:14:33 +01:00
Stephen Abello
494789c02e N°3669 Replace Monorale with Raleway (+ lining figures) 2021-02-02 15:30:33 +01:00
Stephen Abello
63929566d9 Remove debug line from setup 2021-02-02 15:30:33 +01:00
odain
ed3df37176 Merge branch 'feature/3606-twigbase-controller-basichtml' into develop 2021-02-02 11:27:06 +01:00
odain
c736615de1 N°3606: clean symfony useless import 2021-02-02 11:24:06 +01:00
odain
5121ed7c39 N°3606: move whitelist feature from itop core to cbd-mon extension 2021-02-02 10:49:55 +01:00
Eric
4f4ea5c6fa N°3565 - Migrate backoffice pages to new UIBlock system : Setup (move variable) 2021-02-02 08:50:48 +01:00
odain
29a1539379 N°3464: remove useless require in ItopDataTestCase and fix CIs 2021-02-01 18:29:39 +01:00
Eric
2a15fbae4d N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (removed spinner) 2021-02-01 18:02:36 +01:00
Eric
7b5b1c58d3 N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (fix backup status) 2021-02-01 17:58:14 +01:00
Eric
82bf2dab2c N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (fix status) 2021-02-01 17:42:57 +01:00
Eric
694899980c N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (fix last button) 2021-02-01 17:19:02 +01:00
Eric
749ab51651 N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (fix last button) 2021-02-01 16:44:06 +01:00
Eric
fa973c5467 N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (setup page look) 2021-02-01 16:29:31 +01:00
Eric
2f68be14f8 N°3565 - Migrate backoffice pages to new UIBlock system : Setup 2021-02-01 16:28:10 +01:00
jbostoen
37a4a3eb47 🌐 Fix typo in Dutch translations (#189)
Co-authored-by: jbostoen <->
2021-02-01 16:21:10 +01:00
annProg
664dd12241 use strlen() replace empty() 2021-02-01 12:11:31 +01:00
annProg
03190b95cf fix search error when search string '0' 2021-02-01 12:11:31 +01:00
Molkobain
da632c3f0f N°2847 - Improve panel integration regarding the mockups (not done yet) 2021-02-01 12:08:39 +01:00
Molkobain
43290c0ff5 Advanced search: Update unitary tests for PR #170 2021-02-01 12:08:39 +01:00
Pierre Goiffon
590b094ad5 N°3253 setup php check : only use Composer platform_check 2021-02-01 09:38:08 +01:00
Pierre Goiffon
b3e3fe2dc2 🎨 setup index : remove warnings at file end 2021-02-01 08:47:56 +01:00
Pierre Goiffon
d863881591 setup index : remove empty line at the beginning of file 2021-02-01 08:46:45 +01:00
Pierre Goiffon
3e5d0f53d2 N°3253 setup : now displays iTop error instead of Composer platform_check 2021-02-01 08:44:20 +01:00
Pierre Goiffon
29df7fda7e N°3253 setup : change require to trigger Composer's platform_check 2021-02-01 08:35:31 +01:00
Stephen Abello
9ebf0ce1e5 N°3535 Migrate dashboard editor modal to new design 2021-01-29 17:04:00 +01:00
odain
2bb1583995 N°3606: renaming 2021-01-29 10:39:41 +01:00
odain
b98ffc4b8b N°3606: add IP inside iTop error message 2021-01-29 10:01:46 +01:00
odain
818b3632ac N°3606: renaming 2021-01-29 09:24:17 +01:00
Molkobain
7d1a2668a1 N°2847 - Fix object details properties's margins 2021-01-27 21:23:03 +01:00
odain
7677bd7cfe N°3606: authorized_network configured as a list of ip address or networks (no more regexp, IpUtils::checkIp syntax) 2021-01-27 14:36:33 +01:00
acognet
c98881671b Fix name of files : in order to manage the use of "&" character in url 2021-01-27 11:14:54 +01:00
acognet
ef1b7ca82c Remove useless log 2021-01-27 11:14:54 +01:00
acognet
d39d634aba 2284 - Replace JQuery Autocompleter plugin by JQuery UI Autocomplete widget - fix autocomplete on short lists, tab and autoselect item when there is only one option 2021-01-27 11:14:53 +01:00
acognet
c65a760de7 Fix css file-input 2021-01-27 11:14:53 +01:00
Molkobain
8fba402016 N°3208 - Quick create: Fix error when choosing a class from another page than UI.php 2021-01-26 20:15:46 +01:00
Molkobain
0922baee7b Core update: Fix form CSS classes 2021-01-26 20:05:26 +01:00
Molkobain
2a68f13ade Core update: Fix container classes 2021-01-26 16:45:26 +01:00
Eric
2ba01bb408 N°3245 - Move filter of trigger on object update after object update 2021-01-26 16:40:04 +01:00
Molkobain
8c19bc66e4 Core update: Fix not fully fixed (!) regression crashing the confirmation step 2021-01-26 16:24:00 +01:00
Pierre Goiffon
87ee0b8893 📝 N°2329 add PHP bug reference 2021-01-26 16:14:28 +01:00
Eric
92c8af1b19 N°3468 - Fix extension.xml preventing extensions installation 2021-01-26 16:08:30 +01:00
Pierre Goiffon
b85b4d0067 N°3663 Group exception classes in /application/exceptions
Original files kept for compatibility issues :
- core/coreexception.class.inc.php

There are remaining exceptions in /core/oql, but those files are generated
2021-01-26 15:50:26 +01:00
Stephen Abello
5762ac38a7 Add a test (only handle bcrypt and legacy sha256 as we have to maintain PHP 7.1 compatibility) 2021-01-26 09:20:39 +01:00
Stephen Abello
dc804a90d4 Add a setter for config param, use a constant to hold the default hash algo value 2021-01-26 09:20:39 +01:00
Sam B
968720f774 Update core/ormpassword.class.inc.php
Co-authored-by: Thomas Casteleyn <thomas.casteleyn@me.com>
2021-01-26 09:20:39 +01:00
Sam B
7b5244b52d fix docu
Co-authored-by: Thomas Casteleyn <thomas.casteleyn@me.com>
2021-01-26 09:20:39 +01:00
SamB
30d4835fbb ormPassword: allow use of different password hash algo 2021-01-26 09:20:39 +01:00
bruno-ds
dd921e49b6 rollback unit test since the root cause was elsewhere 2021-01-25 10:44:14 +01:00
Molkobain
33a8372409 Core update: Fix regression crashing the confirmation step 2021-01-25 09:26:41 +01:00
Pierre Goiffon
5125a86f8b Merge remote-tracking branch 'origin/support/2.7' into develop 2021-01-25 09:21:36 +01:00
Pierre Goiffon
54e9bd5c8e Merge branch 'support/2.6' into support/2.7
# Conflicts:
#	.editorconfig
2021-01-25 09:13:43 +01:00
Pierre Goiffon
066a6d8b36 🔧 Use same .editorconfig in all supported branches 2021-01-25 09:12:38 +01:00
Eric
b241f03e76 N°3294 - Introduce counters in OQL menu entries (support shortcuts) 2021-01-22 17:43:33 +01:00
Eric
306452679e N°3294 - Introduce counters in OQL menu entries (add comment) 2021-01-22 17:24:26 +01:00
Molkobain
880b88a4ef Code formatting 2021-01-22 17:20:08 +01:00
Molkobain
16dc6b36ba Rename class to match used lib. 2021-01-22 17:20:08 +01:00
Molkobain
7e67661d5f N°3649 - Activity panel: Improve ActivityPanel::IsCaseLogsSubmitAutonomous() robustness 2021-01-22 17:20:08 +01:00
Eric
397cd9b946 N°3294 - Introduce counters in OQL menu entries (fix typo) 2021-01-22 17:19:10 +01:00
Eric
3d29a1e894 Add UIBlocks to twig (Add... methods can be called by specifying their name in the parameters) 2021-01-22 17:16:56 +01:00
Eric
2d93879e7a Add UIBlocks to twig (Add... methods can be called by specifying their name in the parameters) 2021-01-22 17:11:48 +01:00
Pierre Goiffon
4217fa8736 🔧 editor config : fix scss+twig indent
As decided during today's dev team meeting !
We had tab set in .editorConfig in those files, but most of the codebase had 2 spaces for scss and 4 spaces for twig => we decided to change .editorConfig rules to match existing code base

Also adds last PHPStorm version new options
2021-01-22 16:37:57 +01:00
Eric
ff69f9af89 N°3294 - Introduce counters in OQL menu entries (fix when org_id is empty) 2021-01-22 15:42:57 +01:00
Pierre Goiffon
1b2087e52e N°3568 Backup various improvements
- fix path not displayed if not existing
- fix HTML code in warnings & errors
2021-01-22 12:19:52 +01:00
Molkobain
3b31a36473 Navigation menu: Better fix for the previous regression 2021-01-22 12:12:34 +01:00
Molkobain
43fdcab528 Navigation menu: Fix regression introduced in previous commit 2021-01-22 12:08:52 +01:00
acognet
49c2d0c10e N°3528 - Finish silo selection migration 2021-01-22 12:02:44 +01:00
Eric
9db246eb42 N°3438 - Setup: Ignore vendor folder during setup extensions scan 2021-01-22 11:48:25 +01:00
acognet
f1cad5993b N°3528 - Finish silo selection migration 2021-01-22 11:47:17 +01:00
acognet
76fc4e3ee2 Remove development logs 2021-01-22 11:47:17 +01:00
Pierre Goiffon
86dbd8d7a6 N°3568 Update backup page for UiBlocks 2021-01-22 11:46:29 +01:00
Molkobain
36457da4f2 Navigation menu: Remove unnecessary condition 2021-01-22 11:39:49 +01:00
Molkobain
e646dc8a69 Code formatting 2021-01-22 11:39:49 +01:00
Molkobain
1bb6d62c17 PHPDoc and code conventions 2021-01-22 11:39:49 +01:00
Molkobain
2ed785fb06 Restore comment for future refactoring 2021-01-22 11:39:48 +01:00
Eric
01006e55c0 N°3294 - Introduce counters in OQL menu entries (fix when silo changes) 2021-01-22 11:19:14 +01:00
Stephen Abello
46b4990252 N°3632 Move tab's layout preference to preferences page 2021-01-22 10:30:12 +01:00
Eric
b3f1b0e610 N°2677 - Datamodel: Add style definition for class, enum (better tests) 2021-01-22 10:14:25 +01:00
Eric
14d8646734 N°2677 - Datamodel: Add style definition for class, enum (fix wrong conversions) 2021-01-22 09:56:28 +01:00
acognet
5dcddf2317 N°3294 - Introduce counters in OQL menu entries 2021-01-21 17:24:44 +01:00
Stephen Abello
b8aeef1d71 N°3538 * New design for modals
* Fix date picker style
* Move jQueryUI style to vendors/ stylesheet folder
2021-01-21 16:41:06 +01:00
Molkobain
fa0ea7ed77 N°3207 - Global search: Add possibility to open history items in a new tab 2021-01-21 15:52:36 +01:00
acognet
63c1a1d2d3 Fix multi reload of UI.php and js files 2021-01-21 15:35:48 +01:00
Eric
154156f4a1 N°3423 - Allow AttributeImage / AttributeDocument content to be cached by the browser (portal) 2021-01-21 15:24:26 +01:00
acognet
8f1d9fba57 N°3528 - Finish silo selection migration 2021-01-21 15:20:10 +01:00
Molkobain
26d25706f2 UIBlock: Use GetAdditionalCSSClassesAsString() instead of GetAdditionalCSSClasses()|join(' ') in TWIGs 2021-01-21 14:38:05 +01:00
Molkobain
574bd53c37 UIBlock: Fix typo introduced during refactor of the previous commit 2021-01-21 13:00:49 +01:00
Molkobain
1514cd83ab UIBlock: Change $aAdditionalCSSClasses methods to match app. conventions (parameters should be arrays, not space separated string)
Note: This had to be fixed on all calls to this, hence the number of modifications.
2021-01-21 12:59:30 +01:00
Molkobain
7c8019319a UIBlock: Update PHPDoc, fix typo in $aJsTemplatesRelPath property/methods name and fix $aAdditionalCSSClasses initialization 2021-01-21 12:40:42 +01:00
Pierre Goiffon
882fd761a6 🐛 Fix wrong display in dashboards and search pages
Was introduced by f723862d
2021-01-21 11:25:32 +01:00
Eric
3df48f69c6 fix typo 2021-01-21 10:50:24 +01:00
Pierre Goiffon
f723862def Pull up additionalCSSClasses from Button & UiContentBlock to UiBlock
This will allow to use this everywhere !

Before this commit we had :
UiContentBlock
  aCSSClasses
  GetCssClasses
  SetCssClasses // reset + add, existing callers
  AddCSSClasses
Button
  $aAdditionalCSSClasses
  GetAdditionalCSSClass
  AddCSSClasses

Now we have :
UiBlock
  aAdditionalCSSClasses
  AddCSSClasses
  SetCSSClasses
  GetAdditionalCSSClass

Note that there were also some methods in PopoverMenuItem :
PopoverMenuItem
  SetCssClasses
  AddCssClass
  GetCssClasses
As they are indirection to methods in the $oPopupMenuItem attribute, I added to them the "MenuItem" prefix :
  SetMenuItemCssClasses
  AddMenuItemCssClass
  GetMenuItemCssClasses
Didn't find any use to change.
2021-01-21 10:49:31 +01:00
Eric
26f800d488 N°3423 - Allow AttributeImage / AttributeDocument content to be cached by the browser (console) 2021-01-21 10:44:23 +01:00
Eric
1fb15a421a Move class in its own file 2021-01-21 09:56:03 +01:00
Molkobain
4816d1e943 N°2847 - Add style for scrollbars throughout the whole application, not only the nav. menu 2021-01-20 19:01:32 +01:00
Molkobain
e440667d69 N°3649 - Activity panel: Set first case log as the active instead of the activity one 2021-01-20 19:01:31 +01:00
Molkobain
cebc51e045 N°3649 - Activity panel: Remove entry form from the activity tab, only case log tabs will have one 2021-01-20 19:01:31 +01:00
Molkobain
16ca856996 N°3532 - Activity panel: Add support for readonly / hidden flags on caselogs 2021-01-20 19:01:31 +01:00
Molkobain
cb955ee84f Remove unnecessary overloaded constants 2021-01-20 19:01:31 +01:00
Molkobain
de45557635 Update autoloaders 2021-01-20 19:01:30 +01:00
Molkobain
6ac1cc4831 N°3567 - PHPDoc and coding conventions fixes 2021-01-20 19:01:30 +01:00
Eric
959cecf891 N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (Fix default values and typos) 2021-01-20 15:01:27 +01:00
Molkobain
d54e156ec2 N°3207 - Global search: Keep input open and focus at the end of the query when running a search 2021-01-20 11:04:17 +01:00
Eric
54c5c8c016 Merge remote-tracking branch 'origin/develop' into feature/MVCTwigTags3.0 2021-01-20 10:43:12 +01:00
Eric
9b67f7beba N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (use ibo-is-hidden class to hide blocks) 2021-01-20 10:41:04 +01:00
Molkobain
b4caa97e69 Replace utils::HtmlEntities() with utils::EscapeHtml() in the global search and quick create blocks 2021-01-20 09:57:23 +01:00
Molkobain
de7cd679ba PHPDoc 2021-01-20 09:35:48 +01:00
Eric
392cdf6058 N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (display twig errors) 2021-01-19 18:09:58 +01:00
Molkobain
8ddbadacec N°3207 - Global search: Fix current search not displayed in the history results 2021-01-19 17:44:07 +01:00
Eric
6dd1807fca N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade (remove UIHtml from twig) 2021-01-19 17:24:09 +01:00
Eric
01c4dff035 Add UIBlocks to twig (Changed classes name) 2021-01-19 17:23:09 +01:00
Molkobain
cb6a8fccb9 N°3207 - Global search: Fix "Tab" navigation no longer passing over history items 2021-01-19 17:10:52 +01:00
Eric
c15a60170d remove build scripts from autoload 2021-01-19 16:53:00 +01:00
Eric
82f4f47cf3 N°2737 - ExtraParams check in DisplayBlock 2021-01-19 16:51:10 +01:00
Molkobain
aa2651ca71 N°3208 - Quick create: Fix several items:
- Tab navigation no longer passing over history items
- Autocomplete results selection can now be done via up/down arrows
2021-01-19 16:00:30 +01:00
Molkobain
cb28ca7941 N°2836 - Change bubbles colors to something more neutral 2021-01-18 17:10:40 +01:00
Molkobain
527154f0be N°1957 - Navigation menu: Update hint sentence 2021-01-18 15:41:08 +01:00
Molkobain
f4b9b0b313 N°3628 - Navigation menu: Add visual hint on toggler when silo applied 2021-01-18 15:41:08 +01:00
Molkobain
daba1d3bba N°3628 - Navigation menu: Menu drawer can now be closed by clicking again on the active menu group 2021-01-18 15:41:08 +01:00
Molkobain
d57e368b03 N°3628 - Navigation menu: App. logo URL redirects to the home page by default, but is still customizable through 'app_icon_url' 2021-01-18 15:41:07 +01:00
Molkobain
9f962eb40f Add Config::IsCustomValue($sPropCode) method to know if a parameter has been changed or not 2021-01-18 15:41:07 +01:00
Eric
79d0b9543a Add UIBlocks to twig 2021-01-18 15:27:20 +01:00
Pierre Goiffon
7d9f73f650 N°3537 run_query : add missing tooltip on evaluate button
This extra text contains the shortcut info, so we must print this !
2021-01-18 14:55:17 +01:00
Eric
ace0657b7d Add UIBlocks to twig (Use file cache) 2021-01-18 13:59:29 +01:00
Eric
4afb374f6a N°3567 - Migrate backoffice pages to new UIBlock system : App. upgrade 2021-01-18 13:59:29 +01:00
Eric
648cfd9af4 Add UIBlocks to twig (Generalize IsHidden parameter) 2021-01-18 13:59:29 +01:00
Eric
5fe8ca178e Add UIBlocks to twig (CollapsibleSection, FieldBadge, Panel) 2021-01-18 13:59:28 +01:00
Eric
63eb0f1530 Add UIBlocks to twig (Spinner) 2021-01-18 13:59:28 +01:00
Eric
21740123f4 Add UIBlocks to twig (generic parser and node)
# Conflicts:
#	pages/run_query.php
#	test/VisualTest/Backoffice/RenderAllUiBlocks.php
2021-01-18 12:09:07 +01:00
Eric
2aae6cd744 Add UIBlocks to twig (Use sub-blocks for alerts and fields) 2021-01-18 12:03:33 +01:00
Eric
d8316a090a Add UIBlocks to twig (DataTable, Form, Input) 2021-01-18 12:03:32 +01:00
Eric
e51fd028fa Add UIBlocks to twig (changed UIContentBlock params) 2021-01-18 12:03:32 +01:00
Eric
bffb7b5eab Add UIBlocks to twig (new blocks) 2021-01-18 12:03:32 +01:00
Eric
77808ecd41 Add UIBlocks to twig (WIP) 2021-01-18 12:03:31 +01:00
Stephen Abello
2b798baffc N°3560 Add title to scrollable tabs content 2021-01-18 11:56:04 +01:00
odain
07347663d6 N°3606: php doc + handle empty token/whiteliste param usecase 2021-01-18 09:37:19 +01:00
odain
9ab1a0d437 N°3606: provide a token access instead of login + network white list restriction 2021-01-18 09:37:19 +01:00
Molkobain
04b4749510 N°1957 - Navigation menu: Show (dismissable) hint for the menu filter 2021-01-18 09:28:17 +01:00
Molkobain
ad6646afaf N°1957 - Navigation menu: Fix several bugs with menus filter
- Placeholder font style
- Results do not scroll under the filter input anymore
2021-01-18 09:28:16 +01:00
Molkobain
7e3d414e9e Navigation menu: Fix menu counters being over the filter input 2021-01-18 09:28:16 +01:00
Molkobain
c117f8a5ab Navigation menu: Fix placeholder hint placement 2021-01-18 09:28:16 +01:00
Molkobain
b8d6918f71 N°1957 - Fix clear icon that was not longer shown 2021-01-18 09:28:15 +01:00
Pierre Goiffon
2f10f24317 Rename \Combodo\iTop\Application\UI\Base\Component\Html\HtmlFactory::MakeP to MakeParagraph 2021-01-15 13:50:47 +01:00
Pierre Goiffon
ec8a1af2a5 N°3537 fix run_query asking value when using :current_contact
:current_contact is a magic arg and value is set by iTop ORM, so we shouldn't ask the user to provide it !

It was working as expected with :current_user

This is a 3.0.0 regression
2021-01-15 12:05:53 +01:00
Stephen Abello
cd39d6a817 Use widget properties instead of hardcoded css classes in tab-container widget 2021-01-15 11:44:59 +01:00
Stephen Abello
ad08376f6e Move ScrollMagic under npm dependency 2021-01-15 11:18:34 +01:00
bruno-ds
71d3713950 N°3651 - add a (commented out) test to prove the bug
just uncomment to use the test.
2021-01-15 11:14:36 +01:00
Stephen Abello
137b4e55c4 N°3560 Allow to scroll vertically through tabs content. User can activate this feature in preference page 2021-01-15 11:03:08 +01:00
odain
b51d7409c1 N°3606: renaming 2021-01-15 11:02:37 +01:00
Pierre Goiffon
442e9598f8 N°3537 run_query : fix query suggestion button
Was throwing plain old HTML
Now use standard button component, and a new HtmlFactory to avoid calling \WebPage::GetP

Also change "use this query" behavior : now also submits the form directly

And : added a TODO 3.0.0 for the "query examples" buttons (will be done later)
2021-01-15 09:30:39 +01:00
Pierre Goiffon
a41229b223 N°3537 run_query : fix cannot set query arguments values 2021-01-14 17:37:38 +01:00
Pierre Goiffon
f1b972dde8 AbstractInput : add missing abstract keyword 2021-01-14 17:04:47 +01:00
Pierre Goiffon
9a5e86caea N°3617 User pref keys : add prefix and normalize naming
4 keys existing :
* notification help message => UI-Collapsible__notifications__home
* run_query "more info" section => UI-Collapsible__run_query__more-info
* RenderAllUiBlocks test page alert and section examples => UI-Collapsible__RenderAllUiBlocks__alert and UI-Collapsible__RenderAllUiBlocks__section
2021-01-14 10:08:15 +01:00
Molkobain
8df2f96dfe N°3627 - Fix "global search" results page URL not containing the query 2021-01-13 21:20:41 +01:00
Molkobain
0f72a35f48 N°3625 - Remove n:n classes from the "quick create" autocomplete 2021-01-13 21:00:20 +01:00
Molkobain
a4d52aa255 Add new MetaModel::IsLinkClass($sClass) to avoid iterating over MetaModel::GetLinkClasses() 2021-01-13 21:00:19 +01:00
Pierre Goiffon
09e531f11c N°3623 new \utils::EscapeHtml method 2021-01-13 16:10:43 +01:00
Pierre Goiffon
958566da61 Merge remote-tracking branch 'origin/support/2.7' into develop
# Conflicts:
#	application/webpage.class.inc.php
2021-01-13 15:25:24 +01:00
Molkobain
ace6215d20 N°3622 - Change "quick create" placeholder image to something with less orange 2021-01-13 11:29:22 +01:00
bruno-ds
97792ab0b1 N°3618 - add a (skipped by default) test to prove the bug
just uncomment the two 1st lines in order to use the test.
2021-01-13 11:12:34 +01:00
Molkobain
574b6609ba N°3622 - Change "quick create" and "global search" placeholders images to something less ambiguous 2021-01-13 11:11:52 +01:00
Molkobain
0a4db9bd50 N°3621 - Add config. parameter to disable "global search" history 2021-01-13 10:53:11 +01:00
Molkobain
9fccb6dd3f N°2847 - Global search: Fix wrong history results parameter (was using the one from "quick create") 2021-01-13 10:47:03 +01:00
Molkobain
9221899525 N°3620 - Add confg. parameter to disable "quick create" history 2021-01-13 10:40:51 +01:00
Pierre Goiffon
6a33fbc7b3 N°3617 run_query "more information" section : collapsible state is saved back again
The original key name was "runQuery" (f9511aba) but this was too vague and didn't follow naming conventions. SO I decided to renamed it "run_query__more-info", as anyway existing keys won't be used (see 790a675d)
2021-01-13 09:34:24 +01:00
Pierre Goiffon
790a675d90 N°3617 collapsible components state saving : use user pref instead of localStorage
No migration from existing localStorage keys (introduced in 2.5.0 with N°1030) as the console UI has dramatically change in 3.0.0 : will be useful to show all the collapsible sections content once again !

Note that an iTop instance identifier was used in the localStorage key, it is no longer needed as we're getting the user pref directly from the current instance.

Thanks @Molkobain for the help !
2021-01-13 09:33:44 +01:00
Pierre Goiffon
09da54ee56 N°3617 collapsible components state saving : use JQuery widget options instead of a method
This is the way JQuery widget are intended to work !
Thanks @Molkobain for the review !
2021-01-13 09:29:58 +01:00
Eric
028a3ccec8 N°2677 - Add style definition for classes (too much style) 2021-01-13 08:58:27 +01:00
Eric
503817e572 N°2737 - Migrate WebPage::table() to UIBlocks 2021-01-12 16:17:33 +01:00
Molkobain
e0fe657f27 N°2677 - Fix regression introduced in previous commit (itop-request-mgmt-itil DM not completely migrated) 2021-01-12 15:49:00 +01:00
acognet
3a83d2ad89 N°2737 - Migrate table to DataTables plugin to be iso with the end-users portal - fix actions doesn't work after class change 2021-01-12 11:00:46 +01:00
acognet
ccb6bb943c N°2737 - Migrate table to DataTables plugin to be iso with the end-users portal - fix actions doesn't work after class change 2021-01-12 10:34:24 +01:00
Eric
f0307afe2b N°2677 - Add style definition for classes (change code tag) 2021-01-12 10:20:59 +01:00
Eric
05b75cf98a N°2311 - deprecate 'cas_include_path' configuration parameter 2021-01-11 14:34:55 +01:00
Eric
24a6d6b6fd N°2677 - Add style definition for classes (change code tag) 2021-01-11 12:18:33 +01:00
acognet
cdaf431d24 N°2508 - Include Obsolescence icon within list and autocomplete - cleanup code never used 2021-01-08 10:57:30 +01:00
acognet
cf1f49ebc9 N°3604 - Auto refresh no more working on menu 3.0 2021-01-08 09:50:43 +01:00
acognet
06ecfb5814 N°2508 - Include Obsolescence icon within list and autocomplete - case of search filters 2021-01-08 09:48:35 +01:00
acognet
354fc1949b N°2737 - Migrate table to DataTables plugin to be iso with the end-users portal - fix test on $bShowObsoleteData for display message 2021-01-08 09:43:57 +01:00
Eric
fc2b220197 N°2311 - deprecate 'cas_include_path' configuration parameter 2021-01-07 15:58:12 +01:00
odain
acea2110ac N°3606 - Add a basic html page type to TwigBase Controller 2021-01-07 10:35:39 +01:00
acognet
176111794e N°2737 - Migrate table to DataTables plugin to be iso with the end-users portal - fix enable/disable add button 2021-01-07 09:58:36 +01:00
Eric
3e051e38c3 N°2677 - Add style definition for classes (fix XML migration) 2021-01-06 16:10:12 +01:00
Eric
d4aeb4b157 N°2677 - Add style definition for classes 2021-01-06 14:06:46 +01:00
Eric
fca123e127 Fix setup when maintenance mode is active 2021-01-06 14:06:46 +01:00
Molkobain
dc2f8fe9bb N°3594 - Fix label when an attribute is an external field on a remote external key 2021-01-06 13:59:49 +01:00
acognet
f10d3893f4 N°2737 - Migrate table to DataTables plugin to be iso with the end-users portal - fix change in "configure this list" 2021-01-06 11:30:08 +01:00
Stephen Abello
05cf1bc83a N°2847 Add JQueryUI modal CSS to modal SCSS file 2021-01-06 11:19:43 +01:00
acognet
3791306be7 3540 - Migrate printable version of an object - management of the activities of an object 2021-01-06 09:40:30 +01:00
Stephen Abello
1353917994 💚 Fix CI by removing precompile stylesheet 2021-01-05 17:51:34 +01:00
Stephen Abello
5ef75772f0 N°3516 Add Fullmoon 🌕 to theme mechanism, update test-red theme for 3.0 2021-01-05 17:16:30 +01:00
Eric
82e98ced85 N°2677 - Add style definition for enums (MetaModel::GetEnumStyle() API) 2021-01-05 13:45:23 +01:00
Eric
2dea5447b4 N°2677 - Add style definition for enums (Default values) 2021-01-05 11:07:18 +01:00
Molkobain
9aa379981e N°2847 - Remove unused SCSS files 2021-01-04 14:08:44 +01:00
Molkobain
050c00c791 N°2847 - Add SCSS shame file for hacks (https://sass-guidelin.es/#shame-file) 2021-01-04 10:20:52 +01:00
Eric
551689d445 N°2677 - Add style definition for enums (Fix CI) 2021-01-04 09:05:36 +01:00
Eric
dd4d40ce81 N°2677 - Add style definition for enums (Fix list display) 2020-12-31 17:02:44 +01:00
Eric
d77f374918 N°2677 - Add style definition for enums (refactor & fix CI) 2020-12-31 16:34:59 +01:00
Eric
640b6a7288 N°2677 - Add style definition for enums (fix CI) 2020-12-31 13:22:01 +01:00
Eric
5128833a62 N°2677 - Add style definition for enums (fix CI) 2020-12-31 12:02:43 +01:00
Eric
f1ad55c86c N°2677 - Add style definition for enums 2020-12-31 11:25:00 +01:00
Eric
e20f6d7564 N°3540 - Migrate printable version of an object (dashboard) 2020-12-29 18:31:59 +01:00
Eric
ec26a8d343 N°2737 - ExtraParams check in DisplayBlock 2020-12-29 18:31:09 +01:00
Eric
542be44740 N°2737 - ExtraParams check in DisplayBlock 2020-12-29 11:57:14 +01:00
denis.flaven@combodo.com
cdbb783ebc N°3584 - declare the TagSetFieldData class for information in the meta XML 2020-12-29 11:56:33 +01:00
Eric
e602a93829 N°2737 - ExtraParams check in DisplayBlock 2020-12-29 11:41:01 +01:00
Eric
b7bcd4fe7b N°2737 - Fix export dialog 2020-12-28 16:03:46 +01:00
Eric
f01bec4003 Fix Setup (remove double ajax calls) 2020-12-28 11:23:21 +01:00
Pierre Goiffon
9be3ff3cca N°3564 Use CollapsibleSectionState for help 2020-12-24 11:48:30 +01:00
Pierre Goiffon
2c0d001721 N°3564 Alert and CollapsibleSectionState can now be saved 2020-12-24 11:48:30 +01:00
Pierre Goiffon
d3efd3ea0e 🎨 N°3563 user preferences page : some formatting 2020-12-24 10:04:50 +01:00
Pierre Goiffon
e18df16387 N°3583 update max items per list from 10 to 20 2020-12-24 09:59:19 +01:00
Molkobain
4ddfbf6559 N°3477 - Rename methods of the new iPageUIBlockExtension API 2020-12-23 16:25:36 +01:00
Molkobain
1d02ada8dc Update other dictionaries to mark modified entry (other languages are already ok) 2020-12-23 15:48:02 +01:00
Molkobain
608c868b53 N°3561 - Fix all header messages (readonly, log kpi, app. messages, archive mode, ...) 2020-12-23 14:53:06 +01:00
Molkobain
65639517ff N°2847 - Alert: Fix layout when either title or body is empty 2020-12-23 14:38:34 +01:00
Molkobain
1f64e4eda4 Change dictionary for a simpler message 2020-12-23 10:54:53 +01:00
Molkobain
7a446941e0 N°3123 - Fix list dashlet not displaying object type anymore 2020-12-23 10:53:46 +01:00
Molkobain
0a87ccaa77 PHPDoc fixes 2020-12-23 09:53:01 +01:00
Molkobain
06a829ce35 N°2847 - Alert: Rework $bIsOpenedByDefault property integration 2020-12-22 18:22:59 +01:00
Molkobain
fc3f096823 N°2847 - Alert: Add properties to set if closable or collapsible 2020-12-22 18:22:59 +01:00
Molkobain
874bf38316 N°2844 - Fix object panel layout during a transition 2020-12-22 18:22:58 +01:00
Molkobain
27eb3a8509 N°3518 - Start refactor of object details to match block / template design 2020-12-22 18:22:58 +01:00
Molkobain
c14476ec73 N°3518 - Refactor some parts of the WebPage for a better overloading in derivated classes 2020-12-22 18:22:58 +01:00
Molkobain
c3b8abee47 N°2847 - Fix icon not displaying for global search and quick create boxes 2020-12-22 18:22:58 +01:00
Molkobain
ece8803259 N°2127 - Add possibility to exit fullscreen with "Esc" key 2020-12-22 18:22:58 +01:00
Pierre Goiffon
4541aa4446 N°3537 run_query : use H2 for content titles 2020-12-22 18:20:36 +01:00
Pierre Goiffon
679b25f3fb 🗑️ Deprecate WebPage collapsible section methods 2020-12-22 18:09:19 +01:00
Pierre Goiffon
337aebfed9 N°3537 run_query : use panel for OQL error 2020-12-22 17:47:10 +01:00
Pierre Goiffon
5e22c442ce N°3537 new CollapsibleSection component for run_query 2020-12-22 17:18:13 +01:00
Pierre Goiffon
4ebe3d2b2f Fix null returned by Field::IsHidden 2020-12-21 15:23:46 +01:00
jbostoen
4123c6213d 🌐 NL : distinguish between approval (goedkeuring) <=> acceptance (acceptatie) (#182)
Co-authored-by: jbostoen <->
2020-12-21 14:08:29 +01:00
odain
4089e853f8 N°3562 - Cleanup removed images - fix ci 2020-12-21 10:57:29 +01:00
odain
c1fc502916 N°3562 - Cleanup removed images in light-grey.scss 2020-12-21 10:27:23 +01:00
odain
a1030e3f81 clean light-grey.scss from non existing images 2020-12-21 10:08:36 +01:00
Eric
ffc0bd0a9c N°3540 - Migrate printable version of an object (fix js error) 2020-12-18 18:02:43 +01:00
Pierre Goiffon
8dddf90838 ♻️ new var_export filter for bolean values 2020-12-18 17:51:43 +01:00
Eric
2608c071d0 N°3540 - Migrate printable version of an object (change some css classes) 2020-12-18 16:06:51 +01:00
acognet
1f4d1d1959 N°3540 - Migrate printable version of an object 2020-12-18 11:46:05 +01:00
acognet
3876fb9d62 N°3540 - Migrate printable version of an object 2020-12-18 11:41:31 +01:00
Pierre Goiffon
c8dbf88c03 ♻️ new FieldFactory
Idea is to remove the aParams parameter from the Field object
And also allow to pass subblocks for the input value instead of only raw HTML
2020-12-18 11:32:13 +01:00
Molkobain
f8b8dd0bc6 Alert: Rename event callback to match conventions 2020-12-17 16:01:21 +01:00
Molkobain
efe61c7b14 N°2844 - Activity panel: Fix user medallion not displayed when filtering entries 2020-12-17 15:33:57 +01:00
Molkobain
d664c26fb7 N°2127 - Fix fullscreen closing on content click 2020-12-17 13:37:04 +01:00
Molkobain
47cebb8671 N°2127 - Fix visual glitch when several large fields in the form 2020-12-17 13:09:11 +01:00
Molkobain
f525e161a8 N°2127 - Fix field content overlapping on rest of the UI (Backoffice) 2020-12-17 12:12:04 +01:00
Molkobain
a00c573866 Add JS helpers to CombodoBackofficeToolbox to put/remove an element from fullscreen mode 2020-12-17 12:12:04 +01:00
Molkobain
745ffc7cd2 N°3379 - Improve hint display (not definitive) 2020-12-17 12:12:03 +01:00
Pierre Goiffon
dbece17235 Alert : use same data-role value for all collapsible actions 2020-12-17 09:08:45 +01:00
vdumas
ceb48c2ead Enrich dictionary for notify flag on Contact 2020-12-16 18:43:28 +01:00
Pierre Goiffon
9580a20f3f Alert component : title is now clickable to expand/collapse 2020-12-16 18:03:52 +01:00
Pierre Goiffon
85e9073228 N°3537 run_query : use Field instead of InputWithLabel 2020-12-16 17:45:13 +01:00
Pierre Goiffon
2b0691daa6 N°3537 run_query : exception message as an alert Component 2020-12-16 17:45:12 +01:00
Eric
c1e25b121e N°2737 - ExtraParams check in DisplayBlock 2020-12-16 17:44:08 +01:00
Eric
31f3bf9368 N°2847 - move console specific methods from BlockRenderer to ConsoleBlockRenderer 2020-12-16 17:44:08 +01:00
Thomas Casteleyn
42354ba794 Improve secure connection detection (#161)
The previous code broke the setup page when the iTop server is behind a proxy that handles SSL termination.
Now the detection also checks the `HTTP_X_FORWARDED_PROTO` and `HTTP_X_FORWARDED_PROTOCOL` HTTP headers. 
For any other page than the setup, the check is unchanged.

Many thanks @Hipska !
2020-12-16 15:37:48 +01:00
Eric
1b115624a2 N°2737 - RenderBlockTemplate enhancement, uilinkswidget UIBlock refactor 2020-12-16 11:05:30 +01:00
Eric
d2bc651fc6 N°3123 - ExtraParams check 2020-12-16 09:05:05 +01:00
Pierre Goiffon
a20fd2278f N°3537 Code review
Thanks @Molkobain !
2020-12-16 08:06:53 +01:00
Pierre Goiffon
cb4fb15b0a Alert : remove return type 2020-12-16 07:56:13 +01:00
Pierre Goiffon
102123441d Alert component : fix regression introduced in 3d27e592 2020-12-15 17:22:38 +01:00
Pierre Goiffon
4bb59548d0 N°3537 run_query : replace main form by components 2020-12-15 17:09:39 +01:00
Pierre Goiffon
3d27e59269 Alert component : allow to be closed by default 2020-12-15 17:08:54 +01:00
Pierre Goiffon
ebe30a88a1 N°3129 remove useless final keywords 2020-12-15 16:27:00 +01:00
Pierre Goiffon
a5d26b93e9 ThemeHandlerTest : rename source files
They are used solely in the test. And the test does the SCSS compilation and compares the results to expected files. So changing anything in the test source SCSS and we need to change the expected results too ! This isn"t necessary...

But there were some confusions as the css/light-grey.scss file is modified very often, and one of the test source file has the same name !
Adding the prefix DO_NOT_CHANGE should avoid such errors in the future O:)
2020-12-15 16:24:31 +01:00
Eric
afca91089a N°3123 - ExtraParams check 2020-12-15 14:57:06 +01:00
Eric
893787d7f9 Fix typo 2020-12-15 14:46:03 +01:00
Eric
a9bab22720 N°3123 - ExtraParams check (only in dev) 2020-12-15 14:46:02 +01:00
Molkobain
13018c9df7 Fix CI due to 64fca330 2020-12-15 13:23:27 +01:00
Eric
c451293370 N°3123 - ExtraParams check 2020-12-15 12:14:10 +01:00
Molkobain
64fca3306f N°3547 - Fix fullscreen button on HTML field not displaying correctly 2020-12-15 11:39:06 +01:00
Pierre Goiffon
3cce93be95 UIExtKeyWidget : Fix parameters that must be optionals 2020-12-15 10:24:59 +01:00
odain
916f9b367e Merge branch 'feature/restapi-pass-jsondata-asfile2' into develop 2020-12-14 23:22:52 +01:00
odain
c6816318a9 N°3455: test when no json_data is passed 2020-12-14 23:19:54 +01:00
Eric
9df80b9f79 N°3123 - Fix table counts on search results 2020-12-14 18:31:32 +01:00
odain
59e9cdbfe6 N°3455: review with Romain (new code documented) 2020-12-14 18:23:31 +01:00
odain
7f0e8abc09 N°3455: clean code + test after review 2020-12-14 18:22:15 +01:00
Eric
c106caf924 N°3123 - Fix dashlets GroupBy and Object List 2020-12-14 16:37:23 +01:00
Pierre Goiffon
c06e176d57 Templates : remove auto closing tags
We are not using XHTML anymore but HTML 5
2020-12-14 16:29:57 +01:00
Pierre Goiffon
62bb0b9b78 Improve RenderAllUiBlocks 2020-12-14 15:42:56 +01:00
Eric
70beeb726a N°3123 - Fix "view_link" parameter for shortcuts preferences 2020-12-14 09:54:01 +01:00
acognet
c173f0b5d6 N°3123 : Fix create shortcuts and set preferences 2020-12-14 09:23:12 +01:00
acognet
43a2b5cda6 N°3123 : Fix create shortcuts and set preferences 2020-12-11 19:23:35 +01:00
Pierre Goiffon
17cecde604 Fix errors in setup/modelfactory.class.inc.php 2020-12-11 10:49:41 +01:00
Pierre Goiffon
728c09d97d N°3129 Fix compatibility with PHP 8 for \MFElement::ReplaceWith
New method added in PHP 8 : \DOMChildNode::replaceWith with a different signature (both visibility and parameters)
2020-12-11 10:13:10 +01:00
acognet
eb89c52bae N°3123 : Fix create shortcuts 2020-12-11 10:08:57 +01:00
Pierre Goiffon
e3895f284b N°3512 fix setup crashing if env-production doesn't exist 2020-12-11 09:26:19 +01:00
Pierre Goiffon
50342b6dfe Update compiled CSS 2020-12-10 18:28:03 +01:00
Pierre Goiffon
8265b9b034 N°3416 fix PHPDoc 2020-12-10 18:10:45 +01:00
Pierre Goiffon
96e7f57a34 Merge remote-tracking branch 'origin/support/2.7' into develop
# Conflicts:
#	application/ajaxwebpage.class.inc.php
#	application/csvpage.class.inc.php
#	application/itopwebpage.class.inc.php
#	application/webpage.class.inc.php
#	application/xmlpage.class.inc.php
#	core/config.class.inc.php
#	css/css-variables.scss
#	datamodels/2.x/version.xml
#	pages/ajax.document.php
#	pages/ajax.render.php
#	pages/ajax.searchform.php
#	sources/application/TwigBase/Controller/Controller.php
2020-12-10 18:08:11 +01:00
Molkobain
abf6d5422e Merge remote-tracking branch 'origin/feature/faf-cke-mentions' into develop 2020-12-10 17:50:07 +01:00
Eric
2bef89137e N°3123 - DataTables rework (WIP) 2020-12-10 17:13:15 +01:00
Stephen Abello
a0ac1c70a9 N°2847 * Update CKeditor to 4.15.1
* Add iTop default languages to ckeditor
* Change CKeditor skin from flat to Moono-Lisa
2020-12-10 12:12:13 +01:00
Stephen Abello
1ccabe645b N°2847 * Update CKeditor to 4.15.1
* Add iTop default languages to ckeditor
* Change CKeditor skin from flat to Moono-Lisa
2020-12-10 11:18:09 +01:00
Pierre Goiffon
b03c5232b0 N°3253 Fix setup error message
Thanks @Hipska and @Molkobain !
2020-12-10 10:31:58 +01:00
Molkobain
97c77b612e N°2875 - Add config. param. 'mentions.allowed_classes' to choose which classes (eg. Person / FunctionalCI) can be mentioned through which char. (eg. @ / #) 2020-12-10 10:27:34 +01:00
Molkobain
e96400c43b N°2875 - Improve global implementation and integration with the trigger system 2020-12-09 23:19:39 +01:00
Molkobain
c22f019ea1 N°2847 - Add data-[role|object-class|object-id] attributes to the HTML sanitizer white list for anchors 2020-12-09 22:23:37 +01:00
Molkobain
bc3c46b566 N°2847 - Rework ckeditor SCSS to proper files and variables 2020-12-09 22:08:46 +01:00
Molkobain
a8431c5810 N°2875 - Update branch to current develop branch state 2020-12-09 20:06:40 +01:00
Molkobain
68332896ad Merge branch 'develop' into feature/faf-cke-mentions
# Conflicts:
#	application/cmdbabstract.class.inc.php
#	css/css-variables.scss
#	css/light-grey.scss
#	datamodels/2.x/installation.xml
2020-12-09 19:58:26 +01:00
Stephen Abello
dbda9512e5 N°2560 Prevent double submit on forms 2020-12-09 15:48:06 +01:00
Pierre Goiffon
c4756e8cec Upgrade version n° 2020-12-08 18:47:24 +01:00
Eric
b8a42843e0 N°3123 - DisplayBock BlockCvs 2020-12-08 16:29:16 +01:00
acognet
10c3f9f633 N°3123 : Improved JavaScript management in web pages and ajax pages - fix for datatable 2020-12-08 11:04:46 +01:00
Eric
05e802b74a N°3123 - Fix create new object link 2020-12-08 10:13:05 +01:00
acognet
0c8d78d753 N°3123 : refactoring ajax call for datatables 2020-12-08 09:38:24 +01:00
acognet
5ccb12453a N°3123 : Improved JavaScript management in web pages and ajax pages 2020-12-08 08:59:25 +01:00
odain
37351d6b3e N°3464: fix ci 2020-12-07 16:23:17 +01:00
odain
57a085eec1 N°3464: move fix in itop-fence + fix/enhance rest api test 2020-12-07 15:56:35 +01:00
Eric
0808a76226 N°3123 - Fix empty popup menus 2020-12-07 14:29:01 +01:00
odain
0019595923 N°3464: fix ci 2020-12-07 00:44:39 +01:00
odain
4d61c14f80 N°3464 add test in phpunit.xml.dit to validate the fix 2020-12-07 00:12:31 +01:00
odain
cf1b613923 N°3464 REST comment field not working anymore 2020-12-06 23:54:27 +01:00
Molkobain
815b2e1670 N°2847 - Restore components/layouts SCSS files to keep matching SCSS conventions 2020-12-04 23:03:17 +01:00
Pierre Goiffon
c46b046254 N°3253 Fix setup always displaying an error
Woops this was a debug I forgot to change
2020-12-04 18:30:28 +01:00
Pierre Goiffon
70efa37109 N°3253 Fix setup crashing on incompatible PHP versions (#178)
We now have a new setup landing page. The old one is renamed setup/wizard.php

This contains revert for "🐛 Fix setup homepage error with PHP < 7.1.0" (91c6916d86) => it was one of the modifications that caused the setup to crash before this !
2020-12-04 18:28:39 +01:00
Stephen Abello
13d2699011 N°2629 Allow user to choose default expanded/collapsed toolbar for richtext editors 2020-12-04 10:53:22 +01:00
Pierre Goiffon
1304e2eb2d N°3416 Updates after code review v2 :) 2020-12-04 08:51:07 +01:00
Pierre Goiffon
3cf16627c1 Merge remote-tracking branch 'origin/support/2.6' into support/2.7
# Conflicts:
#	pages/ajax.render.php
2020-12-03 18:18:36 +01:00
Pierre Goiffon
4aaa237bf9 🔖 Prepare 2.7.3 version 2020-12-03 18:15:58 +01:00
Pierre Goiffon
cece15d10c N°3416 Updates after code review
Many thanks @bruno-ds !
* add comments to explain intentions
* fix indentations
2020-12-03 17:45:44 +01:00
Stephen Abello
cc6e9492fd N°2847 Fix blocks import paths in notifications following directories refactor 2020-12-03 15:26:40 +01:00
Stephen Abello
7f97df02ce N°2847 Add TODO to datamodel viewer 2020-12-03 15:04:57 +01:00
Stephen Abello
f28fc15a8d N°2847 Replace Notifications page header by an Alert block 2020-12-03 15:04:56 +01:00
Thomas Casteleyn
59f9cd3694 🎨 Fix the filter icon on Data model page (#168)
Fix the filter icon on Data model page
2020-12-03 13:28:59 +01:00
Pierre Goiffon
aa15e009cb 🔖 Prepare 2.7.2-2 version 2020-12-03 10:05:37 +01:00
Pierre Goiffon
b9ca2ac13d N°3416 Fix DocumentFile preview not working anymore
Was caused by X-Frame-Options http header added with N°3317

(cherry picked from commit 35d77ff642)

# Conflicts:
#	pages/ajax.render.php
2020-12-03 08:20:51 +01:00
Pierre Goiffon
80e1e0e61a N°3426 Fix no navigation menu on User object creation
Caused by a typo in js/forms-json-utils.js
Thanks @Molkobain !
2020-12-02 18:02:00 +01:00
Pierre Goiffon
ecebe4ecd5 N°3416 XFrame and cache headers optimizations
* Remove XFrame header set in \WebPage::no_cache : not this method responsability, was confusing :/
* Remove no_cache() calls when already set in page constructor (ajax_page mainly)
* Also calls everywhere the \WebPage::no_cache method instead of setting headers manually
2020-12-02 17:19:05 +01:00
Pierre Goiffon
8bfcb14d0c N°3416 XFrame-Options header is now set using a config parameter, defaults to SAMEORIGIN
Also adds an indirection (\WebPage::add_xframe_options) to set header
2020-12-02 17:17:11 +01:00
Molkobain
1cf1473d6b N°3469 - Fix variable declaration (let => var) 🤭 2020-12-02 17:01:00 +01:00
Molkobain
aa43425df3 N°3469 - Portal: Fix modal created without an ID 2020-12-02 16:59:39 +01:00
Pierre Goiffon
35d77ff642 N°3416 Fix DocumentFile preview not working anymore
Was caused by X-Frame-Options http header added with N°3317
2020-12-02 15:44:58 +01:00
Eric
2575fd6f4d N°3123 - Refactor default constants 2020-12-02 13:22:43 +01:00
Eric
15aa9e508c N°3123 - Refactor Directories 2020-12-02 13:18:01 +01:00
Stephen Abello
d1b12ee04b N°2251 Replace qtip calls by tippyjs calls 2020-12-02 10:06:24 +01:00
Pierre Goiffon
1252d760ab RenderAllUiBlocks improvements
* add call to ButtonFactory::MakeIconLink
* add some CSS customizations to h1, h2, HR
* add H2 with id to link to specific regions
* add @link PHPDoc in related components
* fix typo in alerts (title was using "alert" instead of "panel")
2020-12-02 10:03:40 +01:00
Stephen Abello
81b96b2430 N°2251 Migrate bulk modify field additional content tooltip from qtip to tippyjs 2020-12-02 09:42:20 +01:00
Stephen Abello
5dd6477cfc N°2847 Add field additional content (eg. for bulk modify) 2020-12-02 09:42:20 +01:00
Eric
5f30729127 N°3123 - Add variables for templates (html, js and css) 2020-12-01 19:09:49 +01:00
Eric
abb192eb0f N°3123 - Changed the variables in application UIBlocks 2020-12-01 19:08:49 +01:00
Pierre Goiffon
c701b518b8 Buttons component : add tooltip
Note that we will do later on a pass on accessibility, so we might add as well a title attribute, or a aria-* attribute
2020-12-01 18:34:57 +01:00
Pierre Goiffon
14ac58b999 N°3227 use Button components instead of hardcoded HTML 2020-12-01 18:19:40 +01:00
Pierre Goiffon
ae094f9bc6 N°3227 Fix typo in var names
Thanks @Molkobain (who commented in c117a23e0d)
2020-12-01 17:31:04 +01:00
Pierre Goiffon
e9d800794e ButtonFactory : new icon button method 2020-12-01 16:49:56 +01:00
BenGrenoble
7de427dc38 N°3440 Error loading module "itop-bridge-cmdb-ticket": /class[lnkFunctionalCIToProviderContract] at line 114: could not be added (already exists) with itop-service-mgmt-provider 2020-12-01 16:19:25 +01:00
Pierre Goiffon
c117a23e0d N°3227 For AttributeOQL add a new icon to pick a query from queries phrasebook
Add a new Query.is_template field (default value 'no') to filter queries usable as template.

Also lots of modifications in ExtKeyWidget, both JS and PHP objects :
* pass filter on dialog content generation (was using only targetClass, so search criteria weren't set - but search results were ok as they are made from another ajax query)
* fix loading still displayed after dialog close
* can now get the defined attribute value (was always returning the selected object id)
2020-12-01 09:40:55 +01:00
Pierre Goiffon
77b72a6eb1 📝 Add since on AttributeEnumSet 2020-11-30 18:48:33 +01:00
Pierre Goiffon
9f48de7774 🎨 extkeywidget change copyright format 2020-11-30 18:48:32 +01:00
acognet
539fa43503 N°3461 - Setup Broken with Chrome v87 2020-11-30 18:27:25 +01:00
Eric
5378361faa N°3123 - Add the possibility to create UIBlocks in extensions 2020-11-30 18:01:01 +01:00
Eric
d2d5a90637 N°3123 - Fix popup menus for lists 2020-11-30 16:47:27 +01:00
Eric
631a73e07d N°3123 - Fix breadcrumb for DisplayBlock(type: List) 2020-11-30 15:36:54 +01:00
Pierre Goiffon
c944cd29b1 📝 Fix \utils::Sanitize_Internal phpdoc
Thanks @Molkobain !
2020-11-30 15:01:09 +01:00
Pierre Goiffon
5d5a3183c0 📝 more PHPDoc for \utils::Sanitize_Internal
added more details about const that were introduced in e911290b3d
2020-11-30 14:27:52 +01:00
acognet
eb537f45f4 N°3421 - Attributes of class Person are not accessible from :current_contact in portal anymore. Only attributes of class Contact are. 2020-11-30 09:24:35 +01:00
Pierre Goiffon
cdb97baa80 🐛 DataTableFactory : fix ajax.render URL generation
Was created without approot
2020-11-30 08:03:52 +01:00
denis.flaven@combodo.com
398b5f446c Protect against empty 'precompiled theme' entry in the XML 2020-11-27 17:57:09 +01:00
Eric
4099a8ef5a N°3123 - Moved Popup Menu Items JS parts to UIBlocks 2020-11-27 17:25:50 +01:00
Eric
fd5958b764 N°3123 - Code cleanup (removed unnecessary files) 2020-11-27 17:24:56 +01:00
acognet
a2a4cd4e7a N°3426 - Wrong tab is displayed when a creation or modification form is invalidated 2020-11-27 15:20:20 +01:00
Pierre Goiffon
35215cf62f 🌐 Fix typo in comma (2 "m" !!) 2020-11-26 18:34:07 +01:00
Eric
8dda0f02f2 N°3123 - Create specific block for DisplayBlock(type: ChartAjaxPie and ChartAjaxBars) 2020-11-26 18:17:06 +01:00
Eric
efbd249e7f N°3123 - Create specific block for DisplayBlock(type: Chart) 2020-11-26 17:41:25 +01:00
Eric
cf4e8c65d2 N°3123 - Create specific block for DisplayBlock(type: List) 2020-11-26 16:50:58 +01:00
Eric
9a595e3178 N°3123 - Create specific block for DisplayBlock(type: List) 2020-11-26 16:49:43 +01:00
Vincent Dumas
14f8a5aa36 #3434 typo in FR dictionnary entry 2020-11-26 16:30:17 +01:00
Eric
a759380999 Migrates banner, header, footer in blocks for iTopWebPage 2020-11-26 15:33:49 +01:00
Stephen Abello
05ed58d741 N°2847 Reduce alerts minimized padding and add a min height to handle when there's no title and the alert is minimized 2020-11-26 14:47:29 +01:00
Stephen Abello
6b2eeeccf5 N°2847 Remove a debug line 2020-11-26 11:37:47 +01:00
Stephen Abello
340b9134c0 N°2847 Allow user to minimize/close alerts 2020-11-26 11:13:28 +01:00
odain
ba01ac715f N°3455 - Passing json_data as file to REST API 2020-11-25 18:32:54 +01:00
Eric
8f151b84c9 N°2847 - Code refactor 2020-11-25 15:27:47 +01:00
Eric
c5942a3ddd N°2847 - Code refactor 2020-11-25 15:24:27 +01:00
Molkobain
08449b7af5 Regression: Fix iTop Hub connector not being installed (caused by dd5ac38dd4) 2019-12-17 09:49:14 +01:00
Molkobain
a4ccd835bc 💄 FAF: Mentions in caselogs 2019-12-17 09:03:32 +01:00
Molkobain
97aa758123 FAF: Mention people in caselogs 2019-12-17 09:03:32 +01:00
2601 changed files with 183887 additions and 35377 deletions

View File

@@ -6,19 +6,20 @@ end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = false
max_line_length = 140
max_line_length = 300
tab_width = 4
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = false
ij_smart_tabs = false
ij_visual_guides = 80,120
ij_visual_guides = 300
ij_wrap_on_typing = true
[*.css]
indent_style = tab
ij_smart_tabs = true
ij_visual_guides = none
ij_css_align_closing_brace_with_properties = false
ij_css_blank_lines_around_nested_selector = 1
ij_css_blank_lines_between_blocks = 1
@@ -38,7 +39,9 @@ ij_css_use_double_quotes = true
ij_css_value_alignment = do_not_align
[*.scss]
indent_style = tab
indent_size = 2
tab_width = 2
ij_visual_guides = none
ij_scss_align_closing_brace_with_properties = false
ij_scss_blank_lines_around_nested_selector = 1
ij_scss_blank_lines_between_blocks = 1
@@ -58,8 +61,8 @@ ij_scss_use_double_quotes = true
ij_scss_value_alignment = 0
[*.twig]
indent_style = tab
ij_smart_tabs = true
ij_visual_guides = none
ij_wrap_on_typing = false
ij_twig_keep_indents_on_empty_lines = false
ij_twig_spaces_inside_comments_delimiters = true
@@ -67,6 +70,7 @@ ij_twig_spaces_inside_delimiters = true
ij_twig_spaces_inside_variable_delimiters = true
[.editorconfig]
ij_visual_guides = none
ij_editorconfig_align_group_field_declarations = false
ij_editorconfig_space_after_colon = false
ij_editorconfig_space_after_comma = true
@@ -74,10 +78,12 @@ ij_editorconfig_space_before_colon = false
ij_editorconfig_space_before_comma = false
ij_editorconfig_spaces_around_assignment_operators = true
[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul,phpunit.xml.dist}]
[{*.ant, *.fxml, *.jhm, *.jnlp, *.jrxml, *.rng, *.tld, *.wsdl, *.xml, *.xsd, *.xsl, *.xslt, *.xul, phpunit.xml.dist}]
indent_size = 2
tab_width = 2
ij_smart_tabs = true
ij_visual_guides = none
ij_wrap_on_typing = false
ij_xml_align_attributes = true
ij_xml_align_text = false
ij_xml_attribute_wrap = normal
@@ -93,11 +99,12 @@ ij_xml_line_comment_at_first_column = true
ij_xml_space_after_tag_name = false
ij_xml_space_around_equals_in_attribute = false
ij_xml_space_inside_empty_tag = false
ij_xml_text_wrap = normal
ij_xml_text_wrap = off
[{*.bash,*.sh,*.zsh}]
indent_size = 2
tab_width = 2
ij_visual_guides = none
ij_shell_binary_ops_start_line = false
ij_shell_keep_column_alignment_padding = false
ij_shell_minify_program = false
@@ -108,6 +115,7 @@ ij_shell_switch_cases_indented = false
indent_style = tab
ij_continuation_indent_size = 4
ij_smart_tabs = true
ij_visual_guides = none
ij_javascript_align_imports = false
ij_javascript_align_multiline_array_initializer_expression = false
ij_javascript_align_multiline_binary_operation = false
@@ -297,6 +305,7 @@ ij_php_array_initializer_new_line_after_left_brace = true
ij_php_array_initializer_right_brace_on_new_line = true
ij_php_array_initializer_wrap = on_every_item
ij_php_assignment_wrap = off
ij_php_attributes_wrap = off
ij_php_author_weight = 8
ij_php_binary_operation_sign_on_next_line = false
ij_php_binary_operation_wrap = off
@@ -385,6 +394,7 @@ ij_php_new_line_after_php_opening_tag = false
ij_php_null_type_position = in_the_end
ij_php_package_weight = 28
ij_php_param_weight = 5
ij_php_parameters_attributes_wrap = off
ij_php_parentheses_expression_new_line_after_left_paren = false
ij_php_parentheses_expression_right_paren_on_new_line = false
ij_php_phpdoc_blank_line_before_tags = true
@@ -406,6 +416,7 @@ ij_php_see_weight = 3
ij_php_since_weight = 28
ij_php_sort_phpdoc_elements = true
ij_php_space_after_colon = true
ij_php_space_after_colon_in_named_argument = true
ij_php_space_after_colon_in_return_type = true
ij_php_space_after_comma = true
ij_php_space_after_for_semicolon = true
@@ -419,6 +430,7 @@ ij_php_space_before_catch_parentheses = true
ij_php_space_before_class_left_brace = true
ij_php_space_before_closure_left_parenthesis = true
ij_php_space_before_colon = true
ij_php_space_before_colon_in_named_argument = false
ij_php_space_before_colon_in_return_type = false
ij_php_space_before_comma = false
ij_php_space_before_do_left_brace = true
@@ -486,6 +498,7 @@ ij_php_while_on_new_line = false
[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,composer.lock,jest.config}]
indent_size = 2
ij_visual_guides = none
ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false
ij_json_keep_line_breaks = true
@@ -500,7 +513,8 @@ ij_json_wrap_long_lines = false
[{*.htm,*.html,*.sht,*.shtm,*.shtml}]
indent_style = tab
ij_smart_tabs = true
ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
ij_visual_guides = none
ij_html_add_new_line_before_tags = body, div, p, form, h1, h2, h3
ij_html_align_attributes = true
ij_html_align_text = false
ij_html_attribute_wrap = normal
@@ -527,10 +541,16 @@ ij_html_space_inside_empty_tag = false
ij_html_text_wrap = normal
ij_html_uniform_ident = false
[{*.yaml,*.yml}]
[{*.yaml, *.yml}]
indent_size = 2
ij_visual_guides = none
ij_yaml_align_values_properties = do_not_align
ij_yaml_autoinsert_sequence_marker = true
ij_yaml_block_mapping_on_new_line = false
ij_yaml_indent_sequence_value = true
ij_yaml_keep_indents_on_empty_lines = false
ij_yaml_keep_line_breaks = true
ij_yaml_space_before_colon = true
ij_yaml_sequence_on_new_line = false
ij_yaml_space_before_colon = false
ij_yaml_spaces_within_braces = true
ij_yaml_spaces_within_brackets = true

2
.gitignore vendored
View File

@@ -140,5 +140,3 @@ local.properties
.cache-main
.scala_dependencies
.worksheet
/css/setup.css

View File

@@ -1,7 +1,7 @@
<?php
/**
* Copyright (C) 2010-2020 Combodo SARL
* Copyright (C) 2010-2021 Combodo SARL
*
* This file is part of iTop.
*

View File

@@ -1,6 +1,6 @@
<?php
/**
* Copyright (C) 2010-2020 Combodo SARL
* Copyright (C) 2010-2021 Combodo SARL
*
* This file is part of iTop.
*

View File

@@ -1,6 +1,6 @@
<?php
/**
* Copyright (C) 2010-2020 Combodo SARL
* Copyright (C) 2010-2021 Combodo SARL
*
* This file is part of iTop.
*

View File

@@ -1,7 +1,26 @@
<?php
/**
* script used to sort license file (usefull for autogeneration)
* Example: php
* script used to sort license file (useful for autogeneration)
*
* Requirements :
* * bash (on Windows, use Git Bash)
* * composer (if you use the phar version, mind to create a `Composer` alias !)
* * JQ command
* to install on Windows :
* `curl -L -o /usr/bin/jq.exe https://github.com/stedolan/jq/releases/latest/download/jq-win64.exe`
* this is a Windows port : https://stedolan.github.io/jq/
*
* Known bug on Windows :
* Licenses added from Composer contains a path in the product node (N°3870)
* `<product scope="lib">C:\Dev\wamp64\www\itop-dev\.make\license/../..//lib/symfony/console</product>`
*
* Licenses sources :
* * `composer licenses --format json` (see https://getcomposer.org/doc/03-cli.md#licenses)
* * keep every existing nodes with `/licenses/license[11]/product/@scope` not in ['lib', 'datamodels']
* ⚠ If licenses were added manually, they might be removed by this tool ! Be very careful to check for the result before pushing !
*
* To launch, check requirements and run `php updateLicenses.php`
* The target license file path is in `$xmlFilePath`
*/
$iTopFolder = __DIR__ . "/../../" ;

View File

@@ -42,7 +42,7 @@ If you want to use another license, you may [create an extension][wiki new ext].
When we first start with Git, we were using the [GitFlow](https://nvie.com/posts/a-successful-git-branching-model/) branch model. As
there was some confusions about branches to use for current developed release and previous maintained release, and also because we were
using just a very few of the GitFlow commands, we decided to add just a little modification to this branch model : since april 2020
we don't have anymore a `master` branch.
we don't have a `master` branch anymore.
Here are the branches we use and their meaning :
@@ -68,7 +68,7 @@ In this example, when 3.0.0-beta is shipped that will become:
And when 3.0.0 final will be out:
- `develop`: future 3.1.0 version
- `support/2.8`: 2.8.x maintenance version (will host developments for 3.0.1)
- `support/3.0`: 3.0.x maintenance version (will host developments for 3.0.1)
- `support/2.7`: 2.7.x maintenance version
- `support/2.6`: 2.6.x maintenance version
- `support/2.5`: 2.5.x maintenance version

View File

@@ -72,51 +72,55 @@ iTop development is sponsored, led and supported by [Combodo][0].
## Contributors
We would like to give a special thank you to the people from the community who contributed to this project, including:
We would like to give a special thank you 🤗 to the people from the community who contributed to this project, including:
### Names
- Alves, David
- Beck, Pedro
- Bilger, Jean-François
- Bostoen, Jeffrey (a.k.a @jbostoen)
- Cardoso, Anderson
- Cassaro, Bruno
- Casteleyn, Thomas (a.k.a @Hipska)
- Castro, Randall Badilla
- Colantoni, Maria Laura
- Couronné, Guy
- Dvořák, Lukáš
- Goethals, Stefan
- Gumble, David
- Hippler, Lars
- Khamit, Shamil
- Kincel, Martin
- Konečný, Kamil
- Kunin, Vladimir
- Lassiter, Dennis
- Lazcano, Federico
- Lucas, Jonathan
- Malik, Remie
- Mindêllo de Andrade, Lucas (a.k.a @rokam)
- Rosenke, Stephan
- Seki, Shoji
- Shilov, Vladimir
- Tulio, Marco
- Turrubiates, Miguel
- Alves, David
- Beck, Pedro
- Bilger, Jean-François
- Bostoen, Jeffrey (a.k.a @jbostoen)
- Cardoso, Anderson
- Cassaro, Bruno
- Casteleyn, Thomas (a.k.a @Hipska)
- Castro, Randall Badilla
- Colantoni, Maria Laura
- Couronné, Guy
- Dvořák, Lukáš
- Goethals, Stefan
- Gumble, David
- Kaltefleiter, Lars (a.k.a @larhip)
- Khamit, Shamil
- Kincel, Martin
- Konečný, Kamil
- Kunin, Vladimir
- Lassiter, Dennis
- Lazcano, Federico
- Lucas, Jonathan
- Malik, Remie
- Mindêllo de Andrade, Lucas (a.k.a @rokam)
- Rosenke, Stephan
- Seki, Shoji
- Shilov, Vladimir
- Tulio, Marco
- Turrubiates, Miguel
### Aliases
- chifu1234
- cprobst
- Karkoff1212
- larhip
- Laura
- Purple Grape
- Schlobinux
- theBigOne
- ulmerspatz
- chifu1234
- cprobst
- DudekArtur
- Karkoff1212
- Laura
- Purple Grape
- Schlobinux
- theBigOne
- ulmerspatz
### Companies
- Hardis
- ITOMIG
- Pimkie
- [Hardis](https://www.hardis-group.com/)
- [ITOMIG](https://www.itomig.de/)
- [Pimkie](https://www.pimkie.com/)
- [Super-Visions](https://www.super-visions.com/)

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -19,7 +19,7 @@
/**
* UserRightsMatrix (User management Module)
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,7 +20,7 @@
* UserRightsNull
* User management Module - say Yeah! to everything
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,20 +1,7 @@
<?php
/**
* Copyright (C) 2013-2020 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
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
define('ADMIN_PROFILE_NAME', 'Administrator');
@@ -266,17 +253,54 @@ class URP_UserProfile extends UserRightsBaseClassGUI
public function CheckToDelete(&$oDeletionPlan)
{
if (MetaModel::GetConfig()->Get('demo_mode'))
{
if (MetaModel::GetConfig()->Get('demo_mode')) {
// Users deletion is NOT allowed in demo mode
$oDeletionPlan->AddToDelete($this, null);
$oDeletionPlan->SetDeletionIssues($this, array('deletion not allowed in demo mode.'), true);
$oDeletionPlan->ComputeResults();
return false;
}
try {
$this->CheckIfProfileIsAllowed(UR_ACTION_DELETE);
}
catch (SecurityException $e) {
// Users deletion is NOT allowed
$oDeletionPlan->AddToDelete($this, null);
$oDeletionPlan->SetDeletionIssues($this, [$e->getMessage()], true);
$oDeletionPlan->ComputeResults();
return false;
}
return parent::CheckToDelete($oDeletionPlan);
}
public function DoCheckToDelete(&$oDeletionPlan)
{
if (MetaModel::GetConfig()->Get('demo_mode')) {
// Users deletion is NOT allowed in demo mode
$oDeletionPlan->AddToDelete($this, null);
$oDeletionPlan->SetDeletionIssues($this, array('deletion not allowed in demo mode.'), true);
$oDeletionPlan->ComputeResults();
return false;
}
try {
$this->CheckIfProfileIsAllowed(UR_ACTION_DELETE);
}
catch (SecurityException $e) {
// Users deletion is NOT allowed
$oDeletionPlan->AddToDelete($this, null);
$oDeletionPlan->SetDeletionIssues($this, [$e->getMessage()], true);
$oDeletionPlan->ComputeResults();
return false;
}
return parent::DoCheckToDelete($oDeletionPlan);
}
protected function OnInsert()
{
$this->CheckIfProfileIsAllowed(UR_ACTION_CREATE);
@@ -289,7 +313,6 @@ class URP_UserProfile extends UserRightsBaseClassGUI
protected function OnDelete()
{
$this->CheckIfProfileIsAllowed(UR_ACTION_DELETE);
}
/**

View File

@@ -1,6 +1,6 @@
<?php
/**
* Copyright (C) 2013-2020 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*

View File

@@ -1,6 +1,6 @@
<?php
/**
* Copyright (C) 2013-2020 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*

View File

@@ -2,7 +2,7 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/AjaxPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/
/**

View File

@@ -1,27 +1,11 @@
<?php
// Copyright (C) 2010-2012 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Includes all the classes to have the application up and running
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
require_once(APPROOT.'/application/applicationcontext.class.inc.php');
@@ -31,9 +15,4 @@ require_once(APPROOT.'/application/audit.category.class.inc.php');
require_once(APPROOT.'/application/audit.rule.class.inc.php');
require_once(APPROOT.'/application/query.class.inc.php');
require_once(APPROOT.'/setup/moduleinstallation.class.inc.php');
//require_once(APPROOT.'/application/menunode.class.inc.php');
require_once(APPROOT.'/application/utils.inc.php');
class ApplicationException extends CoreException
{
}

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2018 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,13 +20,13 @@
/**
* Class ApplicationContext
*
* @copyright Copyright (C) 2010-2018 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\UI\Component\Input\InputFactory;
use Combodo\iTop\Application\UI\Layout\UIContentBlock;
use Combodo\iTop\Application\UI\UIBlock;
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
use Combodo\iTop\Application\UI\Base\UIBlock;
require_once(APPROOT."/application/utils.inc.php");
@@ -236,7 +236,7 @@ class ApplicationContext
{
$oContext = new UIContentBlock();
foreach ($this->aValues as $sName => $sValue) {
$oContext->AddSubBlock(InputFactory::MakeForHidden('c[$sName]', utils::HtmlEntities($sValue)));
$oContext->AddSubBlock(InputUIBlockFactory::MakeForHidden('c[$sName]', utils::HtmlEntities($sValue)));
}
return $oContext;
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* Copyright (C) 2013-2020 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*
@@ -18,6 +18,7 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\UI\Base\iUIBlock;
use Symfony\Component\DependencyInjection\Container;
require_once(APPROOT.'application/newsroomprovider.class.inc.php');
@@ -29,7 +30,7 @@ require_once(APPROOT.'application/newsroomprovider.class.inc.php');
* You may implement such interfaces in a module file (e.g. main.mymodule.php)
*
* @api
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
* @package Extensibility
* @since 2.7.0
@@ -430,7 +431,7 @@ interface iApplicationUIExtension
*
* @param DBObjectSet $oSet A set of persistent objects (DBObject)
*
* @return string[string]
* @return array
*/
public function EnumAllowedActions(DBObjectSet $oSet);
}
@@ -1042,6 +1043,7 @@ class JSButtonItem extends JSPopupMenuItem
* @api
* @package Extensibility
* @since 2.0
* @deprecated since 3.0.0 use iPageUIBlockExtension instead
*/
interface iPageUIExtension
{
@@ -1073,12 +1075,56 @@ interface iPageUIExtension
public function GetBannerHtml(iTopWebPage $oPage);
}
/**
* Implement this interface to add content to any iTopWebPage
*
* There are 3 places where content can be added:
*
* * The north pane: (normaly empty/hidden) at the top of the page, spanning the whole
* width of the page
* * The south pane: (normaly empty/hidden) at the bottom of the page, spanning the whole
* width of the page
* * The admin banner (two tones gray background) at the left of the global search.
* Limited space, use it for short messages
*
* Each of the methods of this interface is supposed to return the HTML to be inserted at
* the specified place and can use the passed iTopWebPage object to add javascript or CSS definitions
*
* @api
* @package Extensibility
* @since 3.0.0
*/
interface iPageUIBlockExtension
{
/**
* Add content to the "admin banner"
*
* @return iUIBlock|null The Block to add into the page
*/
public function GetBannerBlock();
/**
* Add content to the header of the page
*
* @return iUIBlock|null The Block to add into the page
*/
public function GetHeaderBlock();
/**
* Add content to the footer of the page
*
* @return iUIBlock|null The Block to add into the page
*/
public function GetFooterBlock();
}
/**
* Extend this class instead of iPageUIExtension if you don't need to overload all methods
*
* @api
* @package Extensibility
* @since 2.7.0
* @deprecated since 3.0.0 use AbstractPageUIBlockExtension instead
*/
abstract class AbstractPageUIExtension implements iPageUIExtension
{
@@ -1108,6 +1154,40 @@ abstract class AbstractPageUIExtension implements iPageUIExtension
}
/**
* Extend this class instead of iPageUIExtension if you don't need to overload all methods
*
* @api
* @package Extensibility
* @since 3.0.0
*/
abstract class AbstractPageUIBlockExtension implements iPageUIBlockExtension
{
/**
* @inheritDoc
*/
public function GetBannerBlock()
{
return null;
}
/**
* @inheritDoc
*/
public function GetHeaderBlock()
{
return null;
}
/**
* @inheritDoc
*/
public function GetFooterBlock()
{
return null;
}
}
/**
* Implement this interface to add content to any enhanced portal page
*

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -22,7 +22,7 @@
* to check and is linked to a set of rules that determine the valid or invalid objects
* inside the set
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -23,7 +23,7 @@
* or the "bad" ones. The core audit engines computes the complement to the definition
* set when needed to obtain either the valid objects, or the ones with an error
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/CaptureWebPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/CLIPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,38 @@
<?php
/**
* Copyright (C) 2013-2020 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
*/
/**
* Class CompileCSSService : used to ease testing ThemeHander class via mocks
*
* @author Olivier DAIN <olivier.dain@combodo.com>
* @since 3.0.0 N°2982
*/
class CompileCSSService
{
/**
* CompileCSSService constructor.
*/
public function __construct()
{
}
public function CompileCSSFromSASS($sSassContent, $aImportPaths = [], $aVariables = []){
return utils::CompileCSSFromSASS($sSassContent, $aImportPaths, $aVariables);
}
}

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/CSVPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -1,26 +1,13 @@
<?php
/**
* Copyright (C) 2013-2019 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
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\UI\Component\Button\ButtonFactory;
use Combodo\iTop\Application\UI\Component\Toolbar\Toolbar;
use Combodo\iTop\Application\UI\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\UI\Base\Component\Button\ButtonUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\UI\Base\Component\Toolbar\ToolbarUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock;
require_once(APPROOT.'application/dashboardlayout.class.inc.php');
require_once(APPROOT.'application/dashlet.class.inc.php');
@@ -443,22 +430,19 @@ abstract class Dashboard
public function RenderProperties($oPage, $aExtraParams = array())
{
// menu to pick a layout and edit other properties of the dashboard
$oPage->add('<div class="ui-widget-content ui-corner-all"><div class="ui-widget-header ui-corner-all" style="text-align:center; padding: 2px;">'.Dict::S('UI:DashboardEdit:Properties').'</div>');
$oPage->add('<div class="ui-widget-content ui-corner-all ibo-dashboard-editor--properties"><div class="ui-widget-header ui-corner-all ibo-dashboard-editor--properties-title">'.Dict::S('UI:DashboardEdit:Properties').'</div>');
$sUrl = utils::GetAbsoluteUrlAppRoot();
$oPage->add('<div style="text-align:center">'.Dict::S('UI:DashboardEdit:Layout').'</div>');
$oPage->add('<div id="select_layout" style="text-align:center">');
foreach( get_declared_classes() as $sLayoutClass)
{
if (is_subclass_of($sLayoutClass, 'DashboardLayout'))
{
$oPage->add('<div class="ibo-dashboard-editor--properties-subtitle" data-role="ibo-dashboard-editor--properties-subtitle">'.Dict::S('UI:DashboardEdit:Layout').'</div>');
$oPage->add('<div id="select_layout" class="ibo-dashboard-editor--layout-list" data-role="ibo-dashboard-editor--layout-list">');
foreach (get_declared_classes() as $sLayoutClass) {
if (is_subclass_of($sLayoutClass, 'DashboardLayout')) {
$oReflection = new ReflectionClass($sLayoutClass);
if (!$oReflection->isAbstract())
{
if (!$oReflection->isAbstract()) {
$aCallSpec = array($sLayoutClass, 'GetInfo');
$aInfo = call_user_func($aCallSpec);
$sChecked = ($this->sLayoutClass == $sLayoutClass) ? 'checked' : '';
$oPage->add('<input type="radio" name="layout_class" '.$sChecked.' value="'.$sLayoutClass.'" id="layout_'.$sLayoutClass.'"><label for="layout_'.$sLayoutClass.'"><img src="'.$sUrl.$aInfo['icon'].'" /></label>'); // title="" on either the img or the label does nothing !
$oPage->add('<input type="radio" name="layout_class" '.$sChecked.' value="'.$sLayoutClass.'" id="layout_'.$sLayoutClass.'"><label for="layout_'.$sLayoutClass.'"><img src="'.$sUrl.$aInfo['icon'].'" class="ibo-dashboard--properties--icon" data-role="ibo-dashboard--properties--icon"/></label>'); // title="" on either the img or the label does nothing !
}
}
}
@@ -489,7 +473,8 @@ abstract class Dashboard
$oPage->add_ready_script(
<<<EOF
// Note: the title gets deleted by the validation mechanism
$("#attr_auto_reload_sec").tooltip({items: 'input', content: '$sRateTitle'});
$("#attr_auto_reload_sec").attr('data-tooltip-content', '$sRateTitle');
CombodoTooltip.InitTooltipFromMarkup($("#attr_auto_reload_sec"));
$("#attr_auto_reload_sec").prop('disabled', !$('#attr_auto_reload').is(':checked'));
$('#attr_auto_reload').change( function(ev) {
@@ -506,7 +491,7 @@ abstract class Dashboard
},
});
$('#event_bus').bind('dashlet-selected', function(event, data){
$('#event_bus').on('dashlet-selected', function(event, data){
var sDashletId = data.dashlet_id;
var sPropId = 'dashlet_properties_'+sDashletId;
$('.dashlet_properties').each(function() {
@@ -531,6 +516,8 @@ EOF
* @param bool $bEditMode
* @param array $aExtraParams
* @param bool $bCanEdit
*
* @return \Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout
*/
public function Render($oPage, $bEditMode = false, $aExtraParams = array(), $bCanEdit = true)
{
@@ -538,21 +525,6 @@ EOF
$aExtraParams['dashboard_div_id'] = utils::Sanitize($this->GetId(), '', 'element_identifier');
}
$sTitleForHTML = utils::HtmlEntities(Dict::S($this->sTitle));
$sHtml = "<div class=\"ibo-top-bar--toolbar-dashboard-title\">{$sTitleForHTML}</div>";
if ($oPage instanceof iTopWebPage) {
$oTopBar = $oPage->GetTopBarLayout();
$oToolbar = new Toolbar();
$oTopBar->SetToolbar($oToolbar);
$oToolbar->AddHtml($sHtml);
} else {
$oPage->add_script(<<<JS
$(".ibo-top-bar--toolbar-dashboard-title").html("$sTitleForHTML");
JS
);
}
/** @var \DashboardLayoutMultiCol $oLayout */
$oLayout = new $this->sLayoutClass();
@@ -563,11 +535,36 @@ JS
}
}
$oLayout->Render($oPage, $this->aCells, $bEditMode, $aExtraParams);
$oDashboard = $oLayout->Render($oPage, $this->aCells, $bEditMode, $aExtraParams);
$oPage->AddUiBlock($oDashboard);
$bFromDasboardPage = isset($aExtraParams['from_dashboard_page']) ? isset($aExtraParams['from_dashboard_page']) : false;
if ($bFromDasboardPage) {
$sTitleForHTML = utils::HtmlEntities(Dict::S($this->sTitle));
$sHtml = "<div class=\"ibo-top-bar--toolbar-dashboard-title\">{$sTitleForHTML}</div>";
if ($oPage instanceof iTopWebPage) {
$oTopBar = $oPage->GetTopBarLayout();
$oToolbar = ToolbarUIBlockFactory::MakeStandard();
$oTopBar->SetToolbar($oToolbar);
$oToolbar->AddHtml($sHtml);
} else {
$oPage->add_script(<<<JS
$(".ibo-top-bar--toolbar-dashboard-title").html("$sTitleForHTML");
JS
);
}
} else {
$oDashboard->SetTitle(Dict::S($this->sTitle));
}
if (!$bEditMode) {
$oPage->add_linked_script('../js/dashlet.js');
$oPage->add_linked_script('../js/dashboard.js');
}
return $oDashboard;
}
/**
@@ -579,19 +576,18 @@ JS
public function RenderDashletsSelection(WebPage $oPage)
{
// Toolbox/palette to drag and drop dashlets
$oPage->add('<div class="ui-widget-content ui-corner-all"><div class="ui-widget-header ui-corner-all" style="text-align:center; padding: 2px;">'.Dict::S('UI:DashboardEdit:Dashlets').'</div>');
$oPage->add('<div class="ui-widget-content ui-corner-all ibo-dashboard--available-dashlets"><div class="ui-widget-header ui-corner-all ibo-dashboard--available-dashlet--title">'.Dict::S('UI:DashboardEdit:Dashlets').'</div>');
$sUrl = utils::GetAbsoluteUrlAppRoot();
$oPage->add('<div id="select_dashlet" style="text-align:center; max-height:120px; overflow-y:auto;">');
$oPage->add('<div id="select_dashlet" class="ibo-dashboard--available-dashlets--list" data-role="ibo-dashboard--available-dashlets--list">');
$aAvailableDashlets = $this->GetAvailableDashlets();
foreach($aAvailableDashlets as $sDashletClass => $aInfo)
{
$oPage->add('<span dashlet_class="'.$sDashletClass.'" class="dashlet_icon ui-widget-content ui-corner-all" id="dashlet_'.$sDashletClass.'" title="'.$aInfo['label'].'" style="width:34px; height:34px; display:inline-block; margin:2px;"><img src="'.$sUrl.$aInfo['icon'].'" /></span>');
foreach ($aAvailableDashlets as $sDashletClass => $aInfo) {
$oPage->add('<span dashlet_class="'.$sDashletClass.'" class="ibo-dashboard-editor--available-dashlet-icon dashlet_icon ui-widget-content ui-corner-all" data-role="ibo-dashboard-editor--available-dashlet-icon" id="dashlet_'.$sDashletClass.'" title="'.$aInfo['label'].'"><img src="'.$sUrl.$aInfo['icon'].'" /></span>');
}
$oPage->add('</div>');
$oPage->add('</div>');
$oPage->add_ready_script("$('.dashlet_icon').draggable({helper: 'clone', appendTo: 'body', zIndex: 10000, revert:'invalid'});");
$oPage->add_ready_script("$('.dashlet_icon').draggable({cursor: 'move', helper: 'clone', appendTo: 'body', zIndex: 10000, revert:'invalid'});");
}
/**
@@ -601,12 +597,12 @@ JS
public function RenderDashletsProperties(WebPage $oPage, $aExtraParams = array())
{
// Toolbox/palette to edit the properties of each dashlet
$oPage->add('<div class="ui-widget-content ui-corner-all"><div class="ui-widget-header ui-corner-all" style="text-align:center; padding: 2px;">'.Dict::S('UI:DashboardEdit:DashletProperties').'</div>');
$oPage->add('<div class="ui-widget-content ui-corner-all ibo-dashlet--properties"><div class="ui-widget-header ui-corner-all ibo-dashlet--properties--title">'.Dict::S('UI:DashboardEdit:DashletProperties').'</div>');
/** @var \DashboardLayoutMultiCol $oLayout */
$oLayout = new $this->sLayoutClass();
$oPage->add('<div id="dashlet_properties" style="text-align:center">');
$oPage->add('<div id="dashlet_properties">');
foreach($this->aCells as $iCellIdx => $aCell)
{
/** @var \Dashlet $oDashlet */
@@ -639,16 +635,13 @@ JS
foreach( get_declared_classes() as $sDashletClass)
{
// DashletUnknown is not among the selection as it is just a fallback for dashlets that can't instanciated.
if ( is_subclass_of($sDashletClass, 'Dashlet') && !in_array($sDashletClass, array('DashletUnknown', 'DashletProxy')) )
{
// DashletUnknown is not among the selection as it is just a fallback for dashlets that can't instantiated.
if (is_subclass_of($sDashletClass, 'Dashlet') && !in_array($sDashletClass, array('DashletUnknown', 'DashletProxy'))) {
$oReflection = new ReflectionClass($sDashletClass);
if (!$oReflection->isAbstract())
{
if (!$oReflection->isAbstract()) {
$aCallSpec = array($sDashletClass, 'IsVisible');
$bVisible = call_user_func($aCallSpec);
if ($bVisible)
{
if ($bVisible) {
$aCallSpec = array($sDashletClass, 'GetInfo');
$aInfo = call_user_func($aCallSpec);
$aDashlets[$sDashletClass] = $aInfo;
@@ -896,11 +889,53 @@ class RuntimeDashboard extends Dashboard
$oDashboard->FromXml($sDashboardDefinition);
$oDashboard->SetCustomFlag($bCustomized);
$oDashboard->SetDefinitionFile($sDashboardFile);
}
else
{
} else {
$oDashboard = null;
}
return $oDashboard;
}
/**
* @param string $sDashboardFile file name relative to the current module folder
* @param string $sDashBoardId code of the dashboard either menu_id or <class>__<attcode>
*
* @return null|RuntimeDashboard
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MissingQueryArgument
* @throws \MySQLException
* @throws \MySQLHasGoneAwayException
* @throws \Exception
*/
public static function GetDashboardToEdit($sDashboardFile, $sDashBoardId)
{
$bCustomized = false;
// Search for an eventual user defined dashboard
$oUDSearch = new DBObjectSearch('UserDashboard');
$oUDSearch->AddCondition('user_id', UserRights::GetUserId(), '=');
$oUDSearch->AddCondition('menu_code', $sDashBoardId, '=');
$oUDSet = new DBObjectSet($oUDSearch);
if ($oUDSet->Count() > 0) {
// Assuming there is at most one couple {user, menu}!
$oUserDashboard = $oUDSet->Fetch();
$sDashboardDefinition = $oUserDashboard->Get('contents');
$bCustomized = true;
} else {
$sDashboardDefinition = @file_get_contents($sDashboardFile);
}
if ($sDashboardDefinition !== false) {
$oDashboard = new RuntimeDashboard($sDashBoardId);
$oDashboard->FromXml($sDashboardDefinition);
$oDashboard->SetCustomFlag($bCustomized);
$oDashboard->SetDefinitionFile($sDashboardFile);
} else {
$oDashboard = null;
}
return $oDashboard;
}
@@ -910,43 +945,33 @@ class RuntimeDashboard extends Dashboard
*/
public function Render($oPage, $bEditMode = false, $aExtraParams = array(), $bCanEdit = true)
{
if (!isset($aExtraParams['query_params']) && isset($aExtraParams['this->class']))
{
if (!isset($aExtraParams['query_params']) && isset($aExtraParams['this->class'])) {
$oObj = MetaModel::GetObject($aExtraParams['this->class'], $aExtraParams['this->id']);
$aRenderParams = array('query_params' => $oObj->ToArgsForQuery());
}
else
{
} else {
$aRenderParams = $aExtraParams;
}
parent::Render($oPage, $bEditMode, $aRenderParams);
$oDashboard = parent::Render($oPage, $bEditMode, $aRenderParams);
if (isset($aExtraParams['query_params']['this->object()']))
{
if (isset($aExtraParams['query_params']['this->object()'])) {
/** @var \DBObject $oObj */
$oObj = $aExtraParams['query_params']['this->object()'];
$aAjaxParams = array('this->class' => get_class($oObj), 'this->id' => $oObj->GetKey());
}
else
{
if (isset($aExtraParams['from_dashboard_page'])) {
$aAjaxParams['from_dashboard_page'] = $aExtraParams['from_dashboard_page'];
}
} else {
$aAjaxParams = $aExtraParams;
}
if (!$bEditMode && !$oPage->IsPrintableVersion())
{
if (!$bEditMode && !$oPage->IsPrintableVersion()) {
$sId = $this->GetId();
$sDivId = utils::Sanitize($sId, '', 'element_identifier');
if ($this->GetAutoReload())
{
$sFile = addslashes($this->GetDefinitionFile());
$sExtraParams = json_encode($aAjaxParams);
if ($this->GetAutoReload()) {
$iReloadInterval = 1000 * $this->GetAutoReloadInterval();
$sReloadURL = $this->GetReloadURL();
$oAppContext = new ApplicationContext();
$sContext=$oAppContext->GetForPostParams();
//$sContext is named "c" because it use the existing code for context parameters c[org_id] and c[menu]
$oPage->add_script(
<<<EOF
<<<JS
if (typeof(AutoReloadDashboardId$sDivId) !== 'undefined')
{
clearInterval(AutoReloadDashboardId$sDivId);
@@ -960,23 +985,16 @@ class RuntimeDashboard extends Dashboard
// Do not reload when a dialog box is active
if (!($('.ui-dialog:visible').length > 0) && $('.ibo-dashboard#$sDivId').is(':visible'))
{
$('.ibo-dashboard#$sDivId').block();
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
{ operation: 'reload_dashboard', dashboard_id: '$sId', file: '$sFile', extra_params: $sExtraParams, c: $sContext, reload_url: '$sReloadURL'},
function(data){
$('.ibo-dashboard#$sDivId').html(data);
$('.ibo-dashboard#$sDivId').unblock();
}
);
updateDashboard$sDivId();
}
}
EOF
JS
);
}
else
{
$oPage->add_script(
<<<EOF
<<<EOF
if (typeof(AutoReloadDashboardId$sDivId) !== 'undefined')
{
clearInterval(AutoReloadDashboardId$sDivId);
@@ -986,67 +1004,76 @@ EOF
);
}
if ($bCanEdit)
{
$this->RenderSelector($oPage, $aAjaxParams);
$this->RenderEditionTools($oPage, $aAjaxParams);
if ($bCanEdit) {
$this->RenderSelector($oPage, $oDashboard, $aAjaxParams);
$this->RenderEditionTools($oPage, $oDashboard, $aAjaxParams);
}
}
}
/**
* @param WebPage $oPage
* @param \Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout $oDashboard
* @param bool $bFromDashboardPage
* @param array $aAjaxParams
*
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
*/
protected function RenderSelector(WebPage $oPage, $aAjaxParams = array())
protected function RenderSelector(WebPage $oPage, DashboardLayoutUIBlock $oDashboard, $aAjaxParams = array())
{
if (!$this->HasCustomDashboard()) {
return;
}
$sId = $this->GetId();
$sDivId = utils::Sanitize($sId, '', 'element_identifier');
$sExtraParams = json_encode($aAjaxParams);
$sSelectorHtml = '<div class="ibo-top-bar--toolbar-dashboard-selector">';
if ($this->HasCustomDashboard()) {
$bStandardSelected = appUserPreferences::GetPref('display_original_dashboard_'.$sId, false);
$sStandard = Dict::S('UI:Toggle:StandardDashboard');
$sSelectorHtml .= '<div class="selector-label">'.$sStandard.'</div>';
$sSelectorHtml .= '<label class="switch"><input type="checkbox" onchange="ToggleDashboardSelector'.$sDivId.'();" '.($bStandardSelected ? '' : 'checked').'><span class="slider round"></span></label></input></label>';
$sCustom = Dict::S('UI:Toggle:CustomDashboard');
$sSelectorHtml .= '<div class="selector-label">'.$sCustom.'</div>';
}
$sSwitchToStandard = Dict::S('UI:Toggle:SwitchToStandardDashboard');
$sSwitchToCustom = Dict::S('UI:Toggle:SwitchToCustomDashboard');
$bStandardSelected = appUserPreferences::GetPref('display_original_dashboard_'.$sId, false);
$sSelectorHtml = '<div id="ibo-dashboard-selector'.$sDivId.'" class="ibo-dashboard--selector" data-tooltip-content="'.($bStandardSelected ? $sSwitchToCustom : $sSwitchToStandard).'">';
$sSelectorHtml .= '<label class="ibo-dashboard--switch"><input type="checkbox" onchange="ToggleDashboardSelector'.$sDivId.'();" '.($bStandardSelected ? '' : 'checked').'><span class="ibo-dashboard--slider"></span></label></input></label>';
$sSelectorHtml .= '</div>';
$sFile = addslashes($this->GetDefinitionFile());
$sReloadURL = $this->GetReloadURL();
if ($oPage instanceof iTopWebPage) {
$oToolbar = $oPage->GetTopBarLayout()->GetToolbar();
$bFromDashboardPage = isset($aAjaxParams['from_dashboard_page']) ? isset($aAjaxParams['from_dashboard_page']) : false;
if ($bFromDashboardPage) {
if ($oPage instanceof iTopWebPage) {
$oToolbar = $oPage->GetTopBarLayout()->GetToolbar();
$oToolbar->AddHtml($sSelectorHtml);
}
} else {
$oToolbar = $oDashboard->GetToolbar();
$oToolbar->AddHtml($sSelectorHtml);
}
$oPage->add_script(
<<<EOF
$oPage->add_script(
<<<JS
function ToggleDashboardSelector$sDivId()
{
$('.ibo-dashboard#$sDivId').block();
var dashboard = $('.ibo-dashboard#$sDivId')
dashboard.block();
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php',
{ operation: 'toggle_dashboard', dashboard_id: '$sId', file: '$sFile', extra_params: $sExtraParams, reload_url: '$sReloadURL' },
function(data) {
$('.ibo-dashboard#$sDivId').html(data);
$('.ibo-dashboard#$sDivId').unblock();
dashboard.html(data);
dashboard.unblock();
if ($('#ibo-dashboard-selector$sDivId input').prop("checked")) {
$('#ibo-dashboard-selector$sDivId').data('tooltip-content', '$sSwitchToStandard');
} else {
$('#ibo-dashboard-selector$sDivId').data('tooltip-content', '$sSwitchToCustom');
}
CombodoTooltip.InitAllNonInstantiatedTooltips($('#ibo-dashboard-selector$sDivId').parent());
}
);
}
EOF
);
} else {
$sSelectorHtml = addslashes($sSelectorHtml);
$oPage->add_script(<<<JS
$(".ibo-top-bar--toolbar-dashboard-selector").replaceWith("$sSelectorHtml");
JS
);
}
);
}
/**
@@ -1076,12 +1103,8 @@ JS
*
* @throws \Exception
*/
protected function RenderEditionTools(WebPage $oPage, $aExtraParams)
protected function RenderEditionTools(WebPage $oPage, DashboardLayoutUIBlock $oDashboard, $aExtraParams)
{
if (!($oPage instanceof iTopWebPage)) {
return;
}
$oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery.iframe-transport.js');
$oPage->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery.fileupload.js');
$sId = utils::Sanitize($this->GetId(), '', 'element_identifier');
@@ -1089,52 +1112,45 @@ JS
$sMenuTogglerId = "ibo-dashboard-menu-toggler-{$sId}";
$sPopoverMenuId = "ibo-dashboard-menu-popover-{$sId}";
$sName = 'UI:Dashboard:Actions';
$oToolbar = $oPage->GetTopBarLayout()->GetToolbar();
$oActionButton = ButtonFactory::MakeLinkNeutral('', '', 'fas fa-ellipsis-v', $sName, '', $sMenuTogglerId);
$oActionButton->AddCSSClasses("ibo-top-bar--toolbar-dashboard-menu-toggler");
$bFromDashboardPage = isset($aExtraParams['from_dashboard_page']) ? isset($aExtraParams['from_dashboard_page']) : false;
if ($bFromDashboardPage) {
if (!($oPage instanceof iTopWebPage)) {
// TODO 3.0 change the menu
return;
}
$oToolbar = $oPage->GetTopBarLayout()->GetToolbar();
} else {
$oToolbar = $oDashboard->GetToolbar();
}
$oActionButton = ButtonUIBlockFactory::MakeIconAction('fas fa-ellipsis-v', Dict::S($sName), $sName, '', false, $sMenuTogglerId)
->AddCSSClass('ibo-top-bar--toolbar-dashboard-menu-toggler')
->AddCSSClass('ibo-action-button');
$oToolbar->AddSubBlock($oActionButton);
$aActions = array();
$sFile = addslashes($this->sDefinitionFile);
$sJSExtraParams = json_encode($aExtraParams);
$bCanEdit = true;
if ($this->HasCustomDashboard()) {
$bCanEdit = !appUserPreferences::GetPref('display_original_dashboard_'.$this->GetId(), false);
}
if ($bCanEdit) {
$oEdit = new JSPopupMenuItem('UI:Dashboard:Edit', Dict::S('UI:Dashboard:Edit'), "return EditDashboard('{$this->sId}', '$sFile', $sJSExtraParams)");
$oEdit = new JSPopupMenuItem('UI:Dashboard:Edit', Dict::S('UI:Dashboard:EditCustom'), "return EditDashboard('{$this->sId}', '$sFile', $sJSExtraParams)");
$aActions[$oEdit->GetUID()] = $oEdit->GetMenuItem();
$oRevert = new JSPopupMenuItem('UI:Dashboard:RevertConfirm', Dict::S('UI:Dashboard:DeleteCustom'),
"if (confirm('".addslashes(Dict::S('UI:Dashboard:RevertConfirm'))."')) return RevertDashboard('{$this->sId}', $sJSExtraParams); else return false");
$aActions[$oRevert->GetUID()] = $oRevert->GetMenuItem();
} else {
$oEdit = new JSPopupMenuItem('UI:Dashboard:Edit', Dict::S('UI:Dashboard:CreateCustom'), "return EditDashboard('{$this->sId}', '$sFile', $sJSExtraParams)");
$aActions[$oEdit->GetUID()] = $oEdit->GetMenuItem();
}
if ($this->bCustomized) {
$oRevert = new JSPopupMenuItem('UI:Dashboard:RevertConfirm', Dict::S('UI:Dashboard:Revert'),
"if (confirm('".addslashes(Dict::S('UI:Dashboard:RevertConfirm'))."')) return RevertDashboard('{$this->sId}', $sJSExtraParams); else return false");
$aActions[$oRevert->GetUID()] = $oRevert->GetMenuItem();
}
utils::GetPopupMenuItems($oPage, iPopupMenuExtension::MENU_DASHBOARD_ACTIONS, $this, $aActions);
$oToolbar->AddSubBlock($oPage->GetPopoverMenu($sPopoverMenuId, $aActions));
$oActionButton->AddCSSClasses('ibo-action-button')
->SetJsCode(<<<JS
$("#{$sPopoverMenuId}").popover_menu({toggler: "#{$sMenuTogglerId}"});
$('#{$sMenuTogglerId}').on('click', function(oEvent) {
var oEventTarget = $('#{$sMenuTogglerId}');
var aEventTargetPos = oEventTarget.position();
var popover = $("#{$sPopoverMenuId}");
popover.css({
// 'top': (aEventTargetPos.top + parseInt(oEventTarget.css('marginTop'), 10) + oEventTarget.height()) + 'px',
// 'left': (aEventTargetPos.left + parseInt(oEventTarget.css('marginLeft'), 10) + oEventTarget.width() - popover.width()) + 'px',
'top': (aEventTargetPos.top + oEventTarget.outerHeight(true)) + 'px',
'left': (aEventTargetPos.left + oEventTarget.outerWidth(true) - popover.width()) + 'px',
'z-index': 10060
});
popover.popover_menu("togglePopup");
});
JS
);
$oActionsMenu = $oPage->GetPopoverMenu($sPopoverMenuId, $aActions)
->SetTogglerJSSelector("#$sMenuTogglerId");
$oToolbar->AddSubBlock($oActionButton)
->AddSubBlock($oActionsMenu);
$sReloadURL = $this->GetReloadURL();
$oPage->add_script(
@@ -1172,7 +1188,7 @@ EOF
$oPage->add_ready_script(
<<<EOF
$('#select_layout input').click( function() {
$('#select_layout input').on('click', function() {
var sLayoutClass = $(this).val();
$('.itop-dashboard').runtimedashboard('option', {layout_class: sLayoutClass});
} );
@@ -1211,30 +1227,27 @@ EOF
*/
public function RenderEditor($oPage, $aExtraParams = array())
{
if (isset($aExtraParams['this->class']))
{
if (isset($aExtraParams['this->class'])) {
$oObj = MetaModel::GetObject($aExtraParams['this->class'], $aExtraParams['this->id']);
$aRenderParams = array('query_params' => $oObj->ToArgsForQuery());
}
else
{
} else {
$aRenderParams = $aExtraParams;
}
$aRenderParams['dashboard_div_id'] = $aExtraParams['dashboard_div_id'];
$sJSExtraParams = json_encode($aExtraParams);
$oPage->add('<div id="dashboard_editor">');
$oPage->add('<div id="dashboard_editor" class="ibo-dashboard-editor" data-role="ibo-dashboard-editor">');
$oPage->add('<div class="ui-layout-center">');
$this->SetCustomFlag(true);
$this->Render($oPage, true, $aRenderParams);
$oPage->add('</div>');
$oPage->add('<div class="ui-layout-east">');
$oPage->add('<div class="ui-layout-east ibo-dashboard-editor--pane" data-role="ibo-dashboard-editor--pane">');
$this->RenderProperties($oPage, $aExtraParams);
$this->RenderDashletsSelection($oPage);
$this->RenderDashletsProperties($oPage, $aExtraParams);
$oPage->add('</div>');
$oPage->add('<div id="event_bus"/>'); // For exchanging messages between the panes, same as in the designer
$oPage->add('</div>');
$sDialogTitle = Dict::S('UI:DashboardEdit:Title');
$sOkButtonLabel = Dict::S('UI:Button:Save');
$sCancelButtonLabel = Dict::S('UI:Button:Cancel');
@@ -1262,7 +1275,24 @@ $('#dashboard_editor').dialog({
modal: true,
title: '$sDialogTitle',
buttons: [
{ text: "$sOkButtonLabel", click: function() {
{ text: "$sCancelButtonLabel",
class: "ibo-is-alternative",
click: function() {
var oDashboard = $('.itop-dashboard').data('itopRuntimedashboard');
if (oDashboard.is_modified())
{
if (!confirm('$sCancelConfirmationMessage'))
{
return;
}
}
window.bLeavingOnUserAction = true;
$(this).dialog( "close" );
$(this).remove();
} },
{ text: "$sOkButtonLabel",
class: "ibo-is-primary",
click: function() {
var oDashboard = $('.itop-dashboard').data('itopRuntimedashboard');
if (oDashboard.is_dirty())
{
@@ -1278,19 +1308,6 @@ $('#dashboard_editor').dialog({
window.bLeavingOnUserAction = true;
oDashboard.save($(this));
} },
{ text: "$sCancelButtonLabel", click: function() {
var oDashboard = $('.itop-dashboard').data('itopRuntimedashboard');
if (oDashboard.is_modified())
{
if (!confirm('$sCancelConfirmationMessage'))
{
return;
}
}
window.bLeavingOnUserAction = true;
$(this).dialog( "close" );
$(this).remove();
} },
],
close: function() { $(this).remove(); }
});
@@ -1308,20 +1325,16 @@ $('#dashboard_editor .ui-layout-center').runtimedashboard({
new_dashlet_parameters: {operation: 'new_dashlet'}
});
dashboard_prop_size = GetUserPreference('dashboard_prop_size', 350);
$('#dashboard_editor').layout({
east: {
minSize: 200,
size: dashboard_prop_size,
togglerLength_open: 0,
togglerLength_closed: 0,
onresize_end: function(name, elt, state, options, layout)
{
if (state.isSliding == false)
{
SetUserPreference('dashboard_prop_size', state.size, true);
}
},
var dashboard_prop_size = GetUserPreference('dashboard_prop_size', 400);
$('#dashboard_editor > .itop-dashboard').width($('#dashboard_editor').width() - dashboard_prop_size);
// We check when we finish click on the pane with the resize slider
// if the pane size changed (% 5px), if it's the case we save the value in userpref
$('#dashboard_editor > .itop-dashboard').on('mouseup',function (){
var iWidthDiff = $(this).width() - ($('#dashboard_editor').width() - dashboard_prop_size);
if( Math.abs(iWidthDiff) > 5){
dashboard_prop_size = iWidthDiff;
SetUserPreference('dashboard_prop_size', $('#dashboard_editor').width() - $(this).width(), true);
}
});
@@ -1483,32 +1496,37 @@ JS
$sCancelButtonLabel = Dict::S('UI:Button:Cancel');
$oPage->add_ready_script(
<<<JS
<<<JS
$('#dashlet_creation_dlg').dialog({
width: 600,
modal: true,
title: '$sDialogTitle',
buttons: [
{ text: "$sOkButtonLabel", click: function() {
var oForm = $(this).find('form');
var sFormId = oForm.attr('id');
var oParams = null;
var aErrors = ValidateForm(sFormId, false);
if (aErrors.length == 0)
{
oParams = ReadFormParams(sFormId);
}
oParams.operation = 'add_dashlet';
var me = $(this);
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', oParams, function(data) {
me.dialog( "close" );
me.remove();
$('body').append(data);
});
} },
{ text: "$sCancelButtonLabel", click: function() {
{ text: "$sCancelButtonLabel",
click: function() {
$(this).dialog( "close" ); $(this).remove();
} },
} ,
'class': 'ibo-button ibo-is-alternative ibo-is-neutral action cancel'
},
{ text: "$sOkButtonLabel",
click: function() {
var oForm = $(this).find('form');
var sFormId = oForm.attr('id');
var oParams = null;
var aErrors = ValidateForm(sFormId, false);
if (aErrors.length == 0)
{
oParams = ReadFormParams(sFormId);
}
oParams.operation = 'add_dashlet';
var me = $(this);
$.post(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php', oParams, function(data) {
me.dialog( "close" );
me.remove();
$('body').append(data);
});
},
'class': 'ibo-button ibo-is-regular ibo-is-primary action' }
],
close: function() { $(this).remove(); }
});

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -15,15 +15,15 @@
//
// 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\Component\Html\Html;
use Combodo\iTop\Application\UI\Layout\Dashboard\DashboardColumn;
use Combodo\iTop\Application\UI\Layout\Dashboard\DashboardLayout as UIDashboardLayout;
use Combodo\iTop\Application\UI\Layout\Dashboard\DashboardRow;
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;
/**
* Dashboard presentation
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
abstract class DashboardLayout
@@ -116,12 +116,15 @@ abstract class DashboardLayoutMultiCol extends DashboardLayout
// Trim the list of cells to remove the invisible/empty ones at the end of the array
$aCells = $this->TrimCellsArray($aCells);
$oDashboardLayout = new UIDashboardLayout();
$oPage->AddUiBlock($oDashboardLayout);
$oDashboardLayout = new DashboardLayoutUIBlock();
//$oPage->AddUiBlock($oDashboardLayout);
$iCellIdx = 0;
$iNbRows = ceil(count($aCells) / $this->iNbCols);
//Js given by each dashlet to reload
$sJSReload = "";
for ($iRows = 0; $iRows < $iNbRows; $iRows++) {
$oDashboardRow = new DashboardRow();
$oDashboardLayout->AddDashboardRow($oDashboardRow);
@@ -148,8 +151,11 @@ abstract class DashboardLayoutMultiCol extends DashboardLayout
}
$iCellIdx++;
}
$sJSReload .= $oDashboardRow->GetJSRefreshCallback()." ";
}
$oPage->add_script("function updateDashboard".$aExtraParams['dashboard_div_id']."(){".$sJSReload."}");
if ($bEditMode) // Add one row for extensibility
{
$oDashboardRow = new DashboardRow();
@@ -161,7 +167,8 @@ abstract class DashboardLayoutMultiCol extends DashboardLayout
$oDashboardColumn->AddUIBlock(new Html('&nbsp;'));
}
}
return;
return $oDashboardLayout;
}
/**

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2012-2018 Combodo SARL
// Copyright (C) 2012-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -16,19 +16,19 @@
// 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\Component\Dashlet\DashletContainer;
use Combodo\iTop\Application\UI\Component\Dashlet\DashletFactory;
use Combodo\iTop\Application\UI\Component\Html\Html;
use Combodo\iTop\Application\UI\Component\Panel\PanelFactory;
use Combodo\iTop\Application\UI\iUIBlock;
use Combodo\iTop\Application\UI\UIBlock;
use Combodo\iTop\Application\UI\Base\Component\Dashlet\DashletContainer;
use Combodo\iTop\Application\UI\Base\Component\Dashlet\DashletFactory;
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;
require_once(APPROOT.'application/forms.class.inc.php');
/**
* Base class for all 'dashlets' (i.e. widgets to be inserted into a dashboard)
*
* @copyright Copyright (C) 2010-2017 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
abstract class Dashlet
@@ -212,20 +212,16 @@ abstract class Dashlet
{
$sId = $this->GetID();
$sCSSClasses = implode(' ', $this->aCSSClasses);
if ($bEnclosingDiv) {
if ($bEditMode) {
$oDashletContainer = new DashletContainer("dashlet_{$sId}");
} else {
$oDashletContainer = new DashletContainer();
}
$oDashletContainer->AddCSSClasses($sCSSClasses);
$oDashletContainer->AddCSSClasses($this->aCSSClasses);
} else {
$oDashletContainer = new DashletContainer();
foreach ($this->aCSSClasses as $sCSSClass) {
$oPage->add_ready_script("$('#dashlet_".$sId."').addClass('$sCSSClass');");
}
$oDashletContainer->AddCSSClasses($this->aCSSClasses);
}
try {
@@ -239,14 +235,14 @@ abstract class Dashlet
// Maybe the class is part of a non-installed module, fail silently
// Except in Edit mode
if ($bEditMode) {
$oDashletContainer->AddCSSClasses("dashlet-content");
$oDashletContainer->AddCSSClass("dashlet-content");
$oDashletContainer->AddHtml('<h2>'.$e->GetUserFriendlyDescription().'</h2>');
}
} catch (OqlException $e) {
$oDashletContainer->AddCSSClasses("dashlet-content");
$oDashletContainer->AddCSSClass("dashlet-content");
$oDashletContainer->AddHtml('<p>'.$e->GetUserFriendlyDescription().'</p>');
} catch (Exception $e) {
$oDashletContainer->AddCSSClasses("dashlet-content");
$oDashletContainer->AddCSSClass("dashlet-content");
$oDashletContainer->AddHtml('<p>'.$e->getMessage().'</p>');
}
@@ -442,17 +438,21 @@ EOF
$sAttType = $aTargetAttCodes[$sTargetAttCode];
$sExtFieldAttCode = $sTargetAttCode;
}
if (is_a($sAttType, 'AttributeLinkedSet', true))
{
continue;
}
if (is_a($sAttType, 'AttributeFriendlyName', true))
{
continue;
}
if (is_a($sAttType, 'AttributeOneWayPassword', true))
{
continue;
$aForbidenAttType = [
'AttributeLinkedSet',
'AttributeFriendlyName',
'iAttributeNoGroupBy', //we cannot only use iAttributeNoGroupBy since this method is also used by the designer who do not have access to the classes' PHP reflection API. So the known classes has to be listed altogether
'AttributeOneWayPassword',
'AttributeEncryptedString',
'AttributePassword',
];
foreach ($aForbidenAttType as $sForbidenAttType) {
if (is_a($sAttType, $sForbidenAttType, true))
{
continue 2;
}
}
$sLabel = $this->oModelReflection->GetLabel($sClass, $sAttCode);
@@ -602,7 +602,7 @@ class DashletUnknown extends Dashlet
$sIconUrl = utils::HtmlEntities(utils::GetAbsoluteUrlAppRoot().$aInfos['icon']);
$sExplainText = ($bEditMode) ? Dict::Format('UI:DashletUnknown:RenderText:Edit', $this->GetDashletType()) : Dict::S('UI:DashletUnknown:RenderText:View');
$oDashletContainer = new DashletContainer(null, 'dashlet-content');
$oDashletContainer = new DashletContainer(null, ['dashlet-content']);
$oDashletContainer->AddHtml('<div class="dashlet-ukn-image"><img src="'.$sIconUrl.'" /></div>');
$oDashletContainer->AddHtml('<div class="dashlet-ukn-text">'.$sExplainText.'</div>');
@@ -622,7 +622,7 @@ class DashletUnknown extends Dashlet
$sIconUrl = utils::HtmlEntities(utils::GetAbsoluteUrlAppRoot().$aInfos['icon']);
$sExplainText = Dict::Format('UI:DashletUnknown:RenderNoDataText:Edit', $this->GetDashletType());
$oDashletContainer = new DashletContainer(null, 'dashlet-content');
$oDashletContainer = new DashletContainer(null, ['dashlet-content']);
$oDashletContainer->AddHtml('<div class="dashlet-ukn-image"><img src="'.$sIconUrl.'" /></div>');
$oDashletContainer->AddHtml('<div class="dashlet-ukn-text">'.$sExplainText.'</div>');
@@ -746,7 +746,7 @@ class DashletProxy extends DashletUnknown
public function Render($oPage, $bEditMode = false, $aExtraParams = array())
{
// This should never be called.
$oDashletContainer = new DashletContainer(null, 'dashlet-content');
$oDashletContainer = new DashletContainer(null, ['dashlet-content']);
$oDashletContainer->AddHtml('<div>This dashlet is not supposed to be rendered as it is just a proxy for third-party widgets.</div>');
return $oDashletContainer;
}
@@ -763,7 +763,7 @@ class DashletProxy extends DashletUnknown
$sIconUrl = utils::HtmlEntities(utils::GetAbsoluteUrlAppRoot().$aInfos['icon']);
$sExplainText = Dict::Format('UI:DashletProxy:RenderNoDataText:Edit', $this->GetDashletType());
$oDashletContainer = new DashletContainer(null, 'dashlet-content');
$oDashletContainer = new DashletContainer(null, ['dashlet-content']);
$sHtml = '';
$sHtml .= '<div class="dashlet-pxy-image"><img src="'.$sIconUrl.'" /></div>';
@@ -848,12 +848,13 @@ class DashletPlainText extends Dashlet
*/
public function Render($oPage, $bEditMode = false, $aExtraParams = array())
{
$sText = utils::HtmlEntities($this->aProperties['text']);
$sText = $this->aProperties['text'];
$sText = utils::EscapeHtml($sText);
$sText = str_replace(array("\r\n", "\n", "\r"), "<br/>", $sText);
$sId = 'plaintext_'.($bEditMode ? 'edit_' : '').$this->sId;
return DashletFactory::MakeForDashletText($sId, $sText);
return DashletFactory::MakeForDashletPlainText($sText, $sId);
}
/**
@@ -873,7 +874,7 @@ class DashletPlainText extends Dashlet
{
return array(
'label' => Dict::S('UI:DashletPlainText:Label'),
'icon' => 'images/dashlet-text.png',
'icon' => 'images/dashlets/icons8-text-box-48.png',
'description' => Dict::S('UI:DashletPlainText:Description'),
);
}
@@ -903,14 +904,16 @@ class DashletObjectList extends Dashlet
{
$sTitle = $this->aProperties['title'];
$sShowMenu = $this->aProperties['menu'] ? '1' : '0';
$oPanel = PanelFactory::MakeNeutral(Dict::S($sTitle));
$oFilter = $this->GetDBSearch($aExtraParams);
$sClass = $oFilter->GetClass();
$oPanel = PanelUIBlockFactory::MakeForClass($sClass, Dict::S($sTitle))
->AddCSSClass('ibo-datatable-panel');
$oBlock = new DisplayBlock($oFilter, 'list');
$aParams = array(
'menu' => $sShowMenu,
'table_id' => self::APPUSERPREFERENCES_PREFIX.$this->sId,
'surround_with_panel' => false,
);
$sBlockId = 'block_'.$this->sId.($bEditMode ? '_edit' : ''); // make a unique id (edition occurring in the same DOM)
$oBlock->DisplayIntoContentBlock($oPanel, $oPage, $sBlockId, array_merge($aExtraParams, $aParams));
@@ -981,7 +984,7 @@ class DashletObjectList extends Dashlet
{
return array(
'label' => Dict::S('UI:DashletObjectList:Label'),
'icon' => 'images/dashlet-list.png',
'icon' => 'images/dashlets/icons8-list-48.png',
'description' => Dict::S('UI:DashletObjectList:Description'),
);
}
@@ -1240,7 +1243,7 @@ abstract class DashletGroupBy extends Dashlet
break;
}
$oPanel = PanelFactory::MakeNeutral(Dict::S($sTitle));
$oPanel = PanelUIBlockFactory::MakeForClass($sClass, Dict::S($sTitle));
$sBlockId = 'block_'.$this->sId.($bEditMode ? '_edit' : ''); // make a unique id (edition occurring in the same DOM)
@@ -1332,7 +1335,7 @@ abstract class DashletGroupBy extends Dashlet
*/
public function RenderNoData($oPage, $bEditMode = false, $aExtraParams = array())
{
$oDashletContainer = new DashletContainer(null, 'dashlet-content');
$oDashletContainer = new DashletContainer(null, ['dashlet-content']);
$oDashletContainer->AddHtml('error!');
return $oDashletContainer;
}
@@ -1581,7 +1584,7 @@ abstract class DashletGroupBy extends Dashlet
// Note: no need to translate, should never be visible to the end-user!
return array(
'label' => 'Objects grouped by...',
'icon' => 'images/dashlet-object-grouped.png',
'icon' => 'images/dashlets/icons8-transaction-list-48.png',
'description' => 'Grouped objects dashlet (abstract)',
);
}
@@ -1645,7 +1648,7 @@ class DashletGroupByPie extends DashletGroupBy
{
return array(
'label' => Dict::S('UI:DashletGroupByPie:Label'),
'icon' => 'images/dashlet-pie-chart.png',
'icon' => 'images/dashlets/icons8-pie-chart-48.png',
'description' => Dict::S('UI:DashletGroupByPie:Description'),
);
}
@@ -1655,7 +1658,7 @@ class DashletGroupByPie extends DashletGroupBy
*/
public function RenderNoData($oPage, $bEditMode = false, $aExtraParams = array())
{
$oDashletContainer = new DashletContainer(null, 'dashlet-content');
$oDashletContainer = new DashletContainer(null, ['dashlet-content']);
$sTitle = $this->aProperties['title'];
@@ -1720,7 +1723,7 @@ class DashletGroupByBars extends DashletGroupBy
{
return array(
'label' => Dict::S('UI:DashletGroupByBars:Label'),
'icon' => 'images/dashlet-bar-chart.png',
'icon' => 'images/dashlets/icons8-bar-chart-48.png',
'description' => Dict::S('UI:DashletGroupByBars:Description'),
);
}
@@ -1730,7 +1733,7 @@ class DashletGroupByBars extends DashletGroupBy
*/
public function RenderNoData($oPage, $bEditMode = false, $aExtraParams = array())
{
$oDashletContainer = new DashletContainer(null, 'dashlet-content');
$oDashletContainer = new DashletContainer(null, ['dashlet-content']);
$sTitle = $this->aProperties['title'];
@@ -1821,7 +1824,7 @@ class DashletGroupByTable extends DashletGroupBy
return array(
'label' => Dict::S('UI:DashletGroupByTable:Label'),
'description' => Dict::S('UI:DashletGroupByTable:Description'),
'icon' => 'images/dashlet-groupby-table.png',
'icon' => 'images/dashlets/icons8-transaction-list-48.png',
);
}
@@ -1890,7 +1893,7 @@ class DashletHeaderStatic extends Dashlet
*/
public function Render($oPage, $bEditMode = false, $aExtraParams = array())
{
$sTitle = utils::HtmlEntities($this->aProperties['title']);
$sTitle = $this->aProperties['title'];
$sIcon = $this->aProperties['icon'];
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
@@ -1950,7 +1953,7 @@ class DashletHeaderStatic extends Dashlet
{
return array(
'label' => Dict::S('UI:DashletHeaderStatic:Label'),
'icon' => 'images/dashlet-header.png',
'icon' => 'images/dashlets/icons8-header-48.png',
'description' => Dict::S('UI:DashletHeaderStatic:Description'),
);
}
@@ -2020,7 +2023,7 @@ class DashletHeaderDynamic extends Dashlet
$sGroupBy = $this->aProperties['group_by'];
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
$sIconPath = utils::HtmlEntities($oIconSelect->MakeFileUrl($sIcon));
$sIconPath = $oIconSelect->MakeFileUrl($sIcon);
$aValues = $this->GetValues();
if (count($aValues) > 0) {
@@ -2042,8 +2045,6 @@ class DashletHeaderDynamic extends Dashlet
);
}
$oPanel = PanelFactory::MakeEnhancedNeutral(Dict::S(str_replace('_', ':', $sTitle)), $sIconPath);
if (isset($aExtraParams['query_params'])) {
$aQueryParams = $aExtraParams['query_params'];
} elseif (isset($aExtraParams['this->class'])) {
@@ -2053,11 +2054,17 @@ class DashletHeaderDynamic extends Dashlet
$aQueryParams = array();
}
$oFilter = DBObjectSearch::FromOQL($sQuery, $aQueryParams);
$oFilter->SetShowObsoleteData(utils::ShowObsoleteData());
$sClass = $oFilter->GetClass();
$oPanel = PanelUIBlockFactory::MakeNeutral(Dict::S(str_replace('_', ':', $sTitle)))
->SetIcon($sIconPath)
->SetColorFromClass($sClass);
$oBlock = new DisplayBlock($oFilter, 'summary');
$sBlockId = 'block_'.$this->sId.($bEditMode ? '_edit' : ''); // make a unique id (edition occuring in the same DOM)
$oBlock->DisplayIntoContentBlock($oPanel, $oPage, $sBlockId, array_merge($aExtraParams, $aParams));
$oSubTitle = $oPanel->GetSubTitle();
$oSubTitle = $oPanel->GetSubTitleBlock();
$oSet = new DBObjectSet($oFilter);
$iCount = $oSet->Count();
$oAppContext = new ApplicationContext();
@@ -2084,7 +2091,7 @@ class DashletHeaderDynamic extends Dashlet
$oIconSelect = $this->oModelReflection->GetIconSelectionField('icon');
$sIconPath = utils::HtmlEntities($oIconSelect->MakeFileUrl($sIcon));
$oDashletContainer = new DashletContainer(null, 'dashlet-content');
$oDashletContainer = new DashletContainer(null, ['dashlet-content']);
$sHtml = '';
$sHtml .= '<img src="'.$sIconPath.'">';
@@ -2254,7 +2261,7 @@ class DashletHeaderDynamic extends Dashlet
{
return array(
'label' => Dict::S('UI:DashletHeaderDynamic:Label'),
'icon' => 'images/dashlet-header-stats.png',
'icon' => 'images/dashlets/icons8-header-altered-48.png',
'description' => Dict::S('UI:DashletHeaderDynamic:Description'),
);
}
@@ -2281,12 +2288,13 @@ class DashletBadge extends Dashlet
*/
public function Render($oPage, $bEditMode = false, $aExtraParams = array())
{
$oDashletContainer = new DashletContainer($this->sId, 'dashlet-content');
$oDashletContainer = new DashletContainer($this->sId, ['dashlet-content']);
$sClass = $this->aProperties['class'];
$oFilter = new DBObjectSearch($sClass);
$oBlock = new DisplayBlock($oFilter, 'actions');
$aExtraParams['context_filter'] = 1;
$aExtraParams['withJSRefreshCallBack'] = true;
$sBlockId = 'block_'.$this->sId.($bEditMode ? '_edit' : ''); // make a unique id (edition occurring in the same DOM)
$oBlock->DisplayIntoContentBlock($oDashletContainer, $oPage, $sBlockId, $aExtraParams);
@@ -2298,7 +2306,7 @@ class DashletBadge extends Dashlet
*/
public function RenderNoData($oPage, $bEditMode = false, $aExtraParams = array())
{
$oDashletContainer = new DashletContainer($this->sId, 'dashlet-content');
$oDashletContainer = new DashletContainer($this->sId, ['dashlet-content']);
$sClass = $this->aProperties['class'];
$sIconUrl = $this->oModelReflection->GetClassIcon($sClass, false);
@@ -2366,7 +2374,7 @@ class DashletBadge extends Dashlet
{
return array(
'label' => Dict::S('UI:DashletBadge:Label'),
'icon' => 'images/dashlet-badge.png',
'icon' => 'images/dashlets/icons8-badge-48.png',
'description' => Dict::S('UI:DashletBadge:Description'),
);
}

View File

@@ -64,7 +64,7 @@
<parent>WelcomeMenu</parent>
<definition>
<layout>DashboardLayoutOneCol</layout>
<title/>
<title>Menu:WelcomeMenuPage</title>
<cells>
<cell id="0">
<rank>0</rank>
@@ -237,6 +237,27 @@
</argument>
</arguments>
</method>
<method id="AddValue">
<arguments>
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>allow</operation>
<types>
<type id="AttributeInteger"/>
<type id="AttributeDecimal"/>
<type id="AttributePercentage"/>
<type id="AttributeDuration"/>
</types>
</type_restrictions>
</argument>
<argument id="2">
<type>string</type>
<mandatory>false</mandatory>
</argument>
</arguments>
</method>
<method id="SetCurrentDate">
<arguments>
<argument id="1">
@@ -253,6 +274,22 @@
</argument>
</arguments>
</method>
<method id="SetCurrentDateIfNull">
<arguments>
<argument id="1">
<type>attcode</type>
<mandatory>true</mandatory>
<type_restrictions>
<operation>allow</operation>
<types>
<type id="AttributeDate"/>
<type id="AttributeDateTime"/>
<type id="AttributeString"/>
</types>
</type_restrictions>
</argument>
</arguments>
</method>
<method id="SetCurrentUser">
<arguments>
<argument id="1">

View File

@@ -1,9 +1,9 @@
<?php
use Combodo\iTop\Renderer\BlockRenderer;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
/**
* Copyright (C) 2013-2020 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*
@@ -18,6 +18,8 @@ use Combodo\iTop\Renderer\BlockRenderer;
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*
* @deprecated since 3.0.0 use Combodo\iTop\Application\UI\Base\Component\DataTable\Datatable
*/
class DataTable
@@ -350,26 +352,26 @@ EOF;
* @param $aExtraParams
*
* @return string
* @throws \ApplicationException
* @throws \ArchivedObjectException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \DictExceptionMissingString
* @throws \MissingQueryArgument
* @throws \MySQLException
* @throws \MySQLHasGoneAwayException
* @throws \OQLException
* @throws \ReflectionException
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
protected function GetActionsMenu(WebPage $oPage, $aExtraParams)
{
$oMenuBlock = new MenuBlock($this->oSet->GetFilter(), 'list');
$oBlock = $oMenuBlock->GetRenderContent($oPage, $aExtraParams, $this->iListId);
foreach ($oBlock->GetCssFilesUrlRecursively(true) as $sFileAbsUrl) {
$oPage->add_linked_stylesheet($sFileAbsUrl);
}
// JS files
foreach ($oBlock->GetJsFilesUrlRecursively(true) as $sFileAbsUrl) {
$oPage->add_linked_script($sFileAbsUrl);
}
$oPage->RenderInlineScriptsAndCSSRecursively($oBlock);
return BlockRenderer::RenderBlockTemplates($oBlock);
return ConsoleBlockRenderer::RenderBlockTemplateInPage($oPage, $oBlock);
}
/**

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/ErrorPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class ApplicationException extends CoreException
{
}

View File

@@ -0,0 +1,14 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Thrown when querying on an object that exists in the database but is archived
*
* @since 2.5.1 N°1108
*/
class ArchivedObjectException extends CoreException
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class BulkChangeException extends CoreException
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class CSVParserException extends CoreException
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class ConfigException extends CoreException
{
}

View File

@@ -0,0 +1,77 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Class CoreCannotSaveObjectException
*
* Specialized exception to raise if {@link DBObject::CheckToWrite()} fails, which allow easy data retrieval
*
* @see \DBObject::DBInsertNoReload()
* @see \DBObject::DBUpdate()
*
* @since 2.6.0 N°659 uniqueness constraint
*/
class CoreCannotSaveObjectException extends CoreException
{
/** @var string[] */
private $aIssues;
/** @var int */
private $iObjectId;
/** @var string */
private $sObjectClass;
/**
* CoreCannotSaveObjectException constructor.
*
* @param array $aContextData containing at least those keys : issues, id, class
*/
public function __construct($aContextData)
{
$this->aIssues = $aContextData['issues'];
$this->iObjectId = $aContextData['id'];
$this->sObjectClass = $aContextData['class'];
$sIssues = implode(', ', $this->aIssues);
parent::__construct($sIssues, $aContextData);
}
/**
* @return string
*/
public function getHtmlMessage()
{
$sTitle = Dict::S('UI:Error:SaveFailed');
$sContent = "<span><strong>{$sTitle}</strong></span>";
if (count($this->aIssues) == 1) {
$sIssue = reset($this->aIssues);
$sContent .= " <span>{$sIssue}</span>";
} else {
$sContent .= '<ul>';
foreach ($this->aIssues as $sError) {
$sContent .= "<li>$sError</li>";
}
$sContent .= '</ul>';
}
return $sContent;
}
public function getIssues()
{
return $this->aIssues;
}
public function getObjectId()
{
return $this->iObjectId;
}
public function getObjectClass()
{
return $this->sObjectClass;
}
}

View File

@@ -0,0 +1,108 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class CoreException extends Exception
{
/**
* CoreException constructor.
*
* @param string $sIssue error message
* @param array|null $aContextData key/value array, value MUST implements _toString
* @param string $sImpact
* @param Exception|null $oPrevious
*/
public function __construct($sIssue, $aContextData = null, $sImpact = '', $oPrevious = null)
{
$this->m_sIssue = $sIssue;
$this->m_sImpact = $sImpact;
if (is_array($aContextData)) {
$this->m_aContextData = $aContextData;
} else {
$this->m_aContextData = [];
}
$sMessage = $sIssue;
if (!empty($sImpact)) {
$sMessage .= "($sImpact)";
}
if (count($this->m_aContextData) > 0) {
$sMessage .= ": ";
$aContextItems = array();
foreach ($this->m_aContextData as $sKey => $value) {
if (is_array($value)) {
$aPairs = array();
foreach ($value as $key => $val) {
if (is_array($val)) {
$aPairs[] = $key.'=>('.implode(', ', $val).')';
} else {
$aPairs[] = $key.'=>'.$val;
}
}
$sValue = '{'.implode('; ', $aPairs).'}';
} else {
$sValue = $value;
}
$aContextItems[] = "$sKey = $sValue";
}
$sMessage .= implode(', ', $aContextItems);
}
parent::__construct($sMessage, 0, $oPrevious);
}
/**
* @return string code and message for log purposes
*/
public function getInfoLog()
{
return 'error_code='.$this->getCode().', message="'.$this->getMessage().'"';
}
public function getHtmlDesc($sHighlightHtmlBegin = '<b>', $sHighlightHtmlEnd = '</b>')
{
return $this->getMessage();
}
/**
* getTraceAsString() cannot be overrided and it is limited as only current exception stack is returned.
* we need stack of all previous exceptions
*
* @uses __tostring() already does the work.
* @since 2.7.2/ 3.0.0
*/
public function getFullStackTraceAsString()
{
return "".$this;
}
public function getTraceAsHtml()
{
$aBackTrace = $this->getTrace();
return MyHelpers::get_callstack_html(0, $this->getTrace());
// return "<pre>\n".$this->getTraceAsString()."</pre>\n";
}
public function addInfo($sKey, $value)
{
$this->m_aContextData[$sKey] = $value;
}
public function getIssue()
{
return $this->m_sIssue;
}
public function getImpact()
{
return $this->m_sImpact;
}
public function getContextData()
{
return $this->m_aContextData;
}
}

View File

@@ -0,0 +1,13 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* @since 2.7.0 N°2555
*/
class CorePortalInvalidActionRuleException extends CoreException
{
}

View File

@@ -0,0 +1,17 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* @since 3.0.0 N°3522
*/
class CoreTemplateException extends CoreException
{
public function __construct(Exception $oTwigException, string $sTemplatePath)
{
$sMessage = "Twig Exception when rendering '$sTemplatePath' : ".$oTwigException->getMessage();
parent::__construct($sMessage, null, '', $oTwigException);
}
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class CoreUnexpectedValue extends CoreException
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class CoreWarning extends CoreException
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class DeleteException extends CoreException
{
}

View File

@@ -0,0 +1,14 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* A parameter stored in the {@link Config} is invalid
*
* @since 2.7.0
*/
class InvalidConfigParamException extends CoreException
{
}

View File

@@ -0,0 +1,14 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Thrown when the password is not valid
*
* @since 2.7.0
*/
class InvalidPasswordAttributeOneWayPassword extends CoreException
{
}

View File

@@ -0,0 +1,13 @@
<?php
/**
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
namespace Combodo\iTop\Application\TwigBase\Controller;
use Exception;
class PageNotFoundException extends Exception
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class SecurityException extends CoreException
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class SynchroExceptionNotStarted extends CoreException
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class UserRightException extends CoreException
{
}

View File

@@ -0,0 +1,9 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class DictException extends CoreException
{
}

View File

@@ -0,0 +1,16 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class DictExceptionMissingString extends DictException
{
public function __construct($sLanguageCode, $sStringCode)
{
$aContext = array();
$aContext['language_code'] = $sLanguageCode;
$aContext['string_code'] = $sStringCode;
parent::__construct('Missing localized string', $aContext);
}
}

View File

@@ -0,0 +1,15 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class DictExceptionUnknownLanguage extends DictException
{
public function __construct($sLanguageCode)
{
$aContext = array();
$aContext['language_code'] = $sLanguageCode;
parent::__construct('Unknown localization language', $aContext);
}
}

View File

@@ -0,0 +1,34 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class MySQLException extends CoreException
{
/**
* MySQLException constructor.
*
* @param string $sIssue
* @param array $aContext
* @param \Exception $oException
* @param \mysqli $oMysqli to use when working with a custom mysqli instance
*/
public function __construct($sIssue, $aContext, $oException = null, $oMysqli = null)
{
if ($oException != null) {
$aContext['mysql_errno'] = $oException->getCode();
$this->code = $oException->getCode();
$aContext['mysql_error'] = $oException->getMessage();
} else if ($oMysqli != null) {
$aContext['mysql_errno'] = $oMysqli->errno;
$this->code = $oMysqli->errno;
$aContext['mysql_error'] = $oMysqli->error;
} else {
$aContext['mysql_errno'] = CMDBSource::GetErrNo();
$this->code = CMDBSource::GetErrNo();
$aContext['mysql_error'] = CMDBSource::GetError();
}
parent::__construct($sIssue, $aContext);
}
}

View File

@@ -0,0 +1,32 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Class MySQLHasGoneAwayException
*
* @see https://dev.mysql.com/doc/refman/5.7/en/gone-away.html
* @since 2.5.0 N°1195
*/
class MySQLHasGoneAwayException extends MySQLException
{
/**
* can not be a constant before PHP 5.6 (http://php.net/manual/fr/language.oop5.constants.php)
*
* @return int[]
*/
public static function getErrorCodes()
{
return array(
2006,
2013,
);
}
public function __construct($sIssue, $aContext)
{
parent::__construct($sIssue, $aContext, null);
}
}

View File

@@ -0,0 +1,13 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* @since 2.7.0 N°679
*/
class MySQLNoTransactionException extends MySQLException
{
}

View File

@@ -0,0 +1,15 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Class MySQLQueryHasNoResultException
*
* @since 2.5.0
*/
class MySQLQueryHasNoResultException extends MySQLException
{
}

View File

@@ -0,0 +1,13 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* @since 2.7.0 N°2555
*/
class CoreOqlException extends CoreException
{
}

View File

@@ -0,0 +1,13 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* @since 2.7.0 N°2555
*/
class CoreOqlMultipleResultsForbiddenException extends CoreOqlException
{
}

View File

@@ -0,0 +1,15 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Exception for {@link iProcess} implementations.<br>
* An error happened during the processing but we can go on with the next implementations.
*
* @since 2.5.0 N°1195
*/
class ProcessException extends CoreException
{
}

View File

@@ -0,0 +1,16 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Class ProcessFatalException
* Exception for iProcess implementations.<br>
* A big error occurred, we have to stop the iProcess processing.
*
* @since 2.5.0 N°1195
*/
class ProcessFatalException extends CoreException
{
}

View File

@@ -0,0 +1,12 @@
<?php
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* @since 2.7.0 PR #89
*/
class ProcessInvalidConfigException extends ProcessException
{
}

View File

@@ -0,0 +1,114 @@
<?php
/**
* Copyright (C) 2013-2020 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
*/
/**
* Class FindStylesheetObject: dedicated class to store computations made in method ThemeHandler::FindStylesheetFile.
* @author Olivier DAIN <olivier.dain@combodo.com>
* @since 3.0.0 N°3588
*/
class FindStylesheetObject{
//file URIs
private $aStylesheetFileURIs;
//fill paths
private $aStylesheetImportPaths;
private $aAllStylesheetFilePaths;
private $sLastStyleSheetPath;
private $iLastModified;
/**
* FindStylesheetObject constructor.
*/
public function __construct()
{
$this->aStylesheetFileURIs = [];
$this->aStylesheetImportPaths = [];
$this->aAllStylesheetFilePaths = [];
$this->sLastStyleSheetPath = "";
$this->iLastModified = 0;
}
public function GetLastStylesheetFile(): string
{
return $this->sLastStyleSheetPath;
}
public function GetImportPaths(): array
{
return $this->aStylesheetImportPaths;
}
/**
* @return array : main stylesheets URIs
*/
public function GetStylesheetFileURIs(): array
{
return $this->aStylesheetFileURIs;
}
public function GetLastModified() : int
{
return $this->iLastModified;
}
/**
* @return array : main stylesheets paths + included files paths
*/
public function GetAllStylesheetPaths(): array
{
return $this->aAllStylesheetFilePaths;
}
/**
* @return string : last found stylesheet URI
*/
public function GetLastStyleSheetPath(): string
{
return $this->sLastStyleSheetPath;
}
public function AddStylesheet(string $sStylesheetFileURI, string $sStylesheetFilePath): void
{
$this->aStylesheetFileURIs[] = $sStylesheetFileURI;
$this->aAllStylesheetFilePaths[] = $sStylesheetFilePath;
$this->sLastStyleSheetPath = $sStylesheetFilePath;
}
public function AlreadyFetched(string $sStylesheetFilePath) : bool {
return in_array($sStylesheetFilePath, $this->aAllStylesheetFilePaths);
}
public function AddImport(string $sStylesheetFileURI, string $sStylesheetFilePath): void
{
$this->aStylesheetImportPaths[$sStylesheetFileURI] = $sStylesheetFilePath;
$this->aAllStylesheetFilePaths[] = $sStylesheetFilePath;
}
public function UpdateLastModified(string $sStylesheetFile): void
{
$this->iLastModified = max($this->iLastModified, @filemtime($sStylesheetFile));
}
public function ResetLastStyleSheet(): void
{
$this->sLastStyleSheetPath = "";
}
}

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,7 +20,7 @@
* Helper class to build interactive forms to be used either in stand-alone
* modal dialog or in "property-sheet" panes.
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
class DesignerForm
@@ -102,23 +102,19 @@ class DesignerForm
$sReturn .= '<fieldset>';
$sReturn .= '<legend>'.$sLabel.'</legend>';
}
foreach($aFields as $oField)
{
foreach($aFields as $oField) {
$aRow = $oField->Render($oP, $sFormId);
if ($oField->IsVisible())
{
$sValidation = '&nbsp;<span class="prop_apply">'.$this->GetValidationArea($oField->GetFieldId()).'</span>';
if ($oField->IsVisible()) {
$sValidation = '<span class="prop_apply ibo-prop--apply">'.$this->GetValidationArea($oField->GetFieldId()).'</span>';
$sField = $aRow['value'].$sValidation;
$aDetails[] = array('label' => $aRow['label'], 'value' => $sField);
}
else
{
} else {
$sHiddenFields .= $aRow['value'];
}
}
$sReturn .= $oP->GetDetails($aDetails);
if ($sLabel != '')
{
if ($sLabel != '') {
$sReturn .= '</fieldset>';
}
}
@@ -230,18 +226,18 @@ class DesignerForm
if ($oField->IsVisible())
{
$sFieldId = $this->GetFieldId($oField->GetCode());
$sValidation = $this->GetValidationArea($sFieldId, '<span title="Apply" class="ui-icon ui-icon-circle-check"/>');
$sValidationFields = '</td><td class="prop_icon prop_apply">'.$sValidation.'</td><td class="prop_icon prop_cancel"><span title="Revert" class="ui-icon ui-icon-circle-close"/></td>'.$this->EndRow();
$sValidation = $this->GetValidationArea($sFieldId, '<span data-tooltip-content="Apply"><i class="fas fa-check"></i></span>');
$sValidationFields = '</td><td class="prop_icon prop_apply ibo-prop--apply">'.$sValidation.'</td><td class="prop_icon prop_cancel ibo-prop--cancel"><span data-tooltip-content="Revert"><i class="fas fa-times"></i></span></td>'.$this->EndRow();
$sPath = $this->GetHierarchyPath().'/'.$oField->GetCode();
if (is_null($aRow['label']))
{
$sReturn .= $this->StartRow($sFieldId).'<td class="prop_value" colspan="2">'.$aRow['value'];
$sReturn .= $this->StartRow($sFieldId).'<td class="prop_value ibo-field--value" colspan="2">'.$aRow['value'];
}
else
{
$sReturn .= $this->StartRow($sFieldId).'<td class="prop_label">'.$aRow['label'].'</td><td class="prop_value">'.$aRow['value'];
$sReturn .= $this->StartRow($sFieldId).'<td class="prop_label ibo-field--label">'.$aRow['label'].'</td><td class="prop_value ibo-field--value">'.$aRow['value'];
}
if (!($oField instanceof DesignerFormSelectorField) && !($oField instanceof DesignerMultipleSubFormField))
{
@@ -266,6 +262,7 @@ class DesignerForm
$this->AddReadyScript(
<<<EOF
$('#row_$sFieldId').$sWidgetClass({parent_selector: $sNotifyParentSelectorJS, field_id: '$sFieldId', equals: $sHandlerEquals, get_field_value: $sHandlerGetValue, auto_apply: $sAutoApply, value: '', submit_to: '$sActionUrl', submit_parameters: $sJSSubmitParams $sJSExtraParams });
CombodoTooltip.InitTooltipFromMarkup($('#$sFormId [data-tooltip-content]'));
EOF
);
}
@@ -291,7 +288,6 @@ EOF
}
$this->AddReadyScript(
<<<EOF
$('.prop_table').tableHover();
var idx = 0;
$('.prop_table tbody tr').each(function() {
if ((idx % 2) == 0)
@@ -548,7 +544,7 @@ EOF
public function GetValidationArea($sId, $sContent = '')
{
return "<span style=\"display:inline-block;width:20px;\" id=\"v_{$sId}\"><span class=\"ui-icon ui-icon-alert\"></span>$sContent</span>";
return "<span id=\"v_{$sId}\">$sContent</span>";
}
public function GetAsyncActionClass()
{
@@ -716,7 +712,7 @@ class DesignerFormField
$this->bMandatory = false;
$this->bReadOnly = false;
$this->bAutoApply = false;
$this->aCSSClasses = array();
$this->aCSSClasses = array('ibo-input');
$this->bDisplayed = true;
$this->aWidgetExtraParams = array();
}
@@ -1020,10 +1016,10 @@ class DesignerTextField extends DesignerFormField
$sMandatory = $this->bMandatory ? 'true' : 'false';
$oP->add_ready_script(
<<<EOF
$('#$sId').bind('change keyup validate', function() { ValidateWithPattern('$sId', $sMandatory, '$sPattern', $(this).closest('form').attr('id'), $sForbiddenValues); } );
$('#$sId').on('change keyup validate', function() { ValidateWithPattern('$sId', $sMandatory, '$sPattern', $(this).closest('form').attr('id'), $sForbiddenValues); } );
{
var myTimer = null;
$('#$sId').bind('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
$('#$sId').on('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
}
EOF
);
@@ -1055,6 +1051,12 @@ EOF
class DesignerLongTextField extends DesignerTextField
{
public function __construct($sCode, $sLabel = '', $defaultValue = '')
{
parent::__construct($sCode, $sLabel, $defaultValue);
$this->aCSSClasses[] = 'ibo-input-text';
}
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
{
$sId = $this->oForm->GetFieldId($this->sCode);
@@ -1078,10 +1080,10 @@ class DesignerLongTextField extends DesignerTextField
{
$oP->add_ready_script(
<<<EOF
$('#$sId').bind('change keyup validate', function() { ValidateWithPattern('$sId', $sMandatory, '$sPattern', $(this).closest('form').attr('id'), $sForbiddenValues); } );
$('#$sId').on('change keyup validate', function() { ValidateWithPattern('$sId', $sMandatory, '$sPattern', $(this).closest('form').attr('id'), $sForbiddenValues); } );
{
var myTimer = null;
$('#$sId').bind('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
$('#$sId').on('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
}
EOF
);
@@ -1129,10 +1131,10 @@ class DesignerIntegerField extends DesignerFormField
$sMandatory = $this->bMandatory ? 'true' : 'false';
$oP->add_ready_script(
<<<EOF
$('#$sId').bind('change keyup validate', function() { ValidateInteger('$sId', $sMandatory, $(this).closest('form').attr('id'), $sMin, $sMax); } );
$('#$sId').on('change keyup validate', function() { ValidateInteger('$sId', $sMandatory, $(this).closest('form').attr('id'), $sMin, $sMax); } );
{
var myTimer = null;
$('#$sId').bind('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
$('#$sId').on('keyup', function() { clearTimeout(myTimer); myTimer = setTimeout(function() { $('#$sId').trigger('change', {} ); }, 100); });
}
EOF
);
@@ -1178,6 +1180,7 @@ class DesignerComboField extends DesignerFormField
$this->bMultipleSelection = false;
$this->bOtherChoices = false;
$this->sNullLabel = Dict::S('UI:SelectOne');
$this->aCSSClasses[] = 'ibo-input-select';
$this->bAutoApply = true;
$this->bSorted = true; // Sorted by default
@@ -1292,11 +1295,12 @@ class DesignerComboField extends DesignerFormField
}
$oP->add_ready_script(
<<<EOF
$('#$sId').bind('change validate', function() { ValidateWithPattern('$sId', $sMandatory, '', $(this).closest('form').attr('id'), null, null); } );
$('#$sId').on('change validate', function() { ValidateWithPattern('$sId', $sMandatory, '', $(this).closest('form').attr('id'), null, null); } );
EOF
);
}
return array('label' => $this->sLabel, 'value' => $sHtml);
}
public function ReadParam(&$aValues)
@@ -1315,6 +1319,7 @@ class DesignerBooleanField extends DesignerFormField
{
parent::__construct($sCode, $sLabel, $defaultValue);
$this->bAutoApply = true;
$this->aCSSClasses[] = 'ibo-input-checkbox';
}
public function Render(WebPage $oP, $sFormId, $sRenderMode='dialog')
@@ -1597,6 +1602,7 @@ class DesignerFormSelectorField extends DesignerFormField
$this->defaultRealValue = $defaultValue;
$this->aSubForms = array();
$this->bSorted = true;
$this->aCSSClasses[] = 'ibo-input-select';
}
public function IsSorted()
@@ -1730,7 +1736,7 @@ class DesignerFormSelectorField extends DesignerFormField
{
$oP->add_ready_script(
<<<EOF
$('#$sId').bind('change reverted', function() { $('.subform_{$sId}').hide(); $('.{$sId}_'+this.value).show(); } );
$('#$sId').on('change reverted', function() { $('.subform_{$sId}').hide(); $('.{$sId}_'+this.value).show(); } );
EOF
);
}

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,7 +20,7 @@
/**
* Persistent class InputOutputTask
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/iTopWebPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/iTopWizardWebPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -2,7 +2,7 @@
/**
* Class LoginBasic
*
* @copyright Copyright (C) 2010-2019 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,6 +1,6 @@
<?php
/**
* @copyright Copyright (C) 2010-2019 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -3,7 +3,7 @@
/**
* Class LoginExternal
*
* @copyright Copyright (C) 2010-2019 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,7 +1,7 @@
<?php
/**
* @copyright Copyright (C) 2010-2019 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -2,7 +2,7 @@
/**
*
* @copyright Copyright (C) 2010-2019 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -3,7 +3,7 @@
/**
* Class LoginURL
*
* @copyright Copyright (C) 2010-2019 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2017 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,7 +20,7 @@
/**
* Class LoginWebPage
*
* @copyright Copyright (C) 2010-2017 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -84,10 +84,8 @@ class LoginWebPage extends NiceWebPage
parent::__construct($sTitle);
$this->SetStyleSheet();
$this->add_header('Cache-control: no-cache, no-store, must-revalidate');
$this->add_header('Pragma: no-cache');
$this->add_header('Expires: 0');
$this->add_header('X-Frame-Options: deny');
$this->no_cache();
$this->add_xframe_options();
}
public function SetStyleSheet()
@@ -724,7 +722,7 @@ class LoginWebPage extends NiceWebPage
public static function HTTPReload()
{
$sOriginURL = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$sOriginURL = utils::GetCurrentAbsoluteUrl();
if (!utils::StartsWith($sOriginURL, utils::GetAbsoluteUrlAppRoot()))
{
// If the found URL does not start with the configured AppRoot URL

View File

@@ -1,6 +1,6 @@
<?php
/**
* Copyright (C) 2013-2019 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*

View File

@@ -1,6 +1,6 @@
<?php
/**
* Copyright (C) 2013-2019 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*
@@ -17,7 +17,7 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\UI\Component\Title\TitleFactory;
use Combodo\iTop\Application\UI\Base\Component\Title\TitleUIBlockFactory;
require_once(APPROOT.'/application/utils.inc.php');
require_once(APPROOT.'/application/template.class.inc.php');
@@ -723,6 +723,56 @@ abstract class MenuNode
return false;
}
protected function GetEntriesCountFromOQL(string $sOQL)
{
// Count the entries up to 99
$oSearch = DBSearch::FromOQL($sOQL);
$oAppContext = new ApplicationContext();
$sClass = $oSearch->GetClass();
foreach ($oAppContext->GetNames() as $key) {
// Find the value of the object corresponding to each 'context' parameter
$aCallSpec = [$sClass, 'MapContextParam'];
$sAttCode = '';
if (is_callable($aCallSpec)) {
$sAttCode = call_user_func($aCallSpec, $key); // Returns null when there is no mapping for this parameter
}
if (MetaModel::IsValidAttCode($sClass, $sAttCode)) {
// Add Hierarchical condition if hierarchical key
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
if (isset($oAttDef) && ($oAttDef->IsExternalKey())) {
$iDefaultValue = intval($oAppContext->GetCurrentValue($key));
if ($iDefaultValue != 0) {
try {
/** @var AttributeExternalKey $oAttDef */
$sTargetClass = $oAttDef->GetTargetClass();
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass($sTargetClass);
if ($sHierarchicalKeyCode !== false) {
$oFilter = new DBObjectSearch($sTargetClass);
$oFilter->AddCondition('id', $iDefaultValue);
$oHKFilter = new DBObjectSearch($sTargetClass);
$oHKFilter->AddCondition_PointingTo($oFilter, $sHierarchicalKeyCode, TREE_OPERATOR_BELOW);
$oSearch->AddCondition_PointingTo($oHKFilter, $sAttCode);
}
}
catch (Exception $e) {
// If filtering fails just ignore it
}
}
}
}
}
$oSet = new DBObjectSet($oSearch);
$iCount = $oSet->CountWithLimit(99);
if ($iCount > 99) {
$iCount = "99+";
}
return $iCount;
}
/**
* Get the number of entries of the page corresponding to this menu item.
*
@@ -1130,8 +1180,8 @@ class OQLMenuNode extends MenuNode
}
//$oPage->add("<p class=\"page-header\">$sIcon ".utils::HtmlEntities(Dict::S($sTitle))."</p>");
$oPage->add("<div class='sf_results_area'>");
$oTitle = TitleFactory::MakeForPage($sTitle);
$oPage->add("<div class='sf_results_area' data-target='search_results'>");
$oTitle = TitleUIBlockFactory::MakeForPage($sTitle);
$oPage->AddUiBlock($oTitle);
$aParams = array_merge(array('table_id' => $sUsageId), $aExtraParams);
@@ -1139,7 +1189,7 @@ class OQLMenuNode extends MenuNode
$oBlock->Display($oPage, $sUsageId);
$oPage->add("</div>");
if ($bEnableBreadcrumb && ($oPage instanceof iTopWebPage)) {
// Breadcrumb
//$iCount = $oBlock->GetDisplayedCount();
@@ -1156,15 +1206,7 @@ class OQLMenuNode extends MenuNode
public function GetEntriesCount()
{
// Count the entries up to 99
$oSet = new DBObjectSet(DBSearch::FromOQL($this->sOQL));
$iCount = $oSet->CountWithLimit(99);
if ($iCount > 99) {
$iCount = "99+";
}
return $iCount;
return $this->GetEntriesCountFromOQL($this->sOQL);
}
}
@@ -1420,37 +1462,29 @@ class DashboardMenuNode extends MenuNode
if ($oDashboard != null)
{
$sDivId = utils::Sanitize($this->sMenuId, '', 'element_identifier');
$oPage->add('<div class="ibo-dashboard" id="'.$sDivId.'">');
$oPage->add('<div id="'.$sDivId.'" class="ibo-dashboard" data-role="ibo-dashboard">');
$aExtraParams['dashboard_div_id'] = $sDivId;
$aExtraParams['from_dashboard_page'] = true;
$oDashboard->SetReloadURL($this->GetHyperlink($aExtraParams));
$oDashboard->Render($oPage, false, $aExtraParams);
$oPage->add('</div>');
$bEdit = utils::ReadParam('edit', false);
if ($bEdit)
{
if ($bEdit) {
$sId = addslashes($this->sMenuId);
$oPage->add_ready_script("EditDashboard('$sId');");
}
else
{
} else {
$oParentMenu = ApplicationMenu::GetMenuNode($this->iParentIndex);
$sParentTitle = $oParentMenu->GetTitle();
$sThisTitle = $this->GetTitle();
if ($sParentTitle != $sThisTitle)
{
if ($sParentTitle != $sThisTitle) {
$sDescription = $sParentTitle.' / '.$sThisTitle;
}
else
{
} else {
$sDescription = $sThisTitle;
}
if ($this->sMenuId == ApplicationMenu::GetDefaultMenuId())
{
if ($this->sMenuId == ApplicationMenu::GetDefaultMenuId()) {
$sIcon = 'fas fa-home';
}
else
{
} else {
$sIcon = 'fas fa-chart-pie';
}
$oPage->SetBreadCrumbEntry("ui-dashboard-".$this->sMenuId, $this->GetTitle(), $sDescription, '', $sIcon, iTopWebPage::ENUM_BREADCRUMB_ENTRY_ICON_TYPE_CSS_CLASSES);
@@ -1622,5 +1656,23 @@ class ShortcutMenuNode extends MenuNode
{
return $this->oShortcut->Get('name');
}
/**
* Indicates if the page corresponding to this menu node is countable
*
* @return bool true if corresponding page is countable
* @since 3.0.0
*/
public function HasCount()
{
return true;
}
public function GetEntriesCount()
{
return $this->GetEntriesCountFromOQL($this->oShortcut->Get('oql'));
}
}

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2015 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/NiceWebPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/PDFPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -1,33 +1,28 @@
<?php
// Copyright (C) 2010-2015 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Persistent class Event and derived
* Application internal events
* There is also a file log
/*
* Copyright (C) 2010-2021 Combodo SARL
*
* @copyright Copyright (C) 2010-2015 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
* 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
*/
abstract class Query extends cmdbAbstractObject
{
/**
* @throws \CoreException
* @since 3.0.0 N°3227 add is_template field for predefined queries
*/
public static function Init()
{
$aParams = array
@@ -42,17 +37,39 @@ abstract class Query extends cmdbAbstractObject
"db_finalclass_field" => "realclass",
);
MetaModel::Init_Params($aParams);
//MetaModel::Init_InheritAttributes();
MetaModel::Init_AddAttribute(new AttributeString("name", array("allowed_values"=>null, "sql"=>"name", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("description", array("allowed_values"=>null, "sql"=>"description", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeString("name", array(
"allowed_values" => null,
"sql" => "name",
"default_value" => null,
"is_null_allowed" => false,
"depends_on" => array(),
)));
MetaModel::Init_AddAttribute(new AttributeText("description", array(
"allowed_values" => null,
"sql" => "description",
"default_value" => null,
"is_null_allowed" => false,
"depends_on" => array(),
)));
MetaModel::Init_AddAttribute(new AttributeEnum("is_template", array(
'allowed_values' => new ValueSetEnum('yes,no'),
'sql' => 'is_template',
'default_value' => 'no',
'is_null_allowed' => false,
'depends_on' => [],
'display_style' => 'radio_horizontal',
)));
// Display lists
MetaModel::Init_SetZListItems('details', array('name', 'description')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details',
array('name', 'is_template', 'description')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('description')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('name', 'description')); // Criteria of the std search form
MetaModel::Init_SetZListItems('default_search', array('name', 'description')); // Criteria of the default search form
MetaModel::Init_SetZListItems('standard_search', array('name', 'description', 'is_template')); // Criteria of the std search form
MetaModel::Init_SetZListItems('default_search',
array('name', 'description', 'is_template')); // Criteria of the default search form
// MetaModel::Init_SetZListItems('advanced_search', array('name')); // Criteria of the advanced search form
}
}
@@ -67,23 +84,37 @@ class QueryOQL extends Query
"key_type" => "autoincrement",
"name_attcode" => "name",
"state_attcode" => "",
"reconc_keys" => array(),
"reconc_keys" => array('oql', 'is_template'),
"db_table" => "priv_query_oql",
"db_key_field" => "id",
"db_finalclass_field" => "",
);
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
MetaModel::Init_AddAttribute(new AttributeOQL("oql", array("allowed_values"=>null, "sql"=>"oql", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("fields", array("allowed_values"=>null, "sql"=>"fields", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeOQL("oql", array(
"allowed_values" => null,
"sql" => "oql",
"default_value" => null,
"is_null_allowed" => false,
"depends_on" => array(),
)));
MetaModel::Init_AddAttribute(new AttributeText("fields", array(
"allowed_values" => null,
"sql" => "fields",
"default_value" => null,
"is_null_allowed" => true,
"depends_on" => array(),
)));
// Rolled back to AttributeText until AttributeQueryAttCodeSet can manage fields order correctly
//MetaModel::Init_AddAttribute(new AttributeQueryAttCodeSet("fields", array("allowed_values"=>null,"max_items" => 1000, "query_field" => "oql", "sql"=>"fields", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array('oql'))));
// Display lists
MetaModel::Init_SetZListItems('details', array('name', 'description', 'oql', 'fields')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details',
array('name', 'is_template', 'description', 'oql', 'fields')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('description')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('name', 'description', 'fields', 'oql')); // Criteria of the std search form
MetaModel::Init_SetZListItems('standard_search',
array('name', 'description', 'is_template', 'fields', 'oql')); // Criteria of the std search form
}
function DisplayBareProperties(WebPage $oPage, $bEditMode = false, $sPrefix = '', $aExtraParams = array())

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2016 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -15,14 +15,14 @@
//
// 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\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
/**
* Persistent class Shortcut and derived
* Shortcuts of any kind
*
* @copyright Copyright (C) 2010-2016 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -101,7 +101,7 @@ function ShortcutRenameOK()
});
}
$('#shortcut_rename_dlg form').bind('submit', function() { return false; });
$('#shortcut_rename_dlg form').on('submit', function() { return false; });
$('#shortcut_rename_dlg').dialog({
width: 400,
@@ -286,8 +286,7 @@ class ShortcutOQL extends Shortcut
$sRateTitle = addslashes(Dict::Format('Class:ShortcutOQL/Attribute:auto_reload_sec/tip', MetaModel::GetConfig()->Get('min_reload_interval')));
$oPage->add_ready_script(
<<<EOF
<<<JS
// Note: the title gets deleted by the validation mechanism
$("#attr_auto_reload_sec").tooltip({items: 'input', content: '$sRateTitle'});
$("#attr_auto_reload_sec").prop('disabled', !$('#attr_auto_reload').is(':checked'));
@@ -315,23 +314,30 @@ function ShortcutCreationOK()
});
}
$('#shortcut_creation_dlg form').bind('submit', function() { ShortcutCreationOK(); return false; });
$('#shortcut_creation_dlg form').on('submit', function() { ShortcutCreationOK(); return false; });
$('#shortcut_creation_dlg').dialog({
width: 400,
modal: true,
title: '$sDialogTitle',
buttons: [
{ text: "$sOkButtonLabel", click: ShortcutCreationOK },
{ text: "$sCancelButtonLabel", click: function() {
$(this).dialog( "close" ); $(this).remove();
} },
{
text: "$sCancelButtonLabel",
class: "ibo-is-alternative",
click: function() {
$(this).dialog( "close" );
$(this).remove();
}
},
{
text: "$sOkButtonLabel",
class: "ibo-is-primary",
click: ShortcutCreationOK
},
],
close: function() { $(this).remove(); }
});
EOF
JS
);
}
}
?>

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2016 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -23,7 +23,7 @@ require_once(APPROOT.'/core/contexttag.class.inc.php');
/**
* File to include to initialize the datamodel in memory
*
* @copyright Copyright (C) 2010-2019 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,6 +1,6 @@
<?php
/**
* Copyright (C) 2013-2020 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*
@@ -21,7 +21,7 @@ require_once(APPROOT.'/application/displayblock.class.inc.php');
/**
* This class manages the special template format used internally to build the iTop web pages
*
* @deprecated Since 3.0.0
* @deprecated 3.0.0
*/
class DisplayTemplate
{

View File

@@ -1,6 +1,6 @@
<?php
/**
* Copyright (C) 2013-2020 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*
@@ -43,15 +43,13 @@ class ThemeHandler
public static function GetDefaultThemeInformation()
{
return [
'name' => 'light-grey',
'name' => 'fullmoon',
'parameters' => [
'variables' => [],
'imports' => [
'css-variables' => '../css/css-variables.scss',
],
'stylesheets' => [
'jqueryui' => '../css/ui-lightness/jqueryui.scss',
'main' => '../css/light-grey.scss',
'main' => '../css/backoffice/main.scss',
],
],
];
@@ -143,27 +141,24 @@ class ThemeHandler
* @throws \CoreException
* @return boolean: indicate whether theme compilation occured
*/
public static function CompileTheme($sThemeId, $bSetup=false, $sSetupCompilationTimestamp="", $aThemeParameters = null, $aImportsPaths = null, $sWorkingPath = null)
{
if ($sSetupCompilationTimestamp==="")
{
public static function CompileTheme($sThemeId, $bSetup=false, $sSetupCompilationTimestamp="", $aThemeParameters = null, $aImportsPaths = null, $sWorkingPath = null) {
if ($sSetupCompilationTimestamp === "") {
$sSetupCompilationTimestamp = microtime(true);
}
$sSetupCompilationTimestampInSecunds = (strpos($sSetupCompilationTimestamp, '.') !==false) ? explode('.', $sSetupCompilationTimestamp)[0] : $sSetupCompilationTimestamp;
$sSetupCompilationTimestampInSecunds = (strpos($sSetupCompilationTimestamp, '.') !== false) ? explode('.',
$sSetupCompilationTimestamp)[0] : $sSetupCompilationTimestamp;
$sEnv = APPROOT.'env-'.utils::GetCurrentEnvironment().'/';
// Default working path
if($sWorkingPath === null)
{
if ($sWorkingPath === null) {
$sWorkingPath = $sEnv;
}
// Default import paths (env-*)
if($aImportsPaths === null)
{
$aImportsPaths = [ $sEnv];
if ($aImportsPaths === null) {
$aImportsPaths = [$sEnv];
}
// Note: We do NOT check that the folder exists!
@@ -171,53 +166,46 @@ class ThemeHandler
$sThemeCssPath = $sThemeFolderPath.'main.css';
// Save parameters if passed... (typically during DM compilation)
if(is_array($aThemeParameters))
{
if (!is_dir($sThemeFolderPath))
{
if (is_array($aThemeParameters)) {
if (!is_dir($sThemeFolderPath)) {
mkdir($sWorkingPath.'/branding/');
mkdir($sWorkingPath.'/branding/themes/');
}
file_put_contents($sThemeFolderPath.'/theme-parameters.json', json_encode($aThemeParameters));
}
// ... Otherwise, retrieve them from compiled DM (typically when switching current theme in the config. file)
else
{
} // ... Otherwise, retrieve them from compiled DM (typically when switching current theme in the config. file)
else {
$aThemeParameters = json_decode(@file_get_contents($sThemeFolderPath.'theme-parameters.json'), true);
if ($aThemeParameters === null)
{
if ($aThemeParameters === null) {
throw new CoreException('Could not load "'.$sThemeId.'" theme parameters from file, check that it has been compiled correctly');
}
}
$aThemeParametersWithVersion = self::CloneThemeParameterAndIncludeVersion($aThemeParameters, $sSetupCompilationTimestampInSecunds);
$sTmpThemeScssContent = '';
$iStyleLastModified = 0;
clearstatcache();
// Loading files to import and stylesheet to compile, also getting most recent modification time on overall files
$aStylesheetFiles = [];
foreach ($aThemeParameters['imports'] as $sImport)
{
$sTmpThemeScssContent .= '@import "'.$sImport.'";'."\n";
$sFile = static::FindStylesheetFile($sImport, $aImportsPaths);
$iImportLastModified = @filemtime($sFile);
$aStylesheetFiles[] = $sFile;
$iStyleLastModified = $iStyleLastModified < $iImportLastModified ? $iImportLastModified : $iStyleLastModified;
$sTmpThemeScssContent = '';
$oFindStylesheetObject = new FindStylesheetObject();
if (isset($aThemeParameters['imports_utility'])) {
foreach ($aThemeParameters['imports_utility'] as $sImport) {
static::FindStylesheetFile($sImport, $aImportsPaths, $oFindStylesheetObject);
}
}
foreach ($aThemeParameters['stylesheets'] as $sStylesheet)
{
if (isset($aThemeParameters['stylesheets'])) {
foreach ($aThemeParameters['stylesheets'] as $sStylesheet) {
static::FindStylesheetFile($sStylesheet, $aImportsPaths, $oFindStylesheetObject);
}
}
foreach ($oFindStylesheetObject->GetStylesheetFileURIs() as $sStylesheet){
$sTmpThemeScssContent .= '@import "'.$sStylesheet.'";'."\n";
$sFile = static::FindStylesheetFile($sStylesheet, $aImportsPaths);
$iStylesheetLastModified = @filemtime($sFile);
$aStylesheetFiles[] = $sFile;
$iStyleLastModified = $iStyleLastModified < $iStylesheetLastModified ? $iStylesheetLastModified : $iStyleLastModified;
}
$aIncludedImages=static::GetIncludedImages($aThemeParametersWithVersion, $aStylesheetFiles, $sThemeId);
$iStyleLastModified = $oFindStylesheetObject->GetLastModified();
$aIncludedImages=static::GetIncludedImages($aThemeParametersWithVersion, $oFindStylesheetObject->GetAllStylesheetPaths(), $sThemeId);
foreach ($aIncludedImages as $sImage)
{
if (is_file($sImage))
@@ -286,6 +274,7 @@ CSS;
}
/**
* @since 3.0.0 N°2982
* Compute the signature of a theme defined by its theme parameters. The signature is a JSON structure of
* 1) one MD5 of all the variables/values (JSON encoded)
* 2) the MD5 of each stylesheet file
@@ -299,8 +288,7 @@ CSS;
* @return string
* @throws \Exception
*/
public static function ComputeSignature($aThemeParameters, $aImportsPaths, $aIncludedImages)
{
public static function ComputeSignature($aThemeParameters, $aImportsPaths, $aIncludedImages) {
$aSignature = [
'variables' => md5(json_encode($aThemeParameters['variables'])),
'stylesheets' => [],
@@ -308,16 +296,44 @@ CSS;
'images' => []
];
foreach ($aThemeParameters['imports'] as $key => $sImport)
{
$sFile = static::FindStylesheetFile($sImport, $aImportsPaths);
$aSignature['stylesheets'][$key] = md5_file($sFile);
$oFindStylesheetObject = new FindStylesheetObject();
if (isset($aThemeParameters['imports_variable'])) {
foreach ($aThemeParameters['imports_variable'] as $key => $sImport) {
static::FindStylesheetFile($sImport, $aImportsPaths, $oFindStylesheetObject);
$sFile = $oFindStylesheetObject->GetLastStylesheetFile();
if (!empty($sFile)) {
$aSignature['stylesheets'][$key] = md5_file($sFile);
}
}
}
foreach ($aThemeParameters['stylesheets'] as $key => $sStylesheet)
{
$sFile = static::FindStylesheetFile($sStylesheet, $aImportsPaths);
$aSignature['stylesheets'][$key] = md5_file($sFile);
if (isset($aThemeParameters['imports_utility'])) {
foreach ($aThemeParameters['imports_utility'] as $key => $sImport) {
static::FindStylesheetFile($sImport, $aImportsPaths, $oFindStylesheetObject);
$sFile = $oFindStylesheetObject->GetLastStylesheetFile();
if (!empty($sFile)) {
$aSignature['stylesheets'][$key] = md5_file($sFile);
}
}
}
if (isset($aThemeParameters['stylesheets'])) {
foreach ($aThemeParameters['stylesheets'] as $key => $sStylesheet) {
static::FindStylesheetFile($sStylesheet, $aImportsPaths, $oFindStylesheetObject);
$sFile = $oFindStylesheetObject->GetLastStylesheetFile();
if (!empty($sFile)) {
$aSignature['stylesheets'][$key] = md5_file($sFile);
}
}
}
$aFiles = $oFindStylesheetObject->GetImportPaths();
if (count($aFiles) !== 0) {
foreach ($aFiles as $sFileURI => $sFilePath) {
$aSignature['imports_utility'][$sFileURI] = md5_file($sFilePath);
}
}
foreach ($aIncludedImages as $sImage)
{
if (is_file($sImage)) {
@@ -337,7 +353,7 @@ CSS;
* @param string $sThemeId : used only for logging purpose
*
* @return array complete path of the images, but with slashes as dir separator instead of DIRECTORY_SEPARATOR
* @since 3.0.0
* @since 3.0.0 N°2982
*/
public static function GetIncludedImages($aThemeParametersVariables, $aStylesheetFiles, $sThemeId)
{
@@ -432,6 +448,7 @@ CSS;
}
/**
* @since 3.0.0 N°2982
* Complete url using provided variables. Example with $var=1: XX + $var => XX1
* @param $aMap
* @param $aThemeParametersVariables
@@ -464,6 +481,7 @@ CSS;
}
/**
* @since 3.0.0 N°2982
* Find missing variable values from SCSS content based on their name.
*
* @param $aThemeParametersVariables
@@ -522,6 +540,7 @@ CSS;
}
/**
* @since 3.0.0 N°2982
* @param $aFoundVariables
* @param array $aToCompleteUrls
* @param array $aCompleteUrls
@@ -566,6 +585,7 @@ CSS;
}
/**
* @since 3.0.0 N°2982
* Find all referenced URLs from a SCSS file.
* @param $aThemeParametersVariables
* @param $sStylesheetFile
@@ -586,6 +606,10 @@ CSS;
{
foreach ($aMatches[1] as $path)
{
$iRemainingClosingParenthesisPos = strpos($path, ')');
if ($iRemainingClosingParenthesisPos !== false){
$path = substr($path, 0, $iRemainingClosingParenthesisPos);
}
if (!array_key_exists($path, $aCompleteUrls)
&& !array_key_exists($path, $aToCompleteUrls))
{
@@ -624,6 +648,7 @@ CSS;
}
/**
* @since 3.0.0 N°2982
* Calculate url based on its template + variables.
* @param $sUrlTemplate
* @param $aFoundVariables
@@ -674,8 +699,10 @@ CSS;
/**
* Extract the signature for a generated CSS file. The signature MUST be alone one line immediately
* followed (on the next line) by the === SIGNATURE END === pattern
* @since 3.0.0 N°2982
* Extract the signature for a generated CSS file.
* The signature MUST be alone one line immediately followed (on the next line) by the === SIGNATURE END === pattern
* The signature MUST be in the first 100th lines of the file.
*
* Note the signature can be place anywhere in the CSS file (obviously inside a CSS comment !) but the
* function will be faster if the signature is at the beginning of the file (since the file is scanned from the start)
@@ -686,6 +713,7 @@ CSS;
*/
public static function GetSignature($sFilepath)
{
$iCount = 0;
$sPreviousLine = '';
$hFile = @fopen($sFilepath, "r");
if ($hFile !== false)
@@ -693,15 +721,22 @@ CSS;
$sLine = '';
do
{
$iCount++;
$sPreviousLine = $sLine;
$sLine = rtrim(fgets($hFile)); // Remove the trailing \n
}
while (($sLine !== false) && ($sLine != '=== SIGNATURE END ==='));
while (($sLine !== false) && ($sLine != '=== SIGNATURE END ===') && ($iCount <= 100));
fclose($hFile);
}
return $sPreviousLine;
}
/**
* @since 3.0.0 N°2982
* @param $JsonSignature
*
* @return false|mixed
*/
public static function GetVarSignature($JsonSignature)
{
$aJsonArray = json_decode($JsonSignature, true);
@@ -713,31 +748,102 @@ CSS;
}
/**
* Find the given file in the list of ImportsPaths directory
* @param string $sFile
* @param string $sFileURI
* @param string[] $aImportsPaths
* @throws Exception
* @return string
* @param FindStylesheetObject $oFindStylesheetObject
* @param bool $bImports
*
* @throws \Exception
*@since 3.0.0 N°2982
* Find the given file in the list '$aImportsPaths' of directory and all included stylesheets as well
* Compute latest timestamp found among all found stylesheets
*
*/
public static function FindStylesheetFile($sFile, $aImportsPaths)
public static function FindStylesheetFile(string $sFileURI, array $aImportsPaths, $oFindStylesheetObject, $bImports = false)
{
if (! $bImports) {
$oFindStylesheetObject->ResetLastStyleSheet();
}
foreach($aImportsPaths as $sPath)
{
$sImportedFile = realpath($sPath.'/'.$sFile);
if (file_exists($sImportedFile))
$sFilePath = $sPath.'/'.$sFileURI;
$sImportedFile = realpath($sFilePath);
if ($sImportedFile === false){
// Handle shortcut syntax : @import "typo" ;
// file matched: typo.scss
$sFilePath2 = "$sFilePath.scss";
$sImportedFile = realpath($sFilePath2);
if ($sImportedFile){
self::FindStylesheetFile("$sFileURI.scss", [ $sPath ], $oFindStylesheetObject, $bImports);
$sImportedFile = false;
}
}
if ($sImportedFile === false){
// Handle shortcut syntax : @import "typo" ;
// file matched: _typo.scss
$sShortCut = substr($sFilePath, strrpos($sFilePath, '/') + 1);
$sFilePath = static::ReplaceLastOccurrence($sShortCut, "_$sShortCut.scss", $sFilePath);
$sFileURI = static::ReplaceLastOccurrence($sShortCut, "_$sShortCut.scss", $sFileURI);
$sImportedFile = realpath($sFilePath);
}
if ((file_exists($sImportedFile))
&& (!$oFindStylesheetObject->AlreadyFetched($sImportedFile)))
{
return $sImportedFile;
if ($bImports){
$oFindStylesheetObject->AddImport($sFileURI, $sImportedFile);
}else{
$oFindStylesheetObject->AddStylesheet($sFileURI, $sImportedFile);
}
$oFindStylesheetObject->UpdateLastModified($sImportedFile);
//Regexp matching on all included scss files : @import 'XXX.scss';
$sDirUri = dirname($sFileURI);
preg_match_all('/@import \s*[\"\']([^\"\']*)\s*[\"\']\s*;/', file_get_contents($sImportedFile), $aMatches);
if ( (is_array($aMatches)) && (count($aMatches)!==0) ){
foreach ($aMatches[1] as $sImportedFile){
self::FindStylesheetFile("$sDirUri/$sImportedFile", [ $sPath ], $oFindStylesheetObject, true);
}
}
}
}
return ''; // Not found, fail silently, maybe the SCSS compiler knowns better...
}
/**
* @param $search
* @param $replace
* @param $subject
*
* @since 3.0.0 N°2982
* Replaces last occurrence of the string
* @return string|string[]
*/
public static function ReplaceLastOccurrence($sSearch, $sReplace, $sSubject)
{
$iPos = strrpos($sSubject, $sSearch);
if($iPos !== false)
{
$sSubject = substr_replace($sSubject, $sReplace, $iPos, strlen($sSearch));
}
return $sSubject;
}
/**
* @since 3.0.0 N°2982
* Used for testing purpose
* @param $oCompileCSSServiceMock
*/
public static function MockCompileCSSService($oCompileCSSServiceMock)
{
static::$oCompileCSSService = $oCompileCSSServiceMock;
}
/**
* @since 3.0.0 N°2982
* Clone variable array and include $version with bSetupCompilationTimestamp value
* @param $aThemeParameters
* @param $bSetupCompilationTimestamp
@@ -753,24 +859,38 @@ CSS;
{
$aThemeParametersVariable = array_merge([], $aThemeParameters['variables']);
}
}
if (array_key_exists('imports_variable', $aThemeParameters))
{
if (is_array($aThemeParameters['imports_variable']))
{
$aThemeParametersVariable = array_merge($aThemeParametersVariable, static::GetVariablesFromFile($aThemeParameters['imports_variable']));
}
}
$aThemeParametersVariable['$version'] = $bSetupCompilationTimestamp;
return $aThemeParametersVariable;
}
}
class CompileCSSService
{
/**
* CompileCSSService constructor.
* @param $aVariableFiles
*
* @return array
* @since 3.0.0 N°3593
*/
public function __construct()
{
}
public function CompileCSSFromSASS($sSassContent, $aImportPaths = [], $aVariables = []){
return utils::CompileCSSFromSASS($sSassContent, $aImportPaths, $aVariables);
public static function GetVariablesFromFile($aVariableFiles){
$aVariablesResults = [];
foreach ($aVariableFiles as $sVariableFile)
{
$sFileContent = file_get_contents(APPROOT.'env-'.utils::GetCurrentEnvironment().'/'.$sVariableFile);
$aVariableMatches = [];
preg_match_all( '/\$(.*?):(.*?);/', $sFileContent,$aVariableMatches);
$aVariableMatches = array_combine( $aVariableMatches[1], array_map( function($sVariableValue) { return ltrim($sVariableValue); }, $aVariableMatches[2] ) );
$aVariablesResults = array_merge($aVariablesResults, $aVariableMatches);
}
array_map( function($sVariableValue) { return ltrim($sVariableValue); }, $aVariablesResults );
return $aVariablesResults;
}
}

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2015 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -23,7 +23,7 @@
* which choice is configured via the parameter 'transaction_storage'
*
* @package iTop
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -297,11 +297,19 @@ class privUITransactionFile
* Cleanup old transactions which have been pending since more than 24 hours
* Use filemtime instead of filectime since filectime may be affected by operations on the directory (like changing the access rights)
*/
protected static function CleanupOldTransactions()
protected static function CleanupOldTransactions($sTransactionDir = null)
{
$iLimit = time() - 24*3600;
$iThreshold = (int) MetaModel::GetConfig()->Get('transactions_gc_threshold');
$iThreshold = min(100, $iThreshold);
$iThreshold = max(1, $iThreshold);
if ((100 != $iThreshold) && (rand(1, 100) > $iThreshold)) {
return;
}
clearstatcache();
$aTransactions = glob(APPROOT.'data/transactions/*-*');
$iLimit = time() - 24*3600;
$sPattern = $sTransactionDir ? "$sTransactionDir/*" : APPROOT.'data/transactions/*';
$aTransactions = glob($sPattern);
foreach($aTransactions as $sFileName)
{
if (filemtime($sFileName) < $iLimit)

View File

@@ -1,20 +1,7 @@
<?php
/**
* Copyright (C) 2013-2020 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
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
require_once(APPROOT.'/application/displayblock.class.inc.php');
@@ -66,67 +53,103 @@ class UIExtKeyWidget
protected $iId;
protected $sTargetClass;
protected $sFilter;
protected $sAttCode;
//@deprecated
protected $bSearchMode;
//public function __construct($sAttCode, $sClass, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sNameSuffix = '', $sFieldPrefix = '', $sFormPrefix = '')
static public function DisplayFromAttCode($oPage, $sAttCode, $sClass, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName = '', $sFormPrefix = '', $aArgs, $bSearchMode = false)
/**
* @param \WebPage $oPage
* @param string $sAttCode
* @param string $sClass
* @param string $sTitle
* @param object $oAllowedValues
* @param mixed $value
* @param int $iInputId
* @param boolean $bMandatory
* @param string $sFieldName
* @param string $sFormPrefix
* @param array $aArgs
* @param boolean $bSearchMode
* @param string $sInputType type of field rendering, contains one of the \cmdbAbstractObject::ENUM_INPUT_TYPE_* constants
*
* @return string
* @throws \Exception
*
* @since 3.0.0 N°3750 new $sInputType parameter
*/
public static function DisplayFromAttCode(
$oPage, $sAttCode, $sClass, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName = '', $sFormPrefix = '',
$aArgs = [], $bSearchMode = false, &$sInputType = ''
)
{
$oAttDef = MetaModel::GetAttributeDef($sClass, $sAttCode);
$sTargetClass = $oAttDef->GetTargetClass();
$iMaxComboLength = $oAttDef->GetMaximumComboLength();
$bAllowTargetCreation = $oAttDef->AllowTargetCreation();
if (!$bSearchMode)
{
if (!$bSearchMode) {
$sDisplayStyle = $oAttDef->GetDisplayStyle();
}
else
{
} else {
$sDisplayStyle = 'select'; // In search mode, always use a drop-down list
}
$oWidget = new UIExtKeyWidget($sTargetClass, $iInputId, $sAttCode, $bSearchMode);
if(!$bSearchMode)
{
switch($sDisplayStyle)
if (!$bSearchMode) {
switch ($sDisplayStyle)
{
case 'radio':
case 'radio_horizontal':
case 'radio_vertical':
$sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_RADIO;
return $oWidget->DisplayRadio($oPage, $iMaxComboLength, $bAllowTargetCreation, $oAllowedValues, $value, $sFieldName, $sDisplayStyle);
break;
return $oWidget->DisplayRadio($oPage, $iMaxComboLength, $bAllowTargetCreation, $oAllowedValues, $value, $sFieldName, $sDisplayStyle);
case 'select':
case 'list':
default:
return $oWidget->DisplaySelect($oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, $oAllowedValues, $value,
$bMandatory, $sFieldName, $sFormPrefix, $aArgs);
$bMandatory, $sFieldName, $sFormPrefix, $aArgs, $sInputType);
}
} else {
return $oWidget->Display($oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, $oAllowedValues, $value, $iInputId,
$bMandatory, $sFieldName, $sFormPrefix, $aArgs, null, $sDisplayStyle, true, $sInputType);
}
else
{
return $oWidget->Display($oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName, $sFormPrefix, $aArgs, null, $sDisplayStyle);
}
}
public function __construct($sTargetClass, $iInputId, $sAttCode = '', $bSearchMode = false)
public function __construct($sTargetClass, $iInputId, $sAttCode = '', $bSearchMode = false, $sFilter = null)
{
$this->sTargetClass = $sTargetClass;
$this->sFilter = $sFilter;
$this->iId = $iInputId;
$this->sAttCode = $sAttCode;
$this->bSearchMode = $bSearchMode;
}
/**
* @since 3.0.0 N°2508 - Include Obsolescence icon within list and autocomplete
* Get the HTML fragment corresponding to the ext key editing widget
* @param WebPage $oP The web page used for all the output
* @param \WebPage $oPage
* @param int $iMaxComboLength
* @param bool $bAllowTargetCreation
* @param string $sTitle
* @param \DBObjectset $oAllowedValues
* @param mixed $value
* @param bool $bMandatory
* @param string $sFieldName
* @param string $sFormPrefix
* @param array $aArgs Extra context arguments
* @return string The HTML fragment to be inserted into the page
* @param string $sInputType type of field rendering, contains one of the \cmdbAbstractObject::ENUM_INPUT_TYPE_* constants
*
* @return string the HTML fragment corresponding to the ext key editing widget
* @throws \ArchivedObjectException
* @throws \ConfigException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \DictExceptionMissingString
* @throws \MissingQueryArgument
* @throws \MySQLException
* @throws \MySQLHasGoneAwayException
*
* @since 3.0.0 N°2508 - Include Obsolescence icon within list and autocomplete
* @since 3.0.0 N°3750 new $sInputType parameter
*/
public function DisplaySelect(WebPage $oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, DBObjectset $oAllowedValues, $value, $bMandatory, $sFieldName, $sFormPrefix = '', $aArgs = array())
public function DisplaySelect(WebPage $oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, DBObjectset $oAllowedValues, $value, $bMandatory, $sFieldName, $sFormPrefix = '', $aArgs = array(), &$sInputType = '')
{
$sTitle = addslashes($sTitle);
$oPage->add_linked_script('../js/extkeywidget.js');
@@ -137,29 +160,22 @@ class UIExtKeyWidget
$sMessage = Dict::S('UI:Message:EmptyList:UseSearchForm');
$sAttrFieldPrefix = ($this->bSearchMode) ? '' : 'attr_';
$sHTMLValue = "<div class=\"field_input_zone field_input_extkey ibo-input-wrapper ibo-input-select-wrapper\" data-validation=\"untouched\">";
$sHTMLValue = "<div class=\"field_input_zone field_input_extkey ibo-input-wrapper ibo-input-select-wrapper--with-buttons\" data-attcode=\"".$this->sAttCode."\" data-validation=\"untouched\">";
$sFilter = addslashes($oAllowedValues->GetFilter()->ToOQL());
if($this->bSearchMode)
{
if ($this->bSearchMode) {
$sWizHelper = 'null';
$sWizHelperJSON = "''";
$sJSSearchMode = 'true';
}
else
{
if (isset($aArgs['wizHelper']))
{
} else {
if (isset($aArgs['wizHelper'])) {
$sWizHelper = $aArgs['wizHelper'];
}
else
{
} else {
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
}
$sWizHelperJSON = $sWizHelper.'.UpdateWizardToJSON()';
$sJSSearchMode = 'false';
}
if (is_null($oAllowedValues))
{
if (is_null($oAllowedValues)) {
throw new Exception('Implementation: null value for allowed values definition');
}
$oAllowedValues->SetShowObsoleteData(utils::ShowObsoleteData());
@@ -168,8 +184,7 @@ class UIExtKeyWidget
$sJSDoSearch = $bDoSearch ? 'true' : 'false';
// We just need to compare the number of entries with MaxComboLength, so no need to get the real count.
if (!$oAllowedValues->CountExceeds($iMaxComboLength))
{
if (!$oAllowedValues->CountExceeds($iMaxComboLength)) {
// Discrete list of values, use a SELECT or RADIO buttons depending on the config
$sHelpText = ''; //$this->oAttDef->GetHelpOnEdition();
//$sHTMLValue .= "<div class=\"field_select_wrapper\">\n";
@@ -204,47 +219,40 @@ class UIExtKeyWidget
$sDisplayValue=$oObj->GetName();
if($value != $oObj->GetKey())
{
$oPage->add_ready_script(
<<<EOF
$('#$this->iId').attr('data-validate','dependencies');
EOF
);
$value=$oObj->GetKey();
}
}
else
{
if ((is_array($value) && in_array($oObj->GetKey(), $value)) || ($value == $oObj->GetKey()))
{
$sDisplayValue=$oObj->GetKey();
// $sHTMLValue.="<div class='item' data-value='".$oObj->GetKey)."'>".$oObj->GetName()."</div>";
else {
if ((is_array($value) && in_array($oObj->GetKey(), $value)) || ($value == $oObj->GetKey())) {
$sDisplayValue = $oObj->GetName();
}
}
if ($oObj->IsObsolete()){
$aOption['obsolescence_flag'] ="1";
if ($oObj->IsObsolete()) {
$aOption['obsolescence_flag'] = "1";
}
if ($bAddingValue)
{
if ($bAddingValue) {
$aArguments = [];
foreach ($aAdditionalField as $sAdditionalField)
{
array_push($aArguments,$oObj->Get($sAdditionalField));
foreach ($aAdditionalField as $sAdditionalField) {
array_push($aArguments, $oObj->Get($sAdditionalField));
}
$aOption['additional_field'] = vsprintf($sFormatAdditionalField, $aArguments);
}
array_push($aOptions,$aOption);
array_push($aOptions, $aOption);
}
$sHTMLValue .= "<select title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$sFieldName}\" id=\"$this->iId\"></select>";
$sJsonOptions=json_encode($aOptions);
$sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_DROPDOWN_DECORATED;
$sHTMLValue .= "<select title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$sFieldName}\" id=\"$this->iId\" tabindex=\"0\"></select>";
$sJsonOptions = json_encode($aOptions);
$oPage->add_ready_script(
<<<EOF
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', true, $sWizHelper, '{$this->sAttCode}', $sJSSearchMode, $sJSDoSearch);
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
oACWidget_{$this->iId}.AddSelectize('$sJsonOptions','$sDisplayValue');
$('#$this->iId').bind('update', function() { oACWidget_{$this->iId}.Update(); } );
$('#$this->iId').bind('change', function() { $(this).trigger('extkeychange') } );
oACWidget_{$this->iId}.AddSelectize('$sJsonOptions','$value');
$('#$this->iId').on('update', function() { oACWidget_{$this->iId}.Update(); } );
$('#$this->iId').on('change', function() { $(this).trigger('extkeychange') } );
EOF
);
$sHTMLValue .= "<div class=\"ibo-input-select--action-buttons\">";
}
else
{
@@ -261,16 +269,14 @@ EOF
if (is_null($value) || ($value == 0)) // Null values are displayed as ''
{
$sDisplayValue = isset($aArgs['sDefaultValue']) ? $aArgs['sDefaultValue'] : '';
}
else
{
} else {
$sDisplayValue = $this->GetObjectName($value);
}
$iMinChars = isset($aArgs['iMinChars']) ? $aArgs['iMinChars'] : 2; //@@@ $this->oAttDef->GetMinAutoCompleteChars();
// the input for the auto-complete
$sHTMLValue .= "<input class=\"field_autocomplete ibo-input ibo-input-select ibo-input-select-autocomplete\" type=\"text\" id=\"label_$this->iId\" value=\"$sDisplayValue\"/>";
$sHTMLValue .= "<div class=\"field_input_btn ibo-input-select--action-button ibo-input-select--action-button--search\" id=\"mini_search_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.Search();\"><i class=\"fas fa-search\"></i></div>";
$sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_AUTOCOMPLETE;
$sHTMLValue .= "<input class=\"field_autocomplete ibo-input ibo-input-select ibo-input-select-autocomplete\" type=\"text\" id=\"label_$this->iId\" value=\"$sDisplayValue\" placeholder='...'/>";
// another hidden input to store & pass the object's Id
$sHTMLValue .= "<input type=\"hidden\" id=\"$this->iId\" name=\"{$sAttrFieldPrefix}{$sFieldName}\" value=\"".htmlentities($value, ENT_QUOTES, 'UTF-8')."\" />\n";
@@ -288,24 +294,13 @@ EOF
}
EOF
);
$sHTMLValue .= "<div class=\"ibo-input-select--action-buttons\">";
$sHTMLValue .= " <div class=\"ibo-input-select--action-button ibo-input-select--action-button--clear ibo-is-hidden\" id=\"mini_clear_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.Clear();\" data-tooltip-content='".Dict::S('UI:Button:Clear')."''><i class=\"fas fa-times\"></i></div>";
}
if ($bExtensions && MetaModel::IsHierarchicalClass($this->sTargetClass) !== false)
{
$sHTMLValue .= "<div class=\"field_input_btn ibo-input-select--action-button ibo-input-select--action-button--hierarchy\" id=\"mini_tree_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.HKDisplay();\"><i class=\"fas fa-sitemap\"></i></div>";
$oPage->add_ready_script(
<<<JS
if ($('#ac_tree_{$this->iId}').length == 0)
{
$('body').append('<div id="ac_tree_{$this->iId}"></div>');
}
JS
);
}
if ($bCreate && $bExtensions)
{
if ($bCreate && $bExtensions) {
$sCallbackName = (MetaModel::IsAbstract($this->sTargetClass)) ? 'SelectObjectClass' : 'CreateObject';
$sHTMLValue .= "<div class=\"field_input_btn ibo-input-select--action-button ibo-input-select--action-button--create\" id=\"mini_add_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.{$sCallbackName}();\"><i class=\"fas fa-plus\"></i></div>";
$sHTMLValue .= "<div class=\"ibo-input-select--action-button ibo-input-select--action-button--create\" id=\"mini_add_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.{$sCallbackName}();\" data-tooltip-content='".Dict::S('UI:Button:Create')."''><i class=\"fas fa-plus\"></i></div>";
$oPage->add_ready_script(
<<<JS
if ($('#ajax_{$this->iId}').length == 0)
@@ -315,6 +310,21 @@ JS
JS
);
}
if ($bExtensions && MetaModel::IsHierarchicalClass($this->sTargetClass) !== false) {
$sHTMLValue .= "<div class=\"ibo-input-select--action-button ibo-input-select--action-button--hierarchy\" id=\"mini_tree_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.HKDisplay();\" data-tooltip-content='".Dict::S('UI:Button:SearchInHierarchy')."''><i class=\"fas fa-sitemap\"></i></div>";
$oPage->add_ready_script(
<<<JS
if ($('#ac_tree_{$this->iId}').length == 0)
{
$('body').append('<div id="ac_tree_{$this->iId}"></div>');
}
JS
);
}
if ($oAllowedValues->CountExceeds($iMaxComboLength)) {
$sHTMLValue .= " <div class=\"ibo-input-select--action-button ibo-input-select--action-button--search\" id=\"mini_search_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.Search();\" data-tooltip-content='".Dict::S('UI:Button:Search')."''><i class=\"fas fa-search\"></i></div>";
}
$sHTMLValue .= "</div>";
$sHTMLValue .= "</div>";
$sHTMLValue .= "<span class=\"form_validation ibo-field-validation\" id=\"v_{$this->iId}\"></span><span class=\"field_status\" id=\"fstatus_{$this->iId}\"></span>";
@@ -403,17 +413,39 @@ JS
return $sHTMLValue;
}
/**
* @deprecated Use DisplayBob
* Get the HTML fragment corresponding to the ext key editing widget
* @param WebPage $oP The web page used for all the output
*
* @param \WebPage $oPage
* @param int $iMaxComboLength
* @param boolean $bAllowTargetCreation
* @param string $sTitle
* @param \DBObjectset $oAllowedValues
* @param mixed $value
* @param int $iInputId
* @param boolean $bMandatory
* @param strin $sFieldName
* @param string $sFormPrefix
* @param array $aArgs Extra context arguments
* @param null $bSearchMode
* @param string $sDisplayStyle
* @param boolean $bSearchMultiple
* @param string $sInputType type of field rendering, contains one of the \cmdbAbstractObject::ENUM_INPUT_TYPE_* constants
*
* @return string The HTML fragment to be inserted into the page
* @throws \ConfigException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MissingQueryArgument
* @throws \MySQLException
* @throws \MySQLHasGoneAwayException
*
* @since 3.0.0 N°3750 new $sInputType parameter
*/
public function Display(WebPage $oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, DBObjectset $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName, $sFormPrefix = '', $aArgs = array(), $bSearchMode = null, $sDisplayStyle = 'select', $bSearchMultiple = true)
public function Display(WebPage $oPage, $iMaxComboLength, $bAllowTargetCreation, $sTitle, DBObjectset $oAllowedValues, $value, $iInputId, $bMandatory, $sFieldName, $sFormPrefix = '', $aArgs = array(), $bSearchMode = null, $sDisplayStyle = 'select', $bSearchMultiple = true, &$sInputType = '')
{
if (!is_null($bSearchMode))
{
if (!is_null($bSearchMode)) {
$this->bSearchMode = $bSearchMode;
}
$sTitle = addslashes($sTitle);
@@ -427,27 +459,20 @@ JS
$sHTMLValue = "<div class=\"field_input_zone field_input_extkey\">";
$sFilter = addslashes($oAllowedValues->GetFilter()->ToOQL());
if($this->bSearchMode)
{
if ($this->bSearchMode) {
$sWizHelper = 'null';
$sWizHelperJSON = "''";
$sJSSearchMode = 'true';
}
else
{
if (isset($aArgs['wizHelper']))
{
} else {
if (isset($aArgs['wizHelper'])) {
$sWizHelper = $aArgs['wizHelper'];
}
else
{
} else {
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
}
$sWizHelperJSON = $sWizHelper.'.UpdateWizardToJSON()';
$sJSSearchMode = 'false';
}
if (is_null($oAllowedValues))
{
if (is_null($oAllowedValues)) {
throw new Exception('Implementation: null value for allowed values definition');
}
$oAllowedValues->SetShowObsoleteData(utils::ShowObsoleteData());
@@ -456,84 +481,71 @@ JS
$sJSDoSearch = $bDoSearch ? 'true' : 'false';
// We just need to compare the number of entries with MaxComboLength, so no need to get the real count.
if (!$oAllowedValues->CountExceeds($iMaxComboLength))
{
// Discrete list of values, use a SELECT or RADIO buttons depending on the config
switch($sDisplayStyle)
{
if (!$oAllowedValues->CountExceeds($iMaxComboLength)) {
// Discrete list of values, use a SELECT or RADIO buttons depending on the config
switch ($sDisplayStyle) {
case 'radio':
case 'radio_horizontal':
case 'radio_vertical':
$sValidationField = null;
$sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_RADIO;
$sValidationField = null;
$bVertical = ($sDisplayStyle != 'radio_horizontal');
$bExtensions = false;
$oAllowedValues->Rewind();
$aAllowedValues = array();
while($oObj = $oAllowedValues->Fetch())
{
$aAllowedValues[$oObj->GetKey()] = $oObj->GetName();
}
$sHTMLValue .= $oPage->GetRadioButtons($aAllowedValues, $value, $this->iId, "{$sAttrFieldPrefix}{$sFieldName}", false /* $bMandatory will be placed manually */, $bVertical, $sValidationField);
$aEventsList[] ='change';
break;
$bVertical = ($sDisplayStyle != 'radio_horizontal');
$bExtensions = false;
$oAllowedValues->Rewind();
$aAllowedValues = array();
while ($oObj = $oAllowedValues->Fetch()) {
$aAllowedValues[$oObj->GetKey()] = $oObj->GetName();
}
$sHTMLValue .= $oPage->GetRadioButtons($aAllowedValues, $value, $this->iId, "{$sAttrFieldPrefix}{$sFieldName}", false /* $bMandatory will be placed manually */, $bVertical, $sValidationField);
$aEventsList[] = 'change';
break;
case 'select':
case 'list':
default:
$sHelpText = '';
$sHTMLValue .= "<div class=\"field_select_wrapper\">\n";
$sHelpText = ''; //$this->oAttDef->GetHelpOnEdition();
$sHTMLValue .= "<div class=\"field_select_wrapper\">\n";
if ($this->bSearchMode)
{
if ($bSearchMultiple)
{
$sHTMLValue .= "<select class=\"multiselect\" multiple title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$sFieldName}[]\" id=\"$this->iId\">\n";
}
else
{
if ($this->bSearchMode) {
if ($bSearchMultiple) {
$sHTMLValue .= "<select class=\"multiselect\" multiple title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$sFieldName}[]\" id=\"$this->iId\">\n";
} else {
$sHTMLValue .= "<select title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$sFieldName}\" id=\"$this->iId\">\n";
$sDisplayValue = isset($aArgs['sDefaultValue']) ? $aArgs['sDefaultValue'] : Dict::S('UI:SearchValue:Any');
$sHTMLValue .= "<option value=\"\">$sDisplayValue</option>\n";
}
} else {
$sHTMLValue .= "<select title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$sFieldName}\" id=\"$this->iId\">\n";
$sDisplayValue = isset($aArgs['sDefaultValue']) ? $aArgs['sDefaultValue'] : Dict::S('UI:SearchValue:Any');
$sHTMLValue .= "<option value=\"\">$sDisplayValue</option>\n";
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SelectOne')."</option>\n";
}
}
else
{
$sHTMLValue .= "<select title=\"$sHelpText\" name=\"{$sAttrFieldPrefix}{$sFieldName}\" id=\"$this->iId\">\n";
$sHTMLValue .= "<option value=\"\">".Dict::S('UI:SelectOne')."</option>\n";
}
$oAllowedValues->Rewind();
while($oObj = $oAllowedValues->Fetch())
{
$key = $oObj->GetKey();
$display_value = $oObj->GetName();
$oAllowedValues->Rewind();
while ($oObj = $oAllowedValues->Fetch()) {
$key = $oObj->GetKey();
$display_value = $oObj->GetName();
if (($oAllowedValues->Count() == 1) && ($bMandatory == 'true') )
{
// When there is only once choice, select it by default
$sSelected = 'selected';
if($value != $key)
{
$oPage->add_ready_script(
<<<EOF
if (($oAllowedValues->Count() == 1) && ($bMandatory == 'true')) {
// When there is only once choice, select it by default
$sSelected = 'selected';
if ($value != $key) {
$oPage->add_ready_script(
<<<EOF
$('#$this->iId').attr('data-validate','dependencies');
EOF
);
);
}
} else {
$sSelected = (is_array($value) && in_array($key, $value)) || ($value == $key) ? 'selected' : '';
}
$sHTMLValue .= "<option value=\"$key\" $sSelected>$display_value</option>\n";
}
else
{
$sSelected = (is_array($value) && in_array($key, $value)) || ($value == $key) ? 'selected' : '';
}
$sHTMLValue .= "<option value=\"$key\" $sSelected>$display_value</option>\n";
}
$sHTMLValue .= "</select>\n";
$sHTMLValue .= "</div>\n";
if (($this->bSearchMode) && $bSearchMultiple)
{
$sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_DROPDOWN_RAW;
if (($this->bSearchMode) && $bSearchMultiple) {
$sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_DROPDOWN_MULTIPLE_CHOICES;
$aOptions = array(
'header' => true,
'checkAllText' => Dict::S('UI:SearchValue:CheckAll'),
@@ -544,36 +556,32 @@ EOF
);
$sJSOptions = json_encode($aOptions);
$oPage->add_ready_script("$('.multiselect').multiselect($sJSOptions);");
}
$oPage->add_ready_script(
<<<EOF
}
$oPage->add_ready_script(
<<<EOF
oACWidget_{$this->iId} = new ExtKeyWidget('{$this->iId}', '{$this->sTargetClass}', '$sFilter', '$sTitle', true, $sWizHelper, '{$this->sAttCode}', $sJSSearchMode, $sJSDoSearch);
oACWidget_{$this->iId}.emptyHtml = "<div style=\"background: #fff; border:0; text-align:center; vertical-align:middle;\"><p>$sMessage</p></div>";
$('#$this->iId').bind('update', function() { oACWidget_{$this->iId}.Update(); } );
$('#$this->iId').bind('change', function() { $(this).trigger('extkeychange') } );
$('#$this->iId').on('update', function() { oACWidget_{$this->iId}.Update(); } );
$('#$this->iId').on('change', function() { $(this).trigger('extkeychange') } );
EOF
);
} // Switch
}
else
{
);
}
} else {
// Too many choices, use an autocomplete
$sInputType = CmdbAbstractObject::ENUM_INPUT_TYPE_AUTOCOMPLETE;
// Check that the given value is allowed
$oSearch = $oAllowedValues->GetFilter();
$oSearch->AddCondition('id', $value);
$oSet = new DBObjectSet($oSearch);
if ($oSet->Count() == 0)
{
if ($oSet->Count() == 0) {
$value = null;
}
if (is_null($value) || ($value == 0)) // Null values are displayed as ''
{
$sDisplayValue = isset($aArgs['sDefaultValue']) ? $aArgs['sDefaultValue'] : '';
}
else
{
} else {
$sDisplayValue = $this->GetObjectName($value);
}
$iMinChars = isset($aArgs['iMinChars']) ? $aArgs['iMinChars'] : 2; //@@@ $this->oAttDef->GetMinAutoCompleteChars();
@@ -599,33 +607,31 @@ EOF
EOF
);
}
if ($bExtensions && MetaModel::IsHierarchicalClass($this->sTargetClass) !== false)
{
if ($bExtensions && MetaModel::IsHierarchicalClass($this->sTargetClass) !== false) {
$sHTMLValue .= "<span class=\"field_input_btn\"><div class=\"ibo-input-select--action-button\" id=\"mini_tree_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.HKDisplay();\"><i class=\"fas fa-sitemap\"></i></div></span>";
$oPage->add_ready_script(
<<<JS
<<<JS
if ($('#ac_tree_{$this->iId}').length == 0)
{
$('body').append('<div id="ac_tree_{$this->iId}"></div>');
}
JS
);
);
}
if ($bCreate && $bExtensions)
{
if ($bCreate && $bExtensions) {
$sCallbackName = (MetaModel::IsAbstract($this->sTargetClass)) ? 'SelectObjectClass' : 'CreateObject';
$sHTMLValue .= "<span class=\"field_input_btn\"><div class=\"ibo-input-select--action-button\" id=\"mini_add_{$this->iId}\" onClick=\"oACWidget_{$this->iId}.{$sCallbackName}();\"><i class=\"fas fa-plus\"></i></div></span>";
$oPage->add_ready_script(
<<<JS
<<<JS
if ($('#ajax_{$this->iId}').length == 0)
{
$('body').append('<div id="ajax_{$this->iId}"></div>');
}
JS
);
);
}
$sHTMLValue .= "</div>";
$sHTMLValue .= "</div>";
$sHTMLValue .= "<span class=\"form_validation ibo-field-validation\" id=\"v_{$this->iId}\"></span><span class=\"field_status\" id=\"fstatus_{$this->iId}\"></span>";
return $sHTMLValue;
@@ -642,6 +648,9 @@ JS
$aParams = array('query_params' => $aArgs);
$oSet = $oAttDef->GetAllowedValuesAsObjectSet($aArgs);
$oFilter = $oSet->GetFilter();
} else if (!empty($this->sFilter)) {
$aParams = array();
$oFilter = DBObjectSearch::FromOQL($this->sFilter);
} else {
$aParams = array();
$oFilter = new DBObjectSearch($this->sTargetClass);
@@ -656,7 +665,7 @@ JS
'table_inner_id' => "{$this->iId}_results",
'selection_mode' => true,
'selection_type' => 'single',
'cssCount' => '#count_'.$this->iId
'cssCount' => '#count_'.$this->iId.'_results',
)
));
$sCancel = Dict::S('UI:Button:Cancel');
@@ -678,7 +687,7 @@ HTML
$sDialogTitle = addslashes($sTitle);
$oPage->add_ready_script(<<<JS
$('#ac_dlg_{$this->iId}').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, title: '$sDialogTitle', resizeStop: oACWidget_{$this->iId}.UpdateSizes, close: oACWidget_{$this->iId}.OnClose });
$('#fs_{$this->iId}').bind('submit.uiAutocomplete', oACWidget_{$this->iId}.DoSearchObjects);
$('#fs_{$this->iId}').on('submit.uiAutocomplete', oACWidget_{$this->iId}.DoSearchObjects);
$('#dc_{$this->iId}').resize(oACWidget_{$this->iId}.UpdateSizes);
JS
);
@@ -712,33 +721,34 @@ JS
$iCurrentExtKeyId = (is_null($oObj)) ? 0 : $oObj->Get($this->sAttCode);
$oBlock = new DisplayBlock($oFilter, 'list_search', false, array('query_params' => array('this' => $oObj, 'current_extkey_id' => $iCurrentExtKeyId)));
$oBlock->Display($oP, $this->iId.'_results', array('this' => $oObj, 'cssCount'=> '#count_'.$this->iId, 'menu' => false, 'selection_mode' => true, 'selection_type' => 'single', 'table_id' => 'select_'.$this->sAttCode)); // Don't display the 'Actions' menu on the results
$oBlock->Display($oP, $this->iId.'_results', array('this' => $oObj, 'cssCount'=> '#count_'.$this->iId.'_results', 'menu' => false, 'selection_mode' => true, 'selection_type' => 'single', 'table_id' => 'select_'.$this->sAttCode)); // Don't display the 'Actions' menu on the results
}
/**
* Search for objects to be selected
*
* @param WebPage $oP The page used for the output (usually an AjaxWebPage)
* @param string $sFilter The OQL expression used to define/limit limit the scope of possible values
* @param DBObject $oObj The current object for the OQL context
* @param string $sContains The text of the autocomplete to filter the results
* @param string $sOutputFormat
* @param null $sOperation for the values @see ValueSetObjects->LoadValues()
* @param WebPage $oP The page used for the output (usually an AjaxWebPage)
* @param string $sFilter The OQL expression used to define/limit limit the scope of possible values
* @param DBObject $oObj The current object for the OQL context
* @param string $sContains The text of the autocomplete to filter the results
* @param string $sOutputFormat
* @param null $sOperation for the values @see ValueSetObjects->LoadValues()
*
* @throws CoreException
* @throws OQLException
*/
public function AutoComplete(WebPage $oP, $sFilter, $oObj = null, $sContains, $sOutputFormat = self::ENUM_OUTPUT_FORMAT_CSV, $sOperation = null)
public function AutoComplete(
WebPage $oP, $sFilter, $oObj = null, $sContains = '', $sOutputFormat = self::ENUM_OUTPUT_FORMAT_CSV, $sOperation = null
)
{
if (is_null($sFilter))
{
if (is_null($sFilter)) {
throw new Exception('Implementation: null value for allowed values definition');
}
// Current extkey value, so we can display event if it is not available anymore (eg. archived).
$iCurrentExtKeyId = (is_null($oObj) || $this->sAttCode === '') ? 0 : $oObj->Get($this->sAttCode);
// Current extkey value, so we can display event if it is not available anymore (eg. archived).
$iCurrentExtKeyId = (is_null($oObj) || $this->sAttCode === '') ? 0 : $oObj->Get($this->sAttCode);
$oValuesSet = new ValueSetObjects($sFilter, 'friendlyname'); // Bypass GetName() to avoid the encoding by htmlentities
$iMax = 150;
$iMax = MetaModel::GetConfig()->Get('max_autocomplete_results');
$oValuesSet->SetLimit($iMax);
$oValuesSet->SetSort(false);
$oValuesSet->SetModifierProperty('UserRightsGetSelectFilter', 'bSearchMode', $this->bSearchMode);
@@ -746,9 +756,8 @@ JS
$aValuesContains = $oValuesSet->GetValuesForAutocomplete(array('this' => $oObj, 'current_extkey_id' => $iCurrentExtKeyId), $sContains, 'start_with');
asort($aValuesContains);
$aValues = $aValuesContains;
if (sizeof($aValues) < $iMax)
{
$aValuesContains = $oValuesSet->GetValuesForAutocomplete(array('this' => $oObj, 'current_extkey_id' => $iCurrentExtKeyId), $sContains, 'contains');
if (sizeof($aValues) < $iMax) {
$aValuesContains = $oValuesSet->GetValuesForAutocomplete(array('this' => $oObj, 'current_extkey_id' => $iCurrentExtKeyId), $sContains, 'contains');
asort($aValuesContains);
$iSize = sizeof($aValuesContains);
foreach ($aValuesContains as $sKey => $sFriendlyName)
@@ -803,17 +812,27 @@ JS
}
/**
* Get the display name of the selected object, to fill back the autocomplete
* @param int $iObjId object ID
* @param string $sFormAttCode attcode if we need a value that isn't the display name
*
* @return string Either the display name of the selected object or the specified attribute value
*
* @uses \DBObject::GetName() to get display name
*
* @since 3.0.0 N°3227 add the $sAttCode parameter and method PHPDoc
*/
public function GetObjectName($iObjId)
public function GetObjectName($iObjId, $sFormAttCode = null)
{
$aModifierProps = array();
$aModifierProps['UserRightsGetSelectFilter']['bSearchMode'] = $this->bSearchMode;
$oObj = MetaModel::GetObject($this->sTargetClass, $iObjId, false, false, $aModifierProps);
if ($oObj)
{
return $oObj->GetName();
if ($oObj) {
if (is_null($sFormAttCode)) {
return $oObj->GetName();
} else {
return $oObj->Get($sFormAttCode);
}
}
else
{
@@ -863,7 +882,7 @@ JS
$oPage->add('</div></div></div>');
$oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: 'auto', height: 'auto', maxHeight: $(window).height() - 50, autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').removeAttr('onsubmit');");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').bind('submit.uilinksWizard', oACWidget_{$this->iId}.DoSelectObjectClass);");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').on('submit.uilinksWizard', oACWidget_{$this->iId}.DoSelectObjectClass);");
}
/**
@@ -888,8 +907,7 @@ JS
$sClassAlias = $oSet->GetFilter()->GetClassAlias();
if (isset($aConsts[$sClassAlias]))
{
foreach($aConsts[$sClassAlias] as $sAttCode => $value)
{
foreach($aConsts[$sClassAlias] as $sAttCode => $value) {
$oNewObj->Set($sAttCode, $value);
}
}
@@ -898,44 +916,35 @@ JS
// 3rd - set values from the page argument 'default'
$oNewObj->UpdateObjectFromArg('default');
$sDialogTitle = '';
$sClassLabel = MetaModel::GetName($this->sTargetClass);
$sClassIcon = MetaModel::GetClassIcon($this->sTargetClass);
$sObjClass = get_class($oNewObj);
$sObjKey = $oNewObj->GetKey();
$sHeaderTitle = Dict::Format('UI:CreationTitle_Class', $sClassLabel);
$sHeaderTitleEscaped = utils::EscapeHtml(Dict::Format('UI:CreationTitle_Class', $sClassLabel));
$oPage->add(<<<HTML
<div id="ac_create_{$this->iId}">
<!-- Beginning of object-details -->
<div class="object-details" data-object-class="$sObjClass" data-object-id="$sObjKey" data-object-mode="create">
<!-- Beginning of wizContainer -->
<div class="wizContainer" style="vertical-align:top;">
<div id="dcr_{$this->iId}">
<h1>$sClassIcon&nbsp;$sHeaderTitle</h1>
<div id="ac_create_{$this->iId}" title="{$sHeaderTitleEscaped}">
<div id="dcr_{$this->iId}">
HTML
);
$aFieldsFlags = array();
$aFieldsComments = array();
foreach(MetaModel::ListAttributeDefs($this->sTargetClass) as $sAttCode => $oAttDef)
{
if (($oAttDef instanceof AttributeBlob) || (false))
{
foreach (MetaModel::ListAttributeDefs($this->sTargetClass) as $sAttCode => $oAttDef) {
if (($oAttDef instanceof AttributeBlob) || (false)) {
$aFieldsFlags[$sAttCode] = OPT_ATT_READONLY;
$aFieldsComments[$sAttCode] = '&nbsp;<img src="../images/transp-lock.png" style="vertical-align:middle" title="'.htmlentities(Dict::S('UI:UploadNotSupportedInThisMode')).'"/>';
}
}
cmdbAbstractObject::DisplayCreationForm($oPage, $this->sTargetClass, $oNewObj, array(), array('formPrefix' => $this->iId, 'noRelations' => true, 'fieldsFlags' => $aFieldsFlags, 'fieldsComments' => $aFieldsComments));
cmdbAbstractObject::DisplayCreationForm($oPage, $this->sTargetClass, $oNewObj, array(), array('formPrefix' => $this->iId, 'noRelations' => true, 'fieldsFlags' => $aFieldsFlags, 'fieldsComments' => $aFieldsComments));
$oPage->add(<<<HTML
</div>
</div><!-- End of wizContainer -->
</div><!-- End of object-details -->
</div>
</div>
HTML
);
// $oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: $(window).width()*0.8, height: 'auto', autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
$oPage->add_ready_script("\$('#ac_create_$this->iId').dialog({ width: 'auto', height: 'auto', maxHeight: $(window).height() - 50, autoOpen: false, modal: true, title: '$sDialogTitle'});\n");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').removeAttr('onsubmit');");
$oPage->add_ready_script("$('#dcr_{$this->iId} form').bind('submit.uilinksWizard', oACWidget_{$this->iId}.DoCreateObject);");
$oPage->add_ready_script(<<<JS
$('#ac_create_{$this->iId}').dialog({ width: 'auto', height: 'auto', maxHeight: $(window).height() - 50, autoOpen: false, modal: true});
$('#dcr_{$this->iId} form').removeAttr('onsubmit');
$('#dcr_{$this->iId} form').on('submit.uilinksWizard', oACWidget_{$this->iId}.DoCreateObject);
JS
);
}
/**

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2016 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -21,7 +21,7 @@
* UI wdiget for displaying and editing one-way encrypted passwords
*
* @author Romain Quetiez
* @copyright Copyright (C) 2010-2016 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -70,11 +70,7 @@ class UIHTMLEditorWidget
// To change the default settings of the editor,
// a) edit the file /js/ckeditor/config.js
// b) or override some of the configuration settings, using the second parameter of ckeditor()
$aConfig = array();
$sLanguage = strtolower(trim(UserRights::GetUserLanguage()));
$aConfig['language'] = $sLanguage;
$aConfig['contentsLanguage'] = $sLanguage;
$aConfig['extraPlugins'] = 'disabler,codesnippet';
$aConfig = utils::GetCkeditorPref();
$sWidthSpec = addslashes(trim($this->m_oAttDef->GetWidth()));
if ($sWidthSpec != '')
{
@@ -97,10 +93,10 @@ class UIHTMLEditorWidget
// The most relevant solution would be to implement a plugin to CKEdit, and handle the internal events like: setData, insertHtml, insertElement, loadSnapshot, key, afterUndo, afterRedo
// Could also be bound to 'instanceReady.ckeditor'
$oPage->add_ready_script("$('#$iId').bind('validate', function(evt, sFormId) { return ValidateCKEditField('$iId', '', {$this->m_sMandatory}, sFormId, '') } );\n");
$oPage->add_ready_script("$('#$iId').on('validate', function(evt, sFormId) { return ValidateCKEditField('$iId', '', {$this->m_sMandatory}, sFormId, '') } );\n");
$oPage->add_ready_script(
<<<EOF
$('#$iId').bind('update', function(evt){
$('#$iId').on('update', function(evt){
BlockField('cke_$iId', $('#$iId').prop('disabled'));
//Delayed execution - ckeditor must be properly initialized before setting readonly
var retryCount = 0;

View File

@@ -1,28 +1,18 @@
<?php
// Copyright (C) 2010-2017 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
/**
* Class UILinksWidgetDirect
*
* @copyright Copyright (C) 2010-2017 Combodo SARL
*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
*/
class UILinksWidgetDirect
{
protected $sClass;
@@ -243,23 +233,21 @@ class UILinksWidgetDirect
protected function DisplayEditInPlace(WebPage $oPage, $oValue, $aArgs = array(), $sFormPrefix, $oCurrentObj, $aButtons = array('create', 'delete'))
{
$aAttribs = $this->GetTableConfig();
$oValue->Rewind();
$oPage->add('<table class="listContainer" id="'.$this->sInputid.'"><tr><td>');
$aData = array();
while($oLinkObj = $oValue->Fetch())
{
while ($oLinkObj = $oValue->Fetch()) {
$aRow = array();
$aRow['form::select'] = '<input type="checkbox" class="selectList'.$this->sInputid.'" value="'.$oLinkObj->GetKey().'"/>';
foreach($this->aZlist as $sLinkedAttCode)
{
foreach ($this->aZlist as $sLinkedAttCode) {
$aRow[$sLinkedAttCode] = $oLinkObj->GetAsHTML($sLinkedAttCode);
}
$aData[] = $aRow;
}
$oPage->table($aAttribs, $aData);
$oPage->add('</td></tr></table>'); //listcontainer
$oDiv = UIContentBlockUIBlockFactory::MakeStandard($this->sInputid, ['listContainer']);
$oPage->AddSubBlock($oDiv);
$oDatatable = DataTableUIBlockFactory::MakeForForm($this->sInputid, $aAttribs, $aData);
$oDatatable->SetOptions(['select_mode' => 'custom']);
$oDiv->AddSubBlock($oDatatable);
$sInputName = $sFormPrefix.'attr_'.$this->sAttCode;
$aLabels = array(
'delete' => Dict::S('UI:Button:Delete'),

View File

@@ -1,32 +1,14 @@
<?php
// Copyright (C) 2010-2017 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
// along with iTop. If not, see <http://www.gnu.org/licenses/>
/**
* Class UILinksWidget
*
* @copyright Copyright (C) 2010-2017 Combodo SARL
/*
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\UI\Component\DataTable\DataTableFactory;
use Combodo\iTop\Application\UI\Component\DataTable\StaticTable\FormTableRow\FormTableRow;
use Combodo\iTop\Renderer\BlockRenderer;
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\BlockIndirectLinksEdit\BlockIndirectLinksEdit;
use Combodo\iTop\Application\UI\Links\Indirect\BlockObjectPickerDialog\BlockObjectPickerDialog;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
require_once(APPROOT.'application/displayblock.class.inc.php');
@@ -100,8 +82,7 @@ class UILinksWidget
$this->m_aEditableFields[] = $this->m_sExtKeyToRemote;
$aRemoteAttDefsToDisplay = MetaModel::GetZListAttDefsFilteredForIndirectRemoteClass($this->m_sRemoteClass);
foreach ($aRemoteAttDefsToDisplay as $oRemoteAttDef)
{
foreach ($aRemoteAttDefsToDisplay as $oRemoteAttDef) {
$sRemoteAttCode = $oRemoteAttDef->GetCode();
$this->m_aTableConfig['static::'.$sRemoteAttCode] = array(
'label' => $oRemoteAttDef->GetLabel(),
@@ -342,29 +323,14 @@ JS
/**
* Display the table with the form for editing all the links at once
*
* @param WebPage $oP The web page used for the output
* @param array $aConfig The table's header configuration
* @param array $aData The tabular data to be displayed
*
* @return string Html fragment representing the form table
* @throws \ReflectionException
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
* @return \Combodo\iTop\Application\UI\Base\Component\DataTable\StaticTable\FormTable\FormTable
*/
protected function DisplayFormTable(WebPage $oP, $aConfig, $aData)
protected function GetFormTableBlock($aConfig, $aData)
{
$oTable = DataTableFactory::MakeForForm("{$this->m_sAttCode}{$this->m_sNameSuffix}", $aConfig);
foreach ($aData as $iRowId => $aRow)
{
$oRow = new FormTableRow("{$this->m_sAttCode}{$this->m_sNameSuffix}", $aConfig, $aRow, $iRowId);
$oTable->AddRow($oRow);
}
$sHtml = BlockRenderer::RenderBlockTemplates($oTable);
return $sHtml;
return DataTableUIBlockFactory::MakeForForm("{$this->m_sAttCode}{$this->m_sNameSuffix}", $aConfig, $aData);
}
@@ -379,65 +345,65 @@ JS
*
* @return string The HTML fragment to be inserted into the page
* @throws \ArchivedObjectException
* @throws \ConfigException
* @throws \CoreException
* @throws \DictExceptionMissingString
* @throws \CoreUnexpectedValue
* @throws \MySQLException
* @throws \ReflectionException
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
public function Display(WebPage $oPage, $oValue, $aArgs, $sFormPrefix, $oCurrentObj)
public function Display(WebPage $oPage, $oValue, $aArgs, $sFormPrefix, $oCurrentObj): string
{
$sHtmlValue = '';
$sHtmlValue .= "<div id=\"linkedset_{$this->m_sAttCode}{$this->m_sNameSuffix}\">\n";
$sHtmlValue .= "<input type=\"hidden\" id=\"{$sFormPrefix}{$this->m_iInputId}\">\n";
$sLinkedSetId = "{$this->m_sAttCode}{$this->m_sNameSuffix}";
$oBlock = new BlockIndirectLinksEdit("linkedset_{$sLinkedSetId}", ["ibo-block-indirect-links--edit"]);
$oBlock->sLinkedSetId = $sLinkedSetId;
$oBlock->sClass = $this->m_sClass;
$oBlock->sAttCode = $this->m_sAttCode;
$oBlock->iInputId = $this->m_iInputId;
$oBlock->sNameSuffix = $this->m_sNameSuffix;
$oBlock->bDuplicates = ($this->m_bDuplicatesAllowed) ? 'true' : 'false';
$oBlock->oWizHelper = 'oWizardHelper'.$sFormPrefix;
$oBlock->sExtKeyToRemote = $this->m_sExtKeyToRemote;
// Don't automatically launch the search if the table is huge
$oBlock->bJSDoSearch = utils::IsHighCardinality($this->m_sRemoteClass) ? 'false' : 'true';
$oBlock->sFormPrefix = $sFormPrefix;
$oBlock->sRemoteClass = $this->m_sRemoteClass;
$oValue->Rewind();
$aForm = array();
$iAddedId = -1; // Unique id for new links
$sDuplicates = ($this->m_bDuplicatesAllowed) ? 'true' : 'false';
// Don't automatically launch the search if the table is huge
$bDoSearch = !utils::IsHighCardinality($this->m_sRemoteClass);
$sJSDoSearch = $bDoSearch ? 'true' : 'false';
$sWizHelper = 'oWizardHelper'.$sFormPrefix;
$oPage->add_ready_script(<<<JS
oWidget{$this->m_iInputId} = new LinksWidget('{$this->m_sAttCode}{$this->m_sNameSuffix}', '{$this->m_sClass}', '{$this->m_sAttCode}', '{$this->m_iInputId}', '{$this->m_sNameSuffix}', $sDuplicates, $sWizHelper, '{$this->m_sExtKeyToRemote}', $sJSDoSearch);
oWidget{$this->m_iInputId}.Init();
JS
);
while ($oCurrentLink = $oValue->Fetch())
{
// We try to retrieve the remote object as usual
$oLinkedObj = MetaModel::GetObject($this->m_sRemoteClass, $oCurrentLink->Get($this->m_sExtKeyToRemote),
false /* Must not be found */);
// If successful, it means that we can edit its link
if ($oLinkedObj !== null)
{
if ($oLinkedObj !== null) {
$bReadOnly = false;
}
// Else we retrieve it without restrictions (silos) and will display its link as readonly
else
{
$bReadOnly = true;
$oLinkedObj = MetaModel::GetObject($this->m_sRemoteClass, $oCurrentLink->Get($this->m_sExtKeyToRemote), false /* Must not be found */, true);
}
} // Else we retrieve it without restrictions (silos) and will display its link as readonly
else {
$bReadOnly = true;
$oLinkedObj = MetaModel::GetObject($this->m_sRemoteClass, $oCurrentLink->Get($this->m_sExtKeyToRemote), false /* Must not be found */, true);
}
if ($oCurrentLink->IsNew())
{
$key = $iAddedId--;
}
else
{
$key = $oCurrentLink->GetKey();
}
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs, $oCurrentObj, $key, $bReadOnly);
if ($oCurrentLink->IsNew()) {
$key = $iAddedId--;
} else {
$key = $oCurrentLink->GetKey();
}
$aForm[$key] = $this->GetFormRow($oPage, $oLinkedObj, $oCurrentLink, $aArgs, $oCurrentObj, $key, $bReadOnly);
}
$sHtmlValue .= $this->DisplayFormTable($oPage, $this->m_aTableConfig, $aForm);
// To prevent adding forms inside the main form
$oDataTable = DataTableUIBlockFactory::MakeForForm("{$this->m_sAttCode}{$this->m_sNameSuffix}", $this->m_aTableConfig, $aForm);
$oDataTable->SetOptions(['select_mode' => 'custom']);
$oBlock->AddSubBlock($oDataTable);
$sHtmlValue .= "<span style=\"float:left;\">&nbsp;&nbsp;&nbsp;<img src=\"../images/tv-item-last.gif\">&nbsp;&nbsp;<input id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_btnRemove\" type=\"button\" value=\"".Dict::S('UI:RemoveLinkedObjectsOf_Class')."\" onClick=\"oWidget{$this->m_iInputId}.RemoveSelected();\" >";
$sHtmlValue .= "&nbsp;&nbsp;&nbsp;<input id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_btnAdd\" type=\"button\" value=\"".Dict::Format('UI:AddLinkedObjectsOf_Class', MetaModel::GetName($this->m_sRemoteClass))."\" onClick=\"oWidget{$this->m_iInputId}.AddObjects();\"><span id=\"{$this->m_sAttCode}{$this->m_sNameSuffix}_indicatorAdd\"></span></span>\n";
$sHtmlValue .= "<span style=\"clear:both;\"><p>&nbsp;</p></span>\n";
$sHtmlValue .= "</div>\n";
$oPage->add_at_the_end("<div id=\"dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}\"></div>"); // To prevent adding forms inside the main form
return $sHtmlValue;
$oBlock->AddControls();
return ConsoleBlockRenderer::RenderBlockTemplateInPage($oPage, $oBlock);
}
/**
@@ -481,8 +447,6 @@ JS
*/
public function GetObjectPickerDialog($oPage, $oCurrentObj, $sJson, $aAlreadyLinkedIds = array(), $aPrefillFormParam = array())
{
//$oPage->add("<div class=\"wizContainer\" style=\"vertical-align:top;\">\n");
$oAlreadyLinkedFilter = new DBObjectSearch($this->m_sRemoteClass);
if (!$this->m_bDuplicatesAllowed && count($aAlreadyLinkedIds) > 0) {
$oAlreadyLinkedFilter->AddCondition('id', $aAlreadyLinkedIds, 'NOTIN');
@@ -500,38 +464,32 @@ JS
$aPrefillFormParam['dest_class'] = $this->m_sRemoteClass;
$oCurrentObj->PrefillForm('search', $aPrefillFormParam);
}
$oBlock = new DisplayBlock($oFilter, 'search', false);
$oPage->AddUiBlock($oBlock->GetDisplay($oPage, "SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}",
$sLinkedSetId = "{$this->m_sAttCode}{$this->m_sNameSuffix}";
$oBlock = new BlockObjectPickerDialog();
$oPage->AddUiBlock($oBlock);
$oBlock->sLinkedSetId = $sLinkedSetId;
$oBlock->iInputId = $this->m_iInputId;
$oBlock->sLinkedClassName = MetaModel::GetName($this->m_sLinkedClass);
$oBlock->sClassName = MetaModel::GetName($this->m_sClass);
$oDisplayBlock = new DisplayBlock($oFilter, 'search', false);
$oBlock->AddSubBlock($oDisplayBlock->GetDisplay($oPage, "SearchFormToAdd_{$sLinkedSetId}",
array(
'menu' => false,
'result_list_outer_selector' => "SearchResultsToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}",
'table_id' => "add_{$this->m_sAttCode}{$this->m_sNameSuffix}",
'table_inner_id' => "ResultsToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}",
'result_list_outer_selector' => "SearchResultsToAdd_{$sLinkedSetId}",
'table_id' => "add_{$sLinkedSetId}",
'table_inner_id' => "ResultsToAdd_{$sLinkedSetId}",
'selection_mode' => true,
'json' => $sJson,
'cssCount' => '#count_'.$this->m_sAttCode.$this->m_sNameSuffix,
'query_params' => $oFilter->GetInternalParams(),
'hidden_criteria' => $sAlreadyLinkedExpression,
)));
$sEmptyList = Dict::S('UI:Message:EmptyList:UseSearchForm');
$sCancel = Dict::S('UI:Button:Cancel');
$sAdd = Dict::S('UI:Button:Add');
$oPage->add(<<<HTML
<form id="ObjectsAddForm_{$this->m_sAttCode}{$this->m_sNameSuffix}">
<div id="SearchResultsToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}" style="vertical-align:top;background: #fff;height:100%;overflow:auto;padding:0;border:0;">
<div style="background: #fff; border:0; text-align:center; vertical-align:middle;"><p>{$sEmptyList}</p></div>
</div>
<input type="hidden" id="count_{$this->m_sAttCode}{$this->m_sNameSuffix}" value="0"/>
<input type="button" value="{$sCancel}" onClick="$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog('close');">&nbsp;&nbsp;
<input id="btn_ok_add_{$this->m_sAttCode}{$this->m_sNameSuffix}" disabled="disabled" type="button" onclick="return oWidget{$this->m_iInputId}.DoAddObjects(this.id);" value="{$sAdd}">
</form>
HTML
);
$oPage->add_ready_script("$('#dlg_{$this->m_sAttCode}{$this->m_sNameSuffix}').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, title:'".addslashes(Dict::Format('UI:AddObjectsOf_Class_LinkedWith_Class', MetaModel::GetName($this->m_sLinkedClass), MetaModel::GetName($this->m_sClass)))."' , autoOpen: false, modal: true, resizeStop: oWidget{$this->m_iInputId}.UpdateSizes });");
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix} form').bind('submit.uilinksWizard', oWidget{$this->m_iInputId}.SearchObjectsToAdd);");
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_sAttCode}{$this->m_sNameSuffix}').resize(oWidget{$this->m_iInputId}.UpdateSizes);");
$oBlock->AddForm();
}
/**
@@ -581,18 +539,44 @@ HTML
$aLinkedObjectIds = utils::ReadMultipleSelection($oFullSetFilter);
$iAdditionId = $iMaxAddedId + 1;
foreach($aLinkedObjectIds as $iObjectId)
{
foreach ($aLinkedObjectIds as $iObjectId) {
$oLinkedObj = MetaModel::GetObject($this->m_sRemoteClass, $iObjectId, false);
if (is_object($oLinkedObj))
{
if (is_object($oLinkedObj)) {
$aRow = $this->GetFormRow($oP, $oLinkedObj, $iObjectId, array(), $oCurrentObj, $iAdditionId); // Not yet created link get negative Ids
$oRow = new FormTableRow("{$this->m_sAttCode}{$this->m_sNameSuffix}", $this->m_aTableConfig, $aRow, -$iAdditionId);
$oP->AddUiBlock($oRow);
$iAdditionId++;
} else {
$oP->p(Dict::Format('UI:Error:Object_Class_Id_NotFound', $this->m_sLinkedClass, $iObjectId));
}
else
{
}
}
/**
* @param WebPage $oP
* @param int $iMaxAddedId
* @param $oFullSetFilter
* @param DBObject $oCurrentObj
*
* @throws \ArchivedObjectException
* @throws \CoreException
*/
public function DoAddIndirectLinks(JsonPage $oP, $iMaxAddedId, $oFullSetFilter, $oCurrentObj)
{
$aLinkedObjectIds = utils::ReadMultipleSelection($oFullSetFilter);
$iAdditionId = $iMaxAddedId + 1;
foreach ($aLinkedObjectIds as $iObjectId) {
$oLinkedObj = MetaModel::GetObject($this->m_sRemoteClass, $iObjectId, false);
if (is_object($oLinkedObj)) {
$aRow = $this->GetFormRow($oP, $oLinkedObj, $iObjectId, array(), $oCurrentObj, $iAdditionId); // Not yet created link get negative Ids
$aData = [];
foreach ($aRow as $item) {
$aData[] = $item;
}
$oP->AddData($aData);
$iAdditionId++;
} else {
$oP->p(Dict::Format('UI:Error:Object_Class_Id_NotFound', $this->m_sLinkedClass, $iObjectId));
}
}

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,7 +20,7 @@
* Class UIPasswordWidget
* UI wdiget for displaying and editing one-way encrypted passwords
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
@@ -67,10 +67,10 @@ class UIPasswordWidget
$sHtmlValue .= '<span class="form_validation ibo-field-validation" id="v_'.$this->iId.'"></span><span class="field_status" id="fstatus_'.$this->iId.'"></span>';
$oPage->add_ready_script("$('#$this->iId').bind('keyup change', function(evt) { return PasswordFieldChanged('$this->iId') } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#$this->iId').bind('keyup change validate', function(evt, sFormId) { return ValidatePasswordField('$this->iId', sFormId) } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#{$this->iId}_confirm').bind('keyup change', function(evt, sFormId) { return ValidatePasswordField('$this->iId', sFormId) } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#{$this->iId}').bind('update', function(evt, sFormId)
$oPage->add_ready_script("$('#$this->iId').on('keyup change', function(evt) { return PasswordFieldChanged('$this->iId') } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#$this->iId').on('keyup change validate', function(evt, sFormId) { return ValidatePasswordField('$this->iId', sFormId) } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#{$this->iId}_confirm').on('keyup change', function(evt, sFormId) { return ValidatePasswordField('$this->iId', sFormId) } );"); // Bind to a custom event: validate
$oPage->add_ready_script("$('#{$this->iId}').on('update', function(evt, sFormId)
{
if ($(this).prop('disabled'))
{

View File

@@ -1,7 +1,7 @@
<?php
/**
*
* Copyright (C) 2010-2018 Combodo SARL
* Copyright (C) 2010-2021 Combodo SARL
*
* This file is part of iTop.
*
@@ -72,7 +72,7 @@ HTML
$oPage->add_ready_script("$('#dlg_{$this->m_iInputId}').dialog({ width: $(window).width()*0.8, height: $(window).height()*0.8, autoOpen: false, modal: true, resizeStop: oForeignKeysWidget{$this->m_iInputId}.UpdateSizes });");
$oPage->add_ready_script("$('#dlg_{$this->m_iInputId}').dialog('option', {title:'$sTitle'});");
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_iInputId} form').bind('submit.uilinksWizard', oForeignKeysWidget{$this->m_iInputId}.SearchObjectsToAdd);");
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_iInputId} form').on('submit.uilinksWizard', oForeignKeysWidget{$this->m_iInputId}.SearchObjectsToAdd);");
$oPage->add_ready_script("$('#SearchFormToAdd_{$this->m_iInputId}').resize(oForeignKeysWidget{$this->m_iInputId}.UpdateSizes);");
}

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,7 +20,7 @@
/**
* Class UIWizard
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -19,7 +19,7 @@
/**
* Store and retrieve user custom dashboards
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
require_once(APPROOT.'/core/dbobject.class.php');

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2017 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -19,7 +19,7 @@
/**
* Store and retrieve user's preferences (i.e persistent per user settings)
*
* @copyright Copyright (C) 2010-2017 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
require_once(APPROOT.'/core/dbobject.class.php');
@@ -34,7 +34,8 @@ require_once(APPROOT.'/core/userrights.class.inc.php');
*/
class appUserPreferences extends DBObject
{
private static $oUserPrefs = null; // Local cache
/** @var array Associative array of the prefs. of users: <USER_ID> => <PREFS> */
private static $aUsersPrefs = []; // Local cache
/**
* Get the value of the given property/preference
@@ -42,31 +43,35 @@ class appUserPreferences extends DBObject
*
* @param string $sCode Code/Name of the property to set
* @param mixed $defaultValue The default value
* @param string|null $sUserId Added in 3.0.0. ID of the user we want the pref. from, default is the current user
*
* @return mixed The value of the property for the current user
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
* @throws \OQLException
* @since 3.0.0 Added the $sUserId parameter
*/
public static function GetPref($sCode, $defaultValue)
public static function GetPref($sCode, $defaultValue, ?string $sUserId = null)
{
if (self::$oUserPrefs == null)
{
self::Load();
if (null === $sUserId) {
$sUserId = UserRights::GetUserId();
}
$aPrefs = self::$oUserPrefs->Get('preferences');
if (array_key_exists($sCode, $aPrefs))
{
if (false === array_key_exists($sUserId, self::$aUsersPrefs)) {
self::Load($sUserId);
}
$aPrefs = self::$aUsersPrefs[$sUserId]->Get('preferences');
if (array_key_exists($sCode, $aPrefs)) {
return $aPrefs[$sCode];
}
else
{
} else {
return $defaultValue;
}
}
/**
* Set the value for a given preference, and stores it into the database
* Set the value for a given preference for the current user, and stores it into the database
*
* @param string $sCode Code/Name of the property/preference to set
* @param mixed $value Value to set
@@ -78,25 +83,23 @@ class appUserPreferences extends DBObject
*/
public static function SetPref($sCode, $value)
{
if (self::$oUserPrefs == null)
{
self::Load();
$sUserId = UserRights::GetUserId();
if (false === array_key_exists($sUserId, self::$aUsersPrefs)) {
self::Load($sUserId);
}
$aPrefs = self::$oUserPrefs->Get('preferences');
if (array_key_exists($sCode, $aPrefs) && ($aPrefs[$sCode] === $value))
{
$aPrefs = self::$aUsersPrefs[$sUserId]->Get('preferences');
if (array_key_exists($sCode, $aPrefs) && ($aPrefs[$sCode] === $value)) {
// Do not write it again
}
else
{
} else {
$aPrefs[$sCode] = $value;
self::$oUserPrefs->Set('preferences', $aPrefs);
self::$aUsersPrefs[$sUserId]->Set('preferences', $aPrefs);
self::Save();
}
}
/**
* Clears the value for a given preference (or list of preferences that matches a pattern), and updates the database
* Clears the value for a given preference (or list of preferences that matches a pattern) for the current user, and updates the database
*
* @param string $sCodeOrPattern Code/Pattern of the properties/preferences to reset
* @param boolean $bPattern Whether or not the supplied code is a PCRE pattern
@@ -108,37 +111,33 @@ class appUserPreferences extends DBObject
*/
public static function UnsetPref($sCodeOrPattern, $bPattern = false)
{
if (self::$oUserPrefs == null)
{
self::Load();
$sUserId = UserRights::GetUserId();
if (false === array_key_exists($sUserId, self::$aUsersPrefs)) {
self::Load($sUserId);
}
$aPrefs = self::$oUserPrefs->Get('preferences');
if ($bPattern)
{
$aPrefs = self::$aUsersPrefs[$sUserId]->Get('preferences');
if ($bPattern) {
// the supplied code is a pattern, clear all preferences that match
foreach($aPrefs as $sKey => $void)
{
if (preg_match($sCodeOrPattern, $sKey))
{
foreach ($aPrefs as $sKey => $void) {
if (preg_match($sCodeOrPattern, $sKey)) {
unset($aPrefs[$sKey]);
}
}
self::$oUserPrefs->Set('preferences', $aPrefs);
}
else
{
self::$aUsersPrefs[$sUserId]->Set('preferences', $aPrefs);
} else {
unset($aPrefs[$sCodeOrPattern]);
self::$oUserPrefs->Set('preferences', $aPrefs);
self::$aUsersPrefs[$sUserId]->Set('preferences', $aPrefs);
}
// Save only if needed
if (self::$oUserPrefs->IsModified())
{
if (self::$aUsersPrefs[$sUserId]->IsModified()) {
self::Save();
}
}
/**
* Call this function to get all the preferences for the user, packed as a JSON object
* Call this function to get all the preferences for the current user, packed as a JSON object
*
* @return string JSON representation of the preferences
* @throws \CoreException
@@ -147,11 +146,13 @@ class appUserPreferences extends DBObject
*/
public static function GetAsJSON()
{
if (self::$oUserPrefs == null)
{
self::Load();
$sUserId = UserRights::GetUserId();
if (false === array_key_exists($sUserId, self::$aUsersPrefs)) {
self::Load($sUserId);
}
$aPrefs = self::$oUserPrefs->Get('preferences');
$aPrefs = self::$aUsersPrefs[$sUserId]->Get('preferences');
return json_encode($aPrefs);
}
@@ -162,32 +163,33 @@ class appUserPreferences extends DBObject
*/
public static function ResetPreferences()
{
self::$oUserPrefs = null;
self::$aUsersPrefs = [];
}
/**
* Call this function to ERASE all the preferences from the current user
* Call this function to ERASE all the preferences from the current user (only in memory, not in DB)
*
* @return void
*/
public static function ClearPreferences()
{
self::$oUserPrefs = null;
$sUserId = UserRights::GetUserId();
unset(self::$aUsersPrefs[$sUserId]);
}
/**
* Save preferences in the DB
* Save preferences of the current user in the DB, for now we don't allow interfering with an other users preferences
*
* @return void;
*/
protected static function Save()
{
if (self::$oUserPrefs != null)
{
if (self::$oUserPrefs->IsModified())
{
$sUserId = UserRights::GetUserId();
if (array_key_exists($sUserId, self::$aUsersPrefs)) {
if (self::$aUsersPrefs[$sUserId]->IsModified()) {
utils::PushArchiveMode(false);
self::$oUserPrefs->DBUpdate();
self::$aUsersPrefs[$sUserId]->DBUpdate();
utils::PopArchiveMode();
}
}
@@ -197,36 +199,45 @@ class appUserPreferences extends DBObject
* Loads the preferences for the current user, creating the record in the database
* if needed
*
* @param string|null $sUserId Added in 3.0.0. ID of the user to load the prefs for, if null then current user will be used.
*
* @return void;
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
* @throws \OQLException
* @since 3.0.0 Added $sUserId parameter
*/
protected static function Load()
protected static function Load(?string $sUserId = null)
{
if (self::$oUserPrefs != null) return;
// Already in cache
if (array_key_exists($sUserId, self::$aUsersPrefs)) {
return;
}
if (null === $sUserId) {
$sUserId = UserRights::GetUserId();
}
$oSearch = new DBObjectSearch('appUserPreferences');
$oSearch->AddCondition('userid', UserRights::GetUserId(), '=');
$oSearch->AddCondition('userid', $sUserId, '=');
$oSet = new DBObjectSet($oSearch);
$oObj = $oSet->Fetch();
if ($oObj == null)
{
if ($oObj == null) {
// No prefs (yet) for this user, create the object
$oObj = new appUserPreferences();
$oObj->Set('userid', UserRights::GetUserId());
$oObj->Set('userid', $sUserId);
$oObj->Set('preferences', array()); // Default preferences: an empty array
try
{
try {
utils::PushArchiveMode(false);
$oObj->DBInsert();
utils::PopArchiveMode();
}
catch(Exception $e)
{
catch (Exception $e) {
// Ignore errors
}
}
self::$oUserPrefs = $oObj;
self::$aUsersPrefs[$sUserId] = $oObj;
}
/**

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/WebPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2016 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -20,7 +20,7 @@
/**
* Class WizardHelper
*
* @copyright Copyright (C) 2010-2016 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

View File

@@ -2,6 +2,6 @@
/**
* @deprecated will be removed in 3.1.0 - moved to sources/application/WebPage/XMLPage.php
* @license http://opensource.org/licenses/AGPL-3.0
* @copyright Copyright (C) 2010-2020 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
*/

View File

@@ -1,7 +1,7 @@
<?php
/**
* Copyright (C) 2013-2020 Combodo SARL
* Copyright (C) 2013-2021 Combodo SARL
*
* This file is part of iTop.
*
@@ -25,6 +25,10 @@
* This is a hard-coded check that limits errors : we are stopping for anything < PHP 7.0.0
* The "real one" will be done in {@link \SetupUtils::CheckPhpVersion()}
*
* Note that since Composer 2 there is a platform_check that make this useless, but keeping it anyway to be extra safe !
*
* @see https://github.com/composer/composer/blob/master/doc/07-runtime.md#platform-check Composer's platform check
*
* @since 3.0.0 N°2214
*/
$bIsValidPhpVersion = false;

View File

@@ -63,6 +63,8 @@
"core/legacy/querybuildercontextlegacy.class.inc.php",
"core/querybuilderexpressions.class.inc.php",
"core/legacy/querybuilderexpressionslegacy.class.inc.php",
"core/oql/build/PHP/",
"core/apc-emulation.php",
"application/startup.inc.php",
"application/loginform.class.inc.php",
"application/loginbasic.class.inc.php",

View File

@@ -1,5 +1,5 @@
<?php
// Copyright (C) 2010-2012 Combodo SARL
// Copyright (C) 2010-2021 Combodo SARL
//
// This file is part of iTop.
//
@@ -21,7 +21,7 @@
* Various dev/debug helpers
* TODO: cleanup or at least re-organize
*
* @copyright Copyright (C) 2010-2012 Combodo SARL
* @copyright Copyright (C) 2010-2021 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/

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