<div class="container-fluid" ng-controller="issueListController">
|
<div class="row">
|
<div class="col-sm-12" >
|
<div class="element-wrapper" ng-if="!vm.detailView">
|
<div class="element-box">
|
<div class="row" >
|
<div class="col-sm-12">
|
<div class="searchdiv" ng-if="!$root.isMainSearch">
|
<form name="issueSearchForm" role="form" ng-enter="fn.getPageList(0)">
|
<div class="row">
|
<div class="col-sm-6">
|
<div class="input-group">
|
<input class="form-control"
|
type="text"
|
tabindex="-1"
|
maxlength="300"
|
kr-input
|
owl-auto-focus
|
ng-model="vm.search.keyWord"
|
placeholder="{{'issue.pleaseEnterIssueKeyWord' | translate}}">
|
<div class="input-group-prepend ml-10">
|
<button class="btn btn-navy" ng-click="fn.getPageList(0)"> <span translate="common.search">검색</span></button>
|
</div>
|
</div>
|
</div>
|
</div>
|
|
<div class="row">
|
<div class="col-sm-12">
|
<div class="tabfilter">
|
<div translate="common.selectedSearchCriteria">선택한 검색 조건</div>
|
<!-- 이슈 제목 -->
|
<p ng-if="$root.isDefined(vm.search.title)">
|
{{vm.search.title}}
|
<span ng-click="vm.search.title = ''">×</span>
|
</p>
|
|
<!-- 프로젝트 -->
|
<!-- <issue-search-array-view-element lists="vm.projects"-->
|
<!-- type="'project'"></issue-search-array-view-element>-->
|
|
<!-- 이슈 타입 -->
|
<!-- <issue-search-field-key-view-element lists="vm.issueTypes"-->
|
<!-- keys="vm.search.issueTypeIds"></issue-search-field-key-view-element>-->
|
|
<!-- 이슈 상태 -->
|
<issue-search-field-key-view-element lists="vm.issueStatuses"
|
keys="vm.search.issueStatusIds"></issue-search-field-key-view-element>
|
|
<!-- 이슈 번호 -->
|
<p ng-if="$root.isDefined(vm.search.issueNumber)">
|
{{vm.search.issueNumber}}
|
<span ng-click="vm.search.issueNumber = ''">×</span>
|
</p>
|
|
<!-- 이슈 내용 -->
|
<p ng-if="$root.isDefined(vm.search.description)">
|
{{vm.search.description}}
|
<span ng-click="vm.search.description = ''">×</span>
|
</p>
|
|
<!-- 우선 순위 -->
|
<issue-search-field-key-view-element lists="vm.priorities"
|
keys="vm.search.priorityIds"></issue-search-field-key-view-element>
|
|
<!-- 중요도 -->
|
<issue-search-field-key-view-element lists="vm.severities"
|
keys="vm.search.severityIds"></issue-search-field-key-view-element>
|
|
<!-- 담당자 -->
|
<issue-search-array-view-element lists="vm.users"
|
type="'user'"></issue-search-array-view-element>
|
|
<!-- 등록자 -->
|
<issue-search-array-view-element lists="vm.registers"
|
type="'user'"></issue-search-array-view-element>
|
|
<!-- 시작일 -->
|
<p ng-if="$root.isDefined(vm.search.startDateRange)">
|
{{vm.search.startDateRange}}
|
<span ng-click="vm.search.startDateRange = ''">×</span>
|
</p>
|
|
<!-- 종료일 -->
|
<p ng-if="$root.isDefined(vm.search.completeDateRange)">
|
{{vm.search.completeDateRange}}
|
<span ng-click="vm.search.completeDateRange = ''">×</span>
|
</p>
|
|
<!-- 기간 -->
|
<p ng-if="$root.isDefined(vm.search.dateRange)">
|
{{vm.search.dateRange}}
|
<span ng-click="vm.search.dateRange = ''">×</span>
|
</p>
|
|
<!-- 등록일 -->
|
<p ng-if="$root.isDefined(vm.search.registerDateRange)">
|
{{vm.search.registerDateRange}}
|
<span ng-click="vm.search.registerDateRange = ''">×</span>
|
</p>
|
|
<!-- 담당부서 -->
|
<issue-search-array-view-element lists="vm.departments"
|
type="'department'"></issue-search-array-view-element>
|
|
<!-- 텍스트 입력 필드 -->
|
<issue-search-custom-field-view-element
|
custom-fields="vm.customFields"></issue-search-custom-field-view-element>
|
</div>
|
</div>
|
</div>
|
|
|
<div class="">
|
<label class="issue-search-label" ng-class="{ 'icon-reverse' : vm.searchView }"
|
ng-click="vm.searchView = !vm.searchView">
|
<span translate="common.detailedSearch">상세검색</span>
|
</label>
|
<div ng-if="vm.searchView">
|
<div class="row">
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="issue.issueTitle">이슈 제목</span></label>
|
<input type="text"
|
name="title"
|
class="form-control input-sm"
|
kr-input
|
maxlength="20"
|
autocomplete="off"
|
ng-model="vm.search.title">
|
</div>
|
</div>
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="issue.issueNumber">이슈 번호</span></label>
|
<input type="text"
|
name="issueNumber"
|
class="form-control input-sm"
|
autocomplete="off"
|
kr-input
|
maxlength="20"
|
ng-model="vm.search.issueNumber">
|
</div>
|
</div>
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="issue.issueContent">이슈 내용</span></label>
|
<input type="text"
|
name="description"
|
class="form-control input-sm"
|
kr-input
|
maxlength="20"
|
autocomplete="off"
|
ng-model="vm.search.description">
|
</div>
|
</div>
|
<!-- <div class="col-lg-3">-->
|
<!-- <div class="form-group">-->
|
<!-- <label> <span translate="common.project">프로젝트</span></label>-->
|
<!-- <js-autocomplete-multi data-input-name="projects"-->
|
<!-- selected-model="vm.projects"-->
|
<!-- search="vm.projectName"-->
|
<!-- input-disabled="false"-->
|
<!-- translation-texts="{ empty : 'common.emptyProject', selectList : 'common.' }"-->
|
<!-- source="fn.getProjectList(vm.projectName, vm.projects, null, null, ['01', '02', '03'])"-->
|
<!-- extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '', type : '', maxlength : 100}"></js-autocomplete-multi>-->
|
<!-- </div>-->
|
<!-- </div>-->
|
|
<!-- <div class="col-lg-3">-->
|
<!-- <div class="form-group">-->
|
<!-- <label> <span translate="issue.issueType">이슈 타입</span></label>-->
|
<!-- <ng-dropdown-multiselect class="multiSelect cursor"-->
|
<!-- data-input-name="issueStatuses"-->
|
<!-- selected-model="vm.search.issueTypeIds"-->
|
<!-- options="::vm.issueTypes"></ng-dropdown-multiselect>-->
|
<!-- </div>-->
|
<!-- </div>-->
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="issue.issueStatus">이슈 상태</span></label>
|
<ng-dropdown-multiselect class="multiSelect cursor"
|
data-input-name="issueStatuses"
|
selected-model="vm.search.issueStatusIds"
|
options="::vm.issueStatuses"></ng-dropdown-multiselect>
|
</div>
|
</div>
|
</div>
|
|
<div class="row">
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="common.priority">우선 순위</span></label>
|
<ng-dropdown-multiselect class="multiSelect cursor"
|
data-input-name="priorities"
|
selected-model="vm.search.priorityIds"
|
options="::vm.priorities"></ng-dropdown-multiselect>
|
</div>
|
</div>
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="common.importance">중요도</span></label>
|
<ng-dropdown-multiselect class="multiSelect cursor"
|
data-input-name="severities"
|
selected-model="vm.search.severityIds"
|
options="::vm.severities"></ng-dropdown-multiselect>
|
</div>
|
</div>
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="common.register">등록자</span></label>
|
<js-autocomplete-multi data-input-name="registers"
|
selected-model="vm.registers"
|
search="vm.registerName"
|
input-disabled="false"
|
source="fn.getUserList(vm.registerName, vm.registers)"
|
translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }"
|
extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'user', maxlength : 100 }">
|
</js-autocomplete-multi>
|
</div>
|
</div>
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="common.assigneeTeam">담당부서</span></label>
|
<js-autocomplete-multi data-input-name="departments"
|
selected-model="vm.departments"
|
search="vm.departmentName"
|
input-disabled="false"
|
source="fn.getUserDepartmentList(vm.departmentName, vm.departments)"
|
translation-texts="{ count : 'common.userNum', empty : 'common.emptyProjectDepartment' }"
|
extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'department', maxlength : 100 }">
|
</js-autocomplete-multi>
|
</div>
|
</div>
|
|
</div>
|
|
|
<div class="row">
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="common.startDate">시작일</span></label>
|
<input type="text"
|
readonly
|
class="form-control input-sm input-readonly"
|
ng-model="vm.search.startDateRange"
|
date-format="YY-MM-DD"
|
parent-el="'#createdWidget'"
|
date-range-picker>
|
</div>
|
</div>
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="common.endDate">종료일</span></label>
|
<input type="text"
|
readonly
|
class="form-control input-sm input-readonly"
|
ng-model="vm.search.completeDateRange"
|
modal-form-auto-scroll
|
date-format="YY-MM-DD"
|
parent-el="'#createdWidget'"
|
date-range-picker>
|
</div>
|
</div>
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="common.dateRange">기간</span></label>
|
<input type="text"
|
readonly
|
class="form-control input-sm input-readonly"
|
ng-model="vm.search.dateRange"
|
modal-form-auto-scroll
|
date-format="YY-MM-DD"
|
parent-el="'#createdWidget'"
|
date-range-picker>
|
</div>
|
</div>
|
|
<div class="col-lg-3">
|
<div class="form-group">
|
<label> <span translate="common.registrationDate">등록일</span></label>
|
<input type="text"
|
readonly
|
class="form-control input-sm input-readonly"
|
ng-model="vm.search.registerDateRange"
|
modal-form-auto-scroll
|
date-format="YY-MM-DD"
|
parent-el="'#createdWidget'"
|
date-range-picker>
|
</div>
|
</div>
|
|
|
<div class="col-lg-3" ng-repeat="customField in vm.customFields">
|
<label>{{::customField.name}}</label>
|
|
<div ng-switch on="customField.customFieldType">
|
<div ng-switch-when="INPUT">
|
<input type="text"
|
class="form-control input-sm"
|
ng-model="customField.useValues"
|
>
|
</div>
|
<div ng-switch-when="NUMBER">
|
<input type="text"
|
class="form-control input-sm"
|
name="item_{{$index}}"
|
ng-model="customField.useValues"
|
kr-input
|
placeholder="숫자만 입력 가능합니다."
|
ng-pattern="/^[0-9]*$/"
|
autocomplete="off">
|
<div ng-if="issueSearchForm['item_'+ $index].$error.pattern" class="help-block form-text text-danger"
|
translate="common.invalidNumberFormat">숫자만 입력 가능합니다.
|
</div>
|
</div>
|
|
<div ng-switch-when="DATETIME">
|
<input class="form-control input-sm input-readonly"
|
name="item_{{$index}}"
|
ng-model="customField.useValues"
|
placeholder="{{'issue.clickToSelectDate' | translate}}"
|
modal-form-auto-scroll
|
range-type="multiDate"
|
date-range-picker
|
autocomplete="off">
|
<div class="row">
|
<div class="col-xs-12">
|
<div id="createdWidget" class="bootstrap-datepicker "></div>
|
</div>
|
</div>
|
</div>
|
|
<div ng-switch-when="IP_ADDRESS">
|
<input type="text"
|
class="form-control input-sm"
|
name="item_{{$index}}"
|
ng-model="customField.useValues"
|
kr-input
|
ng-pattern="/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"
|
placeholder="IP 주소 형식만 입력 가능합니다."
|
autocomplete="off">
|
<div ng-if="issueSearchForm['item_'+ $index].$error.pattern" class="help-block form-text text-danger"
|
translate="common.invalidipAdressFormat">IP주소 형식이 맞지 않습니다.
|
</div>
|
</div>
|
|
<div ng-switch-when="EMAIL">
|
<input type="email"
|
class="form-control input-sm"
|
name="item_{{$index}}"
|
ng-model="customField.useValues"
|
kr-input
|
ng-pattern="/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/"
|
placeholder="이메일 형식만 입력 가능합니다."
|
autocomplete="off">
|
<div ng-if="issueSearchForm['item_'+ $index].$error.pattern" class="help-block form-text text-danger"
|
translate="common.invalidEmailFormat">이메일 형식이 맞지 않습니다.
|
</div>
|
</div>
|
|
<div ng-switch-when="SITE">
|
<input type="text"
|
class="form-control input-sm"
|
name="item_{{$index}}"
|
ng-model="customField.useValues"
|
kr-input
|
ng-pattern="/(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/"
|
placeholder="홈페이지 주소 형식만 입력 가능합니다."
|
autocomplete="off">
|
<div ng-if="issueSearchForm['item_'+ $index].$error.pattern" class="help-block form-text text-danger"
|
translate="common.invalidSiteFormat">홈페이지 주소 형식이 맞지 않습니다.(http://로 시작하셔야합니다)
|
</div>
|
</div>
|
<div ng-switch-when="TEL">
|
<input type="text"
|
class="form-control input-sm"
|
name="item_{{$index}}"
|
ng-model="customField.useValues"
|
kr-input
|
ng-pattern="/^\d{2,3}-\d{3,4}-\d{4}$/"
|
placeholder="연락처 형식만 입력 가능합니다."
|
autocomplete="off">
|
<div ng-if="issueSearchForm['item_'+ $index].$error.pattern" class="help-block form-text text-danger"
|
translate="common.invalidTelFormat">전화번호 형식이 맞지 않습니다.
|
</div>
|
</div>
|
|
<div ng-switch-default>
|
<ng-dropdown-multiselect class="multiSelect cursor"
|
data-input-name="customField.name"
|
selected-model="customField.useValues"
|
extra-settings="{ 'idProp' : 'value', 'externalIdProp' : 'value', 'displayProp' : 'value', 'stringTypeOption' : 'true', 'stopRemoveBodyEvent' : 'true' }"
|
options="::customField.customFieldValueVos"></ng-dropdown-multiselect>
|
</div>
|
</div>
|
</div>
|
|
</div>
|
|
<div class="row">
|
<div class="col-sm-12">
|
<div class="form-buttons-w text-center mb-20">
|
<button class="btn btn-xlg btn-navy" ng-click="fn.getPageList(0)">
|
<i class="os-icon os-icon-ui-37"></i>
|
<span translate="common.search">검색</span>
|
</button>
|
<button class="btn btn-xlg btn-white" ng-click="fn.initSearch()">
|
<i class="os-icon os-icon-grid-18"></i>
|
<span translate="common.reset">초기화</span>
|
</button>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</form>
|
</div>
|
</div>
|
</div>
|
<div class="controls-above-table mt-30">
|
<div class="row">
|
<!-- 좌측 -->
|
<div class="col-7">
|
<div class="dataTables_length">
|
<label>
|
<select name="pageRow"
|
tabindex="-1"
|
class="form-control form-control-sm"
|
ng-change="fn.changePageRowCount()"
|
ng-model="vm.page.selectedPageRowCount">
|
<option value="10">10</option>
|
<option value="50">50</option>
|
<option value="100">100</option>
|
</select> {{vm.page.selectedPage}}-{{vm.responseData.page.totalPage}} /
|
{{vm.responseData.page.totalCount | number}}<span translate="common.few">건</span>
|
</label>
|
<div class="btn-group ml-2" role="group" aria-label="list-group">
|
<button class="btn" ng-class="{'btn-info': vm.listMode === 0, 'btn-light': vm.listMode !== 0}" ng-click="fn.onClickListMode(0)">List</button>
|
<button class="btn" ng-class="{'btn-info': vm.listMode === 1, 'btn-light': vm.listMode !== 1}" ng-click="fn.onClickListMode(1)">Tree</button>
|
</div>
|
</div>
|
</div>
|
|
|
<!-- 우측 -->
|
<div class="col-5" >
|
<span class="issue-detail-label" ng-if="vm.listMode === 0" style="position: relative; left: 2.8rem; bottom: 5px"><span style="color: #0a7cf8">◆</span> 하위 이슈 숨기기</span>
|
<label class='switch' ng-if="vm.listMode === 0" style="left: 3.3rem"><input type='checkbox' ng-model='vm.hideDownIssue' ng-click='fn.getPageList(0)'>
|
<span class='slider round'></span>
|
</label>
|
<span class="issue-detail-label" style="position: relative; left: 5.8rem; bottom: 5px"><span style="color: #0a7cf8">◆</span> 완료 이슈 숨기기</span>
|
<label class='switch' style="left: 6.3rem"><input type='checkbox' ng-model='vm.hideCompleteIssue' ng-click='fn.getPageList(0)'>
|
<span class='slider round'></span>
|
</label>
|
<form class="form-inline justify-content-sm-end pull-right" method="post" action="/issue/downloadExcel" name="issueListForm" >
|
<!--span class="badge-tip" function-tool-tip data-placement="top" data-toggle="tooltip" data-original-title="엑셀 다운로드, 일괄 변경 등 다양한 기능을 제공합니다.">?</span-->
|
<input type="hidden" name="conditions">
|
<div class="btn-group" ng-if="vm.listMode === 0">
|
<button aria-expanded="false" aria-haspopup="true"
|
tabindex="-1"
|
class="btn btn-secondary dropdown-toggle"
|
data-toggle="dropdown" type="button"><span translate="common.addFunction">추가기능</span>
|
</button>
|
<div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu"
|
x-placement="bottom-start" >
|
<a class="dropdown-item cursor" form-submit="issueListForm" make-search-conditions="fn.makeSearchConditions()"> <span translate="common.allDownloadExcel">엑셀 다운로드</span></a>
|
|
<a class="dropdown-item cursor" ng-click="fn.importExcel()"> <span translate="common.importExcel">Excel Import</span></a>
|
<a class="dropdown-item cursor" ng-click="fn.modifyMultiIssueStatus()"> <span translate="common.updateIssueStatus">이슈 상태 변경</span></a>
|
<a class="dropdown-item cursor" ng-click="fn.addIssueTableConfig()"> <span translate="issue.settingTableDisplay">테이블 표시 설정</span></a>
|
<a class="dropdown-item cursor" ng-click="fn.removes()"> <span translate="common.selectDelete">삭제</span></a>
|
</div>
|
</div>
|
</form>
|
</div>
|
</div>
|
</div>
|
|
<div class="table-responsive" >
|
<js-table ng-if="vm.listMode === 0"
|
data="vm.responseData.data" table-configs="vm.tableConfigs"
|
event="tableEvent" detail-view="vm.detailView"></js-table>
|
|
<js-tree ng-if="vm.listMode === 1"
|
data="vm.responseData.data" table-configs="vm.treeConfigs"
|
event="tableEvent" detail-view="vm.detailView"></js-tree>
|
</div>
|
<div class="controls-below-table text-center">
|
<ul uib-pagination
|
boundary-links-numbes="true"
|
items-per-page="vm.page.selectedPageRowCount"
|
total-items="vm.responseData.page.totalCount"
|
ng-model="vm.page.selectedPage"
|
max-size="10"
|
ng-click="fn.getPageList(vm.page.selectedPage - 1)"
|
class="pagination pagination-sm"
|
previous-text="<"
|
next-text=">"
|
first-text=""
|
last-text="">
|
</ul>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
|
<div class="row support-index" ng-show="vm.detailView">
|
<div ng-include include-replace src="'views/issue/issueDetail.html'"></div>
|
</div>
|
</div>
|