465 lines
22 KiB
HTML
465 lines
22 KiB
HTML
<div role="dialog" aria-labelledby="modalLabel">
|
|
<form name="editStatusForm">
|
|
<span class="modal-content__508-hidden-span">{{'common.labels.508BeginContent' | i18n}}</span>
|
|
<div class="action-blade__header">
|
|
<h2 ng-if="!isReopen" id="modalLabel" class="action-blade__title">{{'ticket.updateStatusBlade.title' | i18n}}</h2>
|
|
<h2 ng-if="isReopen" id="modalLabel" class="action-blade__title">{{'controls.action.reopen' | i18n}} {{'common.labels.' + ticket.type | i18n}}</h2>
|
|
</div>
|
|
<div class="action-blade__body" role="main">
|
|
<div loading-spinner if="state.processing || state.updatingStatus" overlay="true" centered="true"></div>
|
|
<div ng-if="!state.processing" class="update-status__action-blade">
|
|
<!--relase code start here -->
|
|
<div ng-if="ticket.type === 'release'">
|
|
<!--milestone start-->
|
|
<div class="clearfix">
|
|
<div class="update-status__selector">
|
|
<!--<div class="update-status__prev-button">
|
|
<button type="button" class="btn_secondary" ng-click="switchState('prev', ticket.type)"
|
|
ng-disabled="checkStatusSwitcherIsDisabled('prev', ticket.type)">
|
|
<i class="icon-angle_left"></i>
|
|
{{"common.labels.prev" | i18n}}
|
|
</button>
|
|
</div>-->
|
|
<div ng-if="!isReopen" class="update-status__dropdown">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text required__label"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{"release.detail.milestone" | i18n }}
|
|
</span>
|
|
<selection selection-items="availableMilestoneStatuses"
|
|
selected-item="selected.milestone"
|
|
selection-callback="changeMileStone(item,ticket.type,true)"
|
|
autofocus
|
|
title-text="{{'common.labels.' + ticket.type | i18n}} {{'ticket.status' | i18n}}"
|
|
aria-required="true"
|
|
required="true"
|
|
label="label"
|
|
disabled-selection="selected.isDisabled"
|
|
value="label">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<!--<div class="update-status__next-button">
|
|
<button type="button" class="btn_secondary" ng-click="switchState('next', ticket.type)"
|
|
ng-disabled="checkStatusSwitcherIsDisabled('next', ticket.type)">
|
|
{{"common.labels.next" | i18n}}
|
|
<i class="icon-angle_right"></i>
|
|
</button>
|
|
</div>-->
|
|
</div>
|
|
</div>
|
|
<!--milestone end-->
|
|
<div class="release_edit_status_sections">
|
|
<div class="col-xs-6">
|
|
<div >
|
|
<div ng-if="!isReopen" >
|
|
<label class="label_control-wrap">
|
|
<span class="label__text required__label"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'common.labels.' + ticket.type | i18n}} {{'ticket.status' | i18n}}
|
|
</span>
|
|
<selection selection-items="availableStatuses"
|
|
selected-item="selected.status"
|
|
selection-callback="changeStatus(item)"
|
|
autofocus
|
|
title-text="{{'common.labels.' + ticket.type | i18n}} {{'ticket.status' | i18n}}"
|
|
aria-required="true"
|
|
required="true"
|
|
label="label"
|
|
disabled-selection="selected.isDisabled"
|
|
value="label">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-xs-6">
|
|
<div ng-if="selected.status.statusReasons.length">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text"
|
|
ng-class="{'required__label': isFieldRequired('statusReason')}"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'ticket.updateStatusBlade.statusReason' | i18n}}
|
|
</span>
|
|
|
|
<selection selection-items="selected.status.statusReasons"
|
|
selected-item="selected.statusReason"
|
|
selection-callback="changeStatusReason(item)"
|
|
title-text="{{'ticket.updateStatusBlade.statusReason' | i18n}}"
|
|
aria-required="isFieldRequired('statusReason')"
|
|
required="isFieldRequired('statusReason')"
|
|
first-item-empty="!isFieldRequired('statusReason')"
|
|
label="label"
|
|
value="label">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!--release cod end here -->
|
|
|
|
<div ng-if="ticket.type !== 'release'">
|
|
<div class="clearfix">
|
|
<div class="update-status__selector">
|
|
<div class="update-status__prev-button"
|
|
ng-if="ticket.type === 'change' || ticket.type === 'problem' || ticket.type === 'knownerror'">
|
|
<button type="button" class="btn_secondary" ng-click="switchState('prev', ticket.type)"
|
|
ng-disabled="checkStatusSwitcherIsDisabled('prev', ticket.type)">
|
|
<i class="icon-angle_left"></i>
|
|
{{"common.labels.prev" | i18n}}
|
|
</button>
|
|
</div>
|
|
<div ng-if="!isReopen" class="update-status__dropdown">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text required__label"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'common.labels.' + ticket.type | i18n}} {{'ticket.status' | i18n}}
|
|
</span>
|
|
<selection selection-items="availableStatuses"
|
|
selected-item="selected.status"
|
|
selection-callback="changeStatus(item)"
|
|
autofocus
|
|
title-text="{{'common.labels.' + ticket.type | i18n}} {{'ticket.status' | i18n}}"
|
|
aria-required="true"
|
|
required="true"
|
|
label="label"
|
|
disabled-selection="selected.isDisabled"
|
|
value="label">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="update-status__next-button"
|
|
ng-if="ticket.type === 'change' || ticket.type === 'problem' || ticket.type === 'knownerror'">
|
|
<button type="button" class="btn_secondary" ng-click="switchState('next', ticket.type)"
|
|
ng-disabled="checkStatusSwitcherIsDisabled('next', ticket.type)">
|
|
{{"common.labels.next" | i18n}}
|
|
<i class="icon-angle_right"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="clearfix">
|
|
<div ng-if="!isReopen && selected.status.statusReasons.length" class="col-xs-6 update-status__section">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text"
|
|
ng-class="{'required__label': isFieldRequired('statusReason')}"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'ticket.updateStatusBlade.statusReason' | i18n}}
|
|
</span>
|
|
|
|
<selection selection-items="selected.status.statusReasons"
|
|
selected-item="selected.statusReason"
|
|
selection-callback="changeStatusReason(item)"
|
|
title-text="{{'ticket.updateStatusBlade.statusReason' | i18n}}"
|
|
aria-required="isFieldRequired('statusReason')"
|
|
required="isFieldRequired('statusReason')"
|
|
show-clear="!isFieldRequired('statusReason')"
|
|
label="label"
|
|
value="label">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div ng-if="selected.status.name && !isReopen" class="action-blade__message">
|
|
<span ng-if="selected.status.name == 'Cancelled' && ticket.type != 'knowledge'">{{'action.ticket.cancel.message' | i18n: ('common.labels.'+ ticket.type | i18n) }}</span>
|
|
<span ng-if="selected.status.name == 'Closed'">{{'action.ticket.close.message' | i18n: ('common.labels.'+ ticket.type | i18n) }}</span>
|
|
</div>
|
|
|
|
<div ng-if="ticket.type == 'incident' && selected.status.name && isReopen" class="action-blade__message">
|
|
<span>{{'action.incident.reopen.message' | i18n }}</span>
|
|
</div>
|
|
|
|
<div ng-if="selected.status.name && needResolutionNote() && !isReopen" class="clearfix">
|
|
<div class="update-status__section">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text required__label"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'ticket.resolutionNote' | i18n}}
|
|
</span>
|
|
<textarea title="{{'ticket.placeholder.statusResolution' | i18n}}" class="textarea full-width" ng-model="selected.resolutionNote" rows="3"
|
|
aria-required="true" placeholder="{{'ticket.placeholder.statusResolution' | i18n}}"></textarea>
|
|
</label>
|
|
</div>
|
|
<categories-editor entity="ticket" categories="resCategories" dependent-categories="categories" class="update-status__section col-xs-6 category-editor__left" allow-location-company="allowLocationCompany"></categories-editor>
|
|
<categories-editor entity="ticket" categories="categories" dependent-categories="resCategories" class="update-status__section col-xs-6" allow-location-company="allowLocationCompany"></categories-editor>
|
|
</div>
|
|
|
|
<div ng-if="ticket.type == 'change'" class="update-status__change-fields">
|
|
<edit-ticket-dates ng-show="showDates"
|
|
ticket="ticket"
|
|
date-form="editStatusForm" only-show-required="true" ignore-access-mapping="true" make-schedule-dates-optional="!isChangeScheduleDatesRequired" make-actual-dates-optional="!isChangeActualDatesRequired">
|
|
</edit-ticket-dates>
|
|
<div ng-if="isFieldRequired('managerGroup')">
|
|
<div class="col-xs-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label' : !isOptional.managerGroup}" data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'change.detail.managerGroup' | i18n}}
|
|
</span>
|
|
<selection selection-items="supportGroups"
|
|
selected-item="selected.group"
|
|
selection-callback="updateGroup(item)"
|
|
title-text="{{'change.detail.managerGroup' | i18n}}"
|
|
aria-required="!isOptional.managerGroup"
|
|
required="!isOptional.managerGroup"
|
|
label="name"
|
|
value="name">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="col-xs-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label' : !isOptional.manager}" data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'change.detail.manager' | i18n}}
|
|
</span>
|
|
<selection selection-items="supportGroupPersons"
|
|
selected-item="selected.manager"
|
|
selection-callback="updateManager(item)"
|
|
title-text="{{'change.detail.manager' | i18n}}"
|
|
aria-required="!isOptional.manager"
|
|
required="!isOptional.manager"
|
|
loading-flag="state.loadingSupportPersons"
|
|
label="fullName"
|
|
value="fullName">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div ng-if="ticket.type == 'problem' && !isDraft">
|
|
<div ng-if="isFieldRequired('targetDate')" class="update-status__section">
|
|
<label class="label_control-wrap">
|
|
<span id="targetDateLabel" class="label__text" ng-class="{'required__label' : !isOptional.targetDate}"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'create.ticket.target.date' | i18n}}
|
|
</span>
|
|
<div>
|
|
<div class="custom-field__time">
|
|
<input required="!isOptional.targetDate"
|
|
type="text"
|
|
aria-labelledby="targetDateLabel"
|
|
title="{{'common.label.date' | i18n}}"
|
|
class="form-control"
|
|
datepicker-popup="mediumDate"
|
|
ng-model="selected.targetDate"
|
|
show-button-bar="false"
|
|
datepicker-options="datePickerOptions"
|
|
is-open="ticket.targetDatePicker.open"
|
|
ng-click="ticket.targetDatePicker.open = true"
|
|
ng-enter="ticket.targetDatePicker.open = true"/>
|
|
<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="{{ selected.targetDate | date: 'shortTime' }}"
|
|
title="{{'common.label.time' | i18n}}" aria-labelledby="targetDateLabel" readonly="readonly"/>
|
|
<i class="icon-clock_o custom-field__time-icon"></i>
|
|
</div>
|
|
<div class="dropdown-menu" prevent-click-event>
|
|
<timepicker ng-model="selected.targetDate"
|
|
show-meridian="showMeridian"
|
|
default-hours="12"
|
|
default-minutes="0">
|
|
</timepicker>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
<div ng-if="isFieldRequired('coordinator')" class="update-status__assignment col-xs-6">
|
|
<div class="col-xs-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label' : !isOptional.coordinatorGroup}">
|
|
{{'common.labels.coordinatorCompany' | i18n}}
|
|
</span>
|
|
<selection selection-items="companies"
|
|
selected-item="coordinatorCompany"
|
|
selection-callback="selectCoordinatorCompany(item)"
|
|
title-text="{{'assignBlade.filter.company' | i18n}}"
|
|
label="name"
|
|
value="name"
|
|
selection-filter="true"
|
|
selection-filter-placeholder-text="assignBlade.searchCompany"
|
|
typeahead-mode="state.tooManySupportCompanies"
|
|
typeahead-details="company as company.name for company in getList($viewValue)"
|
|
typeahead-get-list="getCompaniesByName(name)">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="col-xs-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label' : !isOptional.coordinatorGroup}">
|
|
{{'common.labels.coordinatorOrganization' | i18n}}
|
|
</span>
|
|
<selection selection-items="coordinatorOrganizations"
|
|
selected-item="coordinatorOrganization"
|
|
selection-callback="selectCoordinatorOrganization(item)"
|
|
title-text="{{'assignBlade.filter.organization' | i18n}}"
|
|
label="name"
|
|
value="name"
|
|
duplicate-key="companyName"
|
|
selection-filter="true"
|
|
selection-filter-placeholder-text="assignBlade.searchOrganization"
|
|
typeahead-mode="state.tooManySupportOrganizations"
|
|
typeahead-details="org as org.name for org in getList($viewValue)"
|
|
typeahead-get-list="getSupportOrganizationsByTextAndCompany(name, 'coordinatorCompany')">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="col-xs-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label' : !isOptional.coordinatorGroup}"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'common.labels.coordinatorGroup' | i18n}}
|
|
</span>
|
|
<selection selection-items="coordinatorSupportGroups"
|
|
selected-item="selected.group"
|
|
selection-callback="updateGroup(item)"
|
|
title-text="{{'common.labels.coordinatorGroup' | i18n}}"
|
|
aria-required="!isOptional.coordinatorGroup"
|
|
required="!isOptional.coordinatorGroup"
|
|
label="name"
|
|
value="name"
|
|
selection-filter="true"
|
|
selection-filter-placeholder-text="assignBlade.searchGroup"
|
|
typeahead-mode="state.tooManySupportGroups"
|
|
typeahead-details="group as group.name for group in getList($viewValue)"
|
|
typeahead-get-list="getSupportGroupsForAllCompanyByName(name, 'supportGroup')"
|
|
loading-flag="state.loadingSupportGroups">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="col-xs-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label' : !isOptional.coordinator}"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'problem.details.coordinator' | i18n}}
|
|
</span>
|
|
<selection selection-items="supportGroupPersons"
|
|
selected-item="selected.manager"
|
|
selection-callback="updateManager(item)"
|
|
title-text="{{'problem.details.coordinator' | i18n}}"
|
|
loading-flag="state.loadingSupportPersons"
|
|
aria-required="!isOptional.coordinator"
|
|
required="!isOptional.coordinator"
|
|
label="fullName"
|
|
value="fullName">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div ng-if="isFieldRequired('assignee') || isFieldRequired('supportGroup')" class="update-status__assignment col-xs-6">
|
|
<div class="col-xs-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label' : !isOptional.assigneeGroup}">
|
|
{{'assignBlade.filter.company' | i18n}}
|
|
</span>
|
|
<selection selection-items="companies"
|
|
selected-item="assigneeCompany"
|
|
selection-callback="selectAssigneeCompany(item)"
|
|
title-text="{{'assignBlade.filter.company' | i18n}}"
|
|
label="name"
|
|
value="name"
|
|
selection-filter="true"
|
|
selection-filter-placeholder-text="assignBlade.searchCompany"
|
|
typeahead-mode="state.tooManyAssigneeCompanies"
|
|
typeahead-details="company as company.name for company in getList($viewValue)"
|
|
typeahead-get-list="getCompaniesByName(name)">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="col-xs-12">
|
|
<label class="label_control-wrap" ng-class="{'required__label' : !isOptional.assigneeGroup}">
|
|
<span class="label__text">
|
|
{{'assignBlade.filter.organization' | i18n}}
|
|
</span>
|
|
<selection selection-items="assigneeOrganizations"
|
|
selected-item="assigneeOrganization"
|
|
selection-callback="selectAssigneeOrganization(item)"
|
|
title-text="{{'assignBlade.filter.organization' | i18n}}"
|
|
label="name"
|
|
value="name"
|
|
duplicate-key="companyName"
|
|
selection-filter="true"
|
|
selection-filter-placeholder-text="assignBlade.searchOrganization"
|
|
typeahead-mode="state.tooManyAssigneeOrganizations"
|
|
typeahead-details="org as org.name for org in getList($viewValue)"
|
|
typeahead-get-list="getSupportOrganizationsByTextAndCompany(name, 'assigneeCompany')">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="col-xs-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label' : !isOptional.assigneeGroup}"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'common.labels.supportGroup' | i18n}}
|
|
</span>
|
|
<selection selection-items="assigneeGroups"
|
|
selected-item="selected.assigneeGroup"
|
|
selection-callback="updateAssigneeGroup(item)"
|
|
title-text="{{'common.labels.supportGroup' | i18n}}"
|
|
aria-required="!isOptional.assigneeGroup"
|
|
required="!isOptional.assigneeGroup"
|
|
label="name"
|
|
value="name"
|
|
selection-filter="true"
|
|
selection-filter-placeholder-text="assignBlade.searchGroup"
|
|
typeahead-mode="state.tooManyAssigneeGroups"
|
|
typeahead-details="assigneeGroup as assigneeGroup.name for assigneeGroup in getList($viewValue)"
|
|
typeahead-get-list="getSupportGroupsForAllCompanyByName(name, 'assigneeGroup')"
|
|
loading-flag="state.loadingAssigneeGroups">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="col-xs-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text" ng-class="{'required__label': (isFieldRequired('assignee') && !isOptional.assignee)}"
|
|
data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'common.labels.assignedTo' | i18n}}
|
|
</span>
|
|
<selection selection-items="assignees"
|
|
selected-item="selected.assignee"
|
|
selection-callback="updateAssignee(item)"
|
|
title-text="{{'common.labels.assignedTo' | i18n}}"
|
|
loading-flag="state.loadingAssignees"
|
|
aria-required="isFieldRequired('assignee') && !isOptional.assignee"
|
|
required="isFieldRequired('assignee') && !isOptional.assignee"
|
|
label="fullName"
|
|
value="fullName">
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="update-status__section col-xs-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text">
|
|
{{'ticket.statusNote' | i18n}}
|
|
</span>
|
|
<textarea title="{{'ticket.placeholder.statusNote' | i18n}}" class="textarea full-width" ng-model="selected.worknote" rows="3" placeholder="{{'ticket.placeholder.statusNote' | i18n}}"></textarea>
|
|
</label>
|
|
<div ng-if="(showDates && showChangeUpdateWarning) || showUpdateWarningForRequired" class="ticket-summary__character-limit_warning">{{'console.ticket.changeStatus.warning' | i18n}}</div>
|
|
</div>
|
|
</div>
|
|
<div class="action-blade__disabledSave-error">
|
|
<div ng-if="fixScheduledDates">{{'change.detail.status.scheduledForApproval.scheduledDatedError' | i18n}}</div>
|
|
<div ng-if="noChangeManagerLoginId">{{'change.detail.status.scheduledForApproval.managerError' | i18n}}</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
|
|
<div class="action-blade__footer clearfix" role="region" aria-label="{{'common.region.action' | i18n}}">
|
|
<div class="action-blade__button-container">
|
|
<button type="submit" class="btn_primary" ng-if="!isReopen" ng-disabled="!selected.status.label || isSaveButtonDisabled() || state.updatingStatus || editStatusForm.$invalid || noChangeManagerLoginId || fixScheduledDates" ng-click="submit()">{{'common.button.save' | i18n}}</button>
|
|
<button type="submit" class="btn_primary" ng-if="isReopen" ng-disabled="!selected.status.label || state.updatingStatus" ng-click="submit()">{{'controls.action.reopen' | i18n}}</button>
|
|
<button type="button" class="btn_secondary" ng-click="close()" ng-disabled="state.updatingStatus">{{'common.button.cancel' | i18n}}</button>
|
|
</div>
|
|
</div>
|
|
<span class="modal-content__508-hidden-span">{{'common.labels.508EndContent' | i18n}}</span>
|
|
</div> |