248 lines
14 KiB
HTML
248 lines
14 KiB
HTML
<div loading-spinner if="state.dataIsLoading" centered="true" overlay="true" xmlns="http://www.w3.org/1999/html"></div>
|
|
|
|
<div class="ticket__not-found" ng-if="!state.dataIsLoading && !basicData.id" tabindex="0">
|
|
<h3>{{'serviceRequest.details.notFound' | i18n}}</h3>
|
|
</div>
|
|
|
|
<div class="ticket-details" ng-if="!state.dataIsLoading && basicData.id" aria-label="{{'common.labels.request' | i18n}} {{'ticket.region.details' | i18n}}"
|
|
role="region">
|
|
<div class="ticket__header clearfix">
|
|
|
|
<div class="ticket__management clearfix" aria-label="{{'ticket.region.header' | i18n}}" role="region" tabindex="0">
|
|
<div class="ticket__basic-info">
|
|
<div class="service-request__summary-section row">
|
|
<div class="service-request__summary col-sm-11" ng-if="isFullVersion" title="{{basicData.summary}}">{{basicData.summary}}</div>
|
|
<div class="service-request__summary col-sm-11" ng-if="!isFullVersion" title="{{basicData.summary}}"><a class="ticket__summary" href="#/request/{{basicData.id}}">{{basicData.summary}}</a></div>
|
|
</div>
|
|
|
|
<div class="ticket__icon">
|
|
<span class="icon-files_o"></span>
|
|
</div>
|
|
|
|
<div class="ticket__information">
|
|
<div class="ticket__name" ng-if="isFullVersion">{{'serviceRequest.detail.summary.orderId.label' | i18n:(basicData.displayId || '')}}</div>
|
|
<div class="ticket__name" ng-if="!isFullVersion">{{basicData.displayId || ''}}</div>
|
|
<a class="ticket__name-link" aria-label="{{'search.preview.viewFullRequest' | i18n}}" ng-if="!isFullVersion" href="#/request/{{basicData.id}}">{{'search.preview.viewFullRequest' | i18n}}</a>
|
|
|
|
<div class="ticket__lastupdated">{{'ticket.list.lastUpdated' | i18n : (basicData.modifiedDate | humanizedAbsoluteDateFormat)}}</div>
|
|
</div>
|
|
|
|
<div class="ticket-controls" ng-if="isFullVersion">
|
|
<div class="profile-action-bar__item dropdown" title="{{'controls.action.share' | i18n}}">
|
|
<button type="button" class="btn_link profile-action-bar__item-link dropdown-toggle" aria-label="{{'controls.action.share' | i18n}}">
|
|
<i class="icon-share"></i>
|
|
</button>
|
|
<ul class="profile-action-bar__item-menu dropdown-menu">
|
|
<li>
|
|
<div class="dropdown-item" ng-click="ticketActions.share()" tabindex="0" role="menuitem">
|
|
{{'action.ticket.email' | i18n: ('common.labels.' + basicData.type | i18n) }}
|
|
</div>
|
|
</li>
|
|
<li ng-if='chatModel.connected'>
|
|
<a class="dropdown-item profile-action-bar__item-menu_start-chat" tabindex="0" role="menuitem">
|
|
{{'chat.startFromTicket.headerMenu' | i18n: ('common.labels.' + basicData.type | i18n) }}
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="profile-action-bar__item" role="link" tabindex="0" ng-click="toggleFollowingFlag()" ng-enter="toggleFollowingFlag()"
|
|
title="{{(basicData.following? 'controls.action.unfollow' : 'controls.action.follow') | i18n}}"
|
|
aria-label="{{(basicData.following? 'controls.action.unfollow' : 'controls.action.follow') | i18n}}">
|
|
<i class="{{basicData.following? 'icon-star' : 'icon-star_o'}}"></i>
|
|
</div>
|
|
<div ng-if="!isDraft" title="{{'controls.action.print' | i18n}}" class="profile-action-bar__item"
|
|
aria-label="{{'controls.action.print' | i18n}}" role="link" tabindex="0"
|
|
ng-click="ticketActions.showPrintDialog($event)" ng-enter="ticketActions.showPrintDialog($event)">
|
|
<i class="{{'icon-printer'}}"></i>
|
|
</div>
|
|
<div class="profile-action-bar__item" role="link" tabindex="0" ng-click="refreshTicket()" ng-enter="refreshTicket()"
|
|
title="{{'common.labels.refresh' | i18n}}"
|
|
aria-label="{{'common.labels.refresh' | i18n}}">
|
|
<i class="icon-refresh"></i>
|
|
</div>
|
|
<div class="profile-action-bar__item profile-action-bar__item_text" ng-if="!isDraft && basicData.accessMappings.requestagainActionAllowed">
|
|
<button type="button" title="{{'action.request.requestagain.tooltip' | i18n}}"
|
|
ng-click="ticketActions.applyAction('requestagain')" class="btn_link service-request__requestagain-action">
|
|
{{'controls.action.requestagain' | i18n}}
|
|
</button>
|
|
</div>
|
|
|
|
<div class="profile-action-bar__item profile-action-bar__item_text" ng-if="!isDraft && basicData.status.value != 'Cancelled' && basicData.status.value != 'Closed'">
|
|
<button type="button" title="{{'action.request.reopen.tooltip' | i18n}}" class="btn_link service-request__reopen-action font-size-l"
|
|
ng-if="basicData.status.value == 'Completed' || basicData.status.value == 'Rejected' && basicData.accessMappings.reopenActionAllowed" ng-click="ticketActions.applyAction('reopen')">
|
|
{{'controls.action.reopen' | i18n}}
|
|
</button>
|
|
<button type="button" title="{{'action.request.cancel.tooltip' | i18n}}" class="btn_link service-request__cancel-action font-size-l"
|
|
ng-if="basicData.status.value != 'Completed' && basicData.status.value != 'Rejected' && basicData.accessMappings.cancelActionAllowed" ng-click="ticketActions.confirmAction('cancel')">
|
|
{{'controls.action.cancel' | i18n}}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ticket__status-section dropdown" aria-label="{{'ticket.region.status' | i18n}}" role="region" tabindex="0">
|
|
<div class="ticket__status-selector">
|
|
<div class="dropdown-toggle ticket__status-value">
|
|
{{ basicData.status.value | localizeLabel: 'status':'request' }}
|
|
<i class="icon-angle_down ticket__status-icon"></i>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ticket-status-section__sla-box clearfix" ng-if="!isDraft">
|
|
<div class="sla-progress-bar__wrapper">
|
|
<sla-progress-bar ticket="basicData" class="sla-progress-bar" ng-if="basicData.SLA.slaProgressBarValid"></sla-progress-bar>
|
|
</div>
|
|
<sla-reach-time sla="basicData.SLA"></sla-reach-time>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ticket__body" ng-class="{'service-request__show-approvals': basicData.approvalSummaries}">
|
|
<div ng-if="(basicData.approvalSummaries) &&((basicData.approvalList.open.length) || (basicData.approvalList.rejected.length)) " class="service-request__approvals"
|
|
role="region" tabindex="0" aria-label="{{'common.labels.approvalList' | i18n}}">
|
|
<span ng-if="basicData.approvalList.open.length">{{'serviceRequest.details.approvals' | i18n }}</span>
|
|
<span ng-if="(!basicData.approvalList.open.length) && (basicData.approvalList.rejected.length)">{{'serviceRequest.details.rejectedApprovals' | i18n }}</span>
|
|
|
|
<div class="pull-right service-request-approvers">
|
|
<span ng-if="basicData.approvalList.open.length">{{'serviceRequest.details.approved' | i18n:(basicData.approvalList.closed.length)}}, {{'serviceRequest.details.awaitingApproval' | i18n:(basicData.approvalList.open.length)}}<br /></span>
|
|
<b ng-if="isFullVersion" ng-click="ticketActions.showApprovalList()" ng-enter="ticketActions.showApprovalList()" tabindex="0" role="link">{{'approval.approversList.labels.showList' | i18n}}</b>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ticket__customer-card">
|
|
<person-info-card context="basicData" person-type="customer" person="basicData.customer" class="ticket__owner no-border" profile-type="incident"
|
|
label="basicData.contact.firstName? 'personInfoCard.person.caption.contactInfo' : ''"></person-info-card>
|
|
|
|
<div ng-show="basicData.contact.firstName" class="ticket__contact">
|
|
|
|
<div class="ticket__contact-header">
|
|
<a class="person-summary__full-name_link" href="#/person/{{basicData.contact.loginId | escape}}">{{basicData.contact.firstName}} {{basicData.contact.lastName}} </a>
|
|
<span> {{'ticket.contact.madeRequest'| i18n}}</span>
|
|
<span ng-click="isContactCollapsed = !isContactCollapsed" ng-enter="isContactCollapsed = !isContactCollapsed"
|
|
ng-class="{'icon-triangle_down':isContactCollapsed, 'icon-triangle_up':!isContactCollapsed}" aria-label="{{'person.details.contactInfo' | i18n}}" role="link" tabindex="0"></span>
|
|
</div>
|
|
|
|
<person-info-card context="basicData" person-type="contact" collapse="isContactCollapsed" profile-type="incident" person="basicData.contact"
|
|
label="'personInfoCard.person.caption.contact'"></person-info-card>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="service-request__center-info clearfix" aria-label="{{'serviceRequest.details.requestCoordinator' | i18n}}" role="region" tabindex="0">
|
|
<div class="row service-request__col1">
|
|
<div class="service-request__coordinator">
|
|
<div class="ticket__assignee-thumbnail">
|
|
<img alt="{{basicData.assignee.fullName}}" class="ticket-assignee__thumbnail"
|
|
user-availability="basicData.assignee" thumbnail-img="{{'data:' + basicData.assignee.thumbnailMime + ';base64,' + basicData.assignee.thumbnail}}" imgplaceholder="user">
|
|
</div>
|
|
<span class="label__text">{{'serviceRequest.details.requestCoordinator'|i18n}}</span><br />
|
|
<b><a class="person-summary__full-name_link" href="#/person/{{basicData.assignee.loginId | escape}}"
|
|
aria-label="{{'serviceRequest.details.requestCoordinator'|i18n}} {{basicData.assignee.fullName}}" role="link">
|
|
{{basicData.assignee.fullName}} </a></b>
|
|
</div>
|
|
<div class="service-request__quantity" ng-if="!basicData.isAttributeHidden['quantity']">
|
|
<form name="forms.requestQuantity">
|
|
<label>
|
|
<span class="label__text" ng-class="{'required__label': isDraft}" data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'serviceRequest.details.quantity' | i18n}}
|
|
</span>
|
|
<div ng-if="!isDraft"><b>{{basicData.quantity}}</b></div>
|
|
<input type="number"
|
|
ng-if="isDraft"
|
|
aria-required="true"
|
|
title="{{ 'serviceRequest.details.quantity' | i18n }}"
|
|
class="custom-input service-request__quantity-input"
|
|
ng-model="basicData.quantity"
|
|
min="1"
|
|
required>
|
|
</label>
|
|
</form>
|
|
</div>
|
|
<div class="service-request__price " ng-if="!basicData.isAttributeHidden['price']">
|
|
<span class="label__text">{{'serviceRequest.details.price' | i18n}}</span>
|
|
<div><b>{{(basicData.quantity || 1) * basicData.price | number:2}} {{basicData.currency}}</b></div>
|
|
</div>
|
|
</div>
|
|
<div class="row service-request__col2">
|
|
<div class="service-request__expected-date" ng-if="basicData.expectedDate && !basicData.isAttributeHidden['expectedDate']">
|
|
<span class="label__text">{{'serviceRequest.details.expected.completion.date' | i18n}}</span>
|
|
<div><b>{{ basicData.expectedDate ? ((basicData.expectedDate | date:'mediumDate') + ' ' + (basicData.expectedDate| date:'shortTime')) : ('common.label.none' | i18n) }}</b></div>
|
|
</div>
|
|
<div ng-if="!isDraft && !basicData.isAttributeHidden['requiredDate']" class="service-request__expected-date">
|
|
<span class="label__text">{{'serviceRequest.details.required.date' | i18n}}</span>
|
|
<div><b>{{ basicData.requiredDate ? ((basicData.requiredDate | date:'mediumDate') + ' ' + (basicData.requiredDate| date:'shortTime')) : ('common.label.none' | i18n) }}</b></div>
|
|
</div>
|
|
<div ng-if="isDraft && !basicData.isAttributeHidden['requiredDate']" class="service-request__required-date create-ticket__date">
|
|
<label class="label_control-wrap">
|
|
<span id="requiredDate" class="label__text" field-name="requiredDate">
|
|
{{ 'serviceRequest.details.required.date' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__date-time-item">
|
|
<div class="custom-field__date">
|
|
<input type="text"
|
|
title="{{'common.label.date' | i18n}}"
|
|
aria-labelledby="requiredDate"
|
|
class="form-control"
|
|
name="requiredDate"
|
|
datepicker-popup="mediumDate"
|
|
ng-model="basicData.requiredDate"
|
|
show-button-bar="false"
|
|
is-open="servReqRequiredDatePicker.open"
|
|
ng-click="openDatePicker(servReqRequiredDatePicker, $event)"
|
|
ng-enter="openDatePicker(servReqRequiredDate.servReqRequiredDatePicker)"
|
|
datepicker-options="servReqDatePickerOptions"
|
|
ng-change="updateDateTime('required')"/>
|
|
<i class="icon-calendar custom-field__date-icon"></i>
|
|
</div>
|
|
|
|
<div class="custom-field__time">
|
|
<div class="dropdown timepicker">
|
|
<div class="dropdown-toggle">
|
|
<input class="form-control custom-field__time-input" type="text" value="{{ basicData.requiredDate | date: 'shortTime' }}"
|
|
ng-disabled="!basicData.requiredDate" title="{{'common.label.time' | i18n}}" aria-labelledby="requiredTime" readonly="readonly" />
|
|
<i class="icon-clock_o custom-field__time-icon"></i>
|
|
</div>
|
|
<div class="dropdown-menu" prevent-click-event ng-if="basicData.requiredDate">
|
|
<timepicker ng-model="basicData.requiredDate"
|
|
ng-change="updateDateTime()"
|
|
show-meridian="showMeridian"
|
|
default-hours="12"
|
|
default-minutes="0">
|
|
</timepicker>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="service-request__definition-section clearfix" aria-label="{{'serviceRequest.details.requestDefinition' | i18n}}" role="region" tabindex="0">
|
|
<div class="service-request__definition">
|
|
<div class="service-request-definition-label label__text">{{'serviceRequest.details.requestDefinition'|i18n}}</div>
|
|
<div class="service-request-definition-name">{{basicData.requestTemplateTitle}}</div>
|
|
|
|
<div class="service-request-definition-label label__text">{{'serviceRequest.details.detailedDesc' | i18n}}</div>
|
|
<div class="service-request-definition-name service-request-definition-desc">{{basicData.desc}}</div>
|
|
</div>
|
|
<div class="service-request__questions">
|
|
<div ng-if="basicData.questionDefinitions || basicData.questionResponses" ng-include src="'views/template/srd-details.html'"></div>
|
|
<div ng-if="!isDraft && basicData.isCrossLaunchRequest && isFullVersion" class="service-request-definition-crosslaunchLabel">{{'serviceRequest.details.viewCustomFormDescText' | i18n}}</div>
|
|
<button type="button" ng-if="!isDraft && basicData.isCrossLaunchRequest && isFullVersion" ng-click="ticketActions.viewCustomForm()" class="service-request-definition-crosslaunchBtn small-btn_secondary">{{'serviceRequest.details.viewCustomForm' | i18n}}</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div ng-if="isFullVersion" class="profile__relation clearfix" aria-label="{{'ticket.region.relationship' | i18n}}" role="region" tabindex="0">
|
|
<tabset justified="true" class="tabset_short-relative-tabs">
|
|
<tab heading="{{'serviceRequest.details.fulfillment' | i18n}}">
|
|
<fulfillment-map context="basicData" is-draft="isDraft"></fulfillment-map>
|
|
</tab>
|
|
</tabset>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|