Compare commits

..

113 Commits

Author SHA1 Message Date
Romain Quetiez
bbf7a8cc42 Ease toggling between optimization and legacy algorithms 2025-07-11 15:24:14 +02:00
Romain Quetiez
726542dd66 Update todo list 2025-07-04 15:38:14 +02:00
Romain Quetiez
8e65a65f6b Optimize the build of the graph (POC, somewhat hardcoded) 2025-07-04 15:36:03 +02:00
Romain Quetiez
f8ae1fd2d8 Measure operations duration 2025-07-04 14:31:40 +02:00
bdalsass
57d610fc16 Merge remote-tracking branch 'origin/support/3.2' into develop 2025-07-03 13:41:47 +02:00
bdalsass
740f83f43e N°8395 - php8.1 compatibility in class extended Exception 2025-07-03 13:39:39 +02:00
bdalsass
d2d422afcf Merge remote-tracking branch 'origin/support/3.2' into develop 2025-07-01 16:11:20 +02:00
bdalsass
14791bf6b4 N°8148 - CAS problem when sending a link ending in &
- ApplicationContextTest mocking service
2025-07-01 15:57:45 +02:00
Benjamin Dalsass
062d543b26 N°8148 - CAS problem when sending a link ending in & (#722)
N°8148 - CAS problem when sending a link ending in &
2025-06-30 14:19:33 +02:00
bdalsass
278ac66637 Merge remote-tracking branch 'origin/support/3.2' into develop 2025-06-30 10:08:47 +02:00
bdalsass
8cece0f0fd N°8395 - php8.1 compatibility in class extended Exception 2025-06-30 10:01:00 +02:00
odain
87db141c3c Merge branch 'support/3.2' into develop 2025-06-19 11:32:58 +02:00
odain
18871566d2 N°8286 - fix call to CompleteSessionData in case of no proper session content 2025-06-19 11:29:48 +02:00
odain
b565b700a9 Merge branch 'feature/7398-sessiontracker-extensibility' into support/3.2 2025-06-19 10:39:35 +02:00
odain
3846087dc1 N°7398 - regenerate autoload 2025-06-19 10:39:09 +02:00
odain
4f96246cbe N°7398-log level with invalid json 2025-06-19 10:38:01 +02:00
odain
ddd3dcdaf2 N°8286 - Be able to add additional data in iTop session files via custom classes 2025-06-19 10:38:01 +02:00
odain
82ad9d4317 N°7398 - be able to add custom data in session files generated by SessionHandler 2025-06-19 10:38:00 +02:00
Anne-Cath
6dc48ad36d N°8351 - [Export Impact Analysis] Field to display for the CSV export - Add the friendlyname to each list 2025-06-17 10:22:53 +02:00
jf-cbd
f062f994f0 Merge remote-tracking branch 'origin/support/3.2' into develop 2025-06-16 17:01:49 +02:00
Björn Rudner
84476a869f 🎨 remove outdated or duplicated elemets (#726) 2025-06-16 16:25:22 +02:00
jf-cbd
684f829581 Merge commit from fork 2025-06-16 15:06:45 +02:00
jf-cbd
fb81e54ed9 Merge remote-tracking branch 'origin/support/3.2' into develop
# Conflicts:
#	core/kpi.class.inc.php
#	datamodels/2.x/itop-profiles-itil/datamodel.itop-profiles-itil.xml
2025-06-16 15:03:36 +02:00
Björn Rudner
d1e6334629 N°8456 - 🐛 add missing element attributes (#725) 2025-06-13 16:50:56 +02:00
Eric Espie
047ba8c6c7 Better KPI log performances 2025-06-13 15:31:30 +02:00
Eric Espie
916467ea61 Better perf for KPI logging 2025-06-13 15:26:43 +02:00
Romain Quetiez
8a4ad87b06 N°8440 Allow icon file ids to contain quotes, by correctly escaping language literals (XPath or PHP) 2025-06-13 09:58:59 +02:00
Romain Quetiez
2086052d60 N°8440 Allow icon file ids to contain quotes, by correctly escaping language literals (XPath or PHP) 2025-06-13 09:55:25 +02:00
v-dumas
f609010d7f Fix typo in SynchroLog class name 2025-06-11 17:49:28 +02:00
v-dumas
9330b5ec9a N°8377 - Fix confusing duplicated stimulus label on Change 2025-06-11 17:42:04 +02:00
v-dumas
18b85d4080 N°8377 - Missing rights on change ITIL for SuperUser 2025-06-11 17:41:01 +02:00
v-dumas
7214e5b43a Fix typo in SynchroLog class name 2025-06-11 17:14:15 +02:00
v-dumas
3689a83953 N°2583 - Control rights per class (bulk read on business, bulk write on others) 2025-06-11 17:13:25 +02:00
v-dumas
a715ce1292 Fix typo in SynchroLog class name 2025-06-11 17:11:43 +02:00
v-dumas
17d85fbb3f N°2583 - Advanced mode on CSV import add technical classes and class codes 2025-06-11 16:50:38 +02:00
v-dumas
5e59aff74f N°2583 - Filter Universal Search based on user rights 2025-06-11 16:48:28 +02:00
v-dumas
9e1e81ccc1 N°2583 - Audit, User, Query classes available for universal Search without the "Administrator" profile 2025-06-11 11:17:27 +02:00
v-dumas
c57c8d2af3 N°8406 - Fix FR translations 2025-06-11 10:16:50 +02:00
bdalsass
8a436f9760 N°8251 - Deprecated function when bulk assign
- Deprecated on strlen
2025-06-06 15:26:05 +02:00
bdalsass
2e77713772 N°8399 - Portal: unnecessary screen is displayed during a transition with no field to display 2025-06-06 15:04:21 +02:00
Anne-Cath
0a4f9e95c5 N°7216 - CSV Import failling with cryptic message when some lines have a missing separator - fix test 2025-06-06 10:29:26 +02:00
bdalsass
975c554e91 N°8251 - Deprecated function when bulk assign 2025-06-06 09:02:29 +02:00
bdalsass
ac6f642052 N°8232 - CKEditor: Unexpected lines repeatedly added after blocks 2025-06-06 08:54:23 +02:00
bdalsass
cf9ab2a83c N°8436 - CreateBrick fails when used with an abstract class 2025-06-04 16:22:41 +02:00
Anne-Cath
282fb13973 N°7216 - CSV Import failling with cryptic message when some lines have a missing separator - fix import with ignored values 2025-06-03 13:32:49 +02:00
bdalsass
0b92535fda Merge remote-tracking branch 'origin/support/3.2' into develop 2025-06-02 17:18:34 +02:00
bdalsass
3ff3dcba54 N°8308 - Broken URL in sending mail 2025-06-02 17:15:51 +02:00
jf-cbd
657fc912bf N°8198 - ModuleInstallation now extends DBObject + better exception message 2025-06-02 16:09:29 +02:00
Stephen Abello
a0f4c62bcc Fix browse brick items color not being overloadable 2025-05-28 16:35:12 +02:00
Anne-Catherine
5ae5221f6f N°6925 - Enable on any search result edition of OQL (#711) 2025-05-28 10:59:50 +02:00
jf-cbd
b15ca2fbc9 N°8260 - Change format of REST logs when they are close to the SQL field size limit 2025-05-27 10:41:05 +02:00
Stephen Abello
cb382eab4e Fix CI following dict behavior change 2025-05-26 16:23:38 +02:00
Stephen Abello
9723cde24c N°7960 - Add a wrapper to vsprintf to handle argument number disparities (#717) 2025-05-26 15:41:25 +02:00
Stephen Abello
7ae49e2cf4 N°8076 - Fix cancel and close buttons in a modal blocking all buttons for the underlying object 2025-05-26 11:25:08 +02:00
v-dumas
cb13a7a5b4 N°2583 - Audit, User, Query classes can be Import with bulk_modify right 2025-05-23 17:37:47 +02:00
bdalsass
cd4e2608ee Merge remote-tracking branch 'origin/support/3.2' into develop 2025-05-23 10:19:16 +02:00
bdalsass
9618e47045 N°8201 - [CVE_Request]_Cross-Site-Script Reflected(XSS Reflected at the name="attr_installed" (Low or Medium) 2025-05-23 10:16:22 +02:00
bdalsass
d84506ea9e Merge remote-tracking branch 'origin/support/2.7' into support/3.2
# Conflicts:
#	pages/UI.php
2025-05-23 10:14:50 +02:00
bdalsass
13239c2751 N°8201 - [CVE_Request]_Cross-Site-Script Reflected(XSS Reflected at the name="attr_installed" (Low or Medium) 2025-05-23 10:06:01 +02:00
bdalsass
d6c9a6d318 Merge remote-tracking branch 'origin/support/3.2' into develop 2025-05-23 09:14:26 +02:00
bdalsass
8b30e36dd1 N°8168 - Stored XSS in portals lnk 2025-05-23 08:52:18 +02:00
bdalsass
80b290ab88 Merge remote-tracking branch 'origin/support/2.7' into support/3.2
# Conflicts:
#	sources/renderer/bootstrap/fieldrenderer/bslinkedsetfieldrenderer.class.inc.php
2025-05-23 08:49:52 +02:00
bdalsass
81b20ee583 N°8168 - Stored XSS in portals lnk 2025-05-23 08:42:56 +02:00
Pavel Stetina
ca937b829b Typo correction (#718) 2025-05-22 14:43:31 +02:00
Stephen Abello
e0b8ee2143 Merge branch 'support/3.2' into develop 2025-05-20 09:50:11 +02:00
Stephen Abello
a5545b0084 N°8205 - Security hardening 2025-05-20 09:48:00 +02:00
Stephen Abello
d72e861dfe N°8315 - Security hardening 2025-05-19 14:51:12 +02:00
Stephen Abello
92385273ff N°8315 - Security hardening 2025-05-19 14:45:24 +02:00
bdalsass
61c25f85e7 N°8313 - edit dashboard (fix broken test 3.2) 2025-05-19 13:12:02 +02:00
bdalsass
20a7a945fc Merge remote-tracking branch 'origin/support/3.2' into develop 2025-05-16 14:36:36 +02:00
bdalsass
b1cf2ec137 N°8313 - edit dashboard (fix broken test 3.2) 2025-05-16 14:35:39 +02:00
bdalsass
0640c1e9b6 Merge remote-tracking branch 'origin/support/3.2' into develop
# Conflicts:
#	application/utils.inc.php
2025-05-16 14:22:12 +02:00
bdalsass
7549ded51d Merge remote-tracking branch 'origin/support/2.7' into support/3.2
# Conflicts:
#	application/dashboard.class.inc.php
#	setup/setuputils.class.inc.php
#	tests/php-unit-tests/unitary-tests/application/utilsTest.php
2025-05-16 14:19:00 +02:00
bdalsass
38683c20b1 N°8313 - edit dashboard (fix broken test) 2025-05-16 14:05:55 +02:00
bdalsass
81791dd253 N°8313 - edit dashboard 2025-05-16 14:05:55 +02:00
bdalsass
e77e0eec9f N°8355 - render_dashboard 2025-05-16 14:05:55 +02:00
Guy Couronné
cad40ed758 N°7799 - Allow AttributeSet in XML sample file (#654)
*  Allow AttributeSet in XML sample file

In XML Data Loader, manage AttributeSet class and its children to be imported , in sample XML files.
2025-05-15 16:00:50 +02:00
Stephen Abello
11d23ac99b N°8274 - Make linkset toggler follow primary colors 2025-05-15 11:04:57 +02:00
Stephen Abello
1eeb98d2e2 N°8274 - Make hardcoded string a dict entry 2025-05-15 11:04:57 +02:00
Stephen Abello
92e2d22248 N°8274 - Change ui version 2025-05-15 11:04:57 +02:00
jf-cbd
5811dc06e3 Merge remote-tracking branch 'origin/support/3.2' into develop 2025-05-15 09:48:22 +02:00
jf-cbd
f5ddbbbe0e Rollback typing parameter 2025-05-13 16:59:43 +02:00
jf-cbd
6811a82e1a Merge remote-tracking branch 'origin/support/2.7' into support/3.2
# Conflicts:
#	datamodels/2.x/itop-backup/status.php
#	setup/setuputils.class.inc.php
2025-05-13 16:40:11 +02:00
jf-cbd
960133c0df N°8379 - fix backup issue 2025-05-13 16:27:59 +02:00
jf-cbd
544c4ae888 N°8379 - fix backup issue 2025-05-13 16:05:39 +02:00
Stephen Abello
6bd11fb9bf N°8361 - Make vertical the default value for portal's menu 2025-05-06 10:43:34 +02:00
jbostoen
9ee18c2f36 Add helper method to create an ObjectResult from a DBObject. (#706)
Author: Jeffrey Bostoen <support@jeffreybostoen.be>
2025-04-25 14:46:33 +02:00
jf-cbd
624573d088 Merge remote-tracking branch 'origin/support/3.2' into develop
# Conflicts:
#	tests/php-unit-tests/unitary-tests/core/DBObject/DBObjectTest.php
2025-04-22 10:22:25 +02:00
jf-cbd
43a10e6944 Revert "N°8259 - Problem with GetMaxSize on AttributeText"
This reverts commit 29c75f626b.
2025-04-22 09:37:54 +02:00
Anne-Catherine
b21a02dcb8 N°7385 - Trigger on mention executed even if it's not a mention with @ (#638) 2025-04-18 14:52:23 +02:00
Anne-Catherine
3b60e63c97 N°6663 - Request template fields do not apply portal silos (#684) 2025-04-18 13:01:19 +02:00
Benjamin Dalsass
adc8b47945 N°8318 - Managing menu in itop portal new look (#710) 2025-04-14 16:38:36 +02:00
Stephen Abello
5e6d96019d N°8274 - Move mixins declarations to utils, move their usage to themes/ to be able to have their variables overloaded 2025-04-11 10:43:03 +02:00
Stephen Abello
06cc64f6d6 N°8274 - Move CSS color declaration to themes/ to avoid them being redeclared with every file importing utils 2025-04-11 10:09:18 +02:00
Stephen Abello
a5c14c3a48 N°8274 - Move body colors from legacy file to current theme files 2025-04-11 10:08:17 +02:00
Stephen Abello
8f6f243716 N°8274 - Fix typo 2025-04-11 09:47:50 +02:00
Stephen Abello
3c574819b2 N°8274 - Update precompiled stylesheets 2025-04-10 10:35:01 +02:00
Stephen Abello
5b1ea20407 N°8274 - Move every color style to themes/ to ease color customization, add illustration to export popup 2025-04-10 10:33:34 +02:00
Ben
4d88ef6ed4 Update contributors 2025-04-08 09:55:20 +02:00
Stephen Abello
5cb1102e6e N°8274 - Update precompiled stylesheets 2025-04-03 15:51:44 +02:00
Stephen Abello
bf23e4d98d N°8274 - Fix portal additional user profile tabs display 2025-04-03 15:51:36 +02:00
Stephen Abello
8645b28baa N°8274 - Update precompiled stylesheets 2025-04-02 15:50:29 +02:00
Stephen Abello
eff6fcff49 N°8274 - Fix input followed by input control (such as date time picker) display 2025-04-02 15:48:42 +02:00
Stephen Abello
994b08f94a N°8274 - Add no item illustration to browse brick 2025-04-02 15:45:28 +02:00
Stephen Abello
19495d8acf N°8274 - Update precompiled stylesheets 2025-04-02 14:32:38 +02:00
Stephen Abello
48a3ea1945 N°8274 - Replace color for selected rows in datatables 2025-04-02 14:31:33 +02:00
Stephen Abello
a11b2845f7 N°8274 - Correctly vertical align following dot in modal title 2025-04-02 12:07:21 +02:00
Stephen Abello
ee72325451 N°8274 - Make color slightly different for nested fieldset 2025-04-02 12:07:04 +02:00
Stephen Abello
ebb59d3ddc N°8274 - Align modal header and footer padding 2025-04-02 11:35:23 +02:00
Stephen Abello
0193db609d N°8274 - Add illustration on empty manage brick 2025-04-02 11:30:14 +02:00
Stephen Abello
ea2caed98a N°8274 - Correctly vertical align following dot 2025-04-02 11:29:42 +02:00
Stephen Abello
09c092782c N°8274 - Add approot to portal's Symfony variables. Allow portal's twig to display images located in /images in twig 2025-04-02 11:15:45 +02:00
Stephen Abello
a4166f874e N°8274 - Allow to recolor illustrations in portal 2025-04-01 16:28:40 +02:00
212 changed files with 3961 additions and 2639 deletions

View File

@@ -76,7 +76,9 @@ We would like to give a special thank you 🤗 to the people from the community
### Names
- Al Hallak, Amr (a.k.a [@v4yne1](https://github.com/v4yne1))
- Alves, David
- Audon, Florian
- Beck, Pedro
- Beer, Christian (a.k.a [@ChristianBeer](https://www.github.com/ChristianBeer))
- Bilger, Jean-François
@@ -88,20 +90,26 @@ We would like to give a special thank you 🤗 to the people from the community
- Colantoni, Maria Laura
- Couronné, Guy
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
- Delicado, Elodie
- Dvořák, Lukáš
- Goethals, Stefan
- Giuva, Vincenzo Katriel (a.k.a [@DarkNight97boss](https://github.com/DarkNight97boss))
- Gumble, David
- Heloir, Arthur
- Janssens, Jelle (a.k.a [@janssensjelle](https://github.com/janssensjelle))
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
- Khamit, Shamil
- Kincel, Martin
- Konečný, Kamil
- Kunin, Vladimir
- Lassiter, Dennis
- Lassiter, Denis (a.k.a [@delassiter](https://github.com/delassiter))
- Lazcano, Federico
- Lucas, Jonathan
- Malik, Remie
- Mantel, Ina
- Martin, Pierre (a.k.a [@Worty](https://github.com/worty-syn))
- Melchiorre, Romain
- Mindêllo de Andrade, Lucas (a.k.a [@rokam](https://www.github.com/rokam))
- Mozart de Oliveira, Eduardo (a.k.a [@eduardomozart](https://github.com/eduardomozart))
- Raenker, Martin
@@ -113,10 +121,12 @@ We would like to give a special thank you 🤗 to the people from the community
- Seki, Shoji
- Shilov, Vladimir
- Stetina, Pavel (a.k.a [@Stetinac](https://github.com/Stetinac))
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya)-stukalov)
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya-stukalov))
- Tarjányi, Csaba (a.k.a [@tacsaby](https://github.com/tacsaby))
- Toraya, Chairat (a.k.a [@Kyokito1412](https://github.com/Kyokito1412))
- Tulio, Marco
- Turrubiates, Miguel
- Višnjić, Aldin (a.k.a[@viliald](https://github.com/viliald))
- Vlk, Karel (a.k.a [@vlk-charles](https://www.github.com/vlk-charles))
### Aliases
@@ -138,4 +148,6 @@ We would like to give a special thank you 🤗 to the people from the community
- [ITOMIG](https://www.itomig.de/)
- [Pimkie](https://www.pimkie.com/)
- [Super-Visions](https://www.super-visions.com/)
- [Defence Tech Cyber Security - Malware Lab](https://github.com/DefenceTechSecurity)
- Orange Cyberdefense
- MipihSIB

View File

@@ -195,16 +195,31 @@ class ApplicationContext
/**
* Returns the context as string with the format name1=value1&name2=value2....
* @return string The context as a string to be appended to an href property
*
*/
public function GetForLink()
public function GetForLink(bool $bWithLeadingAmpersand = false)
{
// If there are no parameters, return an empty string
if(empty($this->aValues)){
return '';
}
// Build the query string with ampersand separated parameters
$aParams = array();
foreach($this->aValues as $sName => $sValue)
{
$aParams[] = "c[$sName]".'='.urlencode($sValue);
}
return implode("&", $aParams);
$sReturnValue = implode('&', $aParams);
// add the leading ampersand if requested
if($bWithLeadingAmpersand){
$sReturnValue = '&' . $sReturnValue;
}
return $sReturnValue;
}
/**
* @since 3.0.0 N°2534 - dashboard: bug with autorefresh that deactivates filtering on organisation
* Returns the params as c[menu]:..., c[org_id]:....
@@ -382,7 +397,7 @@ class ApplicationContext
$sUrl = call_user_func(array($sUrlMakerClass, 'MakeObjectUrl'), $sObjClass, $sObjKey);
if (utils::StrLen($sUrl) > 0) {
if ($bWithNavigationContext) {
return $sUrl."&".$oAppContext->GetForLink();
return $sUrl.$oAppContext->GetForLink(true);
} else {
return $sUrl;
}

View File

@@ -1929,76 +1929,41 @@ class RestUtils
* @return array of class => list of attributes (see RestResultWithObjects::AddObject that uses it)
* @throws Exception
*/
public static function GetFieldList($sClass, $oData, $sParamName, $bFailIfNotFound = true)
public static function GetFieldList($sClass, $oData, $sParamName)
{
$sFields = self::GetOptionalParam($oData, $sParamName, '*');
return match($sFields) {
'*' => self::GetFieldListForClass($sClass),
'*+' => self::GetFieldListForParentClass($sClass),
default => self::GetLimitedFieldListForClass($sClass, $sFields, $sParamName, $bFailIfNotFound),
};
}
public static function HasRequestedExtendedOutput(string $sFields): bool
{
return match($sFields) {
'*' => false,
'*+' => true,
default => substr_count($sFields, ':') > 1,
};
}
public static function HasRequestedAllOutputFields(string $sFields): bool
{
return match($sFields) {
'*', '*+' => true,
default => false,
};
}
protected static function GetFieldListForClass(string $sClass): array
{
return [$sClass => array_keys(MetaModel::ListAttributeDefs($sClass))];
}
protected static function GetFieldListForParentClass(string $sClass): array
{
$aFieldList = array();
foreach (MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL) as $sRefClass) {
$aFieldList = array_merge($aFieldList, self::GetFieldListForClass($sRefClass));
$aShowFields = array();
if ($sFields == '*')
{
foreach (MetaModel::ListAttributeDefs($sClass) as $sAttCode => $oAttDef)
{
$aShowFields[$sClass][] = $sAttCode;
}
}
return $aFieldList;
}
protected static function GetLimitedFieldListForSingleClass(string $sClass, string $sFields, string $sParamName, bool $bFailIfNotFound = true): array
{
$aFieldList = [$sClass => []];
foreach (explode(',', $sFields) as $sAttCode) {
$sAttCode = trim($sAttCode);
if (($sAttCode == 'id') || (MetaModel::IsValidAttCode($sClass, $sAttCode))) {
$aFieldList[$sClass][] = $sAttCode;
} else {
if ($bFailIfNotFound) {
throw new Exception("$sParamName: invalid attribute code '$sAttCode' for class '$sClass'");
elseif ($sFields == '*+')
{
foreach (MetaModel::EnumChildClasses($sClass, ENUM_CHILD_CLASSES_ALL) as $sRefClass)
{
foreach (MetaModel::ListAttributeDefs($sRefClass) as $sAttCode => $oAttDef)
{
$aShowFields[$sRefClass][] = $sAttCode;
}
}
}
return $aFieldList;
}
protected static function GetLimitedFieldListForClass(string $sClass, string $sFields, string $sParamName, bool $bFailIfNotFound = true): array
{
if (!str_contains($sFields, ':')) {
return self::GetLimitedFieldListForSingleClass($sClass, $sFields, $sParamName, $bFailIfNotFound);
else
{
foreach (explode(',', $sFields) as $sAttCode)
{
$sAttCode = trim($sAttCode);
if (($sAttCode != 'id') && (!MetaModel::IsValidAttCode($sClass, $sAttCode)))
{
throw new Exception("$sParamName: invalid attribute code '$sAttCode'");
}
$aShowFields[$sClass][] = $sAttCode;
}
}
$aFieldList = [];
$aFieldListParts = explode(';', $sFields);
foreach ($aFieldListParts as $sClassFields) {
list($sSubClass, $sSubClassFields) = explode(':', $sClassFields);
$aFieldList = array_merge($aFieldList, self::GetLimitedFieldListForSingleClass(trim($sSubClass), trim($sSubClassFields), $sParamName, $bFailIfNotFound));
}
return $aFieldList;
return $aShowFields;
}
/**

View File

@@ -311,7 +311,7 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
{
$sParams .= $sName.'='.urlencode($value).'&'; // Always add a trailing &
}
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/'.$oObj->GetUIPage().'?'.$sParams.'class='.get_class($oObj).'&id='.$oObj->getKey().'&'.$oAppContext->GetForLink().'&a=1';
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/'.$oObj->GetUIPage().'?'.$sParams.'class='.get_class($oObj).'&id='.$oObj->getKey().$oAppContext->GetForLink(true).'&a=1';
$oPage->add_early_script(<<<JS
if (!sessionStorage.getItem('$sSessionStorageKey'))
{
@@ -1337,7 +1337,7 @@ HTML
}
}
}
$aHeader['friendlyname'] = ['label' => MetaModel::GetName($sClassName)];
foreach ($aList[$sAlias] as $sAttCodeEx => $oAttDef) {
$sColLabel = $bLocalize ? MetaModel::GetLabel($sClassName, $sAttCodeEx) : $sAttCodeEx;
@@ -1358,6 +1358,7 @@ HTML
$aRow = [];
foreach ($aAuthorizedClasses as $sAlias => $sClassName) {
$oObj = $aObjects[$sAlias];
$aRow["friendlyname"] = $oObj->Get('friendlyname');
foreach ($aList[$sAlias] as $sAttCodeEx => $oAttDef) {
if (is_null($oObj)) {
$aRow[$oAttDef->GetCode()] = '';
@@ -3071,7 +3072,7 @@ JS
$oPage->add($oAppContext->GetForForm());
// Hook the cancel button via jQuery so that it can be unhooked easily as well if needed
$sDefaultUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search_form&class='.$sClass.'&'.$oAppContext->GetForLink();
$sDefaultUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search_form&class='.$sClass.$oAppContext->GetForLink(true);
$sCancelButtonOnClickScript = "let fOnClick{$this->m_iFormId}CancelButton = ";
if(isset($aExtraParams['js_handlers']['cancel_button_on_click'])){
@@ -3079,7 +3080,7 @@ JS
} else {
$sCancelButtonOnClickScript .= "function() { BackToDetails('$sClass', $iKey, '$sDefaultUrl', $sJSToken)};";
}
$sCancelButtonOnClickScript .= "$('#form_{$this->m_iFormId} button.cancel').on('click', fOnClick{$this->m_iFormId}CancelButton);";
$sCancelButtonOnClickScript .= "$('#form_{$this->m_iFormId} button.cancel').on('click.navigation.itop', fOnClick{$this->m_iFormId}CancelButton);";
$oPage->add_ready_script($sCancelButtonOnClickScript);
$iFieldsCount = count($aFieldsMap);

View File

@@ -524,9 +524,7 @@ EOF
*/
public function Render($oPage, $bEditMode = false, $aExtraParams = array(), $bCanEdit = true)
{
if (!array_key_exists('dashboard_div_id', $aExtraParams)) {
$aExtraParams['dashboard_div_id'] = utils::Sanitize($this->GetId(), '', 'element_identifier');
}
$aExtraParams['dashboard_div_id'] = utils::Sanitize($aExtraParams['dashboard_div_id'] ?? null, $this->GetId(), utils::ENUM_SANITIZATION_FILTER_ELEMENT_IDENTIFIER);
/** @var \DashboardLayoutMultiCol $oLayout */
$oLayout = new $this->sLayoutClass();
@@ -1052,7 +1050,7 @@ EOF
$sSelectorHtml .= '</div>';
$sFile = addslashes($this->GetDefinitionFile());
$sReloadURL = $this->GetReloadURL();
$sReloadURL = json_encode($this->GetReloadURL());
$bFromDashboardPage = isset($aAjaxParams['from_dashboard_page']) ? isset($aAjaxParams['from_dashboard_page']) : false;
if ($bFromDashboardPage) {
@@ -1141,7 +1139,6 @@ JS
->AddCSSClass('ibo-action-button');
$oToolbar->AddSubBlock($oActionButton);
$aActions = array();
$sFile = addslashes(utils::LocalPath($this->sDefinitionFile));
$sJSExtraParams = json_encode($aExtraParams);
@@ -1166,7 +1163,7 @@ JS
$oToolbar->AddSubBlock($oActionButton)
->AddSubBlock($oActionsMenu);
$sReloadURL = $this->GetReloadURL();
$sReloadURL = json_encode($this->GetReloadURL());
$oPage->add_script(
<<<EOF
function EditDashboard(sId, sDashboardFile, aExtraParams)
@@ -1273,7 +1270,7 @@ EOF
$sTitle = json_encode($this->sTitle);
$sFile = json_encode($this->GetDefinitionFile());
$sUrl = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php';
$sReloadURL = $this->GetReloadURL();
$sReloadURL = json_encode($this->GetReloadURL());
$sExitConfirmationMessage = addslashes(Dict::S('UI:NavigateAwayConfirmationMessage'));
$sCancelConfirmationMessage = addslashes(Dict::S('UI:CancelConfirmationMessage'));

View File

@@ -2138,7 +2138,7 @@ class DashletHeaderDynamic extends Dashlet
$oSet = new DBObjectSet($oFilter);
$iCount = $oSet->Count();
$oAppContext = new ApplicationContext();
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.rawurlencode($oFilter->serialize());
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search'.$oAppContext->GetForLink(true).'&filter='.rawurlencode($oFilter->serialize());
$oSubTitle->AddHtml('<a class="summary" href="'.$sHyperlink.'">'.Dict::Format(str_replace('_', ':', $sSubtitle), $iCount).'</a>');
return $oPanel;

View File

@@ -1126,7 +1126,7 @@ JS
$oSingleGroupByValueFilter->SetShowObsoleteData($this->m_bShowObsoleteData);
}
$sHyperlink = utils::GetAbsoluteUrlAppRoot()
.'pages/UI.php?operation=search&'.$oAppContext->GetForLink()
.'pages/UI.php?operation=search'.$oAppContext->GetForLink(true)
.'&filter='.rawurlencode($oSingleGroupByValueFilter->serialize());
$aCounts[$sStateValue] = ['link' => $sHyperlink, 'label' => $aCounts[$sStateValue]];
}
@@ -1234,7 +1234,7 @@ JS
$iCount = $this->m_oSet->Count();
$sClassLabel = MetaModel::GetName($sClass);
$sClassIconUrl = MetaModel::GetClassIcon($sClass, false);
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.rawurlencode($this->m_oFilter->serialize());
$sHyperlink = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search'.$oAppContext->GetForLink(true).'&filter='.rawurlencode($this->m_oFilter->serialize());
$aExtraParams['query_params'] = $this->m_oFilter->GetInternalParams();
$aRefreshParams = [
@@ -1243,7 +1243,7 @@ JS
];
if (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY)) {
$sCreateActionUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=new&class='.$sClass.'&'.$oAppContext->GetForLink();
$sCreateActionUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=new&class='.$sClass.$oAppContext->GetForLink(true);
$sCreateActionLabel = Dict::Format('UI:Button:Create');
$oBlock = DashletFactory::MakeForDashletBadge($sClassIconUrl, $sHyperlink, $iCount, $sClassLabel, $sCreateActionUrl,
$sCreateActionLabel, $aRefreshParams);
@@ -1291,7 +1291,7 @@ JS
$aData = array();
$oAppContext = new ApplicationContext();
$sParams = $oAppContext->GetForLink();
$sParams = $oAppContext->GetForLink(true);
foreach ($aGroupBy as $iRow => $iCount) {
// Build the search for this subset
$oSubsetSearch = $this->m_oFilter->DeepClone();
@@ -1306,7 +1306,7 @@ JS
$aData[] = array(
'group' => $aLabels[$iRow],
'value' => "<a href=\"".utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&dosearch=1&$sParams&filter=$sFilter\">$iCount</a>"
'value' => "<a href=\"".utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&dosearch=1$sParams&filter=$sFilter\">$iCount</a>"
); // TO DO: add the context information
}
$aAttribs = array(
@@ -1638,7 +1638,7 @@ JS
$sGroupByExpr = isset($aExtraParams['group_by_expr']) ? '&params[group_by_expr]='.$aExtraParams['group_by_expr'] : '';
$sFilter = $this->m_oFilter->serialize(false, $aQueryParams);
$oContext = new ApplicationContext();
$sContextParam = $oContext->GetForLink();
$sContextParam = $oContext->GetForLink(true);
$sAggregationFunction = isset($aExtraParams['aggregation_function']) ? $aExtraParams['aggregation_function'] : '';
$sAggregationAttr = isset($aExtraParams['aggregation_attribute']) ? $aExtraParams['aggregation_attribute'] : '';
$sLimit = isset($aExtraParams['limit']) ? $aExtraParams['limit'] : '';
@@ -1646,7 +1646,7 @@ JS
$sOrderDirection = isset($aExtraParams['order_direction']) ? $aExtraParams['order_direction'] : '';
if (isset($aExtraParams['group_by_label'])) {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam;
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).$sContextParam;
} else {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[currentId]=$sChartId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sChartId{$iChartCounter}&filter=".rawurlencode($sFilter).'&'.$sContextParam;
}
@@ -1683,11 +1683,14 @@ JS
$oBlock = null;
$sJSURLs = '';
$oContext = new ApplicationContext();
$sContextParam = $oContext->GetForLink(true);
if (isset($aExtraParams['group_by'])) {
$this->MakeGroupByQuery($aExtraParams, $oGroupByExp, $sGroupByLabel, $aGroupBy, $sAggregationFunction, $sFctVar, $sAggregationAttr, $sSql);
$aRes = CMDBSource::QueryToArray($sSql);
$oContext = new ApplicationContext();
$sContextParam = $oContext->GetForLink();
$iTotalCount = 0;
$aURLs = array();
@@ -1707,14 +1710,14 @@ JS
$oSubsetSearch = $this->m_oFilter->DeepClone();
$oCondition = new BinaryExpression($oGroupByExp, '=', new ScalarExpression($sValue));
$oSubsetSearch->AddConditionExpression($oCondition);
$aURLs[] = utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&format=html&filter=".rawurlencode($oSubsetSearch->serialize()).'&'.$sContextParam;
$aURLs[] = utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&format=html&filter=".rawurlencode($oSubsetSearch->serialize()).$sContextParam;
}
$sJSURLs = json_encode($aURLs);
}
if (isset($aExtraParams['group_by_label'])) {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$aExtraParams[group_by]&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$aExtraParams[currentId]&params[order_direction]=$aExtraParams[order_direction]&params[order_by]=$aExtraParams[order_by]&params[limit]=$aExtraParams[limit]&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId&filter=".rawurlencode($this->m_oFilter->ToOQL()).'&'.$sContextParam;
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$aExtraParams[group_by]&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$aExtraParams[currentId]&params[order_direction]=$aExtraParams[order_direction]&params[order_by]=$aExtraParams[order_by]&params[limit]=$aExtraParams[limit]&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId&filter=".rawurlencode($this->m_oFilter->ToOQL()).$sContextParam;
} else {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$aExtraParams[group_by]&params[chart_type]=$sChartType&params[currentId]=$aExtraParams[currentId]&params[order_direction]=$aExtraParams[order_direction]&params[order_by]=$aExtraParams[order_by]&params[limit]=$aExtraParams[limit]&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId&filter=".rawurlencode($this->m_oFilter->ToOQL()).'&'.$sContextParam;
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$aExtraParams[group_by]&params[chart_type]=$sChartType&params[currentId]=$aExtraParams[currentId]&params[order_direction]=$aExtraParams[order_direction]&params[order_by]=$aExtraParams[order_by]&params[limit]=$aExtraParams[limit]&params[aggregation_function]=$sAggregationFunction&params[aggregation_attribute]=$sAggregationAttr&id=$sId&filter=".rawurlencode($this->m_oFilter->ToOQL()).$sContextParam;
}
switch ($sChartType) {
@@ -1787,7 +1790,7 @@ JS
$oBlock->sCsvFile = strtolower($this->m_oFilter->GetClass()).'.csv';
$oBlock->sDownloadLink = utils::GetAbsoluteUrlAppRoot().'webservices/export.php?expression='.urlencode($this->m_oFilter->ToOQL(true)).'&format=csv&filename='.urlencode($oBlock->sCsvFile);
$oBlock->sLinkToToggle = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search&'.$oAppContext->GetForLink().'&filter='.rawurlencode($this->m_oFilter->serialize()).'&format=csv';
$oBlock->sLinkToToggle = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=search'.$oAppContext->GetForLink(true).'&filter='.rawurlencode($this->m_oFilter->serialize()).'&format=csv';
// Pass the parameters via POST, since expression may be very long
$aParamsToPost = array(
'expression' => $this->m_oFilter->ToOQL(true),
@@ -1891,10 +1894,7 @@ class MenuBlock extends DisplayBlock
&& (!isset($aExtraParams['menu']) || $aExtraParams['menu'] === "1" || $aExtraParams['menu'] === true)
) {
$oAppContext = new ApplicationContext();
$sContext = $oAppContext->GetForLink();
if (utils::IsNotNullOrEmptyString($sContext)) {
$sContext = '&'.$sContext;
}
$sContext = $oAppContext->GetForLink(true);
$sFilter = $this->GetFilter()->serialize();
@@ -2584,11 +2584,8 @@ class MenuBlock extends DisplayBlock
$sUrl = "{$sRootUrl}pages/{$sUIPage}?{$sUrlParams}";
$oAppContext = new ApplicationContext();
$sContext = $oAppContext->GetForLink();
if (utils::IsNotNullOrEmptyString($sContext)) {
$sUrl .= '&'.$sContext;
}
$sContext = $oAppContext->GetForLink(true);
return $sUrl;
return $sUrl . $sContext;
}
}

View File

@@ -67,7 +67,7 @@ class CoreException extends Exception
public function getHtmlDesc($sHighlightHtmlBegin = '<b>', $sHighlightHtmlEnd = '</b>')
{
return $this->getMessage();
return utils::EscapeHtml($this->getMessage());
}
/**

View File

@@ -250,7 +250,7 @@ class UIExtKeyWidget
foreach ($aAdditionalField as $sAdditionalField) {
array_push($aArguments, $oObj->Get($sAdditionalField));
}
$aOption['additional_field'] = utils::HtmlEntities(vsprintf($sFormatAdditionalField, $aArguments));
$aOption['additional_field'] = utils::HtmlEntities(utils::VSprintf($sFormatAdditionalField, $aArguments));
}
if (!empty($sObjectImageAttCode)) {
// Try to retrieve image for contact

View File

@@ -521,8 +521,8 @@ class utils
// For URL
case static::ENUM_SANITIZATION_FILTER_URL:
// N°6350 - returns only valid URLs
$retValue = filter_var($value, FILTER_VALIDATE_URL);
$retValue = filter_var($value, FILTER_SANITIZE_URL);
$retValue = filter_var($retValue, FILTER_VALIDATE_URL);
break;
default:
@@ -1516,12 +1516,12 @@ class utils
case iPopupMenuExtension::MENU_OBJLIST_TOOLKIT:
/** @var \DBObjectSet $param */
$oAppContext = new ApplicationContext();
$sContext = $oAppContext->GetForLink();
$sContext = $oAppContext->GetForLink(true);
$sDataTableId = is_null($sDataTableId) ? '' : $sDataTableId;
$sUIPage = cmdbAbstractObject::ComputeStandardUIPage($param->GetFilter()->GetClass());
$sOQL = addslashes($param->GetFilter()->ToOQL(true));
$sFilter = urlencode($param->GetFilter()->serialize());
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/$sUIPage?operation=search&filter=".$sFilter."&{$sContext}";
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/$sUIPage?operation=search&filter=".$sFilter.$sContext;
$oContainerBlock->AddJsFileRelPath('js/tabularfieldsselector.js');
$oContainerBlock->AddJsFileRelPath('js/jquery.dragtable.js');
$oContainerBlock->AddCssFileRelPath('css/dragtable.css');
@@ -1555,6 +1555,11 @@ class utils
}
$aResult[] = new JSPopupMenuItem('UI:Menu:AddToDashboard', Dict::S('UI:Menu:AddToDashboard'), "DashletCreationDlg('$sOQL', '$sContext')");
$aResult[] = new JSPopupMenuItem('UI:Menu:ShortcutList', Dict::S('UI:Menu:ShortcutList'), "ShortcutListDlg('$sOQL', '$sDataTableId', '$sContext')");
if (ApplicationMenu::IsMenuIdEnabled('RunQueriesMenu')) {
$oMenuItemPlay = new JSPopupMenuItem('UI:Menu:OpenOQL', Dict::S('UI:Edit:TestQuery'), "OpenOql('$sOQL')");
$oMenuItemPlay->SetIconClass('fas fa-play');
$aResult[] = $oMenuItemPlay;
}
break;
@@ -1691,8 +1696,8 @@ class utils
$oAppContext = new ApplicationContext();
$sUrl = $sAppRootUrl
.'pages/UI.php?operation=search&'
.$oAppContext->GetForLink()
.'pages/UI.php?operation=search'
.$oAppContext->GetForLink(true)
.'&filter='.rawurlencode($oDataTableSearchFilter->serialize());
$sUrl .= '&aParams='.rawurlencode($sParams); // Not working... yet, cause not handled by UI.php
@@ -1947,7 +1952,7 @@ SQL;
CURLOPT_HEADER => false, // don't return the headers in the output
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => static::GetConfig()->Get('http.request.user_agent'), // who am i
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
@@ -2075,6 +2080,127 @@ SQL;
);
}
/**
* Format a string using vsprintf with safety checks to avoid ValueError
*
* This method fills missing arguments with their original format specifiers,
* then calls vsprintf with the complete array.
*
* @param string $sFormat The format string
* @param array $aArgs The arguments to format
* @param bool $bLogErrors Whether to log errors (defaults to true)
*
* @return string The formatted string
* @since 3.2.2
*/
public static function VSprintf(string $sFormat, array $aArgs, bool $bLogErrors = true): string
{
// Extract all format specifiers
$sPattern = '/%(?:(?:[1-9][0-9]*)\$)?[-+\'0# ]*(?:[0-9]*|\*)?(?:\.(?:[0-9]*|\*))?(?:[hlL])?[diouxXeEfFgGcrs%]/';
preg_match_all($sPattern, $sFormat, $aMatches, PREG_OFFSET_CAPTURE);
// Process matches, keeping track of their positions and excluding escaped percent signs (%%)
$aSpecifierMatches = [];
foreach ($aMatches[0] as $sMatch) {
if ($sMatch[0] !== '%%') {
$aSpecifierMatches[] = $sMatch;
}
}
// Check for positional specifiers and build position map
$bHasPositional = false;
$iMaxPosition = 0;
$aPositions = [];
$aUniquePositions = [];
foreach ($aSpecifierMatches as $index => $match) {
$sSpec = $match[0];
if (preg_match('/^%([1-9][0-9]*)\$/', $sSpec, $posMatch)) {
$bHasPositional = true;
$iPosition = (int)$posMatch[1] - 1; // Convert to 0-based
$aPositions[$index] = $iPosition;
$aUniquePositions[$iPosition] = true;
$iMaxPosition = max($iMaxPosition, $iPosition + 1);
} else {
$aPositions[$index] = $index;
$aUniquePositions[$index] = true;
$iMaxPosition = max($iMaxPosition, $index + 1);
}
}
// Count unique positions, this tells us how many arguments we actually need
$iExpectedCount = count($aUniquePositions);
$iActualCount = count($aArgs);
// If we have enough arguments, just use vsprintf
if ($iActualCount >= $iExpectedCount) {
return vsprintf($sFormat, $aArgs);
}
// else log the error if needed
if ($bLogErrors) {
IssueLog::Warning("Format string requires $iExpectedCount arguments, but only $iActualCount provided. Format: '$sFormat'" );
}
// Create a replacement map
if ($bHasPositional) {
// For positional, we need to handle the exact positions
$aReplacements = array_fill(0, $iMaxPosition, null);
// Fill in the real arguments first
foreach ($aArgs as $index => $sValue) {
if ($index < $iMaxPosition) {
$aReplacements[$index] = $sValue;
}
}
// For null values in the replacement map, use the original specifier
foreach ($aSpecifierMatches as $index => $sMatch) {
$iPosition = $aPositions[$index];
if ($aReplacements[$iPosition] === null) {
// Use the original format specifier when we don't have an argument
$aReplacements[$iPosition] = $sMatch[0];
}
}
// Remove any remaining nulls (for positions that weren't referenced)
$aReplacements = array_filter($aReplacements, static function($val) { return $val !== null; });
} else {
// For non-positional, we need to map each position
$aReplacements = [];
$iUsed = 0;
// Create a map of what values to use for each position
$aPositionValues = [];
for ($i = 0; $i < $iMaxPosition; $i++) {
if (isset($aUniquePositions[$i])) {
if ($iUsed < $iActualCount) {
// We have an actual argument for this position
$aPositionValues[$i] = $aArgs[$iUsed++];
} else {
// Mark this position to use the original specifier
$aPositionValues[$i] = null;
}
}
}
// Build the replacements array preserving the original order
foreach ($aSpecifierMatches as $index => $sMatch) {
$iPosition = $aPositions[$index];
if (isset($aPositionValues[$iPosition])) {
$aReplacements[] = $aPositionValues[$iPosition];
} else {
// Use the original format specifier when we don't have an argument
$aReplacements[] = $sMatch[0];
// Mark this position as used, so if it appears again, it gets the same replacement
$aPositionValues[$iPosition] = $sMatch[0];
}
}
}
// Process the format string with our filled-in arguments
return vsprintf($sFormat, $aReplacements);
}
/**
* Convert a string containing some (valid) HTML markup to plain text
*

View File

@@ -4465,7 +4465,7 @@ class AttributeText extends AttributeString
{
// Is there a way to know the current limitation for mysql?
// See mysql_field_len()
return 16383; // number of characters (that can be 1-4 bytes long), not of bytes
return 65535;
}
public static function RenderWikiHtml($sText, $bWikiOnly = false)
@@ -5020,7 +5020,7 @@ class AttributeCaseLog extends AttributeLongText
}
else
{
if (strlen($proposedValue) > 0)
if (utils::StrLen($proposedValue) > 0)
{
//N°5135 - add impersonation information in caselog
if (UserRights::IsImpersonated()){
@@ -10979,12 +10979,12 @@ abstract class AttributeSet extends AttributeDBFieldVoid
$sDescription = utils::EscapeHtml($this->GetValueDescription($sValue));
$oFilter = DBSearch::FromOQL("SELECT $sClass WHERE $sAttCode MATCHES '$sValue'");
$oAppContext = new ApplicationContext();
$sContext = $oAppContext->GetForLink();
$sContext = $oAppContext->GetForLink(true);
$sUIPage = cmdbAbstractObject::ComputeStandardUIPage($oFilter->GetClass());
$sFilter = rawurlencode($oFilter->serialize());
$sLink = '';
if ($bWithLink && $this->bDisplayLink) {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/$sUIPage?operation=search&filter=".$sFilter."&{$sContext}";
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/$sUIPage?operation=search&filter=".$sFilter.$sContext;
$sLink = ' href="'.$sUrl.'"';
}
@@ -12301,13 +12301,13 @@ class AttributeTagSet extends AttributeSet
$sTagDescription = $oTag->Get('description');
$oFilter = DBSearch::FromOQL("SELECT $sClass WHERE $sAttCode MATCHES '$sTagCode'");
$oAppContext = new ApplicationContext();
$sContext = $oAppContext->GetForLink();
$sContext = $oAppContext->GetForLink(true);
$sUIPage = cmdbAbstractObject::ComputeStandardUIPage($oFilter->GetClass());
$sFilter = rawurlencode($oFilter->serialize());
$sLink = '';
if ($bWithLink && $this->bDisplayLink) {
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/$sUIPage?operation=search&filter=".$sFilter."&{$sContext}";
$sUrl = utils::GetAbsoluteUrlAppRoot()."pages/$sUIPage?operation=search&filter=".$sFilter.$sContext;
$sLink = ' href="'.$sUrl.'"';
}

View File

@@ -472,8 +472,10 @@ class BulkChange
protected $m_bLocalizedValues;
/** @var array Cache for resolving external keys based on the given search criterias */
protected $m_aExtKeysMappingCache;
/** @var int number of columns */
protected $m_iNbCol;
public function __construct($sClass, $aData, $aAttList, $aExtKeys, $aReconcilKeys, $sSynchroScope = null, $aOnDisappear = null, $sDateFormat = null, $bLocalize = false)
public function __construct($sClass, $aData, $aAttList, $aExtKeys, $aReconcilKeys, $sSynchroScope = null, $aOnDisappear = null, $sDateFormat = null, $bLocalize = false, $iNbCol = 0)
{
$this->m_sClass = $sClass;
$this->m_aData = $aData;
@@ -485,6 +487,7 @@ class BulkChange
$this->m_sDateFormat = $sDateFormat;
$this->m_bLocalizedValues = $bLocalize;
$this->m_aExtKeysMappingCache = array();
$this->m_iNbCol =$iNbCol;
}
protected function ResolveExternalKey($aRowData, $sAttCode, &$aResults)
@@ -1236,19 +1239,14 @@ class BulkChange
$iPreviousTimeLimit = ini_get('max_execution_time');
$iLoopTimeLimit = MetaModel::GetConfig()->Get('max_execution_time_per_loop');
$iNBFields = count($this->m_aAttList);
foreach ($this->m_aExtKeys as $aReconcilKeys) {
$iNBFields += count($aReconcilKeys);
}
// Avoid too many events
cmdbAbstractObject::SetEventDBLinksChangedBlocked(true);
try {
foreach ($this->m_aData as $iRow => $aRowData) {
set_time_limit(intval($iLoopTimeLimit));
// Stop if not the good number of cols in $aRowData
if(count($aRowData) != $iNBFields){
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue(Dict::Format('UI:CSVReport-Row-Issue-NbField',count($aRowData),$iNBFields) );
if($this->m_iNbCol>0 && count($aRowData) != $this->m_iNbCol){
$aResult[$iRow]["__STATUS__"] = new RowStatus_Issue(Dict::Format('UI:CSVReport-Row-Issue-NbField',count($aRowData),$this->m_iNbCol) );
continue;
}
@@ -1428,7 +1426,7 @@ class BulkChange
$aDetails = array();
while ($oChange = $oBulkChanges->Fetch())
{
$sDate = '<a href="csvimport.php?step=10&changeid='.$oChange->GetKey().'&'.$oAppContext->GetForLink().'">'.$oChange->Get('date').'</a>';
$sDate = '<a href="csvimport.php?step=10&changeid='.$oChange->GetKey().$oAppContext->GetForLink(true).'">'.$oChange->Get('date').'</a>';
$sUser = $oChange->GetUserName();
if (preg_match('/^(.*)\\(CSV\\)$/i', $oChange->Get('userinfo'), $aMatches))
{
@@ -1510,7 +1508,7 @@ EOF
function OnTruncatedHistoryToggle(bShowAll)
{
$('#csv_history_reload').html('<img src="' + GetAbsoluteUrlAppRoot() + 'images/indicator.gif"/>');
$.get(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php?{$sAppContext}', {operation: 'displayCSVHistory', showall: bShowAll}, function(data)
$.get(GetAbsoluteUrlAppRoot()+'pages/ajax.render.php?$sAppContext', {operation: 'displayCSVHistory', showall: bShowAll}, function(data)
{
$('#$sAjaxDivId').html(data);
}

View File

@@ -25,7 +25,7 @@ define('EXPORTER_DEFAULT_CHUNK_SIZE', 1000);
class BulkExportException extends Exception
{
protected $sLocalizedMessage;
public function __construct($message, $sLocalizedMessage, $code = null, $previous = null)
public function __construct($message, $sLocalizedMessage, $code = 0, $previous = null)
{
parent::__construct($message, $code, $previous);
$this->sLocalizedMessage = $sLocalizedMessage;

View File

@@ -1233,6 +1233,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'sessions_tracking.session_handler_extension' => [
'type' => 'string',
'description' => 'to store more data in itop session files, set your own iSessionHandlerExtension implementation class in this variable',
'default' => '',
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'sessions_tracking.gc_threshold' => [
'type' => 'integer',
'description' => 'fallback in case cron is not active: probability in percent that session files are cleanup during any itop request (100 means always)',

View File

@@ -760,10 +760,10 @@ abstract class DBObject implements iDisplay
*/
public function SetTrim($sAttCode, $sValue)
{
if (!$this->StringFitsInField($sAttCode, $sValue)) {
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
$iMaxSize = $oAttDef->GetMaxSize();
$sLength = mb_strlen($sValue);
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
$iMaxSize = $oAttDef->GetMaxSize();
$sLength = mb_strlen($sValue);
if ($iMaxSize && ($sLength > $iMaxSize)) {
$sMessage = " -truncated ($sLength chars)";
$sValue = mb_substr($sValue, 0, $iMaxSize - mb_strlen($sMessage)).$sMessage;
}
@@ -818,24 +818,6 @@ abstract class DBObject implements iDisplay
$oKPI->ComputeStatsForExtension($this, 'AfterDelete');
}
/**
* @param string $sAttCode
* @param string $sValue
*
* @return bool
* @throws \Exception
*
* @Since 3.2.2
*/
public function StringFitsInField(string $sAttCode, string $sValue): bool
{
$oAttDef = MetaModel::GetAttributeDef(get_class($this), $sAttCode);
$iMaxSize = $oAttDef->GetMaxSize();
$sLength = mb_strlen($sValue);
return !($iMaxSize && ($sLength > $iMaxSize));
}
/**
* Compute (and optionally start) the StopWatches deadlines
*

View File

@@ -501,7 +501,8 @@ class DesignElement extends \DOMElement
{
$sSearchId = $oRefNode->getAttribute('id');
}
$sXPath = './'.$oRefNode->tagName."[@id='$sSearchId']";
$sQuotedId = DesignDocument::XPathQuote($sSearchId);
$sXPath = './'.$oRefNode->tagName."[@id=$sQuotedId]";
$oRes = $oXPath->query($sXPath, $oRoot);
}

View File

@@ -206,7 +206,7 @@ class Dict
}
try{
return vsprintf($sLocalizedFormat, $aArguments);
return utils::VSprintf($sLocalizedFormat, $aArguments);
} catch(\Throwable $e){
\IssueLog::Error("Cannot format dict key", null, ["sFormatCode" => $sFormatCode, "sLangCode" => $sLangCode, 'exception_msg' => $e->getMessage() ]);
return $sFormatCode.' - '.implode(', ', $aArguments);

View File

@@ -453,6 +453,11 @@ class DisplayableNode extends GraphNode
}
}
public static function GetTooltipAttributes($sClass)
{
return MetaModel::GetZListItems($sClass, 'list');
}
public function GetTooltip($aContextDefs)
{
$sHtml = '';
@@ -474,7 +479,7 @@ class DisplayableNode extends GraphNode
$sHtml .= '<hr/>';
}
$sHtml .= '<table><tbody>';
foreach(MetaModel::GetZListItems($sSubClass, 'list') as $sAttCode)
foreach(static::GetTooltipAttributes($sSubClass) as $sAttCode)
{
$oAttDef = MetaModel::GetAttributeDef($sSubClass, $sAttCode);
$sHtml .= '<tr><td>'.$oAttDef->GetLabel().':&nbsp;</td><td>'.$oCurrObj->GetAsHtml($sAttCode).'</td></tr>';
@@ -864,6 +869,7 @@ class DisplayableGraph extends SimpleGraph
*/
public static function FromRelationGraph(RelationGraph $oGraph, $iGroupingThreshold = 20, $bDirectionDown = true, $bForPdf = false)
{
$oKPI = new ExecutionKPI();
$oNewGraph = new DisplayableGraph();
$oNewGraph->bDirectionDown = $bDirectionDown;
$iPreviousTimeLimit = ini_get('max_execution_time');
@@ -1017,6 +1023,7 @@ class DisplayableGraph extends SimpleGraph
}
set_time_limit(intval($iPreviousTimeLimit));
$oKPI->ComputeStats('FromRelationGraph', '');
return $oNewGraph;
}
@@ -1027,6 +1034,7 @@ class DisplayableGraph extends SimpleGraph
*/
public function InitFromGraphviz()
{
$oKPI = new ExecutionKPI();
$sDot = $this->DumpAsXDot();
if (strpos($sDot, 'digraph') === false)
{
@@ -1054,6 +1062,7 @@ class DisplayableGraph extends SimpleGraph
}
}
}
$oKPI->ComputeStats('InitFromGraphviz', '');
}
public function GetBoundingBox()
@@ -1470,8 +1479,8 @@ class DisplayableGraph extends SimpleGraph
try {
$this->InitFromGraphviz();
$sExportAsPdfURL = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php?operation=relation_pdf&relation='.$sRelation.'&direction='.($this->bDirectionDown ? 'down' : 'up');
$sContext = $oAppContext->GetForLink();
$sDrillDownURL = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=details&class=%1$s&id=%2$s&'.$sContext;
$sContext = $oAppContext->GetForLink(true);
$sDrillDownURL = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=details&class=%1$s&id=%2$s'.$sContext;
$sExportAsDocumentURL = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php?operation=relation_attachment&relation='.$sRelation.'&direction='.($this->bDirectionDown ? 'down' : 'up');
$sLoadFromURL = utils::GetAbsoluteUrlAppRoot().'pages/ajax.render.php?operation=relation_json&relation='.$sRelation.'&direction='.($this->bDirectionDown ? 'down' : 'up');
$sAttachmentExportTitle = '';

View File

@@ -469,7 +469,8 @@ class ExecutionKPI
// Invoke extensions to log the KPI operation
/** @var \iKPILoggerExtension $oExtensionInstance */
foreach (MetaModel::EnumPlugins('iKPILoggerExtension') as $oExtensionInstance) {
$sExtension = ModuleService::GetInstance()->GetModuleNameFromCallStack(1);
//$sExtension = ModuleService::GetInstance()->GetModuleNameFromCallStack(1);
$sExtension = '';
$oKPILogData = new KpiLogData(
KpiLogData::TYPE_STATS,
$sOperation,

View File

@@ -77,7 +77,7 @@ abstract class ModelReflection
return $sFormatCode.' - '.implode(', ', $aArguments);
}
return vsprintf($sLocalizedFormat, $aArguments);
return utils::VSprintf($sLocalizedFormat, $aArguments);
}
/**

View File

@@ -203,6 +203,7 @@ class RelationEdge extends GraphEdge
*/
class RelationGraph extends SimpleGraph
{
private static bool $bOptimizationEnabled = true;
protected $aSourceNodes; // Index of source nodes (for a quicker access)
protected $aSinkNodes; // Index of sink nodes (for a quicker access)
protected $aRedundancySettings; // Cache of user settings
@@ -217,6 +218,16 @@ class RelationGraph extends SimpleGraph
$this->aContextSearches = array();
}
static public function GetOptimizationEnabled(): bool
{
return static::$bOptimizationEnabled;
}
static public function SetOptimizationEnabled(bool $bEnabled)
{
static::$bOptimizationEnabled = $bEnabled;
}
/**
* Add an object that will be the starting point for building the relations downstream
*
@@ -261,16 +272,23 @@ class RelationGraph extends SimpleGraph
IssueLog::Error("Invalid context query '$sOQL'. A context query must contain at least two columns.");
throw new Exception("Invalid context query '$sOQL'. A context query must contain at least two columns. Columns: ".implode(', ', $aAliases).'. ');
}
$aAliasNames = array_keys($aAliases);
$oCondition = new BinaryExpression(new FieldExpression('id', $aAliasNames[0]), '=', new VariableExpression('id'));
$oSearch->AddConditionExpression($oCondition);
$sClass = $oSearch->GetClass();
if (!array_key_exists($sClass, $this->aContextSearches))
{
$this->aContextSearches[$sClass] = array();
if (static::GetOptimizationEnabled()) {
$sClass = $oSearch->GetClass();
$this->aContextSearches[$sClass][] = array('key' => $key, 'search' => $oSearch);
}
else {
$aAliasNames = array_keys($aAliases);
$oCondition = new BinaryExpression(new FieldExpression('id', $aAliasNames[0]), '=', new VariableExpression('id'));
$oSearch->AddConditionExpression($oCondition);
$sClass = $oSearch->GetClass();
if (!array_key_exists($sClass, $this->aContextSearches))
{
$this->aContextSearches[$sClass] = array();
}
$this->aContextSearches[$sClass][] = array('key' => $key, 'search' => $oSearch);
}
$this->aContextSearches[$sClass][] = array('key' => $key, 'search' => $oSearch);
}
/**
@@ -283,6 +301,8 @@ class RelationGraph extends SimpleGraph
*/
public function IsPartOfContext(DBObject $oObj, &$aRootCauses)
{
$oKPI = new ExecutionKPI();
$bRet = false;
$sFinalClass = get_class($oObj);
$aParentClasses = MetaModel::EnumParentClasses($sFinalClass, ENUM_PARENT_CLASSES_ALL);
@@ -313,6 +333,7 @@ class RelationGraph extends SimpleGraph
}
}
}
$oKPI->ComputeStats(__METHOD__, get_class($oObj));
return $bRet;
}
@@ -329,6 +350,7 @@ class RelationGraph extends SimpleGraph
*/
public function ComputeRelatedObjectsDown($sRelCode, $iMaxDepth, $bEnableRedundancy, $aUnreachableObjects = array())
{
$oKPI = new ExecutionKPI();
//echo "<h5>Sources only...</h5>\n".$this->DumpAsHtmlImage()."<br/>\n";
// Build the graph out of the sources
foreach ($this->aSourceNodes as $oSourceNode)
@@ -336,8 +358,10 @@ class RelationGraph extends SimpleGraph
$this->AddRelatedObjects($sRelCode, true, $oSourceNode, $iMaxDepth, $bEnableRedundancy);
//echo "<h5>After processing of {$oSourceNode->GetId()}</h5>\n".$this->DumpAsHtmlImage()."<br/>\n";
}
$oKPI->ComputeAndReport(__FUNCTION__.' - AddRelatedObjects');
// Mark the unreachable nodes
$oKPI = new ExecutionKPI();
foreach ($aUnreachableObjects as $oObj)
{
$sNodeId = RelationObjectNode::MakeId($oObj);
@@ -347,29 +371,26 @@ class RelationGraph extends SimpleGraph
$oNode->SetProperty('is_reached_allowed', false);
}
}
$oKPI->ComputeAndReport(__FUNCTION__.' - Mark unreachable nodes');
// Determine the reached nodes
$oKPI = new ExecutionKPI();
foreach ($this->aSourceNodes as $oSourceNode)
{
$oSourceNode->ReachDown('is_reached', true);
//echo "<h5>After reaching from {$oSourceNode->GetId()}</h5>\n".$this->DumpAsHtmlImage()."<br/>\n";
}
$oKPI->ComputeAndReport(__FUNCTION__.' - Determine reached nodes');
// Mark also the "context" nodes as reached and record the "root causes" for each node
$oIterator = new RelationTypeIterator($this, 'Node');
foreach($oIterator as $oNode)
{
$oObj = $oNode->GetProperty('object');
$aRootCauses = array();
if (!is_null($oObj) && $this->IsPartOfContext($oObj, $aRootCauses))
{
$oNode->SetProperty('context_root_causes', $aRootCauses);
$oNode->ReachDown('is_reached', true);
}
}
$oKPI = new ExecutionKPI();
$this->MarkContextNodesAsReached();
$oKPI->ComputeAndReport(__FUNCTION__.' - Mark context nodes as reached');
$oKPI = new ExecutionKPI();
if ( MetaModel::GetConfig()->Get('relations.complete_analysis')) {
$this->ApplyUserRightsOnGraph();
}
$oKPI->ComputeAndReport(__FUNCTION__.' - Apply user rights on graph');
}
/**
@@ -384,6 +405,7 @@ class RelationGraph extends SimpleGraph
*/
public function ComputeRelatedObjectsUp($sRelCode, $iMaxDepth, $bEnableRedundancy)
{
$oKPI = new ExecutionKPI();
//echo "<h5>Sinks only...</h5>\n".$this->DumpAsHtmlImage()."<br/>\n";
// Build the graph out of the sinks
foreach ($this->aSinkNodes as $oSinkNode)
@@ -407,6 +429,7 @@ class RelationGraph extends SimpleGraph
if ( MetaModel::GetConfig()->Get('relations.complete_analysis')) {
$this->ApplyUserRightsOnGraph();
}
$oKPI->ComputeStats('GetRelatedObjects-Up', '');
}
@@ -423,6 +446,11 @@ class RelationGraph extends SimpleGraph
*/
protected function AddRelatedObjects($sRelCode, $bDown, $oObjectNode, $iMaxDepth, $bEnableRedundancy)
{
if (static::GetOptimizationEnabled()) {
$this->AddRelatedObjects_Optimized();
return;
}
if ($iMaxDepth > 0)
{
if ($oObjectNode instanceof RelationRedundancyNode)
@@ -513,6 +541,64 @@ class RelationGraph extends SimpleGraph
}
}
public function AddRelatedObjects_Optimized()
{
$sRelCode = 'impact';
// TODO : dehardcode against the source nodes
$sSQLQuery = file_get_contents(APPROOT.'/impact_server1.sql');
$aRes = CMDBSource::QueryToArray($sSQLQuery, MYSQLI_ASSOC);
$oKPI = new ExecutionKPI();
$aClassToId = [];
foreach ($aRes as $aRow) {
if (is_null($aRow['parent_class']) || is_null($aRow['parent_id'])) {
// No parent => source node already present in the graph
continue;
}
$aClassToId[$aRow['class']][$aRow['id']] = $aRow['name'];
}
$oKPI->ComputeAndReport('AddRelatedObjectsDown - Create aClassToId');
$oKPI = new ExecutionKPI();
// One query per class => not too bad
// Note: it is not possible to use the root class as we need to load the tooltip attributes
foreach ($aClassToId as $sClass => $aIds) {
$oSearch = new DBObjectSearch($sClass);
$oSearch->AllowAllData();
$oSearch->AddCondition('id', array_keys($aIds), 'IN');
$oSet = new DBObjectSet($oSearch);
$oSet->OptimizeColumnLoad([$oSearch->GetClassAlias() => DisplayableNode::GetTooltipAttributes($sClass)]);
while ($oObj = $oSet->Fetch()) {
$sNodeId = RelationObjectNode::MakeId($oObj);
if (!isset($this->aNodes[$sNodeId])) {
$this->aNodes[$sNodeId] = new RelationObjectNode($this, $oObj);
}
}
}
$oKPI->ComputeAndReport('AddRelatedObjectsDown - Query each class and create nodes: '.count($aClassToId));
$oKPI = new ExecutionKPI();
foreach ($aRes as $aRow) {
if (is_null($aRow['parent_class']) || is_null($aRow['parent_id'])) {
// No parent, so no edge
continue;
}
if ($aRow['backtracking'] == 0) {
$oSourceNode = $this->GetNode("{$aRow['parent_class']}::{$aRow['parent_id']}");
$oSinkNode = $this->GetNode("{$aRow['class']}::{$aRow['id']}");
}
else {
$oSourceNode = $this->GetNode("{$aRow['class']}::{$aRow['id']}");
$oSinkNode = $this->GetNode("{$aRow['parent_class']}::{$aRow['parent_id']}");
}
new RelationEdge($this, $oSourceNode, $oSinkNode);
}
$oKPI->ComputeAndReport('AddRelatedObjectsDown - Create edges : '.count($aRes));
}
/**
* Determine if there is a redundancy (or use the existing one) and add the corresponding nodes/edges
*
@@ -747,4 +833,71 @@ class RelationGraph extends SimpleGraph
}
}
/**
* Mark "context" nodes as reached and record the "root causes" for each node
*/
private function MarkContextNodesAsReached()
{
if (static::GetOptimizationEnabled()) {
$this->MarkContextNodesAsReached_Optimized();
return;
}
$oIterator = new RelationTypeIterator($this, 'Node');
foreach($oIterator as $oNode)
{
$oObj = $oNode->GetProperty('object');
$aRootCauses = array();
if (!is_null($oObj) && $this->IsPartOfContext($oObj, $aRootCauses))
{
$oNode->SetProperty('context_root_causes', $aRootCauses);
$oNode->ReachDown('is_reached', true);
}
}
}
private function MarkContextNodesAsReached_Optimized()
{
$oIterator = new RelationTypeIterator($this, 'Node');
// 1. Group all nodes by class
$aClassToId = [];
foreach ($oIterator as $oNode) {
$oObj = $oNode->GetProperty('object');
if ($oObj) {
$aClassToId[get_class($oObj)][$oObj->GetKey()] = $oNode;
}
}
// 2. For each class, perform a search to find the context objects
$aContextNodes = [];
foreach ($aClassToId as $sClass => $aIdToNodes) {
foreach (MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL) as $sParentClass)
{
if (!array_key_exists($sParentClass, $this->aContextSearches)) {
continue; // No context search for this class
}
foreach ($this->aContextSearches[$sParentClass] as $aContextQuery)
{
$oKPI = new ExecutionKPI();
/** @var \DBSearch $oSearch */
$oSearch = $aContextQuery['search']->DeepClone();
$oSearch->AddCondition('id', array_keys($aIdToNodes), 'IN');
$aAliasNames = array_keys($oSearch->GetSelectedClasses());
$sObjectAlias = $aAliasNames[0];
$sRootCauseAlias = $aAliasNames[1];
$oSet = new DBObjectSet($oSearch);
$oSet->OptimizeColumnLoad([$sObjectAlias => [], $sRootCauseAlias => []]);
while($aRow = $oSet->FetchAssoc()) {
$oRootCauseObject = $aRow[$sRootCauseAlias];
if (is_null($oRootCauseObject)) continue;
$oNode = $aIdToNodes[$aRow[$sObjectAlias]->GetKey()];
$aRootCauses = $oNode->GetProperty('context_root_causes', []);
$aRootCauses[$aContextQuery['key']][$oRootCauseObject->GetKey()] = $oRootCauseObject;
$oNode->SetProperty('context_root_causes', $aRootCauses);
}
$oKPI->ComputeStats('Query to find context objects', $sClass.' - '.$aContextQuery['key']);
}
}
}
}
}

View File

@@ -76,6 +76,52 @@ class ObjectResult
$this->fields = array();
}
/**
* Creates an ObjectResult from a DBObject.
*
* @param DBObject $oObj The object.
* @param array|null $aFieldSpec An array of class => attribute codes (Cf. RestUtils::GetFieldList). List of the attributes to be reported.
* @param boolean $bExtendedOutput Output all of the link set attributes ?
* @param integer $iCode An error code (RestResult::OK is no issue has been found)
* @param string $sMessage Description of the error if any, an empty string otherwise
*
* @return ObjectResult
*/
public static function FromDBObject(DBObject $oObj, ?array $aFieldSpec = null, $bExtendedOutput = false, $iCode = 0, $sMessage = '') : ObjectResult {
$oObjRes = new ObjectResult($oObj::class, $oObj->GetKey());
$oObjRes->code = $iCode;
$oObjRes->message = $sMessage;
$aFields = null;
if (!is_null($aFieldSpec))
{
// Enum all classes in the hierarchy, starting with the current one
foreach (MetaModel::EnumParentClasses($oObj::class, ENUM_PARENT_CLASSES_ALL, false) as $sRefClass)
{
if (array_key_exists($sRefClass, $aFieldSpec))
{
$aFields = $aFieldSpec[$sRefClass];
break;
}
}
}
if (is_null($aFields))
{
// No fieldspec given, or not found...
$aFields = array('id', 'friendlyname');
}
foreach ($aFields as $sAttCode)
{
$oObjRes->AddField($oObj, $sAttCode, $bExtendedOutput);
}
return $oObjRes;
}
/**
* Helper to make an output value for a given attribute
*
@@ -185,40 +231,6 @@ class RestResultWithObjects extends RestResult
/** @var array "DBObject_class:DBObject_key" as key, {@see \ObjectResult} as value */
public $objects;
public function PrepareObject($iCode, $sMessage, $oObject, $aFieldSpec = null, $bExtendedOutput = false)
{
$sClass = get_class($oObject);
$oObjRes = new ObjectResult($sClass, $oObject->GetKey());
$oObjRes->code = $iCode;
$oObjRes->message = $sMessage;
$aFields = null;
if (!is_null($aFieldSpec))
{
// Enum all classes in the hierarchy, starting with the current one
foreach (MetaModel::EnumParentClasses($sClass, ENUM_PARENT_CLASSES_ALL, false) as $sRefClass)
{
if (array_key_exists($sRefClass, $aFieldSpec))
{
$aFields = $aFieldSpec[$sRefClass];
break;
}
}
}
if (is_null($aFields))
{
// No fieldspec given, or not found...
$aFields = array('id', 'friendlyname');
}
foreach ($aFields as $sAttCode)
{
$oObjRes->AddField($oObject, $sAttCode, $bExtendedOutput);
}
return $oObjRes;
}
/**
* Report the given object
*
@@ -237,7 +249,8 @@ class RestResultWithObjects extends RestResult
*/
public function AddObject($iCode, $sMessage, $oObject, $aFieldSpec = null, $bExtendedOutput = false)
{
$oObjRes = $this->PrepareObject($iCode, $sMessage, $oObject, $aFieldSpec, $bExtendedOutput);
$oObjRes = ObjectResult::FromDBObject($oObject, $aFieldSpec, $bExtendedOutput, $iCode, $sMessage);
$sObjKey = get_class($oObject).'::'.$oObject->GetKey();
$this->objects[$sObjKey] = $oObjRes;
}
@@ -253,45 +266,6 @@ public function SanitizeContent()
}
}
/**
* @package RESTAPI
* @api
*/
class RestResultWithObjectSets extends RestResultWithObjects
{
private $current_object = null;
public function MakeNewObjectSet()
{
$arr = array();
$this->current_object = &$arr;
$this->objects[] = &$arr;
}
/**
* Report the given object
*
* @api
* @param string $sObjectAlias Name of the subobject, usually the OQL class alias
* @param int $iCode An error code (RestResult::OK is no issue has been found)
* @param string $sMessage Description of the error if any, an empty string otherwise
* @param DBObject $oObject The object being reported
* @param array|null $aFieldSpec An array of class => attribute codes (Cf. RestUtils::GetFieldList). List of the attributes to be reported.
* @param boolean $bExtendedOutput Output all of the link set attributes ?
*
* @return void
* @throws \ArchivedObjectException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \MySQLException
*/
public function AppendSubObject($sObjectAlias, $iCode, $sMessage, $oObject, $aFieldSpec = null, $bExtendedOutput = false)
{
$oObjRes = $this->PrepareObject($iCode, $sMessage, $oObject, $aFieldSpec, $bExtendedOutput);
$this->current_object[$sObjectAlias] = $oObjRes;
}
}
/**
* @package RESTAPI
* @api
@@ -571,21 +545,14 @@ class CoreServices implements iRestServiceProvider, iRestInputSanitizer
break;
case 'core/get':
$sClassParam = RestUtils::GetMandatoryParam($aParams, 'class');
$sClass = RestUtils::GetClass($aParams, 'class');
$key = RestUtils::GetMandatoryParam($aParams, 'key');
$sShowFields = RestUtils::GetOptionalParam($aParams, 'output_fields', '*');
$aShowFields = RestUtils::GetFieldList($sClass, $aParams, 'output_fields');
$bExtendedOutput = (RestUtils::GetOptionalParam($aParams, 'output_fields', '*') == '*+');
$iLimit = (int)RestUtils::GetOptionalParam($aParams, 'limit', 0);
$iPage = (int)RestUtils::GetOptionalParam($aParams, 'page', 1);
// Validate the class(es)
$aClass = explode(',', $sClassParam);
foreach ($aClass as $sClass) {
if (!MetaModel::IsValidClass(trim($sClass))) {
throw new Exception("class '$sClass' is not valid");
}
}
$oObjectSet = RestUtils::GetObjectSetFromKey($sClassParam, $key, $iLimit, self::getOffsetFromLimitAndPage($iLimit, $iPage));
$oObjectSet = RestUtils::GetObjectSetFromKey($sClass, $key, $iLimit, self::getOffsetFromLimitAndPage($iLimit, $iPage));
$sTargetClass = $oObjectSet->GetFilter()->GetClass();
if (UserRights::IsActionAllowed($sTargetClass, UR_ACTION_READ) != UR_ALLOWED_YES)
@@ -603,68 +570,23 @@ class CoreServices implements iRestServiceProvider, iRestInputSanitizer
$oResult->code = RestResult::INVALID_PAGE;
$oResult->message = "The request page number is not valid. It must be an integer greater than 0";
}
elseif (count($oObjectSet->GetSelectedClasses()) > 1)
else
{
$oResult = new RestResultWithObjectSets();
$aCache = [];
$aShowFields = [];
foreach ($oObjectSet->GetSelectedClasses() as $sSelectedClass) {
$aShowFields = array_merge( $aShowFields, RestUtils::GetFieldList($sSelectedClass, $aParams, 'output_fields', false));
}
if (!$bExtendedOutput && RestUtils::GetOptionalParam($aParams, 'output_fields', '*') != '*')
{
$aFields = $aShowFields[$sClass];
//Id is not a valid attribute to optimize
if (in_array('id', $aFields))
{
unset($aFields[array_search('id', $aFields)]);
}
$aAttToLoad = array($oObjectSet->GetClassAlias() => $aFields);
$oObjectSet->OptimizeColumnLoad($aAttToLoad);
}
while ($oObjects = $oObjectSet->FetchAssoc()) {
$oResult->MakeNewObjectSet();
foreach ($oObjects as $sAlias => $oObject) {
if (!$oObject) {
continue;
}
if (!array_key_exists($sAlias, $aCache)) {
$sClass = get_class($oObject);
$bExtendedOutput = RestUtils::HasRequestedExtendedOutput($sShowFields);
if (!RestUtils::HasRequestedAllOutputFields($sShowFields)) {
$aFields = $aShowFields[$sClass];
//Id is not a valid attribute to optimize
if ($aFields && in_array('id', $aFields)) {
unset($aFields[array_search('id', $aFields)]);
}
$aAttToLoad = [$sAlias => $aFields];
$oObjectSet->OptimizeColumnLoad($aAttToLoad);
}
$aCache[$sAlias] = [
'aShowFields' => $aShowFields,
'bExtendedOutput' => $bExtendedOutput,
];
} else {
$aShowFields = $aCache[$sAlias]['aShowFields'];
$bExtendedOutput = $aCache[$sAlias]['bExtendedOutput'];
}
$oResult->AppendSubObject($sAlias, 0, '', $oObject, $aShowFields, $bExtendedOutput);
}
}
$oResult->message = "Found: ".$oObjectSet->Count();
} else {
$aShowFields =[];
foreach ($aClass as $sSelectedClass) {
$sSelectedClass = trim($sSelectedClass);
$aShowFields = array_merge($aShowFields, RestUtils::GetFieldList($sSelectedClass, $aParams, 'output_fields', false));
}
if (!RestUtils::HasRequestedAllOutputFields($sShowFields) && count($aShowFields) == 1) {
$aFields = $aShowFields[$sClass];
//Id is not a valid attribute to optimize
if (in_array('id', $aFields)) {
unset($aFields[array_search('id', $aFields)]);
}
$aAttToLoad = array($oObjectSet->GetClassAlias() => $aFields);
$oObjectSet->OptimizeColumnLoad($aAttToLoad);
}
while ($oObject = $oObjectSet->Fetch()) {
$oResult->AddObject(0, '', $oObject, $aShowFields, RestUtils::HasRequestedExtendedOutput($sShowFields));
while ($oObject = $oObjectSet->Fetch())
{
$oResult->AddObject(0, '', $oObject, $aShowFields, $bExtendedOutput);
}
$oResult->message = "Found: ".$oObjectSet->Count();
}

View File

@@ -517,8 +517,10 @@ EOF
@fclose($rFile);
$aOutput = array();
$CommandLine = "\"$sDotExecutable\" -v -Tpng < \"$sDotFilePath\" -o\"$sImageFilePath\" 2>&1";
$oKPI = new ExecutionKPI();
exec($CommandLine, $aOutput, $iRetCode);
$oKPI->ComputeStats('Graphviz execution png', 'png');
if ($iRetCode != 0)
{
$sHtml = '';
@@ -573,8 +575,10 @@ EOF
@fclose($rFile);
$aOutput = array();
$CommandLine = "\"$sDotExecutable\" -v -Tdot < \"$sDotFilePath\" -o\"$sXdotFilePath\" 2>&1";
$oKPI = new ExecutionKPI();
exec($CommandLine, $aOutput, $iRetCode);
$oKPI->ComputeStats('Graphviz execution dot', 'dot');
if ($iRetCode != 0)
{
$sHtml = '';

View File

@@ -2120,6 +2120,8 @@ class StimulusChecker extends ActionChecker
{
var $sState = null;
public mixed $iState = null;
public function __construct(DBSearch $oFilter, $sState, $iStimulusCode)
{
parent::__construct($oFilter, $iStimulusCode);

View File

@@ -435,7 +435,7 @@ class ValueSetObjects extends ValueSetDefinition
foreach ($aAdditionalField as $sAdditionalField) {
array_push($aArguments, $oObject->Get($sAdditionalField));
}
$aData['additional_field'] = vsprintf($sFormatAdditionalField, $aArguments);
$aData['additional_field'] = utils::VSprintf($sFormatAdditionalField, $aArguments);
} else {
$aData['additional_field'] = '';
}

View File

@@ -21,12 +21,10 @@
<db_key_field>id</db_key_field>
<db_final_class_field/>
<naming>
<format>%1$s</format>
<attributes>
<attribute id="login"/>
</attributes>
</naming>
<display_template/>
<style>
<icon/>
</style>

View File

@@ -53,14 +53,7 @@ class DBRestore extends DBBackup
$sUser = self::EscapeShellArg($this->sDBUser);
$sPwd = self::EscapeShellArg($this->sDBPwd);
$sDBName = self::EscapeShellArg($this->sDBName);
if (empty($this->sMySQLBinDir))
{
$sMySQLExe = 'mysql';
}
else
{
$sMySQLExe = '"'.$this->sMySQLBinDir.'/mysql"';
}
$sMySQLExe = DBBackup::MakeSafeMySQLCommand($this->sMySQLBinDir, 'mysql');
if (is_null($this->iDBPort))
{
$sPortOption = '';

View File

@@ -95,12 +95,7 @@ try {
//
$sMySQLBinDir = MetaModel::GetConfig()->GetModuleSetting('itop-backup', 'mysql_bindir', '');
$sMySQLBinDir = utils::ReadParam('mysql_bindir', $sMySQLBinDir, true);
if (empty($sMySQLBinDir)) {
$sMySQLDump = 'mysqldump';
} else {
//echo 'Info - Found mysql_bindir: '.$sMySQLBinDir;
$sMySQLDump = '"'.$sMySQLBinDir.'/mysqldump"';
}
$sMySQLDump = DBBackup::MakeSafeMySQLCommand($sMySQLBinDir, 'mysqldump');
$sCommand = "$sMySQLDump -V 2>&1";
$aOutput = array();

View File

@@ -46,12 +46,12 @@
<field id="status" xsi:type="AttributeEnum">
<sort_type>rank</sort_type>
<values>
<value id="approved">approved
<value id="approved">
<code>approved</code>
<rank>60</rank>
<style><main_color>$ibo-lifecycle-success-state-primary-color</main_color><complementary_color>$ibo-lifecycle-success-state-secondary-color</complementary_color><decoration_classes>fas fa-user-check</decoration_classes></style>
</value>
<value id="assigned">assigned
<value id="assigned">
<code>assigned</code>
<rank>40</rank>
<style><main_color>$ibo-lifecycle-neutral-state-primary-color</main_color><complementary_color>$ibo-lifecycle-neutral-state-secondary-color</complementary_color><decoration_classes/></style>

View File

@@ -151,7 +151,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_replan' => 'Replan',
'Class:Change/Stimulus:ev_replan+' => '',
'Class:Change/Stimulus:ev_notapprove' => 'Reject',
'Class:Change/Stimulus:ev_notapprove' => 'Reject approval',
'Class:Change/Stimulus:ev_notapprove+' => '',
'Class:Change/Stimulus:ev_implement' => 'Implement',
'Class:Change/Stimulus:ev_implement+' => '',

View File

@@ -151,7 +151,7 @@ Dict::Add('EN GB', 'British English', 'British English', array(
'Class:Change/Stimulus:ev_approve+' => '',
'Class:Change/Stimulus:ev_replan' => 'Replan',
'Class:Change/Stimulus:ev_replan+' => '',
'Class:Change/Stimulus:ev_notapprove' => 'Reject',
'Class:Change/Stimulus:ev_notapprove' => 'Reject approval',
'Class:Change/Stimulus:ev_notapprove+' => '',
'Class:Change/Stimulus:ev_implement' => 'Implement',
'Class:Change/Stimulus:ev_implement+' => '',

View File

@@ -139,7 +139,7 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
'Class:Change/Stimulus:ev_approve+' => '~~',
'Class:Change/Stimulus:ev_replan' => 'Replan~~',
'Class:Change/Stimulus:ev_replan+' => '~~',
'Class:Change/Stimulus:ev_notapprove' => 'Reject~~',
'Class:Change/Stimulus:ev_notapprove' => 'Reject approval~~',
'Class:Change/Stimulus:ev_notapprove+' => '~~',
'Class:Change/Stimulus:ev_implement' => 'Implement~~',
'Class:Change/Stimulus:ev_implement+' => '~~',

View File

@@ -380,7 +380,6 @@
</attribute>
<attribute id="private_log">
<read_only/>
<read_only/>
</attribute>
<attribute id="caller_id">
<read_only/>

View File

@@ -4351,7 +4351,6 @@
</item>
<item id="document_id">
<rank>20</rank>
<rank>20</rank>
</item>
</items>
</list>
@@ -5736,8 +5735,7 @@
<duplicates/>
</field>
</fields>
<methods>
</methods>
<methods/>
<presentation>
<details>
<items>
@@ -7230,7 +7228,12 @@
</class>
<class id="DocumentFile" _delta="must_exist">
<presentation>
<details><items><item id="cis_list" _delta="define"><rank>70</rank></item></items>&gt;
<details>
<items>
<item id="cis_list" _delta="define">
<rank>70</rank>
</item>
</items>
</details>
</presentation>
</class>

View File

@@ -323,8 +323,8 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:NetworkDevice/Attribute:networkdevicetype_id+' => '',
'Class:NetworkDevice/Attribute:networkdevicetype_name' => 'Nom Type',
'Class:NetworkDevice/Attribute:networkdevicetype_name+' => '',
'Class:NetworkDevice/Attribute:connectablecis_list' => 'Matériel connectés',
'Class:NetworkDevice/Attribute:connectablecis_list+' => 'Tous les matériels connectés à cet appareil réseau',
'Class:NetworkDevice/Attribute:connectablecis_list' => 'Matériel connecté',
'Class:NetworkDevice/Attribute:connectablecis_list+' => 'Tous les équipements connectés à cet appareil réseau',
'Class:NetworkDevice/Attribute:iosversion_id' => 'Version IOS',
'Class:NetworkDevice/Attribute:iosversion_id+' => '',
'Class:NetworkDevice/Attribute:iosversion_name' => 'Nom Version IOS',
@@ -1597,7 +1597,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:lnkConnectableCIToNetworkDevice/Attribute:network_port+' => '',
'Class:lnkConnectableCIToNetworkDevice/Attribute:device_port' => 'Port matériel',
'Class:lnkConnectableCIToNetworkDevice/Attribute:device_port+' => '',
'Class:lnkConnectableCIToNetworkDevice/Attribute:connection_type' => 'Type de connection',
'Class:lnkConnectableCIToNetworkDevice/Attribute:connection_type' => 'Type de connexion',
'Class:lnkConnectableCIToNetworkDevice/Attribute:connection_type+' => '',
'Class:lnkConnectableCIToNetworkDevice/Attribute:connection_type/Value:downlink' => 'lien descendant',
'Class:lnkConnectableCIToNetworkDevice/Attribute:connection_type/Value:downlink+' => 'lien descendant',

View File

@@ -797,7 +797,6 @@
<is_null_allowed>true</is_null_allowed>
<on_target_delete>DEL_MANUAL</on_target_delete>
<allow_target_creation>false</allow_target_creation>
<allow_target_creation>false</allow_target_creation>
</field>
<field id="powerstart_name" xsi:type="AttributeExternalField">
<extkey_attcode>powerstart_id</extkey_attcode>

View File

@@ -247,8 +247,10 @@
<db_key_field>link_id</db_key_field>
<db_final_class_field/>
<naming>
<attributes id="error_name"/>
<attributes id="functionalci_name"/>
<attributes>
<attribute id="error_name"/>
<attribute id="functionalci_name"/>
</attributes>
</naming>
<style>
<icon/>

View File

@@ -96,6 +96,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Rozbalit vše',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Sbalit vše',
'Brick:Portal:Browse:Filter:NoData' => 'Žádná položka',
'Brick:Portal:Browse:Mosaic:Back' => 'Zpět',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expand all~~',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Collapse all~~',
'Brick:Portal:Browse:Filter:NoData' => 'No item~~',
'Brick:Portal:Browse:Mosaic:Back' => 'Back~~',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Alle expandieren',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Alle kollabieren',
'Brick:Portal:Browse:Filter:NoData' => 'Kein Eintrag',
'Brick:Portal:Browse:Mosaic:Back' => 'Zurück',
));
// ManageBrick brick

View File

@@ -105,6 +105,7 @@ Dict::Add('EN US', 'English', 'English', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expand all',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Collapse all',
'Brick:Portal:Browse:Filter:NoData' => 'No item',
'Brick:Portal:Browse:Mosaic:Back' => 'Back',
));
// ManageBrick brick

View File

@@ -92,6 +92,7 @@ Dict::Add('EN GB', 'British English', 'British English', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expand all',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Collapse all',
'Brick:Portal:Browse:Filter:NoData' => 'No item',
'Brick:Portal:Browse:Mosaic:Back' => 'Back',
));
// ManageBrick brick

View File

@@ -94,6 +94,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellano', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expandir todo',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Desplegar todo',
'Brick:Portal:Browse:Filter:NoData' => 'Sin elementos',
'Brick:Portal:Browse:Mosaic:Back' => 'Volver',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Tout déplier',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Tout replier',
'Brick:Portal:Browse:Filter:NoData' => 'Aucun élément',
'Brick:Portal:Browse:Mosaic:Back' => 'Retour',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Összes kinyitása',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Összecsukás',
'Brick:Portal:Browse:Filter:NoData' => 'Nincs elem',
'Brick:Portal:Browse:Mosaic:Back' => 'Vissza',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expand all~~',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Collapse all~~',
'Brick:Portal:Browse:Filter:NoData' => 'No item~~',
'Brick:Portal:Browse:Mosaic:Back' => 'Back~~',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expand all~~',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Collapse all~~',
'Brick:Portal:Browse:Filter:NoData' => 'No item~~',
'Brick:Portal:Browse:Mosaic:Back' => 'Back~~',
));
// ManageBrick brick

View File

@@ -97,6 +97,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Toon alles',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Verberg alles',
'Brick:Portal:Browse:Filter:NoData' => 'Geen gegevens',
'Brick:Portal:Browse:Mosaic:Back' => 'Terug',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('PL PL', 'Polish', 'Polski', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Rozwiń wszystkie',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Zwiń wszystkie',
'Brick:Portal:Browse:Filter:NoData' => 'Brak elementu',
'Brick:Portal:Browse:Mosaic:Back' => 'Wstecz',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expandir todos',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Recolher todos',
'Brick:Portal:Browse:Filter:NoData' => 'Sem dados',
'Brick:Portal:Browse:Mosaic:Back' => 'Voltar',
));
// ManageBrick brick

View File

@@ -97,6 +97,7 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Развернуть все',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Свернуть все',
'Brick:Portal:Browse:Filter:NoData' => 'Нет элементов',
'Brick:Portal:Browse:Mosaic:Back' => 'Назад',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expand all~~',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Collapse all~~',
'Brick:Portal:Browse:Filter:NoData' => 'No item~~',
'Brick:Portal:Browse:Mosaic:Back' => 'Back~~',
));
// ManageBrick brick

View File

@@ -96,6 +96,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'Brick:Portal:Browse:Tree:ExpandAll' => 'Expand all~~',
'Brick:Portal:Browse:Tree:CollapseAll' => 'Collapse all~~',
'Brick:Portal:Browse:Filter:NoData' => 'No item~~',
'Brick:Portal:Browse:Mosaic:Back' => 'Back~~',
));
// ManageBrick brick

View File

@@ -105,6 +105,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'Brick:Portal:Browse:Tree:ExpandAll' => '全部展开',
'Brick:Portal:Browse:Tree:CollapseAll' => '全部收起',
'Brick:Portal:Browse:Filter:NoData' => '没有项目',
'Brick:Portal:Browse:Mosaic:Back' => '返回',
));
// ManageBrick brick

View File

@@ -133,6 +133,7 @@ if (!defined('PORTAL_ID'))
// Env. vars to be used in templates and others
$_ENV['COMBODO_CURRENT_ENVIRONMENT'] = utils::GetCurrentEnvironment();
$_ENV['COMBODO_APPROOT'] = APPROOT;
$_ENV['COMBODO_ABSOLUTE_URL'] = utils::GetAbsoluteUrlAppRoot();
$_ENV['COMBODO_CONF_APP_ICON_URL'] = MetaModel::GetConfig()->Get('app_icon_url');
$_ENV['COMBODO_MODULES_ABSOLUTE_URL'] = utils::GetAbsoluteUrlModulesRoot();

View File

@@ -1,5 +1,7 @@
twig:
default_path: '%combodo.modules.absolute_path%'
paths:
'%combodo.approot%images/': ~
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'

View File

@@ -0,0 +1,21 @@
# Copyright (C) 2010-2024 Combodo SAS
#
# 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/>
p_preferences_set_preference:
path: '/preferences/setPreference'
defaults:
_controller: 'Combodo\iTop\Portal\Controller\PreferencesController::SetPreferenceAction'

View File

@@ -27,6 +27,7 @@ parameters:
# Used in templates
combodo.current_environment: '%env(string:COMBODO_CURRENT_ENVIRONMENT)%'
combodo.approot: '%env(string:COMBODO_APPROOT)%'
combodo.absolute_url: '%env(string:COMBODO_ABSOLUTE_URL)%'
combodo.conf.app_icon_url: '%env(string:COMBODO_CONF_APP_ICON_URL)%'
combodo.modules.absolute_url: '%env(string:COMBODO_MODULES_ABSOLUTE_URL)%'

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1 @@
@import '../../../../../css/common/main.scss';
@import "utils/all";
@import "pages/base";
@import "themes/all";
@import "themes/all";

View File

@@ -5,4 +5,5 @@
@import "modal";
@import "form";
@import "input";
@import "caselog";
@import "caselog";
@import "progress-bar";

View File

@@ -1,298 +1,21 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-button--padding-y: 6px !default;
$ipb-button--padding-x: 9px !default;
$ipb-button-colors: (
'' : (
'primary': (
'': (
$common-color-blue-800,
$common-color-white-100,
$common-color-blue-900
),
':hover': (
$common-color-blue-700,
$common-color-white-100,
$common-color-blue-800
),
':active': (
$common-color-blue-900,
$common-color-white-100,
$common-color-blue-950
),
':disabled': (
$common-color-blue-200,
$common-color-blue-600,
$common-color-blue-300
),
),
'default': (
'': (
$common-color-white-100,
$common-color-grey-800,
$common-color-grey-600
),
':hover': (
$common-color-grey-100,
$common-color-grey-900,
$common-color-grey-700
),
':active': (
$common-color-grey-200,
$common-color-grey-900,
$common-color-grey-700
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
'success': (
'': (
$common-color-success-900,
$common-color-white-100,
$common-color-success-900
),
':hover': (
$common-color-success-800,
$common-color-green-100,
$common-color-success-900
),
':active': (
$common-color-success-950,
$common-color-green-100,
$common-color-success-950
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
'warning': (
'': (
$common-color-warning-700,
$common-color-white-100,
$common-color-warning-900
),
':hover': (
$common-color-warning-600,
$common-color-warning-100,
$common-color-warning-700
),
':active': (
$common-color-warning-800,
$common-color-warning-100,
$common-color-warning-900
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
'danger': (
'': (
$common-color-danger-800,
$common-color-white-100,
$common-color-danger-900
),
':hover': (
$common-color-danger-700,
$common-color-danger-100,
$common-color-danger-800
),
':active': (
$common-color-danger-900,
$common-color-danger-100,
$common-color-danger-950
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
'info': (
'': (
$common-color-information-800,
$common-color-white-100,
$common-color-information-900
),
':hover': (
$common-color-information-700,
$common-color-information-100,
$common-color-information-800
),
':active': (
$common-color-information-900,
$common-color-information-100,
$common-color-information-950
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
),
'alternative' : (
'primary': (
'': (
$common-color-transparent,
$common-color-blue-800,
$common-color-transparent
),
':hover': (
$common-color-blue-100,
$common-color-blue-900,
$common-color-blue-100
),
':active': (
$common-color-blue-200,
$common-color-blue-900,
$common-color-blue-200
),
':disabled': (
$common-color-blue-200,
$common-color-blue-600,
$common-color-blue-300
),
),
'default': (
'': (
$common-color-transparent,
$common-color-grey-800,
$common-color-transparent
),
':hover': (
$common-color-grey-200,
$common-color-grey-900,
$common-color-grey-200
),
':active': (
$common-color-grey-300,
$common-color-grey-900,
$common-color-grey-300
),
':disabled': (
$common-color-transparent,
$common-color-grey-500,
$common-color-transparent
),
),
'success': (
'': (
$common-color-transparent,
$common-color-success-900,
$common-color-transparent
),
':hover': (
$common-color-success-100,
$common-color-success-900,
$common-color-success-100
),
':active': (
$common-color-success-200,
$common-color-success-900,
$common-color-success-200
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
'warning': (
'': (
$common-color-transparent,
$common-color-warning-800,
$common-color-transparent
),
':hover': (
$common-color-warning-100,
$common-color-warning-900,
$common-color-warning-100
),
':active': (
$common-color-warning-200,
$common-color-warning-900,
$common-color-warning-200
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
'danger': (
'': (
$common-color-transparent,
$common-color-danger-800,
$common-color-transparent
),
':hover': (
$common-color-danger-100,
$common-color-danger-800,
$common-color-danger-100
),
':active': (
$common-color-danger-200,
$common-color-danger-800,
$common-color-danger-200
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
'info': (
'': (
$common-color-transparent,
$common-color-information-800,
$common-color-transparent
),
':hover': (
$common-color-information-100,
$common-color-information-800,
$common-color-information-100
),
':active': (
$common-color-information-200,
$common-color-information-800,
$common-color-information-200
),
':disabled': (
$common-color-grey-200,
$common-color-grey-700,
$common-color-grey-300
),
),
),
) !default;
.ipb-button, .btn{
--ibp-button-border-radius-top-left: 4px;
--ibp-button-border-radius-top-right: 4px;
--ibp-button-border-radius-bottom-right: 4px;
--ibp-button-border-radius-bottom-left: 4px;
background-color: $common-color-white-100 !important;
border-radius: var(--ibp-button-border-radius-top-left) var(--ibp-button-border-radius-top-right) var(--ibp-button-border-radius-bottom-right) var(--ibp-button-border-radius-bottom-left);
border: solid 1px $common-color-blue-700;
padding: $ipb-button--padding-y $ipb-button--padding-x;
color: $common-color-blue-800 !important;
cursor: pointer;
@each $sType, $aColors in $ipb-button-colors {
@each $sColor, $sPseudoClasses in $aColors {
@each $sPseudoClass, $sAttributes in $sPseudoClasses {
&.ipb-is-#{$sColor}#{if($sType != '', ".ipb-is-#{$sType}", '')}#{$sPseudoClass}, &.btn-#{$sColor}#{if($sType != '', ".#{$sType}", '')}#{$sPseudoClass} {
background-color: nth($sAttributes, 1) !important;
color: nth($sAttributes, 2) !important;
border-color: nth($sAttributes, 3) !important;
}
}
}
}
@extend %common-font-size-150;
}

View File

@@ -1,27 +1,13 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
$messaging-self-primary-color: $common-color-blue-100 !default;
$messaging-self-secondary-color: $common-color-blue-800 !default;
$messaging-1st-peer-primary-color: $white !default;
$messaging-1st-peer-secondary-color: $common-color-grey-400 !default;
$messaging-2nd-peer-primary-color: $white !default;
$messaging-2nd-peer-secondary-color: $common-color-grey-400 !default;
$messaging-3rd-peer-primary-color: $white !default;
$messaging-3rd-peer-secondary-color: $common-color-grey-300 !default;
$messaging-4th-peer-primary-color: $white !default;
$messaging-4th-peer-secondary-color: $common-color-grey-400 !default;
$messaging-5th-peer-primary-color: $white !default;
$messaging-5th-peer-secondary-color: $common-color-grey-400 !default;
$ipb-caselog-thread--border: 1px solid $common-color-grey-400 !default;
/* SCSS variables (can be overloaded) */
$ipb-caselog-thread--border-top: none !default;
$ipb-caselog-thread--header--padding: 12px !default;
$ipb-caselog-thread--header--background-color: $common-color-white-100 !default;
$ipb-caselog-thread--header--span--color: $common-color-grey-800 !default;
$ipb-caselog-thread--header-toggler--color: inherit !default;
$ipb-caselog-thread--header-toggler--hover--active-focus--color: inherit !default;
$ipb-caselog-thread--header-toggler--not-first-child--margin: 0 0.4em 0 0.2em !default;
@@ -30,33 +16,24 @@ $ipb-caselog-thread--header-info--first-child--margin-left: 0 !default;
$ipb-caselog-thread--header-info--span--span--margin-left: $ipb-caselog-thread--header-info--span--margin-left !default;
$ipb-caselog-thread--content--padding: 12px !default;
$ipb-caselog-thread--content--background-color: $common-color-grey-100 !default;
$ipb-caselog-thread--date--margin-bottom: 10px !default;
$ipb-caselog-thread--date--color: $common-color-grey-800 !default;
$ipb-caselog-thread--block--min-height: 40px !default;
$ipb-caselog-thread--block--margin-bottom: 15px !default;
$ipb-caselog-thread--block--last-child--margin-bottom: 0 !default;
$ipb-caselog-thread--block-medallion--block-entries--border: 1px solid $common-color-grey-200 !default;
$ipb-caselog-thread--block-medallion--width: 40px !default;
$ipb-caselog-thread--block-medallion--height: $ipb-caselog-thread--block-medallion--width !default;
$ipb-caselog-thread--block-medallion--color: $common-color-blue-800 !default;
$ipb-caselog-thread--block-medallion--background-color: $common-color-blue-100 !default;
$ipb-caselog-thread--block-user--margin-left: 54px !default;
$ipb-caselog-thread--block-user--color: $ipb-caselog-thread--block-medallion--color !default;
$ipb-caselog-thread--block-entries--margin-x: 60px !default;
$ipb-caselog-thread--block-entries--border-radius: $common-border-radius-500 !default;
$ipb-caselog-thread--block-entries--background-color: $ipb-caselog-thread--block-medallion--background-color !default;
$ipb-caselog-thread--block-entries--color: $ipb-caselog-thread--block-medallion--color !default;
$ipb-caselog-thread--block-entry--padding-y: 8px !default;
$ipb-caselog-thread--block-entry--padding-x: 10px !default;
$ipb-caselog-thread--block-entry--border-bottom: 1px solid $common-color-grey-200 !default;
$ipb-caselog-thread--block-entry-content--height: 0px !default;
@@ -68,24 +45,10 @@ $ipb-caselog-thread--block-entry-toggler--top: 2px !default;
$ipb-caselog-thread--block-entry-toggler--right: 5px !default;
$ipb-caselog-thread--block-entry-toggler--padding-y: 2px !default;
$ipb-caselog-thread--block-entry-toggler--padding-x: 5px !default;
$ipb-caselog-thread--block-entry-toggler--background-color: $ipb-caselog-thread--block-medallion--background-color !default;
$ipb-caselog-thread--block-me--block-user--margin-right: 54px !default;
$ipb-caselog-thread--block-me--block-entries--margin-left: initial !default;
$ipb-caselog-thread--block-me--block-entries--margin-right: $ipb-caselog-thread--block-entries--margin-x !default;
$ipb-caselog-thread--block-me--block-entry--first--content--border-left-color: transparent !default;
$ipb-caselog-thread--block-me--block-entry--first--content--border-right-color: $ipb-caselog-thread--block-medallion--background-color !default;
$ipb-caselog-thread--block-colors: (
1: ($common-color-white-100, $common-color-grey-700),
2: ($common-color-white-100, $common-color-grey-700),
3: ($common-color-white-100, $common-color-grey-700),
4: ($common-color-white-100, $common-color-grey-700),
5: ($common-color-white-100, $common-color-grey-700)
);
$messaging-block-medallion-size: 40px !default;
$messaging-block-entries-margin-x: 60px !default;
@@ -93,28 +56,22 @@ $messaging-block-entries-margin-x: 60px !default;
.ipb-caselog-thread {
position: relative;
border: $ipb-caselog-thread--border;
border-top: $ipb-caselog-thread--border-top;
}
.ipb-caselog-thread--header{
padding: $ipb-caselog-thread--header--padding;
background-color: $ipb-caselog-thread--header--background-color;
border-bottom: none;
@extend %common-font-size-100;
span{
color: $ipb-caselog-thread--header--span--color;
}
}
.ipb-caselog-thread--header-toggler{
cursor: pointer;
color: $ipb-caselog-thread--header-toggler--color;
text-decoration: none;
&:hover,
&:active,
&:focus{
color: $ipb-caselog-thread--header-toggler--hover--active-focus--color;
text-decoration: none;
}
@@ -142,13 +99,11 @@ $messaging-block-entries-margin-x: 60px !default;
.ipb-caselog-thread--content{
padding: $ipb-caselog-thread--content--padding;
background-color: $ipb-caselog-thread--content--background-color;
}
.ipb-caselog-thread--date{
margin-bottom: $ipb-caselog-thread--date--margin-bottom;
text-align: center;
color: $ipb-caselog-thread--date--color;
@extend %common-font-size-150;
&:first-child{
@@ -165,10 +120,7 @@ $messaging-block-entries-margin-x: 60px !default;
margin-bottom: $ipb-caselog-thread--block--last-child--margin-bottom;
}
}
.ipb-caselog-thread--block-medallion,
.ipb-caselog-thread--block-entries{
border: $ipb-caselog-thread--block-medallion--block-entries--border;
}
.ipb-caselog-thread--block-medallion{
position: absolute;
@@ -177,13 +129,11 @@ $messaging-block-entries-margin-x: 60px !default;
width: $ipb-caselog-thread--block-medallion--width;
height: $ipb-caselog-thread--block-medallion--height;
line-height: $ipb-caselog-thread--block-medallion--height;
color: $ipb-caselog-thread--block-medallion--color; /* .ipb-caselog-thread--block-entries color */
text-align: center;
@extend %common-font-size-250;
background-size: 100%; /* Full size is necessary for images with filled background to fit nicely in the medallion, even if this means that images with a transparent background might appear cropped */
background-position: center center;
background-color: $ipb-caselog-thread--block-medallion--background-color; /* .ipb-caselog-thread--block-entries background-color */
background-repeat: no-repeat;
border-radius: 100%;
}
@@ -191,7 +141,6 @@ $messaging-block-entries-margin-x: 60px !default;
.ipb-caselog-thread--block-user{
display: none;
margin-left: $ipb-caselog-thread--block-user--margin-left;
color: $ipb-caselog-thread--block-user--color; /* .ipb-caselog-thread--block-entries background-color */
@extend %common-font-ral-bol-100;
}
@@ -202,14 +151,11 @@ $messaging-block-entries-margin-x: 60px !default;
margin-left: $ipb-caselog-thread--block-entries--margin-x;
max-width: calc(100% - #{$ipb-caselog-thread--block-entries--margin-x});
border-radius: $ipb-caselog-thread--block-entries--border-radius;
background-color: $ipb-caselog-thread--block-entries--background-color;
color: $ipb-caselog-thread--block-entries--color;
}
.ipb-caselog-thread--block-entry{
position: relative;
padding: $ipb-caselog-thread--block-entry--padding-y $ipb-caselog-thread--block-entry--padding-x;
border-bottom: $ipb-caselog-thread--block-entry--border-bottom;
img{
max-width: 100%;
@@ -264,9 +210,13 @@ $messaging-block-entries-margin-x: 60px !default;
padding: $ipb-caselog-thread--block-entry-toggler--padding-y $ipb-caselog-thread--block-entry-toggler--padding-x;
opacity: 0;
cursor: pointer;
background-color: $ipb-caselog-thread--block-entry-toggler--background-color; /* .ipb-caselog-thread--block-entries background-color */
transition: all 0.2s linear;
}
.ipb-caselog-thread--block-entry:not(.closed):hover{
.ipb-caselog-thread--block-entry-toggler{
opacity: 1;
}
}
.ipb-caselog-thread--block-me{
text-align: right;
@@ -297,166 +247,9 @@ $messaging-block-entries-margin-x: 60px !default;
.ipb-caselog-thread--block-entry-content:before{
left: initial;
right: -15px;
border-right-color: transparent;
border-left-color: $ipb-caselog-thread--block-me--block-entry--first--content--border-right-color; /* .ipb-caselog-thread--block-entries background-color */
}
}
}
}
.ipb-caselog-thread--block-color-1{
.ipb-caselog-thread--block-medallion{
color: $messaging-1st-peer-secondary-color;
background-color: $messaging-1st-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-1st-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-1st-peer-secondary-color;
background-color: $messaging-1st-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-1st-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-1st-peer-primary-color;
border-right-color: $messaging-1st-peer-primary-color;
}
}
}
}
.ipb-caselog-thread--block-color-2{
.ipb-caselog-thread--block-medallion{
color: $messaging-2nd-peer-secondary-color;
background-color: $messaging-2nd-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-2nd-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-2nd-peer-secondary-color;
background-color: $messaging-2nd-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-2nd-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-2nd-peer-primary-color;
border-right-color: $messaging-2nd-peer-primary-color;
}
}
}
}
.ipb-caselog-thread--block-color-3{
.ipb-caselog-thread--block-medallion{
color: $messaging-3rd-peer-secondary-color;
background-color: $messaging-3rd-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-3rd-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-3rd-peer-secondary-color;
background-color: $messaging-3rd-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-3rd-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-3rd-peer-primary-color;
border-right-color: $messaging-3rd-peer-primary-color;
}
}
}
}
.ipb-caselog-thread--block-color-4{
.ipb-caselog-thread--block-medallion{
color: $messaging-4th-peer-secondary-color;
background-color: $messaging-4th-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-4th-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-4th-peer-secondary-color;
background-color: $messaging-4th-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-4th-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-4th-peer-primary-color;
border-right-color: $messaging-4th-peer-primary-color;
}
}
}
}
.ipb-caselog-thread--block-color-5{
.ipb-caselog-thread--block-medallion{
color: $messaging-5th-peer-secondary-color;
background-color: $messaging-5th-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-5th-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-5th-peer-secondary-color;
background-color: $messaging-5th-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-5th-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-5th-peer-primary-color;
border-right-color: $messaging-5th-peer-primary-color;
}
}
}
}
@each $index, $colors in $ipb-caselog-thread--block-colors {
.ipb-caselog-thread--block-color-#{$index} {
.ipb-caselog-thread--block-medallion {
color: nth($colors, 2);
background-color: nth($colors, 1);
}
.ipb-caselog-thread--block-user {
color: nth($colors, 1);
}
.ipb-caselog-thread--block-entries {
color: nth($colors, 2);
background-color: nth($colors, 1);
.ipb-caselog-thread--block-entry {
.ipb-caselog-thread--block-entry-toggler {
background-color: nth($colors, 1);
}
}
.ipb-caselog-thread--block-entry:first-child {
.ipb-caselog-thread--block-entry-content:before {
border-top-color: nth($colors, 1);
border-right-color: nth($colors, 1);
}
}
}
}
}

View File

@@ -1,16 +1,14 @@
$ipb-dropdown--background-color: $ipb-color-white-100 !default;
$ipb-dropdown--border: 1px solid $ipb-color-grey-300 !default;
$ipb-dropdown--border-radius: $common-border-radius-400 !default;
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ipb-dropdown--li--background-color: $ipb-dropdown--background-color !default;
/* SCSS variables (can be overloaded) */
$ipb-dropdown--border-radius: $common-border-radius-400 !default;
$ipb-dropdown--a--padding-y: $common-spacing-400 !default;
$ipb-dropdown--a--padding-x: $common-spacing-500 !default;
$ipb-dropdown--a--border-radius: $ipb-dropdown--border-radius !default;
$ipb-dropdown--a--color: $ipb-color-grey-900 !default;
$ipb-dropdown--li--hover--background-color: $ipb-color-grey-200 !default;
$ipb-dropdown--li--hover--a--color: $ipb-color-grey-800 !default;
$ipb-dropdown--icon--margin-right: $common-spacing-300 !default;
@@ -18,12 +16,9 @@ ipb-dropdown {
display: none;
position: absolute;
width: max-content;
background: $ipb-dropdown--background-color;
border: $ipb-dropdown--border;
border-radius: $ipb-dropdown--border-radius;
list-style: none;
li {
background-color: $ipb-dropdown--li--background-color;
a {
display: inline-block;
width: 100%;
@@ -31,13 +26,6 @@ ipb-dropdown {
border-radius: $ipb-dropdown--a--border-radius;
cursor: pointer;
text-decoration: none;
color: $ipb-dropdown--a--color;
}
&:hover {
background: $ipb-dropdown--li--hover--background-color;
a {
color: $ipb-dropdown--li--hover--a--color;
}
}
}
}

View File

@@ -1,7 +1,11 @@
$ipb--fieldset--background-color: $common-color-grey-50 !default;
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb--fieldset--padding-y: 10px !default;
$ipb--fieldset--padding-x: 7px !default;
$ipb--fieldset--border: 1px solid $common-color-grey-200 !default;
$ipb--fieldset--border-radius: $common-border-radius-500 !default;
$ipb--fieldset--legend--padding-y: $common-spacing-0 !default;
@@ -10,19 +14,12 @@ $ipb--fieldset--legend--padding-x: 13px !default;
$ipb-field--has-tooltip-or-is-mandatory--vertical-align: top !default;
$ipb-field--has-tooltip-or-is-mandatory--left: $common-spacing-200 !default;
$ipb-field--has-tooltip--content: "\f05a" !default;
$ipb-field--has-tooltip--color: $common-color-grey-700 !default;
$ipb-field--is-mandatory--content: "\f069" !default;
$ipb-field--is-mandatory--color: $common-color-orange-700 !default;
$ipb-field--is-mandatory--font-size: 0.6rem !default;
.form_fields {
fieldset {
background-color: $common-color-grey-50;
padding: $ipb--fieldset--padding-y $ipb--fieldset--padding-x;
border-radius: $ipb--fieldset--border-radius;
border: $ipb--fieldset--border;
legend {
padding: $ipb--fieldset--legend--padding-y $ipb--fieldset--legend--padding-x;
}
@@ -38,14 +35,10 @@ $ipb-field--is-mandatory--font-size: 0.6rem !default;
}
.form_field_label > .control-label[data-tooltip-instantiated="true"]:after {
content: $ipb-field--has-tooltip--content;
color: $ipb-field--has-tooltip--color;
cursor: pointer;
@extend %common-font-size-50;
}
.form_field .form_mandatory .control-label:after{
content: $ipb-field--is-mandatory--content;
color: $ipb-field--is-mandatory--color;
font-size: $common-font-size-20;
};

View File

@@ -1,18 +1,37 @@
$ipb-form-control--color: $common-color-grey-800 !default;
$ipb-form-control--border-radius: $common-border-radius-500 !default;
$ipb-form-control--box-shadow: none !default;
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-form-control--border-radius: $common-border-radius-300 !default;
$ipb-form-control--box-shadow: none !default;
$ipb-form-control--input-group-addon--border-top-right-radius: 0 !default;
$ipb-form-control--input-group-addon--border-bottom-right-radius: 0 !default;
$ipb-input-group-addon--border-radius: $ipb-form-control--border-radius !default;
$ipb-input-group-addon--form-control--border-top-left-radius: 0 !default;
$ipb-input-group-addon--form-control--border-bottom-left-radius: 0 !default;
$ipb-form-control--is-focused--border-color: $common-color-primary-700 !default;
$ipb-form-control--is-focused--box-shadow: none !default;
.form-control {
color: $ipb-form-control--color;
border-radius: $common-border-radius-500 !important;
border-radius: $ipb-form-control--border-radius;
-webkit-box-shadow: $ipb-form-control--box-shadow;
box-shadow: $ipb-form-control--box-shadow;
&:focus {
border-color: $ipb-form-control--is-focused--border-color;
box-shadow: $ipb-form-control--is-focused--box-shadow;
-webkit-box-shadow: $ipb-form-control--is-focused--box-shadow;
}
}
.form-control:has(+ .input-group-addon) {
border-top-right-radius: $ipb-form-control--input-group-addon--border-top-right-radius;
border-bottom-right-radius: $ipb-form-control--input-group-addon--border-bottom-right-radius;
}
.form-control + .input-group-addon {
border-top-left-radius: $ipb-input-group-addon--form-control--border-top-left-radius;
border-bottom-left-radius: $ipb-input-group-addon--form-control--border-bottom-left-radius;
}

View File

@@ -1,36 +1,28 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables */
/* SCSS variables (can be overloaded) */
$ipb-modal--max-height: 90vh !default;
$ipb-modal--max-width: 90vw !default;
$ipb-modal--border-radius: $common-border-radius-500 !default;
$ipb-modal--header--background-color: $common-color-white-100 !default;
$ipb-modal--header--color: $common-color-grey-900 !default;
$ipb-modal--header--padding: $common-spacing-500 !default;
$ipb-modal--header--border-radius: $ipb-modal--border-radius $ipb-modal--border-radius 0 0 !default;
$ipb-modal--header--close--color: $common-color-grey-900 !default;
$ipb-modal--header--close--opacity: 1 !default;
$ipb-modal--header--close--hover--color: $common-color-grey-700 !default;
$ipb-modal--footer-padding: $ipb-modal--header--padding !default;
$ipb-modal--backdrop--opacity: 0.6 !default;
$ipb-modal--backdrop--background-color: $common-color-blue-grey-800 !default;
$ipb-modal--backdrop--backdrop-filter: blur(2px) !default;
$ipb-modal--content--border-radius: $ipb-modal--border-radius !default;
$ipb-modal--content--border: 1px solid $common-color-grey-400 !default;
$ipb-modal--title--color: $ipb-modal--header--color !default;
$ipb-modal--title--to-clipboard--margin: $common-spacing-200 !default;
$ipb-modal--title--span--margin-left: 5px !default;
$ipb-modal--title--span--separator--margin-right: $common-spacing-200 !default;
$ipb-modal--title--span--separator--width: $common-size-100 !default;
$ipb-modal--title--span--separator--height: $ipb-modal--title--span--separator--width !default;
$ipb-modal--title--span--separator--margin-right: $common-spacing-200 !default;
$ipb-modal--title--span--separator--margin-top: calc(-1 * #{$ipb-modal--title--span--separator--height} / 2) !default;
$ipb-modal--title--span--separator--border-radius: $common-border-radius-full !default;
$ipb-modal--title--span--separator--background-color: $common-color-grey-800 !default;
@@ -40,40 +32,28 @@ $ipb-modal--title--span--separator--background-color: $common-color-grey-800 !de
max-height: $ipb-modal--max-height !important;
max-width: $ipb-modal--max-width !important;
border-radius: $ipb-modal--border-radius;
.modal-header {
background-color: $ipb-modal--header--background-color;
color: $ipb-modal--header--color;
}
}
.modal-backdrop.in {
opacity: $ipb-modal--backdrop--opacity;
background-color: $ipb-modal--backdrop--background-color;
backdrop-filter: $ipb-modal--backdrop--backdrop-filter;
}
.modal-content {
border-radius: $ipb-modal--content--border-radius !important;
border: $ipb-modal--content--border;
box-shadow: none !important;
-webkit-box-shadow: none !important;
}
.modal-header {
padding: $ipb-modal--header--padding;
border-radius:$ipb-modal--header--border-radius !important;
.close {
color: $ipb-modal--header--close--color;
opacity: $ipb-modal--header--close--opacity;
@extend %common-font-size-400;
&:hover {
color: $ipb-modal--header--close--hover--color;
}
}
}
.modal-footer {
padding: $ipb-modal--footer-padding;
}
.modal-title {
color: $ipb-modal--title--color !important;
display: flex;
align-items: center;
@@ -84,10 +64,10 @@ $ipb-modal--title--span--separator--background-color: $common-color-grey-800 !de
display: inline-block;
vertical-align: middle;
margin-right: $ipb-modal--title--span--separator--margin-right;
margin-top: $ipb-modal--title--span--separator--margin-top;
width: $ipb-modal--title--span--separator--width;
height: $ipb-modal--title--span--separator--height;
border-radius: $ipb-modal--title--span--separator--border-radius;
background-color: $ipb-modal--title--span--separator--background-color;
}
}
.url-to-clipboard.url-to-clipboard-icon {

View File

@@ -1,8 +1,12 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-panel--border-radius: $common-border-radius-300!default;
.ipb-panel {
border: 1px solid $common-color-grey-400;
border-radius: 0 $common-border-radius-500 $common-border-radius-500 $common-border-radius-500;
box-shadow: none;
-webkit-box-shadow: none;

View File

@@ -0,0 +1,19 @@
$ipb-progress--height: $common-size-350 !default;
$ipb-progress--border-radius: $common-border-radius-500 !default;
$ipb-progress--bar--line-height: $ipb-progress--height !default;
$ipb-progress--bar--border-radius: $ipb-progress--border-radius !default;
.ipb-progress, .progress {
height: $ipb-progress--height;
border-radius: $ipb-progress--border-radius;
}
.ipb-progress--bar, .progress-bar {
background-color: $ipb-color-primary-600;
color: #ffffff;
line-height: $ipb-progress--bar--line-height;
border-radius: $ipb-progress--bar--border-radius;
@extend %common-font-ral-med-150;
}

View File

@@ -1,23 +1,29 @@
@import "../../../../../../node_modules/bulma-scss/utilities/mixins";
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
@import "../node_modules/bulma-scss/utilities/mixins";
/* SCSS variables */
$ipb-tile--width: 450px !default;
$ipb-tile--min-width: 150px !default;
$ipb-tile--padding: $common-spacing-500 !default;
$ipb-tile--margin: $common-spacing-400 !default;
$ipb-tile--border-color: $common-color-grey-200 !default;
$ipb-tile--border-width: 1px !default;
$ipb-tile--border-radius: $common-border-radius-500 !default;
$ipb-tile--background-color: $common-color-white-100 !default;
$ipb-tile--decoration--size: 44px !default;
$ipb-tile--decoration--padding: $common-spacing-400 !default;
$ipb-tile--decoration--hover--background: common-adjust-alpha($common-color-blue-700, .1) !default;
$ipb-tile--decoration--background: common-adjust-lightness($ipb-tile--decoration--hover--background, 38%) !default;
$ipb-tile--decoration--icon--color: $common-color-blue-700 !default;
$ipb-tile--decoration--icon--font-size: $common-font-size-250 !default;
$ipb-tile--title--color: $common-base-variable--text-color !default;
$ipb-tile--title--font-size: $common-font-size-400 !default;
$ipb-tile--description--color: $common-base-variable--text-color !default;
$ipb-tile--manage-brick--chart--margin-top: $common-spacing-500 !default;
$ipb-tile--manage-brick--badge--margin-top: $common-font-size-400 !default;
$ipb-tile--manage-brick--badge--count--padding: 0 $common-spacing-300 !default;
$ipb-tile--manage-brick--badge--count--font-size: $common-font-size-300 !default;
$ipb-tile--manage-brick--badge--label--font-size: $common-font-size-100 !default;
$ipb-tile--manage-brick--top-list--margin-top: $common-spacing-500 !default;
.ipb-tile{
position: relative;
@@ -26,15 +32,12 @@ $ipb-tile--description--color: $common-base-variable--text-color !default;
min-width: $ipb-tile--min-width;
margin: $ipb-tile--margin;
padding: $ipb-tile--padding;
background-color: $ipb-tile--background-color;
border: $ipb-tile--border-width solid $ipb-tile--border-color;
border-radius: $ipb-tile--border-radius;
white-space: normal;
flex-grow: 1;
&[data-role="navigation-trigger"] {
cursor: pointer;
@include ipb-heavy-animated-border;
}
}
@@ -68,7 +71,6 @@ $ipb-tile--description--color: $common-base-variable--text-color !default;
width: $ipb-tile--decoration--size;
height: $ipb-tile--decoration--size;
padding: $ipb-tile--decoration--padding;
background-color: $ipb-tile--decoration--background;
border-radius: $ipb-tile--border-radius;
text-align: center;
transition: background-color 1s ease;
@@ -81,15 +83,9 @@ $ipb-tile--description--color: $common-base-variable--text-color !default;
}
}
}
.ipb-tile:hover{
.ipb-tile--decoration{
background-color: $ipb-tile--decoration--hover--background;
}
}
.ipb-tile--decoration--icon {
&.icon {
color: $ipb-tile--decoration--icon--color;
font-size: $ipb-tile--decoration--icon--font-size;
}
@@ -102,7 +98,6 @@ $ipb-tile--description--color: $common-base-variable--text-color !default;
.ipb-tile--title{
flex-grow: 1;
color: $ipb-tile--title--color;
font-size: $ipb-tile--title--font-size;
font-weight: bold;
@include ipb-text-overflow-ellipsis;
@@ -126,8 +121,6 @@ $ipb-tile--description--color: $common-base-variable--text-color !default;
/* description */
.ipb-tile--description{
color: $ipb-tile--description--color;
@extend %common-font-ral-nor-150;
}
@@ -144,36 +137,19 @@ $ipb-tile--description--color: $common-base-variable--text-color !default;
/* ManageBrick tile display */
/****************************/
$ipb-tile--manage-brick--chart--margin-top: $common-spacing-500 !default;
$ipb-tile--manage-brick--badge--margin-top: $common-font-size-400 !default;
$ipb-tile--manage-brick--badge--count--padding: 0 $common-spacing-300 !default;
$ipb-tile--manage-brick--badge--count--font-size: $common-font-size-300 !default;
$ipb-tile--manage-brick--badge--label--font-size: $common-font-size-100 !default;
$ipb-tile--manage-brick--badge--hover--item--background: common-adjust-alpha($common-base-variable--text-color, .1) !default;
$ipb-tile--manage-brick--top-list--margin-top: $common-spacing-500 !default;
/* title */
.ipb-tile--manage .ipb-tile--title {
display: flex;
align-items: center;
> span:first-child {
@include ipb-text-overflow-ellipsis;
}
> span:nth-child(2) {
@include ipb-following-dot;
> .class-icon {
width: 20px;
margin-left: 5px;
vertical-align: baseline;
}
}
}
/* chart */
@@ -205,10 +181,6 @@ $ipb-tile--manage-brick--top-list--margin-top: $common-spacing-500 !default;
font-size: $ipb-tile--manage-brick--badge--label--font-size;
}
/* top list */
.ipb-tile--manage-brick--top-list {
}
/***********************/

View File

@@ -1,3 +1,4 @@
@import "navigation-menu";
@import "page";
@import "home";
@import "home";
@import "tabs";

View File

@@ -1,4 +1,7 @@
/* SCSS variables */
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
.ipb-home .ipb-page--main-wrapper:before{
content: '';
@@ -8,8 +11,6 @@
left: 0;
width: 100%;
height: 100%;
background-image: url("../img/backgrounds/dots-left-top.svg");
background-size: 30%;
background-position-y: top;
background-position-x: left;
background-repeat: no-repeat;
@@ -24,8 +25,6 @@
right: 0;
width: 100%;
height: 100%;
background-image: url("../img/backgrounds/dots-right-bottom.svg");
background-size: 30%;
background-position-y: bottom;
background-position-x: right;
background-repeat: no-repeat;

View File

@@ -1,7 +1,12 @@
@import "../../../../../../node_modules/bulma-scss/utilities/mixins";
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
@import "../node_modules/bulma-scss/utilities/mixins";
$ipb-navigation-menu--flex-column-gap: $common-spacing-300 !default;
$ipb-navigation-menu--background-color: $common-color-blue-grey-900 !default;
$ipb-navigation-menu--nav-vertical--width: 60px !default;
$ipb-navigation-menu--nav-vertical--is-expanded--width: 280px !default;
$ipb-navigation-menu--nav-horizontal--height: 56px !default;
@@ -14,16 +19,11 @@ $ipb-navigation-menu--menu-entry--wrapper--flex-column-gap: $common-spacing-500
$ipb-navigation-menu--menu-entry--size: 44px !default;
$ipb-navigation-menu--menu-entry--border-radius: $common-border-radius-500 !default;
$ipb-navigation-menu--menu-entry--padding: $common-spacing-300 !default;
$ipb-navigation-menu--menu-entry--active--icon--color: $common-color-orange-600 !default;
$ipb-navigation-menu--menu-entry--active--color: $common-color-grey-800 !default;
$ipb-navigation-menu--menu-entry--active--background-color: $common-color-white-100 !default;
$ipb-navigation-menu--menu-entry--icon-size: 28px !default;
$ipb-navigation-menu--menu-entry--font-size: 2rem !default;
$ipb-navigation-menu--separator--width: $common-spacing-400 !default;
$ipb-navigation-menu--menu-entry--more--background-color: #455a6447 !default;
$ipb-navigation-menu--user-part--flex-column-gap: $common-spacing-300 !default;
$ipb-navigation-menu--user-card--flex-column-gap: $common-spacing-300;
$ipb-navigation-menu--user-card--photo--background-color: #585653 !default;
$ipb-navigation-menu--user-card--photo--size: 36px !default;
$dropdown-menu--items-remainder--padding: $common-spacing-300 !default;
$dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !default;
@@ -36,18 +36,12 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
display: flex;
flex-direction: column;
border-radius: 0 $ipb-navigation-menu--border-radius $ipb-navigation-menu--border-radius 0;
background-color: $ipb-navigation-menu--background-color;
column-gap: $ipb-navigation-menu--flex-column-gap;
// in expanded state
&.ipb-is-expanded {
width: $ipb-navigation-menu--nav-vertical--is-expanded--width;
// expand menu toggle animation
.ipb-navigation-menu--top-part--toggle--expand-menu {
@include ipb-toggle-nav-animated-chevron-right;
}
// make menu entry fill available space
.ipb-navigation-menu--menu-entry--brick-item {
width: 100%;
@@ -83,11 +77,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
}
// expand toggle menu
.ipb-navigation-menu--top-part--toggle--expand-menu {
@include ipb-toggle-nav;
}
// SEPARATOR ////////////////////////////////////////////
.ipb-navigation-menu--separator {
@@ -102,7 +91,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
display: flex;
flex-direction: column;
padding: 0 $ipb-navigation-menu--middle-part--is-vertical--padding;
@include ipb-scrollbar;
}
// menu entries
@@ -119,22 +107,10 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
// entry wrapper
.ipb-navigation-menu--menu-entry--wrapper {
// entry title
.ipb-navigation-menu--menu-entry--title {
@include ipb-text-overflow-ellipsis;
@extend %common-font-ral-nor-200;
}
&.active .ipb-navigation-menu--menu-entry {
background-color: $ipb-navigation-menu--menu-entry--active--background-color;
color: $ipb-navigation-menu--menu-entry--active--color;
.ipb-navigation-menu--menu-entry--icon {
color: $ipb-navigation-menu--menu-entry--active--icon--color;
}
}
}
// menu entry
@@ -151,8 +127,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
align-items: center;
column-gap: $ipb-navigation-menu--menu-entry--wrapper--flex-column-gap;
border-radius: $ipb-navigation-menu--menu-entry--border-radius;
color: whitesmoke;
@include ipb-transition(#{"background-color, color"});
// entry icon
.ipb-navigation-menu--menu-entry--icon {
@@ -161,13 +135,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
font-size: $ipb-navigation-menu--menu-entry--font-size;
text-align: center;
}
// hover and focus effect
&:hover, &:focus:not(.ipb-not-focusable) {
color: white;
background-color: $common-color-blue-grey-700;
}
}
// drop down items remainder
@@ -178,7 +145,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
// drop down menu items remainder
.ipb-dropdown-menu--items-remainder {
padding: $dropdown-menu--items-remainder--padding;
background-color: $ipb-navigation-menu--background-color;
border-bottom-left-radius: $dropdown-menu--items-remainder--border-radius;
border-bottom-right-radius: $dropdown-menu--items-remainder--border-radius;
-webkit-box-shadow: none;
@@ -195,7 +161,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
display: flex;
align-items: center;
column-gap: $ipb-navigation-menu--user-part--flex-column-gap;
background-color: $common-color-grey-800;
border-radius: 0 0 $ipb-navigation-menu--border-radius 0;
// toggle mobile menu
@@ -213,7 +178,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
align-items: center;
justify-content: center;
@extend %common-font-ral-nor-150;
color: white !important;
text-decoration: none;
overflow-x: hidden;
@@ -226,7 +190,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
background-size: 100%;
background-position: center center;
background-repeat: no-repeat;
background-color: $ipb-navigation-menu--user-card--photo--background-color;
border-radius: 100%;
}
@@ -242,23 +205,12 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
.ipb-navigation-menu--user-card--name {
flex-grow: 1;
overflow-x: hidden;
> div {
@include ipb-text-overflow-ellipsis;
}
}
}
}
// MOBILE MENU ////////////////////////////////////////////
// mobile open toggle menu
.ipb-navigation-menu--user-part--toggle--open-mobile-menu {
@include ipb-toggle-nav;
}
// mobile menu overlay
.ipb-navigation-menu-overlay {
display: none;
@@ -267,7 +219,6 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
top: $ipb-navigation-menu--nav-horizontal--height;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.28);
z-index: 9998;
}
@@ -405,9 +356,7 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
width: 100%;
max-height: 0;
padding: 0 12px;
background-color: $ipb-navigation-menu--background-color;
z-index: 9999;
@include ipb-transition(max-height, ease, 0.5s);
.ipb-navigation-menu--menu-entries {
margin: 15px 0;
@@ -457,15 +406,7 @@ $dropdown-menu--items-remainder--border-radius: $common-border-radius-700 !defau
.ipb-navigation-menu--middle-part {
max-height: 100%;
}
// toggle animation
.ipb-navigation-menu--user-part--toggle--open-mobile-menu {
@include ipb-toggle-nav-animated-cross;
}
}
}
}
}

View File

@@ -1,13 +1,16 @@
@import "../../../../../../node_modules/bulma-scss/utilities/mixins";
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
@import "../node_modules/bulma-scss/utilities/mixins";
/* SCSS variables */
$ipb-page--main-wrapper--padding: $common-spacing-600 $common-spacing-700 !default;
$ipb-page--main-header--margin-bottom: $common-size-250 !default;
$ipb-page--main-header--information--title--font-size: $common-font-size-450 !default;
$ipb-page--main-header--information--title--color: $common-base-variable--text-color !default;
$ipb-page--main-header--information--subtitle--padding: $common-spacing-200 !default;
$ipb-page--main-header--information--subtitle--font-size: $common-font-size-250 !default;
$ipb-page--main-header--information--subtitle--color: $common-base-variable--text-color !default;
html {
font-size: 12px;
@@ -48,16 +51,10 @@ body{
.ipb-page--main-header--information--title{
font-size: $ipb-page--main-header--information--title--font-size;
font-weight: bold;
color: $ipb-page--main-header--information--title--color;
> span ~ span {
@include ipb-following-dot;
}
}
.ipb-page--main-header--information--subtitle{
font-size: $ipb-page--main-header--information--subtitle--font-size;
color: $ipb-page--main-header--information--subtitle--color;
padding: $ipb-page--main-header--information--subtitle--padding;
max-width: 1400px;
}
@@ -76,7 +73,6 @@ body{
.ipb-copyright {
text-decoration: none !important;
color: $common-color-secondary-800;
}
@include mobile {
@@ -97,6 +93,5 @@ body{
width: 100%;
}
}
}

View File

@@ -0,0 +1,42 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-tabs--tab--badge--border-radius: $common-border-radius-500 !default;
$ipb-tabs--tab--badge--padding-y: 3px !default;
$ipb-tabs--tab--badge--padding-x: 5px !default;
$ipb-tabs--tab--badge--margin-left: $common-spacing-200 !default;
$ipb-tabs--tab--active--indicator--width: $common-size-150 !default;
$ipb-tabs--tab--active--indicator--height: $ipb-tabs--tab--active--indicator--width !default;
$ipb-tabs--tab--active--indicator--margin-right: $common-spacing-300 !default;
$ipb-tabs--tab--active--indicator--border-radius: $common-border-radius-full !default;
.ipb-tabs.nav-pills > li{
> a {
display: flex;
align-items: center;
@extend %common-font-ral-med-150;
> .badge {
border-radius: $ipb-tabs--tab--badge--border-radius;
padding: $ipb-tabs--tab--badge--padding-y $ipb-tabs--tab--badge--padding-x;
margin-left: $ipb-tabs--tab--badge--margin-left;
}
}
&.active > a {
&:before {
content: " ";
display: inline-block;
width: $ipb-tabs--tab--active--indicator--width;
height: $ipb-tabs--tab--active--indicator--height;
margin-right: $ipb-tabs--tab--active--indicator--margin-right;
border-radius: $ipb-tabs--tab--active--indicator--border-radius;
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,6 @@
@import "utils/variables/path";
@import 'common/main.scss';
@import "utils/all";
@import "mixins";
@import "components/all";
@import "vendors/all";
@import "pages/all";

View File

@@ -1,8 +0,0 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-body-text-color: $ipb-color-grey-900 !default;
$ipb-body-background-color: $ipb-color-white-200 !default;

View File

@@ -1,14 +1,16 @@
@import "../../../../../../../node_modules/bulma-scss/utilities/mixins";
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ipb-browse-brick--mosaic-item--highlight-color: $common-color-blue-800, $common-color-orange-800, $common-color-green-800, $common-color-pink-800, $common-color-cyan-800, $common-color-yellow-800, $common-color-purple-800;
/* SCSS variables (can be overloaded) */
@import "../node_modules/bulma-scss/utilities/mixins";
$ipb-browse-brick-panel--row--margin: $common-spacing-0 !default;
$ipb-browse-brick-panel--brick-content-toolbar--padding: $common-spacing-400 !default;
$ipb-content-mosaic--padding: $common-spacing-0 !default;
$ipb-browse-brick--mosaic-breadcrumb--padding: $common-spacing-200 !default;
$ipb-browse-brick--mosaic-breadcrumb--active--color: $common-color-grey-800 !default;
$ipb-browse-brick--mosaic-breadcrumb--a--color: $common-color-primary-800 !default;
$ipb-browse-brick--mosaic--gap: $common-spacing-300 !default;
$ipb-browse-brick--mosaic--small--grid-template-columns: 1fr !default;
@@ -20,10 +22,7 @@ $ipb-browse-brick--mosaic-group-item--min-height: $common-size-550 !default;
$ipb-browse-brick--mosaic-group-item--height: auto !default;
$ipb-browse-brick--mosaic-group-item--width: 100% !default;
$ipb-browse-brick--mosaic-group-item--margin: $common-spacing-0 !default;
$ipb-browse-brick--mosaic-group-item--color: $common-base-variable--text-color !default;
$ipb-browse-brick--mosaic-group-item--border: 1px solid $common-color-grey-300 !default;
$ipb-browse-brick--mosaic-group-item--border-radius: $common-border-radius-300 !default;
$ipb-browse-brick--mosaic-group-item--background-color: $common-color-white-100 !default;
$ipb-browse-brick--mosaic-group-item--animation--transform-x: -20px !default;
$ipb-browse-brick--mosaic-group-item--actions--top: $common-spacing-500 !default;
@@ -32,49 +31,30 @@ $ipb-browse-brick--mosaic-item--height: 100% !default;
$ipb-browse-brick--mosaic-item--padding: $common-spacing-600 !default;
$ipb-browse-brick--mosaic-item--margin: $common-spacing-0 !default;
$ipb-browse-brick--mosaic-item--border-radius: $ipb-browse-brick--mosaic-group-item--border-radius !default;
$ipb-browse-brick--mosaic-item--background-color: $common-color-white-100 !default;
$ipb-browse-brick--mosaic-item--color: $common-base-variable--text-color !default;
$ipb-browse-brick--mosaic-item--hover--color: inherit !default;
$ipb-browse-brick--mosaic-item--hover--background-color--alpha: 0.05 !default;
$ipb-browse-brick--mosaic-item-description--color: $common-color-grey-800 !default;
$ipb-browse-brick--mosaic-item-image--height: 44px !default;
$ipb-browse-brick--mosaic-item-image--width: 44px !default;
$ipb-browse-brick--mosaic-item-image--border-radius: $common-border-radius-700 !default;
$ipb-browse-brick--mosaic-item-image--padding: $common-spacing-0 !default;
$ipb-browse-brick--mosaic-item-image--margin-bottom: $common-spacing-500 !default;
$ipb-browse-brick--mosaic-item-image--background-color: common-adjust-alpha($common-color-blue-700, .1) !default;
$ipb-browse-brick--mosaic-item-image--background-color--alpha: 0.1 !default;
$ipb-browse-brick--mosaic-item-image--color: $common-color-blue-700 !default;
$ipb-browse-brick--mosaic-item-image--img--height: $common-size-300 !default;
$ipb-browse-brick--mosaic-item-description--margin-top: $common-spacing-300 !default;
$ipb-browse-brick-panel--mosaic--background-color: transparent !default;
$ipb-browse-brick-panel--mosaic--border: none !default;
$ipb-browse-brick-panel--dataTables_wrapper--padding-x: $common-spacing-0 !default;
$ipb-browse-brick-panel--dataTables_wrapper--padding-y: $common-size-200 !default;
$ipb-browse-brick-panel--dataTables_wrapper--row--div--padding-x: $common-size-200 !default;
$ipb-browse-brick-panel--dataTables_wrapper--row--div--padding-y: $common-size-0 !default;
$ipb-browse-brick--tree-item--color: $common-color-grey-900 !default;
$ipb-browse-brick--tree-item--hyperlink--color: $common-hyperlink-color !default;
$ipb-browse-brick--tree-item-filter-data--color: $common-color-grey-800 !default;
$ipb-browse-brick--tree-item-filter-data--margin-top: $common-spacing-300 !default;
$ipb-browse-brick--tree-item-filter-data--item--margin-y: $common-spacing-0 !default;
$ipb-browse-brick--tree-item-filter-data--item--margin-x: $common-spacing-300 !default;
$ipb-browse-brick--tree-item--description--margin-top: $common-spacing-200 !default;
$ipb-browse-brick--tree-item--description--color: $common-color-grey-800 !default;
$ipb-browse-brick--tree-item--wrapper--padding-top: $common-spacing-500 !default;
$ipb-browse-brick--tree-item--wrapper--color: inherit !default;
$ipb-browse-brick--tree-item-image--height: $common-size-350 !default;
$ipb-browse-brick--tree-item-image--width: $common-size-350 !default;
@@ -90,18 +70,20 @@ $ipb-browse-brick--tree-item-image--has-glyphicon--margin-right: $common-spacing
$ipb-browse-brick--tree-item--has-glyphicon--description--margin-left: 19px !default;
$ipb-browse-brick--list-group-item--padding-y: $common-spacing-0 !default;
$ipb-browse-brick--list-group-item--padding-x: $common-spacing-500 !default;
$ipb-browse-brick--list-group-item--padding: $common-spacing-0 !default;
$ipb-browse-brick--list-group-item--padding-left: $common-spacing-500 !default;
$ipb-browse-brick--list-group-item--margin-bottom: -1px !default;
$ipb-browse-brick--list-group-item--background-color: $common-color-white-100 !default;
$ipb-browse-brick--list-group-item--border: 1px solid $common-color-grey-400 !default;
$ipb-browse-brick--list-group--margin-bottom: $common-spacing-0 !default;
$ipb-browse-brick--list-group-item--tree-item-wrapper--padding-bottom: $common-spacing-500 !default;
$ipb-browse-brick--list-group--tree--margin: $common-spacing-0 !default;
$ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !default;
$ipb-browse-brick--no-item--illustration--max-width: 100% !default;
$ipb-browse-brick--no-item--illustration--padding-y: $common-spacing-600 !default;
$ipb-browse-brick--no-item--illustration--padding-x: $common-spacing-500 !default;
$ipb-browse-brick--no-item--illustration--svg--max-width: $common-size-700 !default;
// Common
.ipb-browse-brick-panel {
@@ -123,23 +105,13 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
width: 100% !important;
}
// Mosaic view
.page_browse_brick_as_mosaic .ipb-browse-brick-panel{
background-color: $ipb-browse-brick-panel--mosaic--background-color !important;
border: $ipb-browse-brick-panel--mosaic--border !important;
}
// Mosaic view
#brick_content_mosaic{
padding: $ipb-content-mosaic--padding;
}
#mosaic-breadcrumb {
padding: $ipb-browse-brick--mosaic-breadcrumb--padding;
a {
color: $ipb-browse-brick--mosaic-breadcrumb--a--color;
}
.active {
color: $ipb-browse-brick--mosaic-breadcrumb--active--color;
}
}
.mosaic-group {
@@ -173,23 +145,7 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
height: $ipb-browse-brick--mosaic-group-item--height;
width: $ipb-browse-brick--mosaic-group-item--width;
margin: $ipb-browse-brick--mosaic-group-item--margin;
color: $ipb-browse-brick--mosaic-group-item--color;
border: $ipb-browse-brick--mosaic-group-item--border;
border-radius: $ipb-browse-brick--mosaic-group-item--border-radius;
background-color: $ipb-browse-brick--mosaic-group-item--background-color;
@for $i from 1 through length($ipb-browse-brick--mosaic-item--highlight-color) {
&:nth-child(#{length($ipb-browse-brick--mosaic-item--highlight-color)}n + #{$i}){
.mosaic-item:hover{
background-color: common-adjust-alpha(nth($ipb-browse-brick--mosaic-item--highlight-color, $i), $ipb-browse-brick--mosaic-item--hover--background-color--alpha);
}
.mosaic-item-image {
background-color: common-adjust-alpha(nth($ipb-browse-brick--mosaic-item--highlight-color, $i), $ipb-browse-brick--mosaic-item-image--background-color--alpha);
color: nth($ipb-browse-brick--mosaic-item--highlight-color, $i);
}
}
}
> .mosaic-group-item-actions {
position: absolute;
@@ -206,15 +162,7 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
padding: $ipb-browse-brick--mosaic-item--padding;
margin: $ipb-browse-brick--mosaic-item--margin;
border-radius: $ipb-browse-brick--mosaic-item--border-radius;
background-color: $ipb-browse-brick--mosaic-item--background-color;
color: $ipb-browse-brick--mosaic-item--color;
transition: background-color 0.3s linear;
&:hover {
color: $ipb-browse-brick--mosaic-item--hover--color;
}
}
@@ -229,7 +177,6 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
.mosaic-item-description {
@extend %common-font-ral-nor-150;
color: $ipb-browse-brick--mosaic-item-description--color;
}
}
@@ -240,8 +187,6 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
padding: $ipb-browse-brick--mosaic-item-image--padding;
margin-bottom: $ipb-browse-brick--mosaic-item-image--margin-bottom;
border-radius: $ipb-browse-brick--mosaic-item-image--border-radius;
background-color: $ipb-browse-brick--mosaic-item-image--background-color;
color: $ipb-browse-brick--mosaic-item-image--color;
align-items: center;
justify-content: center;
text-transform: capitalize;
@@ -273,26 +218,22 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
}
.list-group-item .list-group-item-text, .tree-item {
color: $ipb-browse-brick--tree-item--color;
@extend %common-font-ral-bol-150;
& a {
@extend %common-font-size-150;
color: $ipb-browse-brick--tree-item--hyperlink--color;
}
}
.list-group.tree .list-group-item .list-group-item-description {
display: block;
margin-top: $ipb-browse-brick--tree-item--description--margin-top;
color: $ipb-browse-brick--tree-item--description--color;
@extend %common-font-ral-nor-100;
}
.list-group-item .tree-item-wrapper .tree-item-filter-data {
margin-top: $ipb-browse-brick--tree-item-filter-data--margin-top;
color: $ipb-browse-brick--tree-item-filter-data--color;
@extend %common-font-ral-med-100;
> span:not(:last-child):after {
@@ -300,7 +241,6 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
margin: $ipb-browse-brick--tree-item-filter-data--item--margin-y $ipb-browse-brick--tree-item-filter-data--item--margin-x;
}
a {
color: $ipb-browse-brick--tree-item-filter-data--color;
font-size: $common-font-size-100 !important;
}
}
@@ -308,32 +248,15 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
#brick_content_tree .list-group-item>.tree-item-wrapper {
display: flex;
padding-top: $ipb-browse-brick--tree-item--wrapper--padding-top;
color: $ipb-browse-brick--tree-item--wrapper--color;
text-decoration: inherit;
cursor: pointer
}
.list-group-item {
#brick_content_tree .list-group-item {
display: block;
position: relative;
padding: $ipb-browse-brick--list-group-item--padding-y $ipb-browse-brick--list-group-item--padding-x;
padding: $ipb-browse-brick--list-group-item--padding $ipb-browse-brick--list-group-item--padding $ipb-browse-brick--list-group-item--padding $ipb-browse-brick--list-group-item--padding-left;
margin-bottom: $ipb-browse-brick--list-group-item--margin-bottom;
background-color: $ipb-browse-brick--list-group-item--background-color;
border: $ipb-browse-brick--list-group-item--border;
border-bottom: none;
@for $i from 1 through length($ipb-browse-brick--mosaic-item--highlight-color) {
&:nth-child(#{length($ipb-browse-brick--mosaic-item--highlight-color)}n + #{$i - 1}) {
&:hover {
background-color: common-adjust-alpha(nth($ipb-browse-brick--mosaic-item--highlight-color, $i), $ipb-browse-brick--mosaic-item--hover--background-color--alpha);
}
> .tree-item-wrapper .tree-item-image {
background-color: common-adjust-alpha(nth($ipb-browse-brick--mosaic-item--highlight-color, $i), $ipb-browse-brick--mosaic-item-image--background-color--alpha);
color: nth($ipb-browse-brick--mosaic-item--highlight-color, $i);
}
}
}
}
@@ -379,5 +302,20 @@ $ipb-browse-brick--list-group--tree--background-color: $common-color-white-100 !
.list-group.tree {
margin: $ipb-browse-brick--list-group--tree--margin;
background-color: $ipb-browse-brick--list-group--tree--background-color;
}
.ipb-browse-brick--no-item--illustration {
width: $ipb-browse-brick--no-item--illustration--max-width;
display: flex;
flex-direction: column;;
padding: $ipb-browse-brick--no-item--illustration--padding-y $ipb-browse-brick--no-item--illustration--padding-x;
> svg {
max-width: $ipb-browse-brick--no-item--illustration--svg--max-width;
height: inherit;
align-self: center;
}
}
.ipb-browse-brick--no-item--text {
@extend %common-font-ral-med-300;
}

View File

@@ -1,3 +1,9 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-manage-brick--panel--body--padding-y: $common-spacing-500 !default;
$ipb-manage-brick--panel--body--padding-x: $common-spacing-0 !default;
@@ -7,24 +13,15 @@ $ipb-manage-brick--panel--body--datatable--row--margin: $common-spacing-0 !defau
$ipb-manage-brick--panel--body--datatable--row--padding-y: $common-spacing-0 !default;
$ipb-manage-brick--panel--body--datatable--row--padding-x: $common-spacing-400 !default;
$ipb-manage-brick--tabs--tab--border: solid 1px $common-color-grey-400 !default;
$ipb-manage-brick--tabs--tab--badge--border-radius: $common-border-radius-500 !default;
$ipb-manage-brick--tabs--tab--badge--padding-y: 3px !default;
$ipb-manage-brick--tabs--tab--badge--padding-x: 5px !default;
$ipb-manage-brick--tabs--tab--badge--margin-left: $common-spacing-200 !default;
$ipb-manage-brick--tabs--tab--background-color: $common-color-grey-100 !default;
$ipb-manage-brick--tabs--tab--color: $common-color-grey-900 !default;
$ipb-manage-brick--tabs--tab--active--background-color: $common-color-white-100 !default;
$ipb-manage-brick--tabs--tab--active--badge--background-color: $common-color-grey-200 !default;
$ipb-manage-brick--tabs--tab--active--indicator--background-color: $common-color-primary-600 !default;
$ipb-manage-brick--tabs--tab--active--indicator--width: $common-size-150 !default;
$ipb-manage-brick--tabs--tab--active--indicator--height: $ipb-manage-brick--tabs--tab--active--indicator--width !default;
$ipb-manage-brick--tabs--tab--active--indicator--margin-right: $common-spacing-300 !default;
$ipb-manage-brick--tabs--tab--active--indicator--border-radius: $common-border-radius-full !default;
$ipb-manage-brick--panel--body--table--margin-top: $common-spacing-500 !default;
$ipb-manage-brick--no-result--illustration--width: 100% !default;
$ipb-manage-brick--no-result--illustration--padding-y: $common-spacing-600 !default;
$ipb-manage-brick--no-result--illustration--padding-x: $common-spacing-500 !default;
$ipb-manage-brick--no-result--illustration--svg--max-width: $common-size-700 !default;
.ipb-manage-brick--panel--body {
padding: $ipb-manage-brick--panel--body--padding-y $ipb-manage-brick--panel--body--padding-x 0 $ipb-manage-brick--panel--body--padding-x;
@@ -40,79 +37,51 @@ $ipb-manage-brick--panel--body--table--margin-top: $common-spacing-500 !default;
}
.ipb-manage-brick--tabs.grouping_tabs.nav-pills > li{
> a {
display: flex;
align-items: center;
background-color: $ipb-manage-brick--tabs--tab--background-color;
color: $ipb-manage-brick--tabs--tab--color;
@extend %common-font-ral-med-150;
> .badge {
color: $common-color-grey-900;
background-color: transparent;
border-radius: $ipb-manage-brick--tabs--tab--badge--border-radius;
padding: $ipb-manage-brick--tabs--tab--badge--padding-y $ipb-manage-brick--tabs--tab--badge--padding-x;
margin-left: $ipb-manage-brick--tabs--tab--badge--margin-left;
}
border: $ipb-manage-brick--tabs--tab--border;
border-bottom: none;
}
&.active > a {
background-color: $ipb-manage-brick--tabs--tab--active--background-color;
&:before {
content: " ";
display: inline-block;
width: $ipb-manage-brick--tabs--tab--active--indicator--width;
height: $ipb-manage-brick--tabs--tab--active--indicator--height;
margin-right: $ipb-manage-brick--tabs--tab--active--indicator--margin-right;
border-radius: $ipb-manage-brick--tabs--tab--active--indicator--border-radius;
background-color: $ipb-manage-brick--tabs--tab--active--indicator--background-color;
}
> .badge {
background-color: $ipb-manage-brick--tabs--tab--active--badge--background-color;
}
}
}
.ipb-manage-brick--panel--body--table {
margin-top: $ipb-manage-brick--panel--body--table--margin-top !important;
}
.ipb-manage-brick--export-action {
color: $common-color-grey-800;
}
.ipb-manage-brick--export-action--icon {
float: right;
}
$ipb-manage-brick--pie-chart--colors:
$common-color-blue-400 $common-color-blue-950 "rgb(44, 160, 44)",
$common-color-blue-500 $common-color-blue-950 "rgb(214, 39, 40)",
$common-color-blue-600 $common-color-blue-100 "rgb(148, 103, 189)",
$common-color-blue-700 $common-color-blue-100 "rgb(140, 86, 75)",
$common-color-blue-800 $common-color-blue-100 "rgb(227, 119, 194)",
$common-color-blue-900 $common-color-blue-100 "rgb(127, 127, 127)",
$common-color-blue-950 $common-color-blue-100 "rgb(188, 189, 34)",
$common-color-blue-100 $common-color-blue-950 "rgb(23, 190, 207)",
$common-color-blue-200 $common-color-blue-950 "rgb(31, 119, 180)",
$common-color-blue-300 $common-color-blue-950 "rgb(255, 127, 14)"
!default;
.ipb-export--feedback {
display: flex;
flex-direction: column;
}
@each $background, $text, $originalColor in $ipb-manage-brick--pie-chart--colors {
.c3-chart-arc path[style="fill: #{$originalColor}; cursor: pointer; opacity: 1;"] {
fill: $background !important;
.ipb-export-message {
@extend %common-font-ral-med-150;
margin: $common-spacing-300 $common-spacing-0;
}
.c3-legend-item-tile[style="stroke: #{$originalColor}; pointer-events: none;"] {
stroke: $background !important;
.ipb-export--illustration {
align-self: center;
margin: 24px 0;
max-width: $common-size-650;
max-height: $common-size-650;
> svg {
max-width: 100%;
height: 100%;
}
}
.c3-chart-arc:has(path[style="fill: #{$originalColor}; cursor: pointer; opacity: 1;"]) text {
fill: $text !important;
.ipb-manage-brick--no-result--illustration {
width: $ipb-manage-brick--no-result--illustration--width;
display: flex;
flex-direction: column;;
padding: $ipb-manage-brick--no-result--illustration--padding-y $ipb-manage-brick--no-result--illustration--padding-x;
> svg {
max-width: $ipb-manage-brick--no-result--illustration--svg--max-width;
height: inherit;
align-self: center;
}
}
.ipb-manage-brick--no-result--text {
@extend %common-font-ral-med-300;
}

View File

@@ -1,5 +1,10 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-object-brick--url-to-clipboard--opacity: 0.5 !default;
$ipb-object-brick--url-to-clipboard-tooltip-copied--color: $common-color-green-500!default;
$ipb-object-brick--url-to-clipboard-tooltip-copied--margin-right: $common-spacing-200!default;
@@ -15,6 +20,5 @@ $ipb-object-brick--url-to-clipboard-tooltip-copied--margin-right: $common-spacin
}
// Used for clipboard's tooltip, which is not part of .url-to-clipboard element
.url-to-clipboard-tooltip-copied {
color: $ipb-object-brick--url-to-clipboard-tooltip-copied--color;
margin-right: $ipb-object-brick--url-to-clipboard-tooltip-copied--margin-right;
}

File diff suppressed because one or more lines are too long

View File

@@ -15,10 +15,10 @@
*
* You should have received a copy of the GNU Affero General Public License
*/
@import '../../../../../css/common/main.scss';
@import 'common/main.scss';
@import 'variables.scss';
@import "utils/all";
@import '../../../../../node_modules/ckeditor5-itop-build/build/styles/compiled-theme';
@import '../node_modules/ckeditor5-itop-build/build/styles/compiled-theme';
/*!
* Combodo portal template v1.0.0
@@ -275,201 +275,6 @@ footer{
padding-top: 15px;
}
//.home .tile{
// display: block;
// margin-bottom: 8px;
// padding: 0em 1em;
// min-height: 4em;
// background-color: $white;
// background-image: none;
// border: none;
// border-radius: 0px;
// text-align: center;
// text-decoration: none;
// white-space: normal;
// line-height: 4em;
// box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
//}
//.home .tile .tile_decoration{
// position: absolute;
// top: 0.3em;
// left: 2.5em;
//}
//.home .tile .tile_title{
// font-weight: bold;
// color: $gray;
//}
//
//.home .tile .tile_title > span.icon {
// color: $combodo-orange;
//}
//
//.home .tile .tile_description{
// display: none;
// color: #555555;
//}
//
//
///**********************************/
///* ManageBrick badge tile display */
///**********************************/
//.home a.tile.tile_badge > div {
// display: table;
// width: 100%;
//}
//
//.home a.tile.tile_badge > div > div {
// display: table-row;
//}
//
//.home a.tile.tile_badge > div > div > div {
// display: table-cell;
//}
//
//@media (max-width: 768px) {
// .home a.tile.tile_badge > div > div > div.tile_body div.tile_count {
// position: absolute;
// top: 0em;
// right: 2em;
// text-align: right;
// font-size: 1.2em;
// }
// .home a.tile.tile_badge > div.tile_description {
// display: none;
// }
//}
//@media (min-width: 768px) {
// .home .tile{
// display: block;
// margin-bottom: 25px;
// padding: 40px 40px 30px 40px;
// min-height: 10em;
// text-align: left;
// transition: all 0.2s linear;
// }
// .home .tile:hover{
// box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.10);
// }
// .home .tile .tile_decoration{
// display: block;
// position: relative;
// float: left;
// top: 1.5em;
// left: initial;
// margin: 0px 30px 15px 0px;
// }
// .home .tile .tile_body{
// display: block;
// padding-left: 4.3em;
// text-align: left;
// line-height: 1.5em;
// }
// .home .tile .tile_title{
// margin-bottom: 1em;
// font-size: 1.0em;
// }
// .home .tile .tile_description{
// display: block;
// text-align: left;
// }
//
// .home a.tile.tile_badge{
// height: 10em;
// overflow: hidden;
// }
// .home a.tile.tile_badge > div > div > div.tile_decoration{
// top: unset;
// vertical-align: middle;
// }
// .home a.tile.tile_badge > div > div > div.tile_decoration > span.icon {
// font-size: 4em;
// }
// .home a.tile.tile_badge > div > div > div.tile_body{
// position: relative;
// padding: 0;
// margin: 0;
// vertical-align: middle;
// text-align: right;
// }
// .home a.tile.tile_badge > div > div > div.tile_body .tile_title{
// margin-top: 1em;
// margin-bottom: 0;
// font-size: 1em;
// font-weight: normal;
// }
// .home a.tile.tile_badge > div > div > div.tile_body .tile_count{
// position: absolute;
// top: 0;
// right: 0;
// font-size: 2em;
// font-weight: bold;
// color: $gray;
// }
// .home a.tile.tile_badge .tile_description{
// display: none;
// }
//}
//@media (min-width: 992px) {
// .home .tile{
// min-height: 14em;
// padding: 30px 40px 30px 40px;
// }
// .home .tile .tile_decoration > span.icon{
// font-size: 4em;
// }
// .home .tile .tile_body{
// padding-left: 6.3em;
// }
// .home .tile .tile_title{
// font-size: 1.4em;
// }
// .home .tile .tile_description{
// font-size: 1.2em;
// }
//
// .home a.tile.tile_badge > div > div > div.tile_body .tile_title{
// font-size: 1.2em;
// }
// .home a.tile.tile_badge > div > div > div.tile_body .tile_count{
// font-size: 3em;
// }
// .home a.tile.tile_badge > div > div > div.tile_decoration > span.icon {
// font-size: 4em;
// }
// .home a.tile.tile_badge .tile_description{
// display: block;
// font-size: 1em;
// text-align: center;
// }
//}
//@media (min-width: 1200px) {
// .home .tile{
// margin-bottom: 40px;
// min-height: 15em;
// padding: 40px 50px 30px 50px;
// }
// .home .tile .tile_decoration{
// margin: 0px 40px 15px 0px;
// top: 1.5em;
// }
// .home .tile .tile_decoration > span.icon{
// font-size: 6em;
// }
// .home .tile .tile_body{
// padding-left: 9.1em;
// }
// .home .tile .tile_title{
// font-size: 1.5em;
// }
// .home .tile .tile_description{
// font-size: 1.2em;
// }
//
// .home a.tile.tile_badge > div > div > div.tile_decoration > span.icon {
// font-size: 6em;
// }
//}
/********************/
/* Modules settings */
/********************/
@@ -489,13 +294,7 @@ footer{
#main-header-actions{
margin-bottom: 15px;
}
/* This is no longer necessary but we keep it just in case */
/*#main-header-actions .btn-group .btn{
padding: 0em 1.5em;
line-height: 2.4em;
font-size: 14px;
background-image: none;
}*/
@media (min-width: 768px) {
#main-header:after{
clear: both;
@@ -795,7 +594,6 @@ table .group-actions a.glyphicon-menu-hamburger{
& > .glyphicon{
margin-left: 0.5em;
font-size: 0.85em;
color: $combodo-orange;
transition: transform 0.2s linear;
}
& > .glyphicon.collapsed{

View File

@@ -1,3 +1,9 @@
@import 'common/main.scss';
/* Import shame first as we want to override some of its styles */
@import "shame";
@import "../utils/all";
@import "utils/all";
@import "pages/all";
@import "components/all";
@import "vendors/all";
@import "layout/all";
@import "shame";

View File

@@ -1,35 +1,22 @@
/*!
* Copyright (C) 2013-2024 Combodo SAS
*
* 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-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
@import 'variables.scss';
/*!
/*
* Combodo portal theme v2.7.0
* Based on Bootswatch Simplex
*/
/*!
/*
* bootswatch v3.3.5
* Homepage: http://bootswatch.com
* Copyright 2012-2015 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*/
/*!
/*
* Bootstrap v3.3.5 (http://getbootstrap.com)
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
@@ -49,10 +36,6 @@
html {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0)
}
body {
color: $text-color;
background-color: $body-bg;
}
input,
button,
select,
@@ -1374,15 +1357,6 @@ th {
.table-bordered>thead>tr>td {
border-bottom-width: 2px
}
.table-striped>tbody>tr:nth-of-type(odd) {
background-color: $table-bg-accent;
}
.table-striped>tbody>tr:hover {
background-color: $table-bg-hover;
}
.table-hover>tbody>tr:hover {
background-color: $table-bg-hover;
}
table col[class*="col-"] {
position: static;
float: none;
@@ -1394,111 +1368,6 @@ table th[class*="col-"] {
float: none;
display: table-cell
}
.table>thead>tr>td.active,
.table>tbody>tr>td.active,
.table>tfoot>tr>td.active,
.table>thead>tr>th.active,
.table>tbody>tr>th.active,
.table>tfoot>tr>th.active,
.table>thead>tr.active>td,
.table>tbody>tr.active>td,
.table>tfoot>tr.active>td,
.table>thead>tr.active>th,
.table>tbody>tr.active>th,
.table>tfoot>tr.active>th {
background-color: #f5f5f5
}
.table-hover>tbody>tr>td.active:hover,
.table-hover>tbody>tr>th.active:hover,
.table-hover>tbody>tr.active:hover>td,
.table-hover>tbody>tr:hover>.active,
.table-hover>tbody>tr.active:hover>th {
background-color: #e8e8e8
}
.table>thead>tr>td.success,
.table>tbody>tr>td.success,
.table>tfoot>tr>td.success,
.table>thead>tr>th.success,
.table>tbody>tr>th.success,
.table>tfoot>tr>th.success,
.table>thead>tr.success>td,
.table>tbody>tr.success>td,
.table>tfoot>tr.success>td,
.table>thead>tr.success>th,
.table>tbody>tr.success>th,
.table>tfoot>tr.success>th {
background-color: $state-success-bg
}
.table-hover>tbody>tr>td.success:hover,
.table-hover>tbody>tr>th.success:hover,
.table-hover>tbody>tr.success:hover>td,
.table-hover>tbody>tr:hover>.success,
.table-hover>tbody>tr.success:hover>th {
background-color: #d0e9c6
}
.table>thead>tr>td.info,
.table>tbody>tr>td.info,
.table>tfoot>tr>td.info,
.table>thead>tr>th.info,
.table>tbody>tr>th.info,
.table>tfoot>tr>th.info,
.table>thead>tr.info>td,
.table>tbody>tr.info>td,
.table>tfoot>tr.info>td,
.table>thead>tr.info>th,
.table>tbody>tr.info>th,
.table>tfoot>tr.info>th {
background-color: $state-info-bg
}
.table-hover>tbody>tr>td.info:hover,
.table-hover>tbody>tr>th.info:hover,
.table-hover>tbody>tr.info:hover>td,
.table-hover>tbody>tr:hover>.info,
.table-hover>tbody>tr.info:hover>th {
background-color: #c4e3f3
}
.table>thead>tr>td.warning,
.table>tbody>tr>td.warning,
.table>tfoot>tr>td.warning,
.table>thead>tr>th.warning,
.table>tbody>tr>th.warning,
.table>tfoot>tr>th.warning,
.table>thead>tr.warning>td,
.table>tbody>tr.warning>td,
.table>tfoot>tr.warning>td,
.table>thead>tr.warning>th,
.table>tbody>tr.warning>th,
.table>tfoot>tr.warning>th {
background-color: $state-warning-bg
}
.table-hover>tbody>tr>td.warning:hover,
.table-hover>tbody>tr>th.warning:hover,
.table-hover>tbody>tr.warning:hover>td,
.table-hover>tbody>tr:hover>.warning,
.table-hover>tbody>tr.warning:hover>th {
background-color: #faf2cc
}
.table>thead>tr>td.danger,
.table>tbody>tr>td.danger,
.table>tfoot>tr>td.danger,
.table>thead>tr>th.danger,
.table>tbody>tr>th.danger,
.table>tfoot>tr>th.danger,
.table>thead>tr.danger>td,
.table>tbody>tr.danger>td,
.table>tfoot>tr.danger>td,
.table>thead>tr.danger>th,
.table>tbody>tr.danger>th,
.table>tfoot>tr.danger>th {
background-color: $state-danger-bg
}
.table-hover>tbody>tr>td.danger:hover,
.table-hover>tbody>tr>th.danger:hover,
.table-hover>tbody>tr.danger:hover>td,
.table-hover>tbody>tr:hover>.danger,
.table-hover>tbody>tr.danger:hover>th {
background-color: #ebcccc
}
.table-responsive {
overflow-x: auto;
min-height: 0.01%
@@ -3165,31 +3034,16 @@ select[multiple].input-group-sm>.input-group-btn>.btn {
border: 1px solid #dddddd
}
@media (min-width: 768px) {
.nav-tabs.nav-justified>li>a {
.nav-tabs.nav-justified > li > a {
border-bottom: 1px solid #dddddd;
border-radius: $border-radius-base $border-radius-base 0 0
}
.nav-tabs.nav-justified>.active>a,
.nav-tabs.nav-justified>.active>a:hover,
.nav-tabs.nav-justified>.active>a:focus {
.nav-tabs.nav-justified > .active > a,
.nav-tabs.nav-justified > .active > a:hover,
.nav-tabs.nav-justified > .active > a:focus {
border-bottom-color: #fcfcfc
}
}
.nav-pills>li {
float: left
}
.nav-pills>li>a {
border-radius: $border-radius-base
}
.nav-pills>li+li {
margin-left: 2px
}
.nav-pills>li.active>a,
.nav-pills>li.active>a:hover,
.nav-pills>li.active>a:focus {
color: #ffffff;
background-color: $brand-primary
}
.nav-stacked>li {
float: none
}
@@ -6082,37 +5936,6 @@ table.dataTable{
}
}
}
/* ManageBrick grouping tabs. Should be placed somewhere else? */
.grouping_tabs{
&.nav-pills > li > a{
color: #444;
background-color: #F5F5F5;
&:hover,
&:focus{
text-decoration: none;
background-color: #DDDDDD;
}
> .badge{
color: #ea7d1e;;
background-color: transparent;
}
}
&.nav-pills > li.active{
> a,
> a:hover,
> a:focus{
color: #444;
background-color: #FCFCFC;
}
}
}
/* Temp */
.label{

View File

@@ -1,4 +1,9 @@
/* SCSS variables */
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-alert--message--color: $ipb-body-text-color !default;
$ipb-alert--icon--font-size: $common-font-size-300 !default;
$ipb-alert--icon--width: 24px !default;
@@ -61,8 +66,8 @@ $ipb-alerts-colors: (
$icon: map-get($alert-color, "icon");
$background-color: common-adjust-alpha($color, .1);
.ipb-alert.alert-#{$name} {
background: linear-gradient(113deg, $background-color 0px, $background-color 60px, transparent 60px), white;
.ipb-alert.alert-#{$name}, .ipb-alert.ipb-is-#{$name} {
background: linear-gradient(113deg, $background-color 0px, $background-color 60px, transparent 60px), $ipb-alert--background-color;
border-left-color: $color;
&:before {

View File

@@ -1,7 +1,13 @@
@import "alert";
@import "button";
@import "caselog";
@import "datatables";
@import "dropdown";
@import "form";
@import "illustration";
@import "input";
@import "modal";
@import "nav";
@import "navigation-menu";
@import "panel";
@import "progress-bar";
@import "tile";

View File

@@ -1,33 +1,299 @@
/* SCSS variables */
$btn--border-radius: $common-border-radius-300 !default;
$btn--active--color: $common-color-white-100 !default;
$btn--active--background-color: $common-color-blue-grey-900 !default;
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
.btn{
border-radius: $btn--border-radius !important;
}
.btn.active{
background-color: #263238 !important;
color: $btn--active--color !important;
}
.btn-group .btn:first-child{
border-top-right-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
.btn-group .btn:last-child{
border-top-left-radius: 0 !important;
border-bottom-left-radius: 0 !important;
}
// todo
.btn.btn-secondary:hover {
color: unset;
}
.btn.btn-secondary:active {
color: unset;
/* SCSS variables (can be overloaded) */
$ipb-button-colors: (
'' : (
'primary': (
'': (
$ipb-color-blue-800,
$ipb-color-white-100,
$ipb-color-blue-900
),
':hover': (
$ipb-color-blue-700,
$ipb-color-white-100,
$ipb-color-blue-800
),
':active': (
$ipb-color-blue-900,
$ipb-color-white-100,
$ipb-color-blue-950
),
':disabled': (
$ipb-color-blue-200,
$ipb-color-blue-600,
$ipb-color-blue-300
),
),
'default': (
'': (
$ipb-color-white-100,
$ipb-color-grey-800,
$ipb-color-grey-600
),
':hover': (
$ipb-color-grey-100,
$ipb-color-grey-900,
$ipb-color-grey-700
),
':active': (
$ipb-color-grey-200,
$ipb-color-grey-900,
$ipb-color-grey-700
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
'success': (
'': (
$ipb-color-success-900,
$ipb-color-white-100,
$ipb-color-success-900
),
':hover': (
$ipb-color-success-800,
$ipb-color-green-100,
$ipb-color-success-900
),
':active': (
$ipb-color-success-950,
$ipb-color-green-100,
$ipb-color-success-950
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
'warning': (
'': (
$ipb-color-warning-700,
$ipb-color-white-100,
$ipb-color-warning-900
),
':hover': (
$ipb-color-warning-600,
$ipb-color-warning-100,
$ipb-color-warning-700
),
':active': (
$ipb-color-warning-800,
$ipb-color-warning-100,
$ipb-color-warning-900
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
'danger': (
'': (
$ipb-color-danger-800,
$ipb-color-white-100,
$ipb-color-danger-900
),
':hover': (
$ipb-color-danger-700,
$ipb-color-danger-100,
$ipb-color-danger-800
),
':active': (
$ipb-color-danger-900,
$ipb-color-danger-100,
$ipb-color-danger-950
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
'info': (
'': (
$ipb-color-information-800,
$ipb-color-white-100,
$ipb-color-information-900
),
':hover': (
$ipb-color-information-700,
$ipb-color-information-100,
$ipb-color-information-800
),
':active': (
$ipb-color-information-900,
$ipb-color-information-100,
$ipb-color-information-950
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
),
'alternative' : (
'primary': (
'': (
$ipb-color-transparent,
$ipb-color-blue-800,
$ipb-color-transparent
),
':hover': (
$ipb-color-blue-100,
$ipb-color-blue-900,
$ipb-color-blue-100
),
':active': (
$ipb-color-blue-200,
$ipb-color-blue-900,
$ipb-color-blue-200
),
':disabled': (
$ipb-color-blue-200,
$ipb-color-blue-600,
$ipb-color-blue-300
),
),
'default': (
'': (
$ipb-color-transparent,
$ipb-color-grey-800,
$ipb-color-transparent
),
':hover': (
$ipb-color-grey-200,
$ipb-color-grey-900,
$ipb-color-grey-200
),
':active': (
$ipb-color-grey-300,
$ipb-color-grey-900,
$ipb-color-grey-300
),
':disabled': (
$ipb-color-transparent,
$ipb-color-grey-500,
$ipb-color-transparent
),
),
'success': (
'': (
$ipb-color-transparent,
$ipb-color-success-900,
$ipb-color-transparent
),
':hover': (
$ipb-color-success-100,
$ipb-color-success-900,
$ipb-color-success-100
),
':active': (
$ipb-color-success-200,
$ipb-color-success-900,
$ipb-color-success-200
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
'warning': (
'': (
$ipb-color-transparent,
$ipb-color-warning-800,
$ipb-color-transparent
),
':hover': (
$ipb-color-warning-100,
$ipb-color-warning-900,
$ipb-color-warning-100
),
':active': (
$ipb-color-warning-200,
$ipb-color-warning-900,
$ipb-color-warning-200
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
'danger': (
'': (
$ipb-color-transparent,
$ipb-color-danger-800,
$ipb-color-transparent
),
':hover': (
$ipb-color-danger-100,
$ipb-color-danger-800,
$ipb-color-danger-100
),
':active': (
$ipb-color-danger-200,
$ipb-color-danger-800,
$ipb-color-danger-200
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
'info': (
'': (
$ipb-color-transparent,
$ipb-color-information-800,
$ipb-color-transparent
),
':hover': (
$ipb-color-information-100,
$ipb-color-information-800,
$ipb-color-information-100
),
':active': (
$ipb-color-information-200,
$ipb-color-information-800,
$ipb-color-information-200
),
':disabled': (
$ipb-color-grey-200,
$ipb-color-grey-700,
$ipb-color-grey-300
),
),
),
) !default;
$ipb-button--background-color: $ipb-color-white-100 !default;
$ipb-button--color: $ipb-color-blue-800 !default;
$ipb-button--border-color:$ipb-color-blue-700 !default;
$ipb-button--border: solid 1px $ipb-button--border-color !default;
.ipb-button, .btn{
background-color: $ipb-button--background-color !important;
color: $ipb-button--color !important;
border: $ipb-button--border;
@each $sType, $aColors in $ipb-button-colors {
@each $sColor, $sPseudoClasses in $aColors {
@each $sPseudoClass, $sAttributes in $sPseudoClasses {
&.ipb-is-#{$sColor}#{if($sType != '', ".ipb-is-#{$sType}", '')}#{$sPseudoClass}, &.btn-#{$sColor}#{if($sType != '', ".#{$sType}", '')}#{$sPseudoClass} {
background-color: nth($sAttributes, 1) !important;
color: nth($sAttributes, 2) !important;
border-color: nth($sAttributes, 3) !important;
}
}
}
}
}

View File

@@ -0,0 +1,285 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$messaging-self-primary-color: $ipb-color-blue-100 !default;
$messaging-self-secondary-color: $ipb-color-blue-800 !default;
$messaging-1st-peer-primary-color: $ipb-color-white-100 !default;
$messaging-1st-peer-secondary-color: $ipb-color-grey-400 !default;
$messaging-2nd-peer-primary-color: $ipb-color-white-100 !default;
$messaging-2nd-peer-secondary-color: $ipb-color-grey-400 !default;
$messaging-2nd-peer-secondary-color: $ipb-color-grey-400 !default;
$messaging-3rd-peer-primary-color: $ipb-color-white-100 !default;
$messaging-3rd-peer-secondary-color: $ipb-color-grey-300 !default;
$messaging-4th-peer-primary-color: $ipb-color-white-100 !default;
$messaging-4th-peer-secondary-color: $ipb-color-grey-400 !default;
$messaging-5th-peer-primary-color: $ipb-color-white-100 !default;
$messaging-5th-peer-secondary-color: $ipb-color-grey-400 !default;
$ipb-caselog-thread--border-color: $ipb-color-grey-400 !default;
$ipb-caselog-thread--border: 1px solid $ipb-caselog-thread--border-color !default;
$ipb-caselog-thread--header--background-color: $ipb-color-white-100 !default;
$ipb-caselog-thread--header--span--color: $ipb-color-grey-800 !default;
$ipb-caselog-thread--header-toggler--color: inherit !default;
$ipb-caselog-thread--header-toggler--hover--active-focus--color: inherit !default;
$ipb-caselog-thread--content--background-color: $ipb-color-grey-100 !default;
$ipb-caselog-thread--date--color: $ipb-color-grey-800 !default;
$ipb-caselog-thread--block-medallion--block-entries--border-color: $ipb-color-grey-200 !default;
$ipb-caselog-thread--block-medallion--block-entries--border: 1px solid $ipb-caselog-thread--block-medallion--block-entries--border-color !default;
$ipb-caselog-thread--block-medallion--color: $ipb-color-blue-800 !default;
$ipb-caselog-thread--block-medallion--background-color: $ipb-color-blue-100 !default;
$ipb-caselog-thread--block-user--color: $ipb-caselog-thread--block-medallion--color !default;
$ipb-caselog-thread--block-entries--background-color: $ipb-caselog-thread--block-medallion--background-color !default;
$ipb-caselog-thread--block-entries--color: $ipb-caselog-thread--block-medallion--color !default;
$ipb-caselog-thread--block-entry--border-bottom-color: $ipb-color-grey-200 !default;
$ipb-caselog-thread--block-entry--border-bottom: 1px solid $ipb-caselog-thread--block-entry--border-bottom-color !default;
$ipb-caselog-thread--block-entry-toggler--background-color: $ipb-caselog-thread--block-medallion--background-color !default;
$ipb-caselog-thread--block-me--block-entry--first--content--border-left-color: transparent !default;
$ipb-caselog-thread--block-me--block-entry--first--content--border-right-color: $ipb-caselog-thread--block-medallion--background-color !default;
$ipb-caselog-thread--block-colors: (
1: ($ipb-color-white-100, $ipb-color-grey-700),
2: ($ipb-color-white-100, $ipb-color-grey-700),
3: ($ipb-color-white-100, $ipb-color-grey-700),
4: ($ipb-color-white-100, $ipb-color-grey-700),
5: ($ipb-color-white-100, $ipb-color-grey-700)
);
.ipb-caselog-thread {
border: $ipb-caselog-thread--border;
}
.ipb-caselog-thread--header{
background-color: $ipb-caselog-thread--header--background-color;
span{
color: $ipb-caselog-thread--header--span--color;
}
}
.ipb-caselog-thread--header-toggler{
color: $ipb-caselog-thread--header-toggler--color;
&:hover,
&:active,
&:focus{
color: $ipb-caselog-thread--header-toggler--hover--active-focus--color;
}
}
.ipb-caselog-thread--block-medallion,
.ipb-caselog-thread--block-entries{
border: $ipb-caselog-thread--block-medallion--block-entries--border;
}
.ipb-caselog-thread--content{
background-color: $ipb-caselog-thread--content--background-color;
}
.ipb-caselog-thread--date {
color: $ipb-caselog-thread--date--color;
}
.ipb-caselog-thread--block-medallion{
color: $ipb-caselog-thread--block-medallion--color; /* .ipb-caselog-thread--block-entries color */
background-color: $ipb-caselog-thread--block-medallion--background-color; /* .ipb-caselog-thread--block-entries background-color */
}
.ipb-caselog-thread--block-user{
color: $ipb-caselog-thread--block-user--color; /* .ipb-caselog-thread--block-entries background-color */
}
.ipb-caselog-thread--block-entries{
background-color: $ipb-caselog-thread--block-entries--background-color;
color: $ipb-caselog-thread--block-entries--color;
}
.ipb-caselog-thread--block-entry {
border-bottom: $ipb-caselog-thread--block-entry--border-bottom;
}
.ipb-caselog-thread--block-entry-toggler{
background-color: $ipb-caselog-thread--block-entry-toggler--background-color; /* .ipb-caselog-thread--block-entries background-color */
}
.ipb-caselog-thread--block-me{
.ipb-caselog-thread--block-entries{
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-right-color: $ipb-caselog-thread--block-me--block-entry--first--content--border-left-color;
border-left-color: $ipb-caselog-thread--block-me--block-entry--first--content--border-right-color; /* .ipb-caselog-thread--block-entries background-color */
}
}
}
}
.ipb-caselog-thread--block-color-1{
.ipb-caselog-thread--block-medallion{
color: $messaging-1st-peer-secondary-color;
background-color: $messaging-1st-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-1st-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-1st-peer-secondary-color;
background-color: $messaging-1st-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-1st-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-1st-peer-primary-color;
border-right-color: $messaging-1st-peer-primary-color;
}
}
}
}
.ipb-caselog-thread--block-color-2{
.ipb-caselog-thread--block-medallion{
color: $messaging-2nd-peer-secondary-color;
background-color: $messaging-2nd-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-2nd-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-2nd-peer-secondary-color;
background-color: $messaging-2nd-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-2nd-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-2nd-peer-primary-color;
border-right-color: $messaging-2nd-peer-primary-color;
}
}
}
}
.ipb-caselog-thread--block-color-3{
.ipb-caselog-thread--block-medallion{
color: $messaging-3rd-peer-secondary-color;
background-color: $messaging-3rd-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-3rd-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-3rd-peer-secondary-color;
background-color: $messaging-3rd-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-3rd-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-3rd-peer-primary-color;
border-right-color: $messaging-3rd-peer-primary-color;
}
}
}
}
.ipb-caselog-thread--block-color-4{
.ipb-caselog-thread--block-medallion{
color: $messaging-4th-peer-secondary-color;
background-color: $messaging-4th-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-4th-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-4th-peer-secondary-color;
background-color: $messaging-4th-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-4th-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-4th-peer-primary-color;
border-right-color: $messaging-4th-peer-primary-color;
}
}
}
}
.ipb-caselog-thread--block-color-5{
.ipb-caselog-thread--block-medallion{
color: $messaging-5th-peer-secondary-color;
background-color: $messaging-5th-peer-primary-color;
}
.ipb-caselog-thread--block-user{
color: $messaging-5th-peer-primary-color;
}
.ipb-caselog-thread--block-entries{
color: $messaging-5th-peer-secondary-color;
background-color: $messaging-5th-peer-primary-color;
.ipb-caselog-thread--block-entry{
.ipb-caselog-thread--block-entry-toggler{
background-color: $messaging-5th-peer-primary-color;
}
}
.ipb-caselog-thread--block-entry:first-child{
.ipb-caselog-thread--block-entry-content:before{
border-top-color: $messaging-5th-peer-primary-color;
border-right-color: $messaging-5th-peer-primary-color;
}
}
}
}
@each $index, $colors in $ipb-caselog-thread--block-colors {
.ipb-caselog-thread--block-color-#{$index} {
.ipb-caselog-thread--block-medallion {
color: nth($colors, 2);
background-color: nth($colors, 1);
}
.ipb-caselog-thread--block-user {
color: nth($colors, 1);
}
.ipb-caselog-thread--block-entries {
color: nth($colors, 2);
background-color: nth($colors, 1);
.ipb-caselog-thread--block-entry {
.ipb-caselog-thread--block-entry-toggler {
background-color: nth($colors, 1);
}
}
.ipb-caselog-thread--block-entry:first-child {
.ipb-caselog-thread--block-entry-content:before {
border-top-color: nth($colors, 1);
border-right-color: nth($colors, 1);
}
}
}
}
}

View File

@@ -1,3 +1,9 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ibo-vendors-datatables--column-sorting-icon--opacity: 0.3 !default;
$ibo-vendors-datatables--column-sorting-icon--opacity--is-sorted: 1 !default;
$ibo-vendors-datatables--column-sorting-icon--content: "\f0dc" !default;

View File

@@ -0,0 +1,33 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-dropdown--background-color: $ipb-color-white-100 !default;
$ipb-dropdown--border-color: $ipb-color-grey-300 !default;
$ipb-dropdown--border: 1px solid $ipb-dropdown--border-color !default;
$ipb-dropdown--li--background-color: $ipb-dropdown--background-color !default;
$ipb-dropdown--a--color: $ipb-color-grey-900 !default;
$ipb-dropdown--li--hover--background-color: $ipb-color-grey-200 !default;
$ipb-dropdown--li--hover--a--color: $ipb-color-grey-800 !default;
ipb-dropdown {
background-color: $ipb-dropdown--background-color;
border: $ipb-dropdown--border;
li {
background-color: $ipb-dropdown--li--background-color;
a {
color: $ipb-dropdown--a--color;
}
&:hover {
background: $ipb-dropdown--li--hover--background-color;
a {
color: $ipb-dropdown--li--hover--a--color;
}
}
}
}

View File

@@ -0,0 +1,45 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb--fieldset--background-color: $ipb-color-grey-50 !default;
$ipb--fieldset--border-color: $ipb-color-grey-200 !default;
$ipb--fieldset--border: 1px solid $ipb--fieldset--border-color !default;
$ipb--fieldset--inside--fieldset--background-color: $ipb-color-grey-100 !default;
$ipb-field--has-tooltip--content: "\f05a" !default;
$ipb-field--has-tooltip--color: $ipb-color-grey-700 !default;
$ipb-field--is-mandatory--content: "\f069" !default;
$ipb-field--is-mandatory--color: $ipb-color-primary-700 !default;
$ipb-form--linkedset--toggler--color: $ipb-color-primary-700 !default;
.form_fields {
fieldset {
background-color: $ipb--fieldset--background-color;
border: $ipb--fieldset--border;
fieldset {
background-color: $ipb--fieldset--inside--fieldset--background-color;
}
}
}
.form_field_label > .control-label[data-tooltip-instantiated="true"]:after {
content: $ipb-field--has-tooltip--content;
color: $ipb-field--has-tooltip--color;
}
.form_field .form_mandatory .control-label:after{
content: $ipb-field--is-mandatory--content;
color: $ipb-field--is-mandatory--color;
};
.form_linkedset_toggler, .form_upload_toggler {
& > .glyphicon{
color: $ipb-form--linkedset--toggler--color;
}
}

View File

@@ -0,0 +1,11 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-svg-illustration--fill: $ipb-color-primary-700 !default;
.ipb-svg-illustration--container > svg *[fill="#6c63ff"]{
fill: $ipb-svg-illustration--fill;
}

View File

@@ -1,7 +1,27 @@
/* SCSS variables */
$form-control--border-radius: $common-border-radius-300 !default;
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-form-control--color: $common-color-grey-800 !default;
$ipb-form-control--is-focused--border-color: $common-color-primary-700 !default;
$ipb-input-group-addon--border-color: $ipb-color-grey-300 !default;
$ipb-input-group-addon--border: 1px solid $ipb-input-group-addon--border-color !default;
$ipb-input-group-addon--background-color: $common-color-grey-100 !default;
$ipb-input-group-addon--color: $common-color-grey-800 !default;
.form-control {
border-radius: $form-control--border-radius!important;
color: $ipb-form-control--color;
&:focus {
border-color: $ipb-form-control--is-focused--border-color;
}
}
.input-group-addon {
border: $ipb-input-group-addon--border;
background-color: $ipb-input-group-addon--background-color;
color: $ipb-input-group-addon--color;
}

View File

@@ -0,0 +1,62 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-modal--header--background-color: $ipb-color-white-100 !default;
$ipb-modal--header--color: $ipb-color-grey-900 !default;
$ipb-modal--header--close--color: $ipb-color-grey-900 !default;
$ipb-modal--header--close--opacity: 1 !default;
$ipb-modal--header--close--hover--color: $ipb-color-grey-700 !default;
$ipb-modal--backdrop--opacity: 0.6 !default;
$ipb-modal--backdrop--background-color: $ipb-color-blue-grey-800 !default;
$ipb-modal--backdrop--backdrop-filter: blur(2px) !default;
$ipb-modal--content--border-color: $ipb-color-grey-400 !default;
$ipb-modal--content--border: 1px solid $ipb-modal--content--border-color !default;
$ipb-modal--title--color: $ipb-modal--header--color !default;
$ipb-modal--title--span--separator--background-color: $ipb-color-grey-800 !default;
.modal .modal-dialog{
.modal-header {
background-color: $ipb-modal--header--background-color;
color: $ipb-modal--header--color;
}
}
.modal-backdrop.in {
background-color: common-adjust-alpha($ipb-modal--backdrop--background-color, $ipb-modal--backdrop--opacity);
backdrop-filter: $ipb-modal--backdrop--backdrop-filter;
}
.modal-content {
border: $ipb-modal--content--border;
}
.modal-header {
.close {
color: $ipb-modal--header--close--color;
opacity: $ipb-modal--header--close--opacity;
&:hover {
color: $ipb-modal--header--close--hover--color;
}
}
}
.modal-title {
color: $ipb-modal--title--color !important;
span ~ span {
&:before {
background-color: $ipb-modal--title--span--separator--background-color;
}
}
}

View File

@@ -1,4 +1,9 @@
/* SCSS variables */
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$nav-pills--li--border-radius: $common-border-radius-300 !default;
.nav-pills > li > a{

View File

@@ -1,10 +0,0 @@
.nav > li {
display: flex;
}
.nav > li > a {
display: flex;
}
.navbar-default .navbar-nav > li > a {
color: $common-color-grey-300;
}

View File

@@ -1,8 +1,27 @@
/* SCSS variables */
$panel--border-radius: $common-border-radius-300!default;
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-panel--border-color: $ipb-color-grey-400 !default;
$ipb-panel--border: 1px solid $ipb-panel--border-color !default;
$ipb-panel--background-color: $ipb-color-white-100 !default;
$ipb-panel--heading--border-color: $ipb-color-grey-400 !default;
$ipb-panel--heading--background-color: $ipb-color-grey-100 !default;
$ipb-panel--heading--color: $ipb-color-grey-800 !default;
.panel{
.ipb-panel, .panel{
box-shadow: none;
border: $ipb-panel--border;
background-color: $ipb-panel--background-color;
&.panel-default .panel-heading {
border-color: $ipb-panel--heading--border-color;
background-color: $ipb-panel--heading--background-color;
color: $ipb-panel--heading--color;
}
}

View File

@@ -0,0 +1,14 @@
$ipb-progress--background-color: $ipb-color-grey-200 !default;
$ipb-progress--bar--background-color: $ipb-color-primary-700 !default;
$ipb-progress--bar--color: $ipb-color-white-100 !default;
.ipb-progress, .progress {
background-color: $ipb-progress--background-color;
}
.ipb-progress--bar, .progress-bar {
background-color: $ipb-color-primary-700;
color: $ipb-progress--bar--color;
}

View File

@@ -0,0 +1,61 @@
/*
* @copyright Copyright (C) 2010-2025 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables (can be overloaded) */
$ipb-tile--background-color: $ipb-color-white-100 !default;
$ipb-tile--border-color: $ipb-color-grey-200 !default;
$ipb-tile--border: 1px solid $ipb-tile--border-color!default;
$ipb-tile--decoration--opacity: 0.1 !default;
$ipb-tile--decoration--background-color: common-adjust-alpha($ipb-color-blue-700, $ipb-tile--decoration--opacity) !default;
$ipb-tile--decoration--hover--opacity: 0.25 !default;
$ipb-tile--decoration--hover--background-color: common-adjust-alpha($ipb-tile--decoration--background-color, $ipb-tile--decoration--hover--opacity) !default;
$ipb-tile--decoration--icon--color: $ipb-color-blue-700 !default;
$ipb-tile--title--color: $common-base-variable--text-color !default;
$ipb-tile--description--color: $common-base-variable--text-color !default;
.ipb-tile{
background-color: $ipb-tile--background-color;
border: $ipb-tile--border;
&[data-role="navigation-trigger"] {
@include ipb-heavy-animated-border;
}
}
.ipb-tile--decoration {
background-color: $ipb-tile--decoration--background-color;
}
.ipb-tile:hover {
.ipb-tile--decoration {
background-color: $ipb-tile--decoration--hover--background-color;
}
}
.ipb-tile--decoration--icon {
&.icon {
color: $ipb-tile--decoration--icon--color;
}
}
.ipb-tile--title{
color: $ipb-tile--title--color;
}
.ipb-tile--description{
color: $ipb-tile--description--color;
}
.ipb-tile--manage .ipb-tile--title {
> span:first-child {
@include ipb-text-overflow-ellipsis;
}
> span:nth-child(2) {
@include ipb-following-dot;
}
}

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