146 lines
9.8 KiB
HTML
146 lines
9.8 KiB
HTML
<!--Ticket header section-->
|
|
<div loading-spinner if="state.isDataLoading" centered="true" overlay="true"></div>
|
|
<div ux-id="title-bar" ng-class="{'highlight-section':!ticket.summary}" class="title-bar__section col-md-12" role="region" tabindex="0" auto-focus>
|
|
<div class="ticket__basic-info">
|
|
<!--First Row-->
|
|
<div ux-id="title-summary" ng-if="!editMode">
|
|
<div ng-if="!ticket.summary" class="ticket__required-field">
|
|
<i class="icon-exclamation_triangle"></i> {{'ticket.notification.draft.missingTitle' | i18n}}
|
|
</div>
|
|
<div ux-id="ticket-title-value" tabindex="0" class="title-bar__summary" ng-if="isFullVersion" title="{{summaryField.value}}" ng-bind-html="summaryField.value | securelinky:'_blank'"></div>
|
|
<div class="title-bar__summary" ng-if="!isFullVersion" >
|
|
<a class="ticket__summary" ui-sref="{{ticket.type}}({id: ticket.id})">{{summaryField.value}}</a>
|
|
</div>
|
|
</div>
|
|
<div ux-id="field_title" ng-if="editMode">
|
|
<label class="label_control-wrap">
|
|
<span id="titleLabel" class="label__text"
|
|
potentially-required-field
|
|
field-name="summary"
|
|
itsm-required="{{summaryField.ootb}}"
|
|
entity="ticket">
|
|
{{'common.labels.title' | i18n}}
|
|
</span>
|
|
<input type="text" class="edit-header__title form-control" ng-change="onSummaryChange()" ng-model="summaryField.value"
|
|
title="{{summaryField.value}}" potentially-required-field
|
|
field-name="summary"
|
|
itsm-required="{{summaryField.ootb}}"
|
|
ng-disabled="!isSummaryEditable"
|
|
entity="ticket" maxlength="{{summaryField.maxLength}}" aria-labelledby="titleLabel">
|
|
<character-limit-message field="summaryField.value" limit="{{summaryField.maxLength}}"></character-limit-message>
|
|
</label>
|
|
</div>
|
|
|
|
<!--Second Row-->
|
|
<div class="pull-left row col-md-12" ng-class="{'title-bar__display': !editMode}">
|
|
<div ux-id="ticket-type" class="title-bar__display-id" ng-if="!editMode">
|
|
<div class="ticket__icon">
|
|
<span ux-id="ticket-icon" class="{{iconClass()}}"></span>
|
|
</div>
|
|
<div ux-id="ticket-type-value" class="title-bar__display-id-label">{{'ticket.type.' + ticket.type | i18n}} </div>
|
|
</div>
|
|
<!--configurable section-->
|
|
<div ng-if="titleBarPanelId" ng-class="(editMode) ? 'col-md-12 row' : ''" class="title-bar__configuration-section panel-field-area">
|
|
<custom-field-area ux-id="title-bar-custom-fields" ticket="ticket"
|
|
metadata="metadata"
|
|
panel-id="{{titleBarPanelId}}"
|
|
stacked="true"
|
|
class="editable-content-section-block {{editMode ? '' : 'title-bar__configuration-section-custom-area'}}"
|
|
update-is-handled-by-parent="true"
|
|
is-title-bar="true">
|
|
</custom-field-area>
|
|
</div>
|
|
</div>
|
|
<!--Third Row-->
|
|
<div ng-if="!editMode" class="title-bar__information-section">
|
|
<div class="pull-left">
|
|
<div ux-id="last-updated" class="title-bar__lastupdated">{{'ticket.list.lastUpdated' | i18n : (ticket.modifiedDate | humanizedAbsoluteDateFormat)}}</div>
|
|
</div>
|
|
<div class="pull-right" ng-if="!isFullVersion">
|
|
<a ux-id="view-full-link" class="ticket__name-link" aria-label="{{ fullDetailsText }}"
|
|
ui-sref="{{ticket.type}}({id: ticket.id})">{{ fullDetailsText }}</a>
|
|
</div>
|
|
<div class="ticket-controls" ng-if="isFullVersion">
|
|
<div ux-id="need-attention-ticket" title="{{ needsAttentionFlag.value === 'Yes' ? 'controls.action.unflag' : 'controls.action.flag' | i18n }}" class="profile-action-bar__item"
|
|
aria-label="{{ needsAttentionFlag.value === 'Yes' ? 'controls.action.unflag' : 'controls.action.flag' | i18n }}" role="button" tabindex="0"
|
|
ng-class="{'title-bar__needs-attention': (needsAttentionFlag.value === 'Yes')}"
|
|
ng-if="needsAttentionFlag.visibility && (ticket.type === 'incident' || ticket.type === 'workorder') && !((ticket.status.value === 'Rejected' || ticket.status.value === 'Cancelled' || ticket.status.value === 'Closed') && needsAttentionFlag.value === 'No')"
|
|
ng-click="ticketActions.toggleNeedAttentionFlag()" ng-enter="ticketActions.toggleNeedAttentionFlag()">
|
|
<i ng-class="needsAttentionFlag.value === 'Yes' ? 'icon-flag': 'icon-flag_o'"></i>
|
|
</div>
|
|
<div ux-id="need-attention-ticket" title="{{ 'ticket.needsAttention.flag.disabled' | i18n : (ticket.status.value | localizeLabel: 'status': ticket.type) }}" class="profile-action-bar__item title-bar__needs-attention-disabled"
|
|
aria-label="{{ 'ticket.needsAttention.flag.disabled' | i18n : (ticket.status.value | localizeLabel: 'status': ticket.type) }}"
|
|
ng-class="{'title-bar__needs-attention': (needsAttentionFlag.value === 'Yes')}"
|
|
ng-if="needsAttentionFlag.visibility && (ticket.type === 'incident' || ticket.type === 'workorder') && ((ticket.status.value === 'Rejected' || ticket.status.value === 'Cancelled' || ticket.status.value === 'Closed') && needsAttentionFlag.value === 'No')">
|
|
<i ng-class="needsAttentionFlag.value === 'Yes' ? 'icon-flag': 'icon-flag_o'"></i>
|
|
</div>
|
|
<div class="profile-action-bar__item" ng-if="!isDraft && ticket.accessMappings.assigneeSelfAssignmentAllowed">
|
|
<button ux-id="assign-to-me-btn" type="button" class="btn_link" ng-disabled="!isAssignToMeEnabled()" ng-click="ticketActions.assignToMe($event)"
|
|
title="{{'common.labels.assignToMe' | i18n}}" aria-label="{{'common.labels.assignToMe' | i18n}}" tabindex="0">
|
|
<i class="icon-user_plus"></i>
|
|
</button>
|
|
</div>
|
|
<div class="profile-action-bar__item dropdown" ng-if="!isDraft">
|
|
<i ux-id="share-btn" role="button" class="icon-share dropdown-toggle" title="{{'controls.action.share' | i18n}}" aria-label="{{'controls.action.share' | i18n}}" tabindex="0"></i>
|
|
<ul class="profile-action-bar__item-menu dropdown-menu">
|
|
<li>
|
|
<div ux-id="share-ticket-email" class="dropdown-item" ng-click="ticketActions.share()" tabindex="0" role="menuitem">
|
|
{{'action.ticket.email' | i18n: ('common.labels.' + ticket.type | i18n) }}
|
|
</div>
|
|
</li>
|
|
<li ng-if='chatModel.connected'>
|
|
<a ux-id="share-ticket-chat" class="dropdown-item profile-action-bar__item-menu_start-chat" tabindex="0" role="menuitem">
|
|
{{(('chat.startFromTicket.headerMenu.' + ticket.type) | i18n) }}
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div ux-id="follow-btn" class="profile-action-bar__item" ng-if="!isDraft" role="link" tabindex="0" ng-click="toggleFollowingFlag()" ng-enter="toggleFollowingFlag()"
|
|
title="{{(ticket.following? 'controls.action.unfollow' : 'controls.action.follow') | i18n}}"
|
|
aria-label="{{(ticket.following? 'controls.action.unfollow' : 'controls.action.follow') | i18n}}">
|
|
<i class="{{ticket.following? 'icon-star' : 'icon-star_o'}}"></i>
|
|
</div>
|
|
<div ux-id="print-btn" 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 ux-id="refresh-btn" class="profile-action-bar__item" ng-if="!isDraft" 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 ux-id="copy-change-btn" class="profile-action-bar__item" ng-if="ticket.type == 'change' && ticketActions.copyChangeAllowed()" role="link" tabindex="0" ng-click="copyChangeTicket()" ng-enter="copyChangeTicket()"
|
|
title="{{'copychange.form.title' | i18n}}"
|
|
aria-label="{{'copychange.form.title' | i18n}}">
|
|
<i class="icon-files_copy_o"></i>
|
|
</div>
|
|
<div ux-id="reopen-btn" ng-class="{'profile-action-bar__item': true, 'profile-action-bar__item_text' : !userModel.isAccessibleUser}"
|
|
ng-if="!isDraft && (ticket.status.value == 'Cancelled' || ticket.status.value == 'Closed') && !ticket.reopenedDate && ticket.accessMappings.reopenActionAllowed">
|
|
<button type="button" title="{{'action.incident.reopen.tooltip' | i18n}}" ng-click="ticketActions.confirmAction('reopen')" class="btn_link font-size-l">
|
|
{{'controls.action.reopen' | i18n}}
|
|
</button>
|
|
</div>
|
|
<div ux-id="resume-btn" ng-class="{'profile-action-bar__item': true, 'profile-action-bar__item_text' : !userModel.isAccessibleUser}"
|
|
ng-if="ticket.type==='change' && (ticket.accessMappings.restartActionAllowed && ticket.status.value=='Rejected') ||
|
|
(ticket.accessMappings.restartActionAllowed && ticket.status.value=='Cancelled') ||
|
|
ticket.accessMappings.resumeActionAllowed">
|
|
<button type="button" ng-if="ticket.accessMappings.restartActionAllowed && ticket.status.value=='Rejected'"
|
|
title="{{'action.change.restart.tooltip.rejected' | i18n : (ticket.previousStatus.value | localizeLabel: 'status':'change')}}" ng-click="ticketActions.applyAction('restart')" class="font-size-l btn_link">
|
|
{{'controls.action.restart' | i18n}}
|
|
</button>
|
|
<button type="button" ng-if="ticket.accessMappings.restartActionAllowed && ticket.status.value=='Cancelled'"
|
|
title="{{'action.change.restart.tooltip.cancelled' | i18n}}" ng-click="ticketActions.applyAction('restart')" class="font-size-l btn_link">
|
|
{{'controls.action.restart' | i18n}}
|
|
</button>
|
|
<button type="button" ng-if="ticket.accessMappings.resumeActionAllowed"
|
|
title="{{'action.change.resume.tooltip' | i18n : (ticket.previousStatus.value | localizeLabel: 'status':'change')}}" ng-click="ticketActions.applyAction('resume')" class="font-size-l btn_link">
|
|
{{'controls.action.resume' | i18n}}
|
|
</button>
|
|
</div>
|
|
<launch-actions-dropdown ux-id="more-actions" ng-hide="hideMoreActionsButton || isDraft" hide-dropdown="hideMoreActionsButton" class="profile-action-bar__item profile-action-bar__item_text" context="ticket" drop-down-options="moreDropDownOptions"></launch-actions-dropdown>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|