538 lines
23 KiB
HTML
538 lines
23 KiB
HTML
<div class="create-knownerror clearfix">
|
|
<div class="create-form-wrapper">
|
|
<div loading-spinner class="create-ticket__loading-spinner" if="state.dataIsLoading" centered="true" overlay="true"></div>
|
|
|
|
<div class="clearfix">
|
|
|
|
<form name="createKnownerrorForm" novalidate>
|
|
|
|
<div class="create-ticket__header">
|
|
<h3 class="create-ticket__header-title">{{ 'create.knownerror.header' | i18n }}</h3>
|
|
<span>{{ 'create.knownerror.sub.header' | i18n }}</span>
|
|
</div>
|
|
<div class="create-ticket__full-width-section">
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<div class="create-ticket__section clearfix row">
|
|
<div class="col-sm-12">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text_required"
|
|
potentially-required-field
|
|
field-name="summary"
|
|
entity="ke">
|
|
{{ 'create.knownerror.title' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__item">
|
|
<input type="text"
|
|
prevent-click-event
|
|
potentially-required-field
|
|
field-name="summary"
|
|
entity="ke"
|
|
title="{{ 'create.knownerror.title' | i18n }}"
|
|
class="custom-input"
|
|
name="summary"
|
|
ng-model="ke.summary"
|
|
maxlength="100"
|
|
placeholder="{{ 'create.knownerror.summary.placeholder' | i18n }}"
|
|
auto-focus required >
|
|
</div>
|
|
</label>
|
|
<character-limit-message field="ke.summary" limit="100"></character-limit-message>
|
|
</div>
|
|
</div>
|
|
<div class="create-ticket__section clearfix row" ng-show="!state.initialLoading">
|
|
<div class="col-sm-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text_required"
|
|
potentially-required-field
|
|
field-name="impact"
|
|
entity="ke">
|
|
{{'create.ticket.impact' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__item">
|
|
<selection selection-items="keMetadata.impacts"
|
|
selected-item="ke.selectedImpact"
|
|
selection-callback="updatePriority(item)"
|
|
title-text="{{'create.ticket.impact' | i18n}}"
|
|
label="label"
|
|
value="label"
|
|
field-name="impact"
|
|
entity="ke"
|
|
aria-required="true"
|
|
update-selected-item="true" >
|
|
</selection>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="col-sm-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text_required"
|
|
potentially-required-field
|
|
field-name="urgency"
|
|
entity="ke">
|
|
{{ 'create.ticket.urgency' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__item">
|
|
<selection selection-items="keMetadata.urgencies"
|
|
selected-item="ke.selectedUrgency"
|
|
selection-callback="updatePriority()"
|
|
title-text="{{'create.ticket.urgency' | i18n}}"
|
|
label="label"
|
|
value="label"
|
|
field-name="urgency"
|
|
entity="ke"
|
|
aria-required="true"
|
|
update-selected-item="true" >
|
|
</selection>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="create-ticket__section clearfix row" ng-show="!state.initialLoading">
|
|
<div class="col-sm-6">
|
|
<span class="label__text">{{ 'create.ticket.calculated.priority' | i18n }}</span>
|
|
|
|
<div class="div">
|
|
<span ng-if="!ke.company.name">{{ 'common.label.noneYet' | i18n }}</span>
|
|
<span ng-if="ke.company.name" ticket-priority-display priority-value="{{ke.calculatedPriority.name | lowercase}}">{{ke.calculatedPriority.label}}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="create-ticket__section clearfix row" ng-show="!state.initialLoading">
|
|
<div class="col-sm-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text_required"
|
|
potentially-required-field
|
|
field-name="status.value"
|
|
entity="ke">
|
|
{{ 'create.knownerror.status' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__item">
|
|
<selection selection-items="keMetadata.statuses"
|
|
selected-item="ke.selectedStatus"
|
|
selection-callback="updateStatusReason()"
|
|
title-text="{{'create.knownerror.status' | i18n}}"
|
|
label="label"
|
|
value="label"
|
|
field-name="status.value"
|
|
entity="ke"
|
|
aria-required="true"
|
|
update-selected-item="true">
|
|
</selection>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
|
|
<div class="col-sm-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text required__label" data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'ticket.detail.company' | i18n }}
|
|
</span>
|
|
<div>
|
|
<selection selection-items="selections.companies"
|
|
selected-item="company"
|
|
title-text="{{'ticket.detail.company' | i18n}}"
|
|
label="name"
|
|
value="name"
|
|
selection-callback="updateCompany()"
|
|
aria-required="true"
|
|
update-selected-item="true"
|
|
selection-filter="true"
|
|
selection-filter-placeholder-text="assignBlade.searchCompany"
|
|
show-chunking-tooltip="true"
|
|
typeahead-mode="state.tooManyCompanies"
|
|
typeahead-details="company as company.name for company in getList($viewValue)"
|
|
typeahead-get-list="getCompaniesByName(name)"
|
|
show-cleare=true>
|
|
</selection>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="create-ticket__section clearfix row" ng-show="!state.initialLoading">
|
|
<div class="col-sm-6" ng-if="ke.selectedStatus.statusReasons.length">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text"
|
|
potentially-required-field
|
|
field-name="status.reason"
|
|
entity="workorder">
|
|
{{ 'create.ticket.status.reason' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__item">
|
|
<selection selection-items="ke.selectedStatus.statusReasons"
|
|
selected-item="ke.selectedStatusReason"
|
|
title-text="{{'create.incident.status-reason' | i18n}}"
|
|
label="label"
|
|
value="label"
|
|
aria-required="true"
|
|
field-name="status.reason"
|
|
entity="workorder"
|
|
update-selected-item="true">
|
|
</selection>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text_required"
|
|
potentially-required-field
|
|
field-name="viewAccess"
|
|
entity="ke">
|
|
{{ 'create.knownerror.viewAccess' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__item">
|
|
<selection selection-items="keMetadata.viewAccesses"
|
|
selected-item="ke.selectedViewAccess"
|
|
title-text="{{'create.knownerror.viewAccess' | i18n}}"
|
|
label="label"
|
|
value="label"
|
|
field-name="viewAccess.value"
|
|
entity="ke"
|
|
aria-required="true"
|
|
update-selected-item="true">
|
|
</selection>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-sm-6" ng-show="!state.initialLoading">
|
|
<div class="create-ticket__section">
|
|
<div class="create-ticket__item">
|
|
<edit-summary label="{{'create.knownerror.description' | i18n}}" ticket="ke" context="'create'"
|
|
textplaceholder="'create.ticket.description.placeholder' | i18n" attachment="true"
|
|
is-desc-required="true" show-attachment-icon="true">
|
|
</edit-summary>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="create-ticket__full-width-section" ng-show="!state.initialLoading">
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<div class="create-ticket__section row">
|
|
<div class="col-sm-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text"
|
|
potentially-required-field
|
|
field-name="impactedService.name"
|
|
entity="ke">
|
|
{{ 'create.ticket.affected.business.services' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__service-item">
|
|
<input type="text"
|
|
potentially-required-field
|
|
field-name="impactedService.name"
|
|
entity="ke"
|
|
title="{{ 'create.ticket.affected.business.services' | i18n }}"
|
|
name="service"
|
|
ng-model="ke.selectedService"
|
|
role="combobox"
|
|
typeahead-wait-ms="500"
|
|
typeahead-min-length="3"
|
|
typeahead-template-url="views/create/custom-add-asset-dropdown.html"
|
|
typeahead="asset as asset.name for asset in getList('service', $viewValue)"
|
|
placeholder="{{ 'create.ticket.affected.business.services.placeholder' | i18n }}"
|
|
class="custom-input"
|
|
ng-blur="onInputFocusBlur()"
|
|
uib-tooltip="{{'search.category.exceedsChunkSize' | i18n}}"
|
|
tooltip-is-open="isTooltipOpenService"
|
|
tooltip-enable="exceedsChunkSizeService"
|
|
tooltip-trigger="'none'"
|
|
tooltip-placement="auto">
|
|
<i class="icon-cross item-input__delete-btn" tabindex=0 role="link"
|
|
title="{{'common.button.clear' | i18n}} {{ 'create.ticket.affected.business.services' | i18n }}" ng-if="ke.selectedService"
|
|
focus-input-on-clear ng-click="clearSelectedService()" ng-enter="clearSelectedService()">
|
|
</i>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text"
|
|
potentially-required-field
|
|
field-name="causalCI.name"
|
|
entity="ke">
|
|
{{ 'create.ticket.affected.asset' | i18n }}
|
|
</span>
|
|
|
|
<div class="create-ticket__service-item">
|
|
<input type="text"
|
|
potentially-required-field
|
|
field-name="causalCI.name"
|
|
entity="ke"
|
|
title="{{ 'create.ticket.affected.asset' | i18n }}"
|
|
name="asset"
|
|
ng-model="ke.selectedAsset"
|
|
role="combobox"
|
|
typeahead-wait-ms="500"
|
|
typeahead-min-length="3"
|
|
typeahead-template-url="views/create/custom-add-asset-dropdown.html"
|
|
typeahead="asset as asset.name for asset in getList('asset', $viewValue)"
|
|
placeholder="{{ 'create.ticket.affected.asset.placeholder' | i18n }}"
|
|
class="custom-input"
|
|
ng-blur="onInputFocusBlur()"
|
|
uib-tooltip="{{'search.category.exceedsChunkSize' | i18n}}"
|
|
tooltip-is-open="isTooltipOpenAsset"
|
|
tooltip-enable="exceedsChunkSizeAsset"
|
|
tooltip-trigger="'none'"
|
|
tooltip-placement="top">
|
|
<i class="icon-cross item-input__delete-btn" tabindex=0 role="link"
|
|
title="{{'common.button.clear' | i18n}} {{ 'create.ticket.affected.asset' | i18n }}" ng-if="ke.selectedAsset"
|
|
focus-input-on-clear ng-click="clearSelectedAsset()" ng-enter="clearSelectedAsset()">
|
|
</i>
|
|
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="create-ticket__section row">
|
|
<div class="col-sm-6">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text"
|
|
potentially-required-field
|
|
field-name="rootCause"
|
|
entity="ke">
|
|
{{'ticket.detail.rootCause' | i18n}}
|
|
</span>
|
|
<selection selection-items="selections.rootCause"
|
|
selected-item="ke.rootCause"
|
|
title-text="{{'ticket.detail.rootCause' | i18n}}"
|
|
label="label"
|
|
value="label"
|
|
field-name="rootCause"
|
|
entity="ke"
|
|
update-selected-item="true"
|
|
show-clear=true>
|
|
</selection>
|
|
</label>
|
|
</div>
|
|
<div class="custom-field__date_time_container col-sm-6">
|
|
<label>
|
|
<span id="targetDate" class="label__text required__label" data-required="{{'common.label.required.bracketed' | i18n}}">
|
|
{{'create.ticket.target.date' | i18n}}
|
|
</span>
|
|
<div class="col-sm-12">
|
|
<div class="custom-field__date col-sm-6">
|
|
<input type="text"
|
|
class="form-control"
|
|
name="targetDate"
|
|
title="{{'common.label.date' | i18n}}"
|
|
aria-labelledby="targetDate"
|
|
datepicker-popup="mediumDate"
|
|
ng-model="ke.targetDate"
|
|
min-date="currentDate"
|
|
init-date="currentDate"
|
|
is-open="ke.targetDatePicker.open"
|
|
show-button-bar="false"
|
|
ng-click="ke.targetDatePicker.open = true"
|
|
ng-enter="ke.targetDatePicker.open = true"
|
|
datepicker-options="datePickerOptions"
|
|
required/>
|
|
<i class="icon-calendar custom-field__date-icon"></i>
|
|
</div>
|
|
<div class="custom-field__time col-sm-6">
|
|
<div class="dropdown timepicker">
|
|
<div class="dropdown-toggle">
|
|
<input class="form-control custom-field__time-input" type="text" value="{{ ke.targetDate | date: 'shortTime' }}"
|
|
title="{{'common.label.time' | i18n}}" aria-labelledby="targetDate" readonly="readonly"/>
|
|
<i class="icon-clock_o custom-field__time-icon"></i>
|
|
</div>
|
|
<div class="dropdown-menu" prevent-click-event ng-if="ke.targetDate">
|
|
<timepicker ng-model="ke.targetDate"
|
|
show-meridian="showMeridian"
|
|
default-hours="12"
|
|
default-minutes="0">
|
|
</timepicker>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="create-ticket__section">
|
|
<div class="create-ticket__item">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text"
|
|
id="workaround-label"
|
|
potentially-required-field
|
|
entity="ke"
|
|
field-name="workaround">
|
|
{{('ticket.detail.workaround' | i18n)}}
|
|
</span>
|
|
<textarea type="text"
|
|
class="textarea full-width"
|
|
placeholder="{{ 'create.knownerror.workaround.placeholder' | i18n }}"
|
|
potentially-required-field
|
|
entity="ke"
|
|
field-name="workaround"
|
|
aria-labelledby="workaround-label"
|
|
ng-model="ke.workaround">
|
|
</textarea>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
<div class="create-ticket__item">
|
|
<label class="label_control-wrap">
|
|
<span class="label__text"
|
|
id="resolution-label"
|
|
potentially-required-field
|
|
entity="ke"
|
|
field-name="resolution">
|
|
{{('ticket.detail.resolution' | i18n)}}
|
|
</span>
|
|
<textarea type="text"
|
|
class="textarea full-width"
|
|
placeholder="{{ 'create.knownerror.resolution.placeholder' | i18n }}"
|
|
potentially-required-field
|
|
entity="ke"
|
|
field-name="resolution"
|
|
aria-labelledby="resolution-label"
|
|
ng-model="ke.resolution">
|
|
</textarea>
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-sm-6">
|
|
<div class="create-ticket__section">
|
|
<categories-editor ng-if="ke.allCategories" entity="ke" categories="ke.allCategories" allow-location-company-edit="false"></categories-editor>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="create-ticket__full-width-section" ng-show="!state.initialLoading">
|
|
<div loading-spinner if="state.assigneeLoading" overlay="true" inline="true"></div>
|
|
<div class="row create-ticket__section">
|
|
<div class="create-ticket__assignment col-sm-5">
|
|
<div ng-show="ke.coordinatorAutoAssign">
|
|
<div class="ticket__label-small">
|
|
{{ 'problem.details.coordinator' | i18n }}
|
|
</div>
|
|
<div class="auto-assign__text">
|
|
{{ 'create.ticket.auto.assign' | i18n }}
|
|
</div>
|
|
<div class="ticket-assignee__action" ng-click="assignToMe($event, 'problemcoordinator')" ng-enter="assignToMe($event, 'problemcoordinator')">
|
|
<i class="icon-user_plus"></i>
|
|
<a aria-label="{{'common.labels.assignToMe' | i18n}}" href="">
|
|
{{'common.labels.assignToMe' | i18n }}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div ng-show="!ke.coordinatorAutoAssign">
|
|
<div class="col-sm-1">
|
|
<img ng-if="ke.coordinator.loginId" alt="{{ke.coordinator.fullName}}" class="ticket-assignee__thumbnail " user-availability="ke.coordinator" imgplaceholder="user"
|
|
thumbnail-img="{{'data:' + ke.coordinator.thumbnailMime + ';base64,' + ke.coordinator.thumbnail}}" />
|
|
<span ng-if="!ke.coordinator.loginId" class="ticket-assignee__none icon-question_circle"></span>
|
|
</div>
|
|
<div class="ticket-assignee__details">
|
|
<div class="ticket__label-small">{{'problem.details.coordinator' | i18n }}</div>
|
|
<span ng-if="!ke.coordinator.loginId" class="ticket__field-value">{{'common.label.noneYet' | i18n }}</span>
|
|
<span ng-if="ke.coordinator.loginId" class="ticket__field-value">
|
|
<a aria-label="{{'problem.details.coordinator' | i18n}} {{ke.coordinator.fullName}}"
|
|
href="#/person/{{ke.coordinator.id | escape}}">{{ke.coordinator.fullName}}</a>
|
|
</span>
|
|
<div class="ticket__label-small">{{'common.labels.coordinatorGroup' | i18n}}</div>
|
|
<span class="ticket__field-value">{{ ke.coordinatorGroup.name || ('common.label.noneYet' | i18n ) }}</span>
|
|
</div>
|
|
<div class="ticket-new-knownerror-assignee__action" ng-click="assignToMe($event, 'problemcoordinator')"
|
|
ng-enter="assignToMe($event, 'problemcoordinator')" ng-if="availableForAssignment && ke.coordinator.id !== loggedInUserId">
|
|
<i class="icon-user_plus"></i>
|
|
<a aria-label="{{'common.labels.assignToMe' | i18n}}" href="">
|
|
{{'common.labels.assignToMe' | i18n }}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="create-ticket__assignment col-sm-5">
|
|
<div ng-show="ke.autoAssign">
|
|
<div class="ticket__label-small">
|
|
{{ 'create.ticket.assignee' | i18n }}
|
|
</div>
|
|
<div class="auto-assign__text">
|
|
{{ 'create.ticket.auto.assign' | i18n }}
|
|
</div>
|
|
<div class="ticket-assignee__action" ng-click="assignToMe($event, 'ticketassignee')"
|
|
ng-enter="assignToMe($event, 'ticketassignee')" ng-if="availableForAssignment">
|
|
<i class="icon-user_plus"></i>
|
|
<a aria-label="{{'common.labels.assignToMe' | i18n}}" href="">
|
|
{{'common.labels.assignToMe' | i18n }}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div ng-show="!ke.autoAssign">
|
|
<div class="col-sm-1">
|
|
<img ng-if="ke.assignee.loginId" alt="{{ke.assignee.fullName}}" class="ticket-assignee__thumbnail " user-availability="ke.assignee" imgplaceholder="user"
|
|
thumbnail-img="{{'data:' + ke.assignee.thumbnailMime + ';base64,' + ke.assignee.thumbnail}}" />
|
|
<span ng-if="!ke.assignee.loginId" class="ticket-assignee__none icon-question_circle"></span>
|
|
</div>
|
|
<div class="ticket-assignee__details">
|
|
<div class="ticket__label-small">{{'common.labels.assignedTo' | i18n }}</div>
|
|
<span ng-if="!ke.assignee.loginId" class="ticket__field-value">{{'common.label.noneYet' | i18n }}</span>
|
|
<span ng-if="ke.assignee.loginId" class="ticket__field-value">
|
|
<a aria-label="{{'change.detail.changeCoordinator' | i18n}} {{ke.assignee.fullName}}"
|
|
href="#/person/{{ke.assignee.id | escape}}">{{ke.assignee.fullName}}</a>
|
|
</span>
|
|
<div class="ticket__label-small">{{'common.labels.supportGroup' | i18n}}</div>
|
|
<span class="ticket__field-value">{{ ke.supportGroup.name || ('common.label.noneYet' | i18n ) }}</span>
|
|
</div>
|
|
<div class="ticket-new-knownerror-assignee__action" ng-click="assignToMe($event, 'ticketassignee')" ng-enter="assignToMe($event, 'ticketassignee')" ng-if="ke.assignee.id !== loggedInUserId">
|
|
<i class="icon-user_plus"></i>
|
|
<a aria-label="{{'common.labels.assignToMe' | i18n}}" href="">
|
|
{{'common.labels.assignToMe' | i18n }}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<button type="button" class="btn_primary ticket-template__assignment-btn" ng-click="assign($event)">{{ 'create.ticket.assignment' | i18n }}</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="create-ticket__full-width-section" ng-if="customFields.length">
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<custom-field-container ticket="ke" fields="customFields"></custom-field-container>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="create-ticket__action-panel">
|
|
<span class="create-ticket__form_invalid" ng-if="createKnownerrorForm.$invalid">
|
|
<i class="icon-exclamation_triangle"></i>
|
|
<span ng-if="createKnownerrorForm.$error.required.length">{{createKnownerrorForm.$error.required.length}} {{ 'create.ticket.more.required.fields' | i18n }}</span>
|
|
<span ng-if="formContainsInvalidFields(createKnownerrorForm)">{{ 'create.ticket.invalid.fields' | i18n }}</span>
|
|
</span>
|
|
<span class="font-size-m" ng-if="createKnownerrorForm.$valid">
|
|
<i class="icon-check"></i>
|
|
{{ 'create.ticket.all.required.fields.complete' | i18n }}
|
|
</span>
|
|
|
|
<div class="pull-right">
|
|
<button type="button" class="btn_primary create-ticket__action-btn" ng-disabled="createKnownerrorForm.$invalid || state.dataIsLoading" ng-click="createKE()">
|
|
{{ 'common.button.saveTicket' | i18n }}
|
|
</button>
|
|
<button type="button" class="btn_secondary action-panel__cancel-btn" ng-disabled="state.dataIsLoading" ng-click="cancel()">
|
|
{{ 'common.button.cancel' | i18n }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|