Merge remote-tracking branch 'origin/develop' into feature/backoffice-full-moon-design

# Conflicts:
#	application/ajaxwebpage.class.inc.php
#	application/csvpage.class.inc.php
#	application/displayblock.class.inc.php
#	application/itopwebpage.class.inc.php
#	application/utils.inc.php
#	application/webpage.class.inc.php
#	application/xmlpage.class.inc.php
#	datamodels/2.x/itop-config-mgmt/datamodel.itop-config-mgmt.xml
#	datamodels/2.x/itop-knownerror-light/datamodel.itop-knownerror-light.xml
#	datamodels/2.x/itop-service-mgmt/datamodel.itop-service-mgmt.xml
#	datamodels/2.x/itop-tickets/datamodel.itop-tickets.xml
#	js/components/breadcrumbs.js
#	pages/navigator.php
#	test/core/DBSearchTest.php
This commit is contained in:
Molkobain
2020-10-07 11:25:47 +02:00
274 changed files with 22153 additions and 19640 deletions

View File

@@ -277,9 +277,6 @@
<item id="contacts_list">
<rank>130</rank>
</item>
<item id="functionalcis_list">
<rank>140</rank>
</item>
<item id="workorders_list">
<rank>150</rank>
</item>
@@ -464,115 +461,6 @@
</list>
</presentation>
</class>
<class id="lnkFunctionalCIToTicket" _delta="define">
<parent>cmdbAbstractObject</parent>
<properties>
<is_link>1</is_link>
<category>bizmodel</category>
<abstract>false</abstract>
<key_type>autoincrement</key_type>
<db_table>lnkfunctionalcitoticket</db_table>
<db_key_field>id</db_key_field>
<db_final_class_field/>
<naming>
<attributes>
<attribute id="ticket_id"/>
<attribute id="functionalci_id"/>
</attributes>
</naming>
<icon/>
<reconciliation>
<attributes>
<attribute id="ticket_id"/>
<attribute id="functionalci_id"/>
</attributes>
</reconciliation>
</properties>
<fields>
<field id="ticket_id" xsi:type="AttributeExternalKey">
<sql>ticket_id</sql>
<target_class>Ticket</target_class>
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_AUTO</on_target_delete>
</field>
<field id="ticket_ref" xsi:type="AttributeExternalField">
<extkey_attcode>ticket_id</extkey_attcode>
<target_attcode>ref</target_attcode>
</field>
<field id="ticket_title" xsi:type="AttributeExternalField">
<extkey_attcode>ticket_id</extkey_attcode>
<target_attcode>title</target_attcode>
</field>
<field id="functionalci_id" xsi:type="AttributeExternalKey">
<sql>functionalci_id</sql>
<target_class>FunctionalCI</target_class>
<is_null_allowed>false</is_null_allowed>
<on_target_delete>DEL_AUTO</on_target_delete>
</field>
<field id="functionalci_name" xsi:type="AttributeExternalField">
<extkey_attcode>functionalci_id</extkey_attcode>
<target_attcode>name</target_attcode>
</field>
<field id="impact" xsi:type="AttributeString">
<sql>impact</sql>
<default_value/>
<is_null_allowed>true</is_null_allowed>
</field>
<field id="impact_code" xsi:type="AttributeEnum">
<values>
<value id="manual">manual</value>
<value id="computed">computed</value>
<value id="not_impacted">not_impacted</value>
</values>
<sql>impact_code</sql>
<default_value>manual</default_value>
<is_null_allowed>false</is_null_allowed>
<display_style>list</display_style>
</field>
</fields>
<methods/>
<presentation>
<details>
<items>
<item id="ticket_id">
<rank>10</rank>
</item>
<item id="functionalci_id">
<rank>20</rank>
</item>
<item id="impact_code">
<rank>30</rank>
</item>
</items>
</details>
<search>
<items>
<item id="ticket_id">
<rank>10</rank>
</item>
<item id="functionalci_id">
<rank>20</rank>
</item>
<item id="impact_code">
<rank>30</rank>
</item>
</items>
</search>
<list>
<items>
<item id="ticket_id">
<rank>10</rank>
</item>
<item id="functionalci_id">
<rank>20</rank>
</item>
<item id="impact_code">
<rank>30</rank>
</item>
</items>
</list>
</presentation>
</class>
<class id="WorkOrder" _delta="define">
<parent>cmdbAbstractObject</parent>
<properties>
@@ -799,6 +687,39 @@
</list>
</presentation>
</class>
<class id="Document" _delta="must_exist">
<fields>
<field id="contracts_list" xsi:type="AttributeLinkedSetIndirect" _delta="define">
<linked_class>lnkContractToDocument</linked_class>
<ext_key_to_me>document_id</ext_key_to_me>
<count_min>0</count_min>
<count_max>0</count_max>
<ext_key_to_remote>contract_id</ext_key_to_remote>
<duplicates/>
</field>
<field id="services_list" xsi:type="AttributeLinkedSetIndirect" _delta="define">
<linked_class>lnkDocumentToService</linked_class>
<ext_key_to_me>document_id</ext_key_to_me>
<count_min>0</count_min>
<count_max>0</count_max>
<ext_key_to_remote>service_id</ext_key_to_remote>
<duplicates/>
</field>
</fields>
<methods/>
<presentation>
<details>
<items>
<item id="contracts_list" _delta="define">
<rank>70</rank>
</item>
<item id="services_list" _delta="define">
<rank>80</rank>
</item>
</items>
</details>
</presentation>
</class>
</classes>
<meta>
<classes>
@@ -815,77 +736,9 @@
</classes>
</meta>
<module_designs>
<module_design id="itop-portal" xsi:type="portal" _delta="define">
<properties>
<name>portal:itop-portal</name>
<!-- Can be either a fileref or a relative path to the file (To be tested). Takes over env-xxx/branding/portal-logo.png -->
<!-- Priority order is <logo> from xml > env-xxx/branding/portal-logo.png > /images/logo-itop-dark-bg.svg -->
<!--<fileref ref="brt_6a2be154b2a62659d3332c513bdad715" />-->
<!--<logo>../images/itop-logo.png</logo>-->
<!-- Can be either a fileref or a relative path to the file from /env-xxx (eg. itop-portal-base/mystyle.css) -->
<!-- Available themes must have a unique id. Some ids are loaded in a specific order : bootstrap/portal/custom. Other ids are loaded after them, but their order cannot be predicted -->
<themes/>
<!-- Can be either a fileref or a relative path to the file from /env-xxx (eg. itop-portal-base/mytemplate.html.twig) -->
<!-- Available templates are id="layout|home" -->
<templates/>
<!-- Class used for generating objects view/edit urls (eg. in linked sets). -->
<!-- Note: Notification placeholders are NOT using this but the "DBObject::RegisterURLMakerClass(<PORTAL_ID>, <CLASS_NAME>)" declarations. -->
<urlmaker_class>iTopPortalViewUrlMaker</urlmaker_class>
<!-- An OQL query to determine which TriggerOnPortalUpdate to use within THIS instance of the portal. This is mostly needed to enable different triggers on several portal instances -->
<!-- Note : ":parent_classes" parameter is a reserved name that will be used for the current object class name (and its ancestors) -->
<triggers_query><![CDATA[SELECT TriggerOnPortalUpdate AS t WHERE t.target_class IN (:parent_classes)]]></triggers_query>
<attachments>
<allow_delete>true</allow_delete>
</attachments>
<allowed_portals>
<!-- Defines how other portals -allowed for the current user- will be opened. "tab" for a new tab, "self" for the current window -->
<opening_mode>tab</opening_mode>
</allowed_portals>
</properties>
<module_design id="itop-portal" xsi:type="portal" >
<bricks>
<brick id="user-profile" xsi:type="Combodo\iTop\Portal\Brick\UserProfileBrick">
<rank>
<!-- Can be either a <default> tag for both home page and navigation menu or distinct <home> or/and <navigation_menu> tags-->
<default>1</default>
</rank>
<title>
<!-- Can be either a <default> tag for both home page and navigation menu or distinct <home> or/and <navigation_menu> tags-->
<default>Brick:Portal:UserProfile:Navigation:Dropdown:MyProfil</default>
</title>
<decoration_class>
<default>fas fa-user fa-2x</default>
</decoration_class>
<!-- Show / hide some of the user profile forms by setting the tag value to true|false -->
<!--<show_picture_form>true</show_picture_form>-->
<!--<show_preferences_form>true</show_preferences_form>-->
<!--<show_password_form>true</show_password_form>-->
<form>
<!-- Optional tag to list the fields. If empty only fields from <twig> tag will be displayed, if omitted fields from zlist details will. -->
<fields />
<!-- Optional tag to specify the form layout. Fields that are not positioned in the layout will be placed at the end of the form -->
<twig>
<!-- data-field-id attribute must be an attribute code of the class -->
<!-- data-field-flags attribute contains flags among read_only/hidden/mandatory/must_prompt/must_change -->
<div class="form_field" data-field-id="first_name" data-field-flags="read_only">
</div>
<div class="form_field" data-field-id="name" data-field-flags="read_only">
</div>
<div class="form_field" data-field-id="org_id" data-field-flags="read_only">
</div>
<div class="form_field" data-field-id="email" data-field-flags="read_only">
</div>
<div class="form_field" data-field-id="phone">
</div>
<div class="form_field" data-field-id="location_id">
</div>
<div class="form_field" data-field-id="function">
</div>
<div class="form_field" data-field-id="manager_id" data-field-flags="read_only">
</div>
</twig>
</form>
</brick>
<brick id="services" xsi:type="Combodo\iTop\Portal\Brick\BrowseBrick">
<brick id="services" xsi:type="Combodo\iTop\Portal\Brick\BrowseBrick" _delta="define">
<active>true</active>
<width>6</width>
<rank>
@@ -978,7 +831,7 @@
<data_loading>auto</data_loading>
<!-- lazy|full|auto. Let the consultant choose if the list/tree data are load progressively at each page/level or in one-shot or if it is up to the system regarding the "lazy_loading_threshold" parameter -->
</brick>
<brick id="ongoing-tickets-for-portal-user" xsi:type="Combodo\iTop\Portal\Brick\ManageBrick">
<brick id="ongoing-tickets-for-portal-user" xsi:type="Combodo\iTop\Portal\Brick\ManageBrick" _delta="define">
<active>true</active>
<rank>
<default>20</default>
@@ -989,16 +842,16 @@
</title>
<!-- Optional tag to define which display modes can be used in the brick's page and the brick's tile -->
<!--<display_modes>-->
<!-- Optional tag that must contain at least 1 <mode> tag. -->
<!--<availables>-->
<!--<mode id="list"/>-->
<!--<mode id="pie-chart"/>-->
<!--<mode id="bar-chart"/>-->
<!--</availables>-->
<!-- Optional tag to define which display mode will be used by default when opening the brick -->
<!--<default>list</default>-->
<!-- Optional tag to define which display mode will be used to render the brick's tile -->
<!--<tile>text</tile>-->
<!-- Optional tag that must contain at least 1 <mode> tag. -->
<!--<availables>-->
<!--<mode id="list"/>-->
<!--<mode id="pie-chart"/>-->
<!--<mode id="bar-chart"/>-->
<!--</availables>-->
<!-- Optional tag to define which display mode will be used by default when opening the brick -->
<!--<default>list</default>-->
<!-- Optional tag to define which display mode will be used to render the brick's tile -->
<!--<tile>text</tile>-->
<!--</display_modes>-->
<description>Brick:Portal:OngoingRequests:Title+</description>
<decoration_class>
@@ -1051,10 +904,10 @@
<!-- <default_list_length>20</default_list_length> -->
<data_loading>full</data_loading>
<export>
<export_default_fields>true</export_default_fields>
</export>
<export_default_fields>true</export_default_fields>
</export>
</brick>
<brick id="closed-tickets-for-portal-user" xsi:type="Combodo\iTop\Portal\Brick\ManageBrick">
<brick id="closed-tickets-for-portal-user" xsi:type="Combodo\iTop\Portal\Brick\ManageBrick" _delta="define">
<active>true</active>
<rank>
<navigation_menu>50</navigation_menu>
@@ -1098,12 +951,12 @@
</grouping>
<data_loading>auto</data_loading>
<export>
<export_default_fields>true</export_default_fields>
</export>
<export_default_fields>true</export_default_fields>
</export>
</brick>
</bricks>
<forms>
<form id="service-view">
<form id="service-view" _delta="define">
<class>Service</class>
<fields></fields>
<twig>
@@ -1128,7 +981,7 @@
<mode id="view" />
</modes>
</form>
<form id="servicesubcategory">
<form id="servicesubcategory" _delta="define">
<class>ServiceSubcategory</class>
<!-- Optional tag to list the fields. If empty only fields from <twig> tag will be displayed, if omitted fields from zlist details will. -->
<fields />
@@ -1158,7 +1011,7 @@
</div>
</twig>
</form>
<form id="ticket-create">
<form id="ticket-create" _delta="define">
<class>Ticket</class>
<properties>
<navigation_rules>
@@ -1205,7 +1058,7 @@
<mode id="create"/>
</modes>
</form>
<form id="ticket-edit">
<form id="ticket-edit" _delta="define">
<class>Ticket</class>
<properties>
<!-- Optional, display mode of the form fields. "cosy" for a regular labels over values layout; "compact" for a side-by-side
@@ -1216,10 +1069,10 @@
<!--<always_show_submit>false</always_show_submit>-->
<!-- Optional, navigation rules to define where to go when clicking on the submit/cancel buttons of the form -->
<navigation_rules>
<submit>
<default>go-to-open-requests</default>
</submit>
</navigation_rules>
<submit>
<default>go-to-open-requests</default>
</submit>
</navigation_rules>
</properties>
<fields></fields>
<twig>
@@ -1275,14 +1128,14 @@
<mode id="view"/>
</modes>
</form>
<form id="ticket-reopen">
<form id="ticket-reopen" _delta="define">
<class>Ticket</class>
<properties>
<navigation_rules>
<submit>
<default>go-to-open-requests</default>
</submit>
</navigation_rules>
<submit>
<default>go-to-open-requests</default>
</submit>
</navigation_rules>
</properties>
<fields />
<twig>
@@ -1295,19 +1148,19 @@
<modes>
<mode id="apply_stimulus">
<stimuli>
<stimulus id="ev_reopen"/>
</stimuli>
</mode>
<stimulus id="ev_reopen"/>
</stimuli>
</mode>
</modes>
</form>
<form id="ticket-apply-stimulus">
<form id="ticket-apply-stimulus" _delta="define">
<class>Ticket</class>
<properties>
<navigation_rules>
<submit>
<default>go-to-open-requests</default>
</submit>
</navigation_rules>
<submit>
<default>go-to-open-requests</default>
</submit>
</navigation_rules>
</properties>
<fields />
<twig />
@@ -1315,7 +1168,7 @@
<mode id="apply_stimulus"/>
</modes>
</form>
<form id="person-view">
<form id="person-view" _delta="define">
<class>Person</class>
<fields />
<twig>
@@ -1346,64 +1199,7 @@
</forms>
<classes>
<!-- Note : A class (or one of its ancestors) MUST be declared here to be displayed in the portal -->
<class id="User">
<!-- Allow <allowed_profile>s to apply the <transition>s below. Flags on <field>s will be merged with those from datamodel -->
<!-- See example in UserRequest class -->
<!--<lifecycle/>-->
<scopes>
<!-- Note : Silos apply to those scope queries -->
<scope id="all">
<oql_view><![CDATA[SELECT User AS U JOIN Person AS P ON U.contactid=P.id WHERE P.id = :current_contact_id]]></oql_view>
<!-- No object of this class can be edited -->
<!--<oql_edit />-->
<!-- Everybody -->
<!--<allowed_profiles />-->
</scope>
</scopes>
</class>
<class id="Organization">
<scopes>
<scope id="all">
<oql_view><![CDATA[SELECT Organization WHERE id = :current_contact->org_id]]></oql_view>
</scope>
</scopes>
</class>
<class id="Location">
<scopes>
<scope id="all">
<oql_view><![CDATA[SELECT Location WHERE org_id = :current_contact->org_id]]></oql_view>
</scope>
</scopes>
</class>
<class id="Contact">
<scopes>
<scope id="all">
<oql_view><![CDATA[SELECT Contact WHERE org_id = :current_contact->org_id]]></oql_view>
</scope>
<scope id="admin">
<oql_view><![CDATA[SELECT Contact]]></oql_view>
<allowed_profiles>
<allowed_profile id="Administrator"/>
</allowed_profiles>
</scope>
</scopes>
<lists>
<list id="default">
<items>
<item id="status">
<rank>10</rank>
</item>
<item id="org_id">
<rank>20</rank>
</item>
<item id="function">
<rank>50</rank>
</item>
</items>
</list>
</lists>
</class>
<class id="ServiceFamily">
<class id="ServiceFamily" _delta="define">
<scopes>
<scope id="all">
<oql_view><![CDATA[SELECT ServiceFamily AS sf JOIN Service AS s ON s.servicefamily_id = sf.id JOIN lnkCustomerContractToService AS l1 ON l1.service_id=s.id JOIN CustomerContract AS cc ON l1.customercontract_id=cc.id WHERE cc.org_id = :current_contact->org_id]]></oql_view>
@@ -1411,7 +1207,7 @@
</scope>
</scopes>
</class>
<class id="Service">
<class id="Service" _delta="define">
<scopes>
<scope id="all">
<oql_view><![CDATA[SELECT Service AS s JOIN lnkCustomerContractToService AS l1 ON l1.service_id=s.id JOIN CustomerContract AS cc ON l1.customercontract_id=cc.id WHERE cc.org_id = :current_contact->org_id AND s.status != 'obsolete']]></oql_view>
@@ -1419,7 +1215,7 @@
</scope>
</scopes>
</class>
<class id="ServiceSubcategory">
<class id="ServiceSubcategory" _delta="define">
<scopes>
<scope id="all">
<oql_view><![CDATA[SELECT ServiceSubcategory AS ssc JOIN Service AS s ON ssc.service_id=s.id JOIN lnkCustomerContractToService AS l1 ON l1.service_id=s.id JOIN CustomerContract AS cc ON l1.customercontract_id=cc.id WHERE cc.org_id = :current_contact->org_id AND ssc.status != 'obsolete']]></oql_view>
@@ -1427,7 +1223,7 @@
</scope>
</scopes>
</class>
<class id="Ticket">
<class id="Ticket" _delta="define">
<scopes>
<scope id="all">
<oql_view><![CDATA[SELECT Ticket AS T WHERE T.caller_id = :current_contact_id AND T.finalclass IN ('UserRequest', 'Incident')]]></oql_view>
@@ -1444,7 +1240,7 @@
</class>
</classes>
<action_rules>
<action_rule id="contact-to-userrequest">
<action_rule id="contact-to-userrequest" _delta="define">
<!-- source_oql|source_class is only necessary if there is some copy preset|retrofit -->
<source_oql><![CDATA[SELECT Contact AS C WHERE C.id = :current_contact_id]]></source_oql>
<presets>
@@ -1455,13 +1251,13 @@
</presets>
<retrofits/>
</action_rule>
<action_rule id="service-to-userrequest">
<action_rule id="service-to-userrequest" _delta="define">
<source_class>Service</source_class>
<presets>
<preset id="1">copy(id, service_id)</preset>
</presets>
</action_rule>
<action_rule id="servicesubcategory-to-userrequest">
<action_rule id="servicesubcategory-to-userrequest" _delta="define">
<source_class>ServiceSubcategory</source_class>
<presets>
<preset id="1">copy(id, servicesubcategory_id)</preset>
@@ -1469,7 +1265,7 @@
</presets>
</action_rule>
<!-- Deprecated, will be removed in iTop 2.8 -->
<action_rule id="go-to-open-request-on-submit">
<action_rule id="go-to-open-request-on-submit" _delta="define">
<submit xsi:type="goto">
<brick>ongoing-tickets-for-portal-user</brick>
</submit>
@@ -1477,11 +1273,11 @@
</action_rules>
<navigation_rules>
<!-- Close form (either the modal or the whole page) -->
<navigation_rule id="close-form" xsi:type="close" />
<navigation_rule id="close-form" xsi:type="close" _delta="define"/>
<!-- Go to the homepage -->
<navigation_rule id="go-to-homepage" xsi:type="go-to-homepage" />
<navigation_rule id="go-to-homepage" xsi:type="go-to-homepage" _delta="define"/>
<!-- Open a manage brick (simple method) -->
<navigation_rule id="go-to-open-requests" xsi:type="go-to-manage-brick">
<navigation_rule id="go-to-open-requests" xsi:type="go-to-manage-brick" _delta="define">
<!-- Mandatory, ID of the ManageBrick to go to -->
<id>ongoing-tickets-for-portal-user</id>
<!-- Optional, must be an ID of the available display modes of the brick (//brick/display_modes/availables/mode) -->
@@ -1492,31 +1288,31 @@
<!-- <filter>:this->caller_id_friendlyname</filter> -->
</navigation_rule>
<!-- Open a browse brick -->
<navigation_rule id="go-to-services" xsi:type="go-to-browse-brick">
<!-- Mandatory, ID of the BrowseBrick to go to -->
<id>services</id>
<!-- Optional, must be an ID of the available browse modes of the brick (//brick/browse_modes/availables/mode) -->
<!-- <browse_mode>tree</browse_mode> -->
<!-- Optional, a string to preset as filter in the brick. ":this->XXX" can be used for the current object -->
<!-- <filter>computer</filter> -->
<navigation_rule id="go-to-services" xsi:type="go-to-browse-brick" _delta="define">
<!-- Mandatory, ID of the BrowseBrick to go to -->
<id>services</id>
<!-- Optional, must be an ID of the available browse modes of the brick (//brick/browse_modes/availables/mode) -->
<!-- <browse_mode>tree</browse_mode> -->
<!-- Optional, a string to preset as filter in the brick. ":this->XXX" can be used for the current object -->
<!-- <filter>computer</filter> -->
</navigation_rule>
<!-- Open a brick, developer method -->
<!-- <navigation_rule id="go-to-open-requests-alternate-way" xsi:type="go-to-brick"> -->
<!-- <route> -->
<!-- <id>p_manage_brick_display_as</id> -->
<!-- <params> -->
<!-- <param id="sBrickId">ongoing-tickets-for-portal-user</param> -->
<!-- <param id="sDisplayMode">pie-chart</param> -->
<!-- <param id="sGroupingTab">resolved</param> -->
<!-- </params> -->
<!-- </route> -->
<!-- <route> -->
<!-- <id>p_manage_brick_display_as</id> -->
<!-- <params> -->
<!-- <param id="sBrickId">ongoing-tickets-for-portal-user</param> -->
<!-- <param id="sDisplayMode">pie-chart</param> -->
<!-- <param id="sGroupingTab">resolved</param> -->
<!-- </params> -->
<!-- </route> -->
<!-- </navigation_rule> -->
</navigation_rules>
</module_design>
</module_designs>
<module_parameters>
<parameters id="itop-portal" _delta="define">
<lazy_loading_threshold>500</lazy_loading_threshold><!-- Will be placed in the conf/<env>/config-itop.php file under the itop-portal module's settings -->
</navigation_rules>
</module_design>
</module_designs>
<module_parameters>
<parameters id="itop-portal" _delta="define">
<lazy_loading_threshold>500</lazy_loading_threshold><!-- Will be placed in the conf/<env>/config-itop.php file under the itop-portal module's settings -->
</parameters>
</module_parameters>
</itop_design>