N°2112 Remove legacy end-user portal

- Accessing the /portal URL redirects to the new portal (/pages/exec.php?exec_module=itop-portal-base&...)
- Removed /itop_design/portals/portal[@id="legacy_portal"] from standard datamodel, adapt your XML accordingly
- Removed /itop_design/constants/constant[@id^="PORTAL_"] from standard datamodel, adapt your XML accordingly
- Removed PortalWebPage & TransactionException classes
- Added a warning in setup when no portal is selected
This commit is contained in:
Molkobain
2019-07-16 11:15:27 +02:00
parent 9ed33f16dd
commit 83ba909c08
17 changed files with 42 additions and 2833 deletions

View File

@@ -1,14 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.6">
<portals>
<portal id="legacy_portal" _delta="define">
<url>portal/index.php</url>
<rank>1.0</rank>
<handler/>
<allow>
</allow>
<deny/>
</portal>
<portal id="backoffice" _delta="define">
<url>pages/UI.php</url>
<rank>2.0</rank>

File diff suppressed because it is too large Load Diff

View File

@@ -2732,6 +2732,13 @@ span.search-button, span.refresh-button {
overflow: auto;
border: #ccc 1px solid;
}
#setup .module-selection-body .wiz-choice:checked ~ .description #itop-ticket-mgmt-simple-ticket-enhanced-portal:not(:checked) ~ .description::after, #setup .module-selection-body .wiz-choice:checked ~ .description #itop-ticket-mgmt-itil-enhanced-portal:not(:checked) ~ .description::after {
content: "Legacy portal is no longer part of iTop, by leaving this option unchecked your portal users won't be able to access iTop anymore.";
display: block;
margin-top: 0.5em;
font-weight: bold;
color: rgba(230, 0, 0, 0.722);
}
.mfp-close {
cursor: pointer !important;
}

View File

@@ -3131,6 +3131,18 @@ span.search-button, span.refresh-button {
height: 28em;
overflow: auto;
border: #ccc 1px solid;
.wiz-choice:checked ~ .description{
#itop-ticket-mgmt-simple-ticket-enhanced-portal:not(:checked),
#itop-ticket-mgmt-itil-enhanced-portal:not(:checked){
~ .description::after {
content: "Legacy portal is no longer part of iTop, by leaving this option unchecked your portal users won't be able to access iTop anymore.";
display: block;
margin-top: 0.5em;
font-weight: bold;
color: #e60000b8;
}
}
}
}
}
.mfp-close {

View File

@@ -99,8 +99,8 @@
<options type="array">
<choice>
<extension_code>itop-ticket-mgmt-simple-ticket-enhanced-portal</extension_code>
<title>Enhanced Customer Portal</title>
<description>Replace the built-in customer portal with a more modern version, working better with hand-held devices and bringing new features</description>
<title>Customer Portal</title>
<description><![CDATA[Modern & responsive portal for the end-users]]></description>
<modules type="array">
<module>itop-portal</module>
<module>itop-portal-base</module>
@@ -134,8 +134,8 @@
</choice>
<choice>
<extension_code>itop-ticket-mgmt-itil-enhanced-portal</extension_code>
<title>Enhanced Customer Portal</title>
<description>Replace the built-in customer portal with a more modern version, working better with hand-held devices and bringing new features</description>
<title>Customer Portal</title>
<description><![CDATA[Modern & responsive portal for the end-users]]></description>
<modules type="array">
<module>itop-portal</module>
<module>itop-portal-base</module>

View File

@@ -1,17 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.6">
<constants>
<constant id="PORTAL_TYPE_TO_CLASS" xsi:type="string" _delta="redefine"><![CDATA[{"service_request":"UserRequest","incident":"Incident"}]]></constant>
<constant id="PORTAL_INCIDENT_PUBLIC_LOG" xsi:type="string" _delta="define"><![CDATA[public_log]]></constant>
<constant id="PORTAL_INCIDENT_USER_COMMENT" xsi:type="string" _delta="define"><![CDATA[user_comment]]></constant>
<constant id="PORTAL_INCIDENT_FORM_ATTRIBUTES" xsi:type="string" _delta="define"><![CDATA[title,description,impact,urgency]]></constant>
<constant id="PORTAL_INCIDENT_TYPE" xsi:type="string" _delta="define"><![CDATA[]]></constant>
<constant id="PORTAL_INCIDENT_LIST_ZLIST" xsi:type="string" _delta="define"><![CDATA[finalclass,title,start_date,status,servicesubcategory_id,priority,caller_id]]></constant>
<constant id="PORTAL_INCIDENT_CLOSED_ZLIST" xsi:type="string" _delta="define"><![CDATA[title,start_date,close_date,servicesubcategory_id]]></constant>
<constant id="PORTAL_INCIDENT_DETAILS_ZLIST" xsi:type="string" _delta="define"><![CDATA[{"col:left":["ref","caller_id","servicesubcategory_id","title","description","solution"],"col:right":["status","priority","start_date","resolution_date","last_update","agent_id"]}]]></constant>
<constant id="PORTAL_INCIDENT_DISPLAY_QUERY" xsi:type="string" _delta="define"><![CDATA[SELECT Incident WHERE org_id = :contact->org_id AND caller_id = :contact->id]]></constant>
<constant id="PORTAL_INCIDENT_DISPLAY_POWERUSER_QUERY" xsi:type="string" _delta="define"><![CDATA[SELECT Incident WHERE org_id = :contact->org_id]]></constant>
</constants>
<classes>
<class id="Incident" _delta="define">
<parent>Ticket</parent>

View File

@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.6">
<portals>
<portal id="legacy_portal" _delta="delete" /> <!-- TODO: voir si opportun de renommer au lieu de delete+define -->
<portal id="itop-portal" _delta="define"><!-- ID must match module_design[id] -->
<url>pages/exec.php?exec_module=itop-portal-base&amp;exec_page=index.php&amp;portal_id=itop-portal</url><!-- portal_id must match module_design[id] -->
<url>pages/exec.php?exec_module=itop-portal-base&amp;exec_page=index.php&amp;portal_id=itop-portal</url><!-- portal_id must match module_design[id] -->
<rank>1.0</rank>
<handler />
<allow>

View File

@@ -1,17 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.6">
<constants>
<constant id="PORTAL_TYPE_TO_CLASS" xsi:type="string" _delta="redefine"><![CDATA[{"service_request":"UserRequest","incident":"Incident"}]]></constant>
<constant id="PORTAL_USERREQUEST_PUBLIC_LOG" xsi:type="string" _delta="define"><![CDATA[public_log]]></constant>
<constant id="PORTAL_USERREQUEST_USER_COMMENT" xsi:type="string" _delta="define"><![CDATA[user_comment]]></constant>
<constant id="PORTAL_USERREQUEST_FORM_ATTRIBUTES" xsi:type="string" _delta="define"><![CDATA[title,description,impact,urgency]]></constant>
<constant id="PORTAL_USERREQUEST_TYPE" xsi:type="string" _delta="define"><![CDATA[]]></constant>
<constant id="PORTAL_USERREQUEST_LIST_ZLIST" xsi:type="string" _delta="define"><![CDATA[finalclass,title,start_date,status,servicesubcategory_id,priority,caller_id]]></constant>
<constant id="PORTAL_USERREQUEST_CLOSED_ZLIST" xsi:type="string" _delta="define"><![CDATA[title,start_date,close_date,servicesubcategory_id]]></constant>
<constant id="PORTAL_USERREQUEST_DETAILS_ZLIST" xsi:type="string" _delta="define"><![CDATA[{"col:left":["ref","caller_id","servicesubcategory_id","title","description","solution"],"col:right":["status","priority","start_date","resolution_date","last_update","agent_id"]}]]></constant>
<constant id="PORTAL_USERREQUEST_DISPLAY_QUERY" xsi:type="string" _delta="define"><![CDATA[SELECT UserRequest WHERE org_id = :contact->org_id AND caller_id = :contact->id]]></constant>
<constant id="PORTAL_USERREQUEST_DISPLAY_POWERUSER_QUERY" xsi:type="string" _delta="define"><![CDATA[SELECT UserRequest WHERE org_id = :contact->org_id]]></constant>
</constants>
<classes>
<class id="UserRequest" _delta="define">
<parent>Ticket</parent>

View File

@@ -1,23 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.6">
<constants>
<constant id="PORTAL_USERREQUEST_PUBLIC_LOG" xsi:type="string" _delta="define"><![CDATA[public_log]]></constant>
<constant id="PORTAL_USERREQUEST_USER_COMMENT" xsi:type="string" _delta="define">
<![CDATA[user_comment]]></constant>
<constant id="PORTAL_USERREQUEST_FORM_ATTRIBUTES" xsi:type="string" _delta="define">
<![CDATA[title,description,impact,urgency]]></constant>
<constant id="PORTAL_USERREQUEST_TYPE" xsi:type="string" _delta="define"><![CDATA[request_type]]></constant>
<constant id="PORTAL_USERREQUEST_LIST_ZLIST" xsi:type="string" _delta="define">
<![CDATA[finalclass,title,start_date,status,servicesubcategory_id,priority,caller_id]]></constant>
<constant id="PORTAL_USERREQUEST_CLOSED_ZLIST" xsi:type="string" _delta="define">
<![CDATA[title,start_date,close_date,servicesubcategory_id]]></constant>
<constant id="PORTAL_USERREQUEST_DETAILS_ZLIST" xsi:type="string" _delta="define">
<![CDATA[{"col:left":["ref","caller_id","servicesubcategory_id","title","description","solution"],"col:right":["status","priority","start_date","resolution_date","last_update","agent_id"]}]]></constant>
<constant id="PORTAL_USERREQUEST_DISPLAY_QUERY" xsi:type="string" _delta="define">
<![CDATA[SELECT UserRequest WHERE org_id = :contact->org_id AND caller_id = :contact->id]]></constant>
<constant id="PORTAL_USERREQUEST_DISPLAY_POWERUSER_QUERY" xsi:type="string" _delta="define">
<![CDATA[SELECT UserRequest WHERE org_id = :contact->org_id]]></constant>
</constants>
<classes>
<class id="UserRequest" _delta="define">
<parent>Ticket</parent>

View File

@@ -2,17 +2,6 @@
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.6">
<constants>
<constant id="RESPONSE_TICKET_SLT_QUERY" xsi:type="string" _delta="define"><![CDATA[SELECT SLT AS slt JOIN lnkSLAToSLT AS l1 ON l1.slt_id=slt.id JOIN SLA AS sla ON l1.sla_id=sla.id JOIN lnkCustomerContractToService AS l2 ON l2.sla_id=sla.id JOIN CustomerContract AS sc ON l2.customercontract_id=sc.id WHERE slt.metric = :metric AND l2.service_id = :this->service_id AND sc.org_id = :this->org_id AND slt.request_type = :request_type AND slt.priority = :this->priority]]></constant>
<constant id="PORTAL_POWER_USER_PROFILE" xsi:type="string" _delta="define"><![CDATA[Portal power user]]></constant>
<constant id="PORTAL_SERVICECATEGORY_QUERY" xsi:type="string" _delta="define"><![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 = :org_id AND s.status != 'obsolete']]></constant>
<constant id="PORTAL_SERVICE_SUBCATEGORY_QUERY" xsi:type="string" _delta="define"><![CDATA[SELECT ServiceSubcategory WHERE service_id = :svc_id AND ServiceSubcategory.status != 'obsolete']]></constant>
<constant id="PORTAL_VALIDATE_SERVICECATEGORY_QUERY" xsi:type="string" _delta="define"><![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 = :org_id AND s.id = :id AND s.status != 'obsolete']]></constant>
<constant id="PORTAL_VALIDATE_SERVICESUBCATEGORY_QUERY" xsi:type="string" _delta="define"><![CDATA[SELECT ServiceSubcategory AS Sub JOIN Service AS Svc ON Sub.service_id = Svc.id WHERE Sub.id=:id AND Sub.status != 'obsolete']]></constant>
<constant id="PORTAL_ALL_PARAMS" xsi:type="string" _delta="define"><![CDATA[from_service_id,org_id,caller_id,service_id,servicesubcategory_id,title,description,impact,emergency,moreinfo,caller_id,start_date,end_date,duration,impact_duration]]></constant>
<constant id="PORTAL_SET_TYPE_FROM" xsi:type="string" _delta="define"><![CDATA[request_type]]></constant>
<constant id="PORTAL_TYPE_TO_CLASS" xsi:type="string" _delta="define"><![CDATA[]]></constant>
<constant id="PORTAL_TICKETS_SEARCH_CRITERIA" xsi:type="string" _delta="define"><![CDATA[ref,start_date,close_date,service_id,caller_id]]></constant>
<constant id="PORTAL_TICKETS_SEARCH_FILTER_service_id" xsi:type="string" _delta="define"><![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 = :org_id AND s.status != 'obsolete']]></constant>
<constant id="PORTAL_TICKETS_SEARCH_FILTER_caller_id" xsi:type="string" _delta="define"><![CDATA[SELECT Person WHERE org_id = :org_id]]></constant>
</constants>
<classes>
<class id="Ticket" _delta="define">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 B

File diff suppressed because it is too large Load Diff

View File

@@ -1,237 +0,0 @@
html, body {
margin: 0;
padding:0;
overflow-y: auto;
font-family: Arial,Helvetica,Verdana,sans-serif;
font-size: 8pt;
}
#portal {
height: 100%;
}
#content {
margin: auto;
padding-left: 10px;
padding-right: 10px;
no.text-align: center;
overflow-y: auto;
max-width: 90%;
min-width: 960px;
position: relative;
display: block;
clear: both;
}
div#portal #welcome {
background: url("./images/dockbar_bg.png") repeat-x scroll 0 0 #97A1AE;
border-bottom: 1px solid #636364;
font-size: 13px;
padding: 1px 5px;
position: relative;
z-index: 300;
text-align:right;
color: #2C2F34;
font-weight: bold;
text-shadow: 1px 1px #FFFFFF;
}
div#portal #banner {
height: 116px;
display: block;
vertical-align:middle;
background-color: #f6f6f1;
background: none repeat scroll 0 0 transparent;
margin: 0 auto;
max-width: 90%;
min-width: 960px;
position: relative;
margin-bottom: 1em;
}
div#portal #logo {
background: url(./images/company_logo.png?v=2) 0 50% no-repeat;
margin-top:6px;
margin-bottom:6px;
margin-left:20px;
margin-right:20px;
height: 60px;
border: 0;
vertical-align: middle;
text-align: center;
display: block;
line-height: 116px;
}
#menu {
background: url("./images/bg.png") repeat-x scroll 0 0 #414445;
clear: both;
min-height: 2.4em;
line-height: 3em;
-moz-border-radius: 4px;
vertical-align: middle;
}
#portal_menu {
height: 60px;
}
div.button {
font-size: 1.1em;
font-weight: bold;
text-decoration: none;
}
a.button , a.button:visited {
line-height: 1.2em;
color: #FFFFFF;
font-size: 1.1em;
font-weight: bold;
text-decoration: none;
display: inline;
clear:both;
}
a.button:hover span {
background: #000;
}
a.button span {
vertical-align:middle;
margin: 0 1px;
padding: 5px;
padding-left: 15px;
padding-right: 15px;
-moz-border-radius: 4px;
border-radius: 4px;
}
#close_form_table {
width: 100%;
padding: 20px;
}
#request_details td {
text-align:left;
}
#request_details td fieldset{
xxxheight:100%;
}
#form_details {
display: inline-block;
}
div.wizContainer
{
border: 1px solid #C8C9CA;
-moz-border-radius: 4px 4px 4px 4px;
background-color: #fff;
padding: 3px;
}
.wizContainer table {
nodisplay: inline-block;
text-align: left;
}
#user_request_comment {
width: 30em;
height: 20em;
}
#buttons {
margin-top: 1em;
}
div#buttons #btn_cancel {
margin-right: 50px;
}
div#buttons #btn_back {
margin-left: 50px;
margin-right: 5px;
}
div#buttons #btn_next {
margin-left: 5px;
}
div#buttons #btn_finish {
margin-left: 5px;
}
table.listContainer {
clear: both;
width: 100%;
}
h1 {
background: url("./images/header_bg.png") repeat-x scroll 0 0 #D4D4D4;
border-color: #C8C9CA #9E9E9E #9E9E9E #C8C9CA;
border-style: solid;
border-width: 1px;
font-size: 1.1em;
font-weight: bold;
color: #222222;
font-weight: bold;
text-shadow: 1px 1px #FFFFFF;
padding: 5px;
-moz-border-radius: 4px 4px 4px 4px;
margin-top: 5px;
}
div.DrawerHandle {
display:none;
}
div.HRDrawer {
background: transparent;
border: 0;
height: 0.5em;
}
.SearchDrawer {
background-color: #F9EDBF;
border: 0;
-moz-border-radius: 4px 4px 4px 4px;
}
.SearchDrawer label {
background: transparent;
}
#open_incidents, #open_requests, #open_changes, #request_details {
margin-bottom: 1em;
}
legend {
background: url("./images/header_bg.png") repeat-x scroll 0 0 #D4D4D4;
border-color: #C8C9CA #9E9E9E #9E9E9E #C8C9CA;
border-style: solid;
border-width: 1px;
font-size: 1.1em;
font-weight: bold;
color: #222222;
font-weight: bold;
text-shadow: 1px 1px #FFFFFF;
padding: 5px;
-moz-border-radius: 4px 4px 4px 4px;
margin-top:0;
}
table.details > tbody > tr > td {
padding-bottom: 5px;
padding-top: 3px;
padding-right: 5px;
border: 0;
}
.label {
font-weight: bold;
}
.caselog {
display:block;
width: 100%;
}
.caselog textarea {
resize: none;
}
.edit_item {
margin-bottom: 1em;
}
div.edit_item span div table {
width: 100%;
}
div.edit_item span div table tbody tr td textarea{
width: 99%;
}
div#ticket_shortcuts form {
display: inline-block;
}
.cke_contents {
border: 1px #C8C9CA solid !important;
}

View File

@@ -1,72 +0,0 @@
--- Customization of the portal
This is the way it is working now and is highly subject to change...
Configuration (itop-config.php)
===============================
portal_tickets: CSV value to specify which ticket classes are enabled (default to 'UserRequest')
Common constants (XML)
======================
PORTAL_POWER_USER_PROFILE: Name of the profile that determines who can see the ticket of her organization (not only the tickets she is caller for)
PORTAL_SERVICECATEGORY_QUERY: OQL to list the services (parameters available: org_id)
PORTAL_SERVICE_SUBCATEGORY_QUERY: OQL to list the service subcategories (parameters available: org_id, svc_id)
PORTAL_VALIDATE_SERVICECATEGORY_QUERY: OQL to check the service again (security against malicious HTTP POSTs)
PORTAL_VALIDATE_SERVICESUBCATEGORY_QUERY: OQL to check the service again (security against malicious HTTP POSTs)
PORTAL_ALL_PARAMS: parameters that the wizard will kindly propagate through its pages (mixing should not be a problem, default value could be cleaned a little...)
PORTAL_SET_TYPE_FROM: attribute of the class ServiceSubcategory determining the request type
PORTAL_TYPE_TO_CLASS: optional mapping from the request types to ticket classes
PORTAL_TICKETS_SEARCH_CRITERIA: comma separated list of search criteria (attcodes) for closed tickets
PORTAL_TICKETS_SEARCH_FILTER_attcode: an OQL query to limit the list of values available in the search form (drop-down list). One define per entry in PORTAL_TICKETS_SEARCH_CRITERIA
Caution: Hardcoded stuff
========================
Classes Service and ServiceSubcategory
A user can update a ticket (new/assigned)
A user can close a ticket (resolved) (user_satisfaction is hardcoded though user_comment is not)
Constants depending on the class of ticket
==========================================
For each ticket class enabled, you will have to define these constants:
PORTAL_<TICKET-CLASS>_PUBLIC_LOG: name of the public log attribute
PORTAL_<TICKET-CLASS>_USER_COMMENT: name of the user comment attribute (legacy, used to be user_commmmment)
PORTAL_<TICKET-CLASS>_FORM_ATTRIBUTES: attributes proposed to the end-user in the edition form
PORTAL_<TICKET-CLASS>_TYPE: optional attribute to be set with the value of "request type"
PORTAL_<TICKET-CLASS>_LIST_ZLIST: list of attribute displayed in the lists (opened and resolved)
PORTAL_<TICKET-CLASS>_CLOSED_ZLIST: list of attribute displayed in the list of closed tickets
PORTAL_<TICKET-CLASS>_DETAILS_ZLIST: selection and presentation of attributes in the page that shows their details
PORTAL_<TICKET-CLASS>_DISPLAY_QUERY: selection of displayable objects (use parameters contact->attcode to check things against the user/contact)
PORTAL_<TICKET-CLASS>_DISPLAY_POWERUSER_QUERY: selection of displayable objects for power users (use parameters contact->attcode to check things against the user/contact)
How to add a type of ticket (example: Incident)
===============================================
1) Add it to the list of supported tickets classes: itop-config.php/portal_tickets
2) Define PORTAL_SET_TYPE_FROM (if not already done) as the attribute of ServiceSubcategory, that will define the request type, depending on the user selection
3) Map the different values of this request type (in class ServiceSubcategory) to the supported ticket classes
YOU MUST MAKE SURE THAT ANY OF THE VALUE HAS A MAPPING SO AS TO EXCLUDE SUBCATEGORIES IF THE CORRESPONDING CLASS ARE NOT ENABLED IN THE CONFIG.
4) Make sure that the queries PORTAL_SERVICE_SUBCATEGORY_QUERY and PORTAL_VALIDATE_SERVICESUBCATEGORY_QUERY will not exclude the expected type
5) Define the various constants for this class (PORTAL_<MY-CLASS>_XXXX).
6) Adjust PORTAL_TICKETS_SEARCH_CRITERIA. Those criteria are common to all types of tickets. Giving too many criteria can lead to confusion.
7) Test, test and re-test!!!
How to copy the request type to the ticket
==========================================
1) Define PORTAL_SET_TYPE_FROM (if not already done) as the attribute of ServiceSubcategory, that will define the request type, depending on the user selection
2) Define PORTAL_<TICKET-CLASS>_TYPE as the tiket attribute code to which the request type will be copied as is. There is no mapping.
Behavior of the lists when handling several types of tickets
============================================================
There are three lists: opened tickets, resolved tickets and closed tickets.
The following explanation applies to any of those lists.
* If no item has been found, one single message is displayed (no request of this category).
* If a number of items of only one category have been found, the list is displayed as is.
* Otherwise, there are several types of tickets to display. Each sub-list is preceeded by the name of the corresponding class.