Skip to content

Instantly share code, notes, and snippets.

@AaronMcCaughan
Last active January 16, 2019 08:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AaronMcCaughan/e5d9ce92dfee55eee8ca676ad8d63653 to your computer and use it in GitHub Desktop.
Save AaronMcCaughan/e5d9ce92dfee55eee8ca676ad8d63653 to your computer and use it in GitHub Desktop.
Barclays TECR Grid View
.barclays-tecr {
position: relative;
}
imdashboard .barclays-tecr-panel {
border-width: 0;
/*background-color: transparent;*/
}
imdashboard .barclays-tecr-panel .panel-heading {
border-bottom-width: 0;
}
imdashboard .barclays-tecr-panel .panel-heading h4 {
font-size: 16px;
line-height: 36px;
}
imdashboard .barclays-tecr-panel .panel-heading h4:before {
content: "";
width: 5px;
background-color: #46ade9;
height: 35px;
display: inline-block;
vertical-align: middle;
margin-right: 5px;
}
imdashboard .barclays-tecr table {
font-size: 12px;
table-layout: fixed;
}
imdashboard .barclays-tecr table tbody tr {
cursor: pointer;
}
imdashboard .barclays-tecr table tbody tr:hover {
background-color: #e5f5fa;
}
imdashboard .barclays-tecr table td {
vertical-align: middle;
border-width: 0;
}
imdashboard .barclays-tecr table.table > tr td:nth-child(2) {
max-width: 250px;
}
imdashboard .barclays-tecr table.table > tr td:nth-child(3) {
max-width: 100px;
}
imdashboard .barclays-tecr .table > thead tr th {
border-bottom-width: 0;
position: relative;
width: 10%;
}
imdashboard .barclays-tecr .table > thead tr th:nth-child(2) {
width: 20%;
}
imdashboard .barclays-tecr thead tr th > div:first-child {
text-transform: uppercase;
font-weight: bold;
}
imdashboard .barclays-tecr thead tr th > div:first-child img {
background: transparent url("/Content/cassete/overall/sort_asc_green.png") center center no-repeat;
width: 16px;
height: 16px;
text-align: right;
display: inline-block;
vertical-align: top;
}
imdashboard .barclays-tecr thead tr th > div:first-child img.sort-asc {
background-image: url("/Content/cassete/overall/sort_asc_green.png");
}
imdashboard .barclays-tecr thead tr th > div:first-child img.sort-desc {
background-image: url("/Content/cassete/overall/sort_desc_green.png");
}
imdashboard .barclays-tecr thead tr th > *:nth-child(2) {
margin-left: -7px;
}
imdashboard .barclays-tecr thead tr th .remove-filter {
bottom: 11px;
position: absolute;
right: 16px;
z-index: 3;
}
imdashboard .barclays-tecr thead tr th .remove-filter div {
width: 15px;
height: 15px;
}
imdashboard .barclays-tecr thead tr th .form-control {
border-width: 0;
background-color: transparent;
box-shadow: none;
/*margin-left: -7px;*/
border-radius: 2px;
padding: 4px 7px;
height: 27px;
font-weight: normal;
line-height: 18px;
}
imdashboard .barclays-tecr thead tr th .form-control[type=text] {
padding-right: 20px;
}
imdashboard .barclays-tecr thead tr th .form-control.quick-filter {
position: absolute;
top: 0px;
left: 0px;
z-index: 1;
background-color: #fff;
}
imdashboard .barclays-tecr thead tr th .input-group input.form-control {
width: 50%;
}
imdashboard .barclays-tecr thead tr th .tecr-user {
border-radius: 2px;
height: 27px;
}
imdashboard .barclays-tecr thead tr th .tecr-status, imdashboard .barclays-tecr thead tr th .tecr-type, imdashboard .barclays-tecr thead tr th .tecr-user {
font-size: 12px;
}
imdashboard .barclays-tecr thead tr th .tecr-user .btn {
font-size: 12px;
text-transform: none;
}
imdashboard .barclays-tecr thead tr th .tecr-user .btn:active {
font-size: 12px;
background-color: transparent;
}
imdashboard .barclays-tecr thead tr th .btn.ui-select-match-item {
height: 20px;
line-height: 18px;
}
imdashboard .barclays-tecr thead tr th .btn.ui-select-match-item .close {
opacity: 0.7;
line-height: 0.9;
}
imdashboard .barclays-tecr thead tr th .btn.ui-select-match-item:hover {
background-color: #a6c7ff;
color: #000;
}
imdashboard .barclays-tecr thead tr th .form-control::placeholder, imdashboard .barclays-tecr thead tr th .ui-select-search::placeholder {
font-weight: normal;
font-size: 12px;
}
imdashboard .barclays-tecr thead tr th .form-control:hover:not(.btn), imdashboard .barclays-tecr thead tr th .form-control:focus:not(.btn),
imdashboard .barclays-tecr thead tr th .tecr-user:hover, imdashboard .barclays-tecr thead tr th .tecr-user:focus {
box-shadow: inset 0px 0px 0px 2px #a6c7ff;
border-width: 0;
}
imdashboard .barclays-tecr thead tr th .btn-range {
line-height: 19px;
border-width: 0;
padding: 4px 15px 4px 7px;
border-radius: 2px;
color: #777;
text-align: left;
overflow: hidden;
text-overflow: ellipsis;
}
imdashboard .barclays-tecr thead tr th .form-control.has-value, imdashboard .barclays-tecr thead tr th .tecr-user.has-value, imdashboard .barclays-tecr thead tr th .btn-range.has-value {
/*border: 1px solid #73dd24;*/
box-shadow: inset 0px 0px 0px 1px #73dd24 !important;
background-color: #f1ffe7;
}
imdashboard .barclays-tecr .input-number::-webkit-inner-spin-button,
imdashboard .barclays-tecr .input-number::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
imdashboard .barclays-tecr .tecr .text-blue {
color: #1B76CA;
}
imdashboard .barclays-tecr .tecr .text-bold {
font-weight: bold;
}
imdashboard .barclays-tecr .tecr .status p {
font-size: 11px;
display: inline-block;
text-transform: uppercase;
font-weight: bold;
padding: 5px 7px;
max-width: 100%;
}
imdashboard .barclays-tecr .tecr .badge {
height: 25px;
width: 25px;
border-radius: 50%;
background: linear-gradient(-45deg, rgba(73, 140, 255, 1) 3%, rgba(0, 178, 255, 1) 100%);
display: inline-block;
margin-right: 5px;
line-height: 20px;
text-align: center;
text-transform: uppercase;
padding: 3px;
font-weight: normal;
}
.barclays-tecr .pagination-sm {
border-radius: 15px;
background-color: #f1f3f6;
box-shadow: inset 0 0 0 1px #ececec;
margin-bottom: 10px;
}
.barclays-tecr .pagination-sm>li:first-child>a, .pagination-sm>li:first-child>span {
border-top-left-radius: 50%;
border-bottom-left-radius: 50%;
font-size: 15px;
line-height: 20px;
}
.barclays-tecr .pagination-sm>li:last-child>a, .pagination-sm>li:last-child>span {
border-top-right-radius: 50%;
border-bottom-right-radius: 50%;
font-size: 15px;
line-height: 20px;
}
.barclays-tecr .pagination-sm>li a, .barclays-tecr .pagination-sm>li a:hover {
border-color: transparent;
background-color: transparent;
line-height: 23px;
}
.barclays-tecr .pagination-sm>li:first-child>a:hover,
.barclays-tecr .pagination-sm>li:last-child>a:hover {
line-height: 20px;
}
.barclays-tecr .pagination-sm>li:not(.disabled) a {
color: #000;
}
.barclays-tecr .pagination-sm>li.active a {
border-radius: 50%;
color: #fff;
background-color: #000;
padding: 0px 8px;
/*margin-left: 2px;*/
margin-top: 5px;
font-weight: bold;
}
.barclays-tecr .multiple-select-custom {
position: relative;
}
.barclays-tecr .multiple-select-custom ul {
position: absolute;
top: 100%;
left: 0;
z-index: 10;
float: left;
width: 100%;
max-height: 250px;
overflow-y: auto;
margin: 2px 0 0;
list-style: none;
background-color: #fff;
border: 1px solid rgba(200,200,200,0.5);
}
.barclays-tecr .multiple-select-custom ul li {
padding: 0 15px;
line-height: 30px;
}
.barclays-tecr .multiple-select-custom ul li label {
vertical-align: middle;
}
.barclays-tecr .multiple-select-custom ul li label input[type=checkbox] {
vertical-align: text-bottom;
}
.barclays-tecr .multiple-select-custom ul li:hover {
background-color: #e6f5fa;
color: #1B76CA;
}
.barclays-tecr .multiple-select-custom ul li.action {
line-height: 35px;
}
.barclays-tecr .multiple-select-custom ul li.action .btn-block {
margin: 10px 0 0 0;
}
.barclays-tecr .daterange-backdrop {
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 10;
background-color: rgba(0,0,0,0.2);
}
.barclays-tecr .daterange-panel.panel.panel-default {
width: auto;
height: auto;
position: absolute;
left: 50%;
top: 50px;
z-index: 11;
background-color: #fefefe;
margin-left: -25%;
}
.barclays-tecr .daterange-panel .alert {
padding: 10px;
margin: 0 5px 5px;
}
.barclays-tecr .daterange-panel .datetime-picker-dropdown {
position: relative;
left: 0 !important;
top: 0 !important;
width: 292px;
}
.barclays-tecr .daterange-panel .datetime-picker-dropdown .pull-right.btn-group {
display: none;
}
.barclays-tecr .daterange-panel .daterange-row {
}
.barclays-tecr .daterange-panel .daterange-col {
display: inline-block;
position: relative;
margin: 0 5px;
vertical-align: top;
}
.barclays-tecr .daterange-panel .daterange-col li {
cursor: pointer;
}
.barclays-tecr .daterange-panel .daterange-col li .btn-group {
margin: 0;
}
<div class="barclays-tecr" ng-controller="BarclaysWidgetTecr">
<div class="daterange-backdrop" ng-click="closeChangeStatusDropdown()" ng-if="model.showChangeStatusDropdown"></div>
<button class="btn btn-sm btn-default hidden" ng-click="showDateRangeFilter()" zng-if="!model.showDateRangeFilter">show Date Range Filter</button>
<div class="daterange-backdrop" ng-click="onDateRangeFilterClick($event, prop)" ng-if="model.showDateRangeFilter"></div>
<div class="daterange-panel panel panel-default" ng-click="onDateRangeFilterClick($event, prop)" ng-if="model.showDateRangeFilter">
<div class="panel-body">
<div class="alert alert-info" role="alert" ng-if="!isDateRangeValid()">Hint: Select two dates, make sure that Start date is prior the End date, or equal</div>
<div class="daterange-row">
<div class="daterange-col"><!--options-->
<ul class="list-group">
<li class="list-group-item small" ng-click="selectDateRange('-7')">Past week</li>
<li class="list-group-item small" ng-click="selectDateRange('-30')">Past month</li>
<li class="list-group-item small" ng-click="selectDateRange('-90')">Past 3 month</li>
<li class="list-group-item small" ng-click="selectDateRange('7')">Next 7 days</li>
<li class="list-group-item small" ng-click="selectDateRange('30')">Next month</li>
<li class="list-group-item small" ng-click="selectDateRange('90')">Next 3 month</li>
</ul>
</div>
<div class="daterange-col">
<input type="text" readonly class="form-control input-sm" datetime-picker="{{model.dateTimeFormatPicker}}" ng-model="model.dateRangeFilterFrom" enable-time="false" close-on-date-selection="false" is-open="true" datepicker-options="model.dateOptions" re-open-default="date" ng-change="validateDateRange()" />
</div>
<div class="daterange-col">
<input type="text" readonly class="form-control input-sm" datetime-picker="{{model.dateTimeFormatPicker}}" ng-model="model.dateRangeFilterTo" enable-time="false" close-on-date-selection="false" is-open="true" datepicker-options="model.dateOptions" re-open-default="date" ng-change="validateDateRange()" />
</div>
</div>
<button class="btn btn-sm btn-default" ng-click="dateRangeApply()" ng-disabled="!isDateRangeValid()" style="margin-top: 10px">Apply</button>
<button class="btn btn-sm btn-default" ng-click="model.showDateRangeFilter = false" style="margin-top: 10px">Cancel</button>
</div>
</div>
<table class="table table-hover table-condensed">
<thead>
<tr>
<th>
<div ng-click="applySortField('number')">number <img ng-if="model.filter.sortField == 'RequestNumber'" ng-class="{'sort-asc' : model.filter.sortDir == 'ASC', 'sort-desc' : model.filter.sortDir == 'DESC'}" src="/Content/images/1px.png" /></div>
<input type="number" ng-keypress="filterNumbersOnly($event)" class="form-control input-sm input-number" ng-class="{'has-value' : model.filter.numberValue != ''}" placeholder="Search" ng-model="model.filter.numberValue" ng-change="applyFilter('number')" ng-model-options="{updateOn : 'change blur'}" update-on-enter />
<button type="button" class="remove-filter close" ng-if="model.filter.numberValue != ''" ng-click="model.filter.numberValue = ''; applyFilter('number')"><div class="x-form-clear-trigger"></div></button>
</th>
<th>
<div ng-click="applySortField('title')">title <img ng-if="model.filter.sortField == 'Title'" ng-class="{'sort-asc' : model.filter.sortDir == 'ASC', 'sort-desc' : model.filter.sortDir == 'DESC'}" src="/Content/images/1px.png" /></div>
<input type="text" class="form-control input-sm" ng-class="{'has-value' : model.filter.titleValue != ''}" placeholder="Search" ng-model="model.filter.titleValue" ng-change="applyFilter('title')" ng-model-options="{updateOn : 'change blur'}" update-on-enter />
<button type="button" class="remove-filter close" ng-if="model.filter.titleValue != ''" ng-click="model.filter.titleValue = ''; applyFilter('title')"><div class="x-form-clear-trigger"></div></button>
</th>
<th>
<div ng-click="applySortField('type')">type <img ng-if="model.filter.sortField == 'CRType'" ng-class="{'sort-asc' : model.filter.sortDir == 'ASC', 'sort-desc' : model.filter.sortDir == 'DESC'}" src="/Content/images/1px.png" /></div>
<!--<ui-select ng-if="model.tecrTypes && model.tecrTypes.length" multiple class="tecr-type" ng-class="{'has-value' : model.filter.typeValue.length}" ng-model="model.filter.typeValue" on-select="applyFilter('type')" on-remove="applyFilter('type')" close-on-select="false">
<ui-select-match placeholder="Search">{{$item.Name}}</ui-select-match>
<ui-select-choices repeat="crType in model.tecrTypes | filter: $select.search">
<div ng-bind-html="(crType.Name | highlight: $select.search)"></div>
</ui-select-choices>
</ui-select>-->
<div ng-if="model.tecrTypes.length > 0">
<div deep-blur="model.typeFilterFocused = false; applyFilter('type')" tabindex="-1" class="multiple-select-custom">
<input class="form-control input-sm" placeholder="Search" ng-class="{'has-value': model.filter.typeValue.length}"
ng-value="model.filter.typeValue.length ? model.filter.typeValue.length+' selected' : ''"
ng-focus="model.typeFilterFocused = true" readonly="readonly" />
<input class="form-control input-sm quick-filter" placeholder="Search" ng-model="quickTypeFilter.Name" ng-show="model.typeFilterFocused == true" />
<ul ng-show="model.typeFilterFocused">
<li class="action" ng-if="(model.tecrTypes|filter:quickTypeFilter).length > 0">
<button type="button" class="btn btn-default btn-sm btn-block" ng-click="toggleTypeFilter()">{{(model.filter.typeValue.length) ? 'Deselect All' : 'Select All'}}</button>
</li>
<li ng-repeat="option in model.tecrTypes|filter: quickTypeFilter">
<label class="">
<input type="checkbox" ng-model="option.selected" ng-keyup="$event.keyCode === 13 && onEnterTypeClick()" /> {{option.Name}}
</label>
</li>
</ul>
</div>
</div>
<button type="button" class="remove-filter close" ng-if="model.filter.typeValue.length" ng-click="model.filter.typeValue = []; emptyTypeFilter(); applyFilter('type')"><div class="x-form-clear-trigger"></div></button>
</th>
<th>
<div ng-click="applySortField('raised')">raised on <img ng-if="model.filter.sortField == 'CreatedDate'" ng-class="{'sort-asc' : model.filter.sortDir == 'ASC', 'sort-desc' : model.filter.sortDir == 'DESC'}" src="/Content/images/1px.png" /></div>
<button class="btn btn-sm btn-default btn-range btn-block" ng-class="{'has-value' : model.filter.raisedValueFrom}" ng-click="showDateRangeFilter('raised')"><span ng-if="model.filter.raisedValueFrom && model.filter.raisedValueTo">{{model.filter.raisedValueFrom | date : model.dateTimeFormatPicker}} : {{model.filter.raisedValueTo | date : model.dateTimeFormatPicker}}</span><span ng-if="!model.filter.raisedValueFrom || !model.filter.raisedValueTo">Set range</span></button>
<div class="input-group hidden">
<input type="text" readonly class="form-control input-sm" ng-class="{'has-value' : model.filter.raisedValueFrom}" placeholder="dd/mm/yyyy"
ng-model="model.filter.raisedValueFrom" ng-click="openFilterCalendar($event, 'raisedFrom', prop)" datetime-picker="{{model.dateTimeFormatPicker}}"
is-open="model.raisedDateFromFilterOpen" datepicker-options="model.dateOptions" enable-time="false" ng-change="applyFilter('raisedDateFrom')" datepicker-append-to-body="true" />
<input type="text" readonly class="form-control input-sm" ng-class="{'has-value' : model.filter.raisedValueTo}" placeholder="dd/mm/yyyy"
ng-model="model.filter.raisedValueTo" ng-click="openFilterCalendar($event, 'raisedTo', prop)" datetime-picker="{{model.dateTimeFormatPicker}}"
is-open="model.raisedDateToFilterOpen" datepicker-options="model.dateOptions" enable-time="false" ng-change="applyFilter('raisedDateTo')" datepicker-append-to-body="true" />
</div>
<button type="button" class="remove-filter close" ng-if="model.filter.raisedValueFrom || model.filter.raisedValueTo" ng-click="model.filter.raisedValueFrom = ''; model.filter.raisedValueTo = ''; applyFilter('raisedDateFromToClean')"><div class="x-form-clear-trigger"></div></button>
</th>
<th>
<div ng-click="applySortField('start')">start date <img ng-if="model.filter.sortField == 'StartDate'" ng-class="{'sort-asc' : model.filter.sortDir == 'ASC', 'sort-desc' : model.filter.sortDir == 'DESC'}" src="/Content/images/1px.png" /></div>
<button class="btn btn-sm btn-default btn-range btn-block" ng-class="{'has-value' : model.filter.startValueFrom}" ng-click="showDateRangeFilter('start')"><span ng-if="model.filter.startValueFrom && model.filter.startValueTo">{{model.filter.startValueFrom | date : model.dateTimeFormatPicker}} : {{model.filter.startValueTo | date : model.dateTimeFormatPicker}}</span><span ng-if="!model.filter.startValueFrom || !model.filter.startValueTo">Set range</span></button>
<div class="input-group hidden">
<input type="text" readonly class="form-control input-sm" ng-class="{'has-value' : model.filter.startValueFrom}" placeholder="dd/mm/yyyy"
ng-model="model.filter.startValueFrom" ng-click="openFilterCalendar($event, 'startFrom', prop)" datetime-picker="{{model.dateTimeFormatPicker}}"
is-open="model.startDateFromFilterOpen" datepicker-options="model.dateOptions" enable-time="false" ng-change="applyFilter('startDateFrom')" datepicker-append-to-body="true" />
<input type="text" readonly class="form-control input-sm" ng-class="{'has-value' : model.filter.startValueTo}" placeholder="dd/mm/yyyy"
ng-model="model.filter.startValueTo" ng-click="openFilterCalendar($event, 'startTo', prop)" datetime-picker="{{model.dateTimeFormatPicker}}"
is-open="model.startDateToFilterOpen" datepicker-options="model.dateOptions" enable-time="false" ng-change="applyFilter('startDateTo')" datepicker-append-to-body="true" />
</div>
<button type="button" class="remove-filter close" ng-if="model.filter.startValueFrom || model.filter.startValueTo" ng-click="model.filter.startValueFrom = ''; model.filter.startValueTo = ''; applyFilter('startDateFromToClean')"><div class="x-form-clear-trigger"></div></button>
</th>
<th>
<div ng-click="applySortField('end')">end date <img ng-if="model.filter.sortField == 'DueDate'" ng-class="{'sort-asc' : model.filter.sortDir == 'ASC', 'sort-desc' : model.filter.sortDir == 'DESC'}" src="/Content/images/1px.png" /></div>
<button class="btn btn-sm btn-default btn-range btn-block" ng-class="{'has-value' : model.filter.endValueFrom}" ng-click="showDateRangeFilter('end')"><span ng-if="model.filter.endValueFrom && model.filter.endValueTo">{{model.filter.endValueFrom | date : model.dateTimeFormatPicker}} : {{model.filter.endValueTo | date : model.dateTimeFormatPicker}}</span><span ng-if="!model.filter.endValueFrom || !model.filter.endValueTo">Set range</span></button>
<div class="input-group hidden">
<input type="text" readonly class="form-control input-sm" ng-class="{'has-value' : model.filter.endValueFrom}" placeholder="dd/mm/yyyy"
ng-model="model.filter.endValueFrom" ng-click="openFilterCalendar($event, 'endFrom', prop)" datetime-picker="{{model.dateTimeFormatPicker}}"
is-open="model.endDateFromFilterOpen" datepicker-options="model.dateOptions" enable-time="false" ng-change="applyFilter('endDateFrom')" datepicker-append-to-body="true" />
<input type="text" readonly class="form-control input-sm" ng-class="{'has-value' : model.filter.endValueTo}" placeholder="dd/mm/yyyy"
ng-model="model.filter.endValueTo" ng-click="openFilterCalendar($event, 'endTo', prop)" datetime-picker="{{model.dateTimeFormatPicker}}"
is-open="model.endDateToFilterOpen" datepicker-options="model.dateOptions" enable-time="false" ng-change="applyFilter('endDateTo')" datepicker-append-to-body="true" />
</div>
<button type="button" class="remove-filter close" ng-if="model.filter.endValueFrom || model.filter.endValueTo" ng-click="model.filter.endValueFrom = ''; model.filter.endValueTo = ''; applyFilter('endDateFromToClean')"><div class="x-form-clear-trigger"></div></button>
</th>
<th>
<div ng-click="applySortField('status')">status <img ng-if="model.filter.sortField == 'Status'" ng-class="{'sort-asc' : model.filter.sortDir == 'ASC', 'sort-desc' : model.filter.sortDir == 'DESC'}" src="/Content/images/1px.png" /></div>
<!--<ui-select ng-if="model.tecrStatuses && model.tecrStatuses.length" multiple class="tecr-status" ng-class="{'has-value' : model.filter.statusValue.length}" ng-model="model.filter.statusValue" on-select="applyFilter('status')" on-remove="applyFilter('status')" close-on-select="false">
<ui-select-match placeholder="Search">{{$item.Name}}</ui-select-match>
<ui-select-choices repeat="crStatus in model.tecrStatuses | filter: $select.search">
<div ng-bind-html="(crStatus.Name | highlight: $select.search)"></div>
</ui-select-choices>
</ui-select>-->
<div ng-if="model.tecrStatuses.length > 0">
<div deep-blur="model.statusFilterFocused = false; applyFilter('status')" tabindex="-1" class="multiple-select-custom">
<input class="form-control input-sm" placeholder="Search" ng-class="{'has-value': model.filter.statusValue.length}"
ng-value="model.filter.statusValue.length ? model.filter.statusValue.length+' selected' : ''"
ng-focus="model.statusFilterFocused = true" readonly="readonly" />
<input class="form-control input-sm quick-filter" placeholder="Search" ng-model="quickStatusFilter.Name" ng-show="model.statusFilterFocused == true" />
<ul ng-show="model.statusFilterFocused">
<li class="action" ng-if="(model.tecrStatuses|filter:quickStatusFilter).length > 0">
<button type="button" class="btn btn-default btn-sm btn-block" ng-click="toggleStatusFilter()">{{(model.filter.statusValue.length) ? 'Deselect All' : 'Select All'}}</button>
</li>
<li ng-repeat="option in model.tecrStatuses|filter: quickStatusFilter">
<label class="">
<input type="checkbox" ng-model="option.selected" ng-keyup="$event.keyCode === 13 && onEnterStatusClick()" /> {{option.Name}}
</label>
</li>
</ul>
</div>
</div>
<button type="button" class="remove-filter close" ng-if="model.filter.statusValue.length" ng-click="model.filter.statusValue = []; emptyStatusFilter(); applyFilter('status')"><div class="x-form-clear-trigger"></div></button>
</th>
<th>
<div ng-click="applySortField('assignedTo')">assignee <img ng-if="model.filter.sortField == 'AssignedTo'" ng-class="{'sort-asc' : model.filter.sortDir == 'ASC', 'sort-desc' : model.filter.sortDir == 'DESC'}" src="/Content/images/1px.png" /></div>
<ui-select ng-if="model.suggestions['ass'].list && model.suggestions['ass'].list.length" on-select="applyFilter('assignedTo')" class="tecr-user" ng-class="{'has-value' : model.filter.assigneeValue}" ng-model="model.filter.assigneeValue">
<ui-select-match placeholder="Search" allow-clear="false">
<i ng-show="$select.selected.Type == 'UserGroup'" class="glyphicon glyphicon-user" aria-hidden="true"></i> {{$select.selected.Value}}
</ui-select-match>
<ui-select-choices repeat="suggestion in model.suggestions['ass'].list | filter: $select.search">
<div>
<i ng-if="suggestion.Type == 'UserGroup' " class="glyphicon glyphicon-user" aria-hidden="true"></i> <span ng-bind-html="(suggestion.Value| highlight: $select.search)"></span>
</div>
</ui-select-choices>
</ui-select>
<button type="button" class="remove-filter close" ng-if="model.filter.assigneeValue" ng-click="model.filter.assigneeValue = ''; applyFilter('assignedTo')" style="right: 26px;"><div class="x-form-clear-trigger"></div></button>
</th>
<th></th>
<!-- <th>
<div>requestor</div>
<ui-select ng-if="model.suggestions['req'].list && model.suggestions['req'].list.length" on-select="applyFilter('lastModifiedBy')" class="tecr-user" ng-class="{'has-value' : model.filter.requestorValue}" ng-model="model.filter.requestorValue">
<ui-select-match placeholder="Search" allow-clear="true">
<i ng-show="$select.selected.Type == 'UserGroup'" class="glyphicon glyphicon-user" aria-hidden="true"></i> {{$select.selected.Value}}
</ui-select-match>
<ui-select-choices repeat="suggestion in model.suggestions['req'].list | filter: $select.search">
<div>
<i ng-if="suggestion.Type == 'UserGroup' " class="glyphicon glyphicon-user" aria-hidden="true"></i> <span ng-bind-html="(suggestion.Value| highlight: $select.search)"></span>
</div>
</ui-select-choices>
</ui-select>
</th> -->
</tr>
</thead>
<tbody>
<tr ng-repeat="item in model.items" class="tecr">
<td class="text-bold text-blue" ng-click="openTecr(item.ID)">{{item.RequestNumber}}</td>
<td ng-bind="item.Title" data-qtip="{{item.Title}}" class="text-bold truncate" ng-click="openTecr(item.ID)"></td>
<td ng-bind="item.CRType" class="truncate"></td>
<td ng-bind="UtcToLocalTime(item.CreatedDate)"></td>
<td ng-bind="UtcToLocalTime(item.StartDate)"></td>
<td ng-bind="UtcToLocalTime(item.DueDate)"></td>
<td class="status truncate" zzzclick-outside="item.statusFilterFocused = false">
<p style="background-color:{{item.bgcolor}};color:{{item.color}}" ng-bind="item.Status" zng-click="item.statusFilterFocused = true; model.showChangeStatusDropdown = true"></p>
<div ng-if="model.tecrStatuses.length > 0">
<div tabindex="-1" class="multiple-select-custom">
<ul ng-show="item.statusFilterFocused">
<li ng-repeat="option in model.tecrStatuses" ng-click="changeTecrStatus(item, option)">
<label class="truncate">
{{option.Name}}
</label>
</li>
</ul>
</div>
</div>
</td>
<td><div ng-if="item.asInitials" class="badge" ng-bind="item.asInitials"></div><span ng-bind="item.AssignedTo"></span></td>
<td><button class="btn btn-sm" ng-click="broadcastEnvorinment(item)">View on schedule</button></td>
<!--<td><div class="badge" ng-bind="item.reInitials"></div><span ng-bind="item.lastModifiedBy"></span></td>-->
</tr>
</tbody>
</table>
<nav ng-if="model.filter.totalPagesCount > 1">
<ul class="pagination pagination-sm">
<li ng-class="{'disabled' : model.filter.pageNum <= 0 }">
<a href="#" aria-label="Previous" ng-click="gotoPrevPage()">
<span aria-hidden="true">&larr;</span>
</a>
</li>
<li ng-class="{'active' : model.filter.pageNum == 0}">
<a href="#" ng-click="gotoPage(0)">1</a>
</li>
<li ng-if="model.filter.totalPagesCount > 1" ng-class="{'hidden' : model.filter.pageNum < 4}">
<a href="#">...</a>
</li>
<!-- only pre-prev page -->
<li ng-if="model.filter.pageNum-1 > 1 && model.filter.pageNum-1 < model.filter.totalPagesCount">
<a href="#" ng-click="gotoPage(model.filter.pageNum-2)">{{model.filter.pageNum-1}}</a>
</li>
<!-- only prev page -->
<li ng-if="model.filter.pageNum > 1 && model.filter.pageNum < model.filter.totalPagesCount">
<a href="#" ng-click="gotoPage(model.filter.pageNum-1)">{{model.filter.pageNum}}</a>
</li>
<!-- only current page, if it is large then 2 and less than max -->
<li class="active" ng-if="model.filter.pageNum+1 > 1 && model.filter.pageNum+1 < model.filter.totalPagesCount">
<a href="#" ng-click="gotoPage(model.filter.pageNum)">{{model.filter.pageNum+1}}</a>
</li>
<!-- only next page -->
<li ng-if="model.filter.pageNum+2 > 1 && model.filter.pageNum+2 < model.filter.totalPagesCount">
<a href="#" ng-click="gotoPage(model.filter.pageNum+1)">{{model.filter.pageNum+2}}</a>
</li>
<!-- only after-next page -->
<li ng-if="model.filter.pageNum+3 > 1 && model.filter.pageNum+3 < model.filter.totalPagesCount">
<a href="#" ng-click="gotoPage(model.filter.pageNum+2)">{{model.filter.pageNum+3}}</a>
</li>
<!--<li ng-if="model.filter.totalPagesCount > 1" ng-repeat="n in _.range(2, model.filter.totalPagesCount)" ng-class="{'active' : n == model.filter.pageNum + 1, 'hidden' : (n-1 > model.filter.pageNum+2) || (n-1 < model.filter.pageNum-2) }">
<a href="#" ng-click="gotoPage(n - 1)">{{n}}</a>
</li>-->
<li ng-if="model.filter.totalPagesCount > 1" ng-class="{'hidden' : model.filter.pageNum+4 > model.filter.totalPagesCount-1}">
<a href="#">...</a>
</li>
<li ng-if="model.filter.totalPagesCount > 1" ng-class="{'active' : model.filter.totalPagesCount == model.filter.pageNum + 1}">
<a href="#" ng-click="gotoPage(model.filter.totalPagesCount - 1)">{{model.filter.totalPagesCount}}</a>
</li>
<li ng-class="{'disabled' : model.filter.pageNum+1 > model.filter.totalPagesCount-1 }">
<a href="#" aria-label="Next" ng-click="gotoNextPage()">
<span aria-hidden="true">&rarr;</span>
</a>
</li>
</ul>
</nav>
</div>
angular.module('plutora.core').controller('BarclaysWidgetTecr',['$scope', 'localStorageService', 'suggestionService', '$rootScope', function($scope, localStorageService, suggestionService, $rootScope) {
$('.barclays-tecr').closest('.panel').addClass('barclays-tecr-panel');
$scope._ = _; // provide lodash
// pagination functions
$scope.gotoPage = function(i) {
if ($scope.model.filter.pageNum != i) {
$scope.model.filter.pageNum = i;
$scope.loadPagedTecrs();
}
};
$scope.gotoPrevPage = function() {
if ($scope.model.filter.pageNum > 0) {
$scope.model.filter.pageNum = $scope.model.filter.pageNum - 1;
$scope.loadPagedTecrs();
}
};
$scope.gotoNextPage = function() {
if ($scope.model.filter.pageNum+1 <= $scope.model.filter.totalPagesCount-1) {
$scope.model.filter.pageNum = $scope.model.filter.pageNum + 1;
$scope.loadPagedTecrs();
}
};
$scope.model = {
items: [],
dateTimeFormat: 'DD/MM/YYYY',
dateTimeFormatPicker: formatUtil.getDateFormat(PlutoraApp.DateFormat),
startDateFromFilterOpen: false,
startDateToFilterOpen: false,
endDateFromFilterOpen: false,
endDateToFilterOpen: false,
RaisedDateFromFilterOpen: false,
RaisedDateToFilterOpen: false,
showDateRangeFilter: false,
showChangeStatusDropdown: false,
dateRangeFilterFrom: new Date(),
dateRangeFilterTo: new Date(),
dateRangeFilterFor: '',
dateOptions: {
showWeeks: false,
},
tecrStatuses: null,
tecrStatusColors: [],
tecrTypes: null,
typeFilterFocused: false,
statusFilterFocused: false,
filter: {
numberValue: '',
titleValue: '',
typeValue: '',
statusValue: '',
assigneeValue: '',
requestorValue: '',
raisedValueFrom: '',
raisedValueTo: '',
startValueFrom: '',
startValueTo: '',
endValueFrom: '',
endValueTo: '',
searchFilters: [
//{ "property": "Title", "direction": "ASC", "value": "", "operator": "Contains" }
],
pageNum: 0,
recordsPerPage: 10,
//returnCount: 0,
totalCount: 0,
totalPagesCount: 0,
sortField: null,
sortDir: null,
},
suggestions: {
'ass': {
list: []
},
'req': {
list: []
}
}
};
// fetch list of users and groups, alternatively we could use 'suggestion' service, however it was not deployed on devruby
$scope.getUsersGroups = function (type) {
var suggType = (type == 'ass') ? 'ass' : 'req';
var params = {
parameters: {
DataSource1CustomListID: 'Plutora.Domain.UserGroups.UserGroup',
DataSource1Name: 'UserGroup',
DataSource2CustomListID: 'Plutora.Domain.Users.User',
DataSource2Name: 'User',
MultiselectList: 'true'
}
};
$.ajax({
type: 'POST',
data: JSON.stringify(params),
url: '/QueryBuilder/GetListComboValueData?getterName=UserGroup',
success: function(data, success) {
data.data.LineList.map(function(group) {
group.Type = 'UserGroup';
});
Array.prototype.push.apply($scope.model.suggestions[suggType].list, data.data.LineList);
}
});
$.ajax({
type: 'POST',
data: JSON.stringify(params),
url: '/QueryBuilder/GetListComboValueData?getterName=User',
success: function(data, success) {
data.data.LineList.map(function(group) {
group.Type = 'User';
});
Array.prototype.push.apply($scope.model.suggestions[suggType].list, data.data.LineList);
}
});
};
var defaultKey = 'barclaysWidgetTecr';
var _getFilter = function(key) {
var accessKey = key || defaultKey;
return localStorageService.get(accessKey);
};
var _setFilter = function(value, key) {
var accessKey = key || defaultKey;
localStorageService.set(accessKey, value);
};
var _clearFilter = function (key) {
var accessKey = key || defaultKey;
localStorageService.remove(accessKey);
};
// custom range date filter begin
$scope.isDateRangeValid = function() {
return $scope.model.dateRangeFilterFrom && $scope.model.dateRangeFilterTo && $scope.model.dateRangeFilterFrom <= $scope.model.dateRangeFilterTo;
};
$scope.validateDateRange = function() {
if ($scope.model.dateRangeFilterFrom && $scope.model.dateRangeFilterTo && $scope.model.dateRangeFilterFrom > $scope.model.dateRangeFilterTo) {
$scope.model.dateRangeFilterTo = '';
highlight('End date can not be prior the Start date');
}
if ($scope.model.dateRangeFilterFrom && !$scope.model.dateRangeFilterTo) {
$scope.model.dateRangeFilterTo = new Date($scope.model.dateRangeFilterFrom.getTime());
$scope.model.dateRangeFilterTo.setTime($scope.model.dateRangeFilterTo.getTime() + 24*60*60*1000 - 1);
}
};
$scope.showDateRangeFilter = function(type) {
$scope.model.showDateRangeFilter = true;
$scope.model.dateRangeFilterFor = type;
switch ($scope.model.dateRangeFilterFor) {
case 'raised':
$scope.model.dateRangeFilterFrom = $scope.model.filter.raisedValueFrom;
$scope.model.dateRangeFilterTo = $scope.model.filter.raisedValueTo;
break;
case 'start':
$scope.model.dateRangeFilterFrom = $scope.model.filter.startValueFrom;
$scope.model.dateRangeFilterTo = $scope.model.filter.startValueTo;
break;
case 'end':
$scope.model.dateRangeFilterFrom = $scope.model.filter.endValueFrom;
$scope.model.dateRangeFilterTo = $scope.model.filter.endValueTo;
break;
}
};
$scope.onDateRangeFilterClick = function(e) {
e.preventDefault();
e.stopPropagation();
};
$scope.dateRangeApply = function() {
switch ($scope.model.dateRangeFilterFor) {
case 'raised':
$scope.model.filter.raisedValueFrom = $scope.model.dateRangeFilterFrom;
$scope.model.filter.raisedValueTo = $scope.model.dateRangeFilterTo;
$scope.applyFilter('raisedDateFrom', true);
$scope.applyFilter('raisedDateTo', true);
$scope.applyFilters();
break;
case 'start':
$scope.model.filter.startValueFrom = $scope.model.dateRangeFilterFrom;
$scope.model.filter.startValueTo = $scope.model.dateRangeFilterTo;
$scope.applyFilter('startDateFrom', true);
$scope.applyFilter('startDateTo', true);
$scope.applyFilters();
break;
case 'end':
$scope.model.filter.endValueFrom = $scope.model.dateRangeFilterFrom;
$scope.model.filter.endValueTo = $scope.model.dateRangeFilterTo;
$scope.applyFilter('endDateFrom', true);
$scope.applyFilter('endDateTo', true);
$scope.applyFilters();
break;
}
$scope.model.showDateRangeFilter = false;
};
$scope.selectDateRange = function(type) {
switch(type) {
case '-90':
$scope.model.dateRangeFilterFrom = new Date();
$scope.model.dateRangeFilterTo = new Date();
$scope.model.dateRangeFilterFrom.setDate($scope.model.dateRangeFilterFrom.getDate() - 90);
break;
case '-30':
$scope.model.dateRangeFilterFrom = new Date();
$scope.model.dateRangeFilterTo = new Date();
$scope.model.dateRangeFilterFrom.setDate($scope.model.dateRangeFilterFrom.getDate() - 30);
break;
case '-7':
$scope.model.dateRangeFilterFrom = new Date();
$scope.model.dateRangeFilterTo = new Date();
$scope.model.dateRangeFilterFrom.setDate($scope.model.dateRangeFilterFrom.getDate() - 7);
break;
case '7':
$scope.model.dateRangeFilterFrom = new Date();
$scope.model.dateRangeFilterTo = new Date();
$scope.model.dateRangeFilterTo.setDate($scope.model.dateRangeFilterTo.getDate() + 7);
break;
case '30':
$scope.model.dateRangeFilterFrom = new Date();
$scope.model.dateRangeFilterTo = new Date();
$scope.model.dateRangeFilterTo.setDate($scope.model.dateRangeFilterTo.getDate() + 30);
break;
case '90':
$scope.model.dateRangeFilterFrom = new Date();
$scope.model.dateRangeFilterTo = new Date();
$scope.model.dateRangeFilterTo.setDate($scope.model.dateRangeFilterTo.getDate() + 90);
break;
}
};
// custom range date filter end
$scope.openFilterCalendar = function(e, type) {
e.preventDefault();
e.stopPropagation();
switch(type) {
case 'raisedFrom':
$scope.model.startDateFromFilterOpen = false;
$scope.model.startDateToFilterOpen = false;
$scope.model.endDateFromFilterOpen = false;
$scope.model.endDateToFilterOpen = false;
$scope.model.raisedDateToFilterOpen = false;
$scope.model.raisedDateFromFilterOpen = true;
break;
case 'raisedTo':
$scope.model.startDateFromFilterOpen = false;
$scope.model.startDateToFilterOpen = false;
$scope.model.endDateFromFilterOpen = false;
$scope.model.endDateToFilterOpen = false;
$scope.model.raisedDateFromFilterOpen = false;
$scope.model.raisedDateToFilterOpen = true;
break;
case 'startFrom':
$scope.model.raisedDateFromFilterOpen = false;
$scope.model.raisedDateToFilterOpen = false;
$scope.model.endDateFromFilterOpen = false;
$scope.model.endDateToFilterOpen = false;
$scope.model.startDateToFilterOpen = false;
$scope.model.startDateFromFilterOpen = true;
break;
case 'startTo':
$scope.model.raisedDateFromFilterOpen = false;
$scope.model.raisedDateToFilterOpen = false;
$scope.model.endDateFromFilterOpen = false;
$scope.model.endDateToFilterOpen = false;
$scope.model.startDateFromFilterOpen = false;
$scope.model.startDateToFilterOpen = true;
break;
case 'endFrom':
$scope.model.raisedDateFromFilterOpen = false;
$scope.model.raisedDateToFilterOpen = false;
$scope.model.startDateFromFilterOpen = false;
$scope.model.startDateToFilterOpen = false;
$scope.model.endDateToFilterOpen = false;
$scope.model.endDateFromFilterOpen = true;
break;
case 'endTo':
$scope.model.raisedDateFromFilterOpen = false;
$scope.model.raisedDateToFilterOpen = false;
$scope.model.startDateFromFilterOpen = false;
$scope.model.startDateToFilterOpen = false;
$scope.model.endDateFromFilterOpen = false;
$scope.model.endDateToFilterOpen = true;
break;
}
};
$scope.getInitials = function (fullName) {
if (! fullName) {
return;
}
var names = fullName.split(' ');
var result = names[0].charAt(0);
if (names.length > 1 && names[1].charAt(0) !== ' ') {
result += /*'.' +*/ names[1].charAt(0);
}
return result ? result : '';
};
$scope.UtcToLocalTime = function(time) {
return time ? moment.utc(time).local().format($scope.model.dateTimeFormat) : '';
};
$scope.overlayColor = function(color){
//if only first half of color is defined, repeat it
if(color.length < 5) {
color += color.slice(1);
}
return (color.replace('#','0x')) > (0xffffff/2) ? '#333' : '#fff';
};
$scope.loadStatusesTypes = function(callback) {
// tecr statuses
$.ajax({
type: 'POST',
data: { workItemType: 1, lookupIndex: EnumsManager.LookupFieldType.CRStatus },
url: '/Customisation/GetLookupValues',
success: function(data, success) {
if (success && data.success) {
$scope.model.tecrStatuses = data.data;
$scope.model.tecrStatuses.map(function(status) {
status.Color = status.Color ? status.Color : generateRandomColor();
$scope.model.tecrStatusColors[status.Name] = status.Color;
status.selected = ($scope.model.filter.statusValue) ? $scope.model.filter.statusValue.includes(status.ID) : false;
});
}
callback();
}
});
// tecr types
$.ajax({
type: 'POST',
data: { workItemType: 1, lookupIndex: EnumsManager.LookupFieldType.CRType },
url: '/Customisation/GetLookupValues',
success: function(data, success) {
if (success && data.success) {
$scope.model.tecrTypes = data.data;
$scope.model.tecrTypes.map(function(type) {
type.selected = ($scope.model.filter.typeValue) ? $scope.model.filter.typeValue.includes(type.ID) : false;
});
}
}
});
//$scope.getUsersGroups('ass'); // get users for Assignee field
//$scope.getUsersGroups('req');
};
$scope.loadTecrs = function(loadingTo, callback) {
loadingIndicator(1);
$('<div class="loading-spin" id="spinTecr"></div>').appendTo(loadingTo).fadeIn(300);
let sortOrder = ($scope.model.filter.sortField && $scope.model.filter.sortDir) ? '&sort='+$scope.model.filter.sortField+'&dir='+$scope.model.filter.sortDir : '';
$.ajax({
type: 'GET',
//url: '/proxy/api/TECRs/filter', // external API usage
url: '/Requests/GetCompanyChangeRequestsGrid?page='+ ($scope.model.filter.pageNum+1) +'&start='+$scope.model.filter.pageNum*$scope.model.filter.recordsPerPage+'&limit='+$scope.model.filter.recordsPerPage + sortOrder, // internal api
/*data: {
"searchFilters": $scope.model.filter.searchFilters,
"recordsPerPage": $scope.model.filter.recordsPerPage, "pageNum": $scope.model.filter.pageNum
},*/
success: function(data, success) {
if (success && data.success) {
var parsedData = data;
$scope.updateFilterPagination(parsedData);
$scope.model.items = parsedData.data.Data;
// define Assignee initials, status color and bgcolor
$scope.model.items.map(function(item) {
item.asInitials = $scope.getInitials(item.AssignedTo);
item.bgcolor = $scope.model.tecrStatusColors[item.Status];
item.statusFilterFocused = false;
if (item.bgcolor) {
item.color = $scope.overlayColor(item.bgcolor);
} else {
console.log('Need investigate this case');
}
return item;
});
$scope.$apply();
callback();
} else {
highlight('Unable to fetch TECRs');
}
loadingIndicator(0);
$('.loading-spin#spinTecr').fadeOut(300, function() {
$(this).remove();
});
},
error: function (e) {
var response = JSON.parse(e.responseText);
highlight('Internal error: ' + response.modelState.internalServerValidationError.toString());
loadingIndicator(0);
$('.loading-spin#spinTecr').fadeOut(300, function() {
$(this).remove();
});
},
xhrFields: {
withCredentials: true
}
});
};
$scope.openTecr = function(id) {
var controller = PlutoraApp.app.getController('PlutoraApp.controller.requests.changeRequestController');
controller.openRequestWindow(id, function() { // onCloseCallback
$scope.loadPagedTecrs();
});
};
$scope.broadcastEnvorinment = function(tecrObject) {
$rootScope.$broadcast('barclays-envs-scheduler-trigger-tecr', {
selectedTecr: tecrObject
});
$('.barclays-envs').get(0).scrollIntoView();
};
$scope.closeChangeStatusDropdown = function() {
$scope.model.items.map(function(element) {
element.statusFilterFocused = false;
});
$scope.model.showChangeStatusDropdown = false;
};
$scope.changeTecrStatus = function(item, status) {
item.Status = status.Name;
/*$.ajax({
type: 'PUT',
url: '/Requests/UpdateStatus/'+item.ID,
data: status.ID,
success: function(data, success) {
console.log(data);
},
xhrFields: {
withCredentials: true
}
});*/
item.statusFilterFocused = false;
$scope.model.showChangeStatusDropdown = false;
};
$scope.updateFilterPagination = function(results) {
$scope.model.filter.totalCount = results.total; //: 29635
$scope.model.filter.totalPagesCount = Math.ceil($scope.model.filter.totalCount / $scope.model.filter.recordsPerPage);
};
$scope.emptyTypeFilter = function () {
$scope.model.tecrTypes.map(function(type) {
type.selected = false;
});
};
$scope.emptyStatusFilter = function () {
$scope.model.tecrStatuses.map(function(type) {
type.selected = false;
});
};
$scope.toggleTypeFilter = function () {
if ($scope.model.filter.typeValue && $scope.model.filter.typeValue.length) { // deselect all
$scope.model.tecrTypes.map(function(type) {
type.selected = false;
});
} else { // select all
$scope.model.tecrTypes.map(function(type) {
type.selected = true;
});
}
$scope.model.filter.typeValue = $scope.model.tecrTypes.filter(function(type) { return type.selected; }).map(function(type) { return type.ID; });
};
$scope.toggleStatusFilter = function () {
if ($scope.model.filter.statusValue && $scope.model.filter.statusValue.length) { // deselect all
$scope.model.tecrStatuses.map(function(status) {
status.selected = false;
});
} else { // select all
$scope.model.tecrStatuses.map(function(status) {
status.selected = true;
});
}
$scope.model.filter.statusValue = $scope.model.tecrStatuses.filter(function(status) { return status.selected; }).map(function(status) { return status.ID; });
};
$scope.onEnterTypeClick = function() {
$scope.model.typeFilterFocused = false;
$scope.applyFilter('type');
};
$scope.onEnterStatusClick = function() {
$scope.model.statusFilterFocused = false;
$scope.applyFilter('status');
};
$scope.applySortField = function (type) {
let sortField = '';
switch (type) {
case 'number':
sortField = 'RequestNumber';
break;
case 'title':
sortField = 'Title';
break;
case 'type':
sortField = 'CRType';
break;
case 'status':
sortField = 'Status';
break;
case 'assignedTo':
sortField = 'AssignedTo';
break;
case 'raised':
sortField = 'CreatedDate';
break;
case 'start':
sortField = 'StartDate';
break;
case 'end':
sortField = 'DueDate';
break;
}
if (!$scope.model.filter.sortField) {
$scope.model.filter.sortField = sortField;
$scope.model.filter.sortDir = 'ASC';
} else {
if ($scope.model.filter.sortField != sortField) {
$scope.model.filter.sortField = sortField;
$scope.model.filter.sortDir = 'ASC';
} else {
$scope.model.filter.sortDir = ($scope.model.filter.sortDir == 'ASC') ? 'DESC' : 'ASC';
}
}
_setFilter($scope.model.filter);
$scope.loadPagedTecrs();
};
$scope.filterNumbersOnly = function (event) {
if (event.which != 13 && event.which != 8 && event.which != 0 && event.which < 48 || event.which > 57) {
event.preventDefault();
}
};
$scope.applyFilter = function (type, skipApply) {
var newValue = null, operator = '6', systemType = 'System.String', concreteType = 'String';
var property = null, columnName = type;
switch (type) {
case 'number':
newValue = $scope.model.filter.numberValue;
systemType = 'System.Int32';
concreteType = 'Int32';
property = columnName = 'Number';
operator = '0';
break;
case 'title':
newValue = $scope.model.filter.titleValue;
property = columnName = 'Title';
break;
case 'type':
$scope.model.filter.typeValue = $scope.model.tecrTypes.filter(function(type) { return type.selected; }).map(function(type) { return type.ID; });
newValue = $scope.model.filter.typeValue.join(',');
systemType = 'System.GuidSetType';
concreteType = 'GuidSetType';
property = columnName = 'CRType';
break;
case 'status':
$scope.model.filter.statusValue = $scope.model.tecrStatuses.filter(function(status) { return status.selected; }).map(function(status) { return status.ID; });
newValue = $scope.model.filter.statusValue.join(',');
systemType = 'System.GuidSetType';
concreteType = 'GuidSetType';
property = columnName = 'CRStatus';
break;
case 'assignedTo':
newValue = $scope.model.filter.assigneeValue ? $scope.model.filter.assigneeValue.ID : '';
systemType = 'System.GuidSetType';
concreteType = 'GuidSetType';
property = columnName = 'UserGroup&User';
break;
/*case 'lastModifiedBy':
newValue = $scope.model.filter.requestorValue ? $scope.model.filter.requestorValue.Value : '';
operator = 'Equals';
break;*/
case 'raisedDateFrom': // raised on date
if ($scope.model.filter.raisedValueFrom) {
newValue = moment($scope.model.filter.raisedValueFrom).format($scope.model.dateTimeFormat);
//operator = 'Equals';
} else {
newValue = '';
}
systemType = 'System.DateTime';
concreteType = 'Nullable`1';
operator = '2';
columnName = 'CreatedDate';
property = 'raisedDateFrom';
break;
case 'raisedDateTo': // raised on date
if ($scope.model.filter.raisedValueTo) {
newValue = moment($scope.model.filter.raisedValueTo).format($scope.model.dateTimeFormat);
//operator = 'Equals';
} else {
newValue = '';
}
systemType = 'System.DateTime';
concreteType = 'Nullable`1';
operator = '3';
columnName = 'CreatedDate';
property = 'raisedDateTo';
break;
case 'raisedDateFromToClean':
var filterIndexFrom = $scope.model.filter.searchFilters.findIndex(function(o) { return o.property == 'raisedDateFrom'});
if (filterIndexFrom != -1) {
$scope.model.filter.searchFilters.splice(filterIndexFrom, 1);
}
var filterIndexTo = $scope.model.filter.searchFilters.findIndex(function(o) { return o.property == 'raisedDateTo'});
if (filterIndexTo != -1) {
$scope.model.filter.searchFilters.splice(filterIndexTo, 1);
}
$scope.applyFilters();
break;
case 'startDateFromToClean':
var filterIndexFrom = $scope.model.filter.searchFilters.findIndex(function(o) { return o.property == 'startDateFrom'});
if (filterIndexFrom != -1) {
$scope.model.filter.searchFilters.splice(filterIndexFrom, 1);
}
var filterIndexTo = $scope.model.filter.searchFilters.findIndex(function(o) { return o.property == 'startDateTo'});
if (filterIndexTo != -1) {
$scope.model.filter.searchFilters.splice(filterIndexTo, 1);
}
$scope.applyFilters();
break;
case 'endDateFromToClean':
var filterIndexFrom = $scope.model.filter.searchFilters.findIndex(function(o) { return o.property == 'endDateFrom'});
if (filterIndexFrom != -1) {
$scope.model.filter.searchFilters.splice(filterIndexFrom, 1);
}
var filterIndexTo = $scope.model.filter.searchFilters.findIndex(function(o) { return o.property == 'endDateTo'});
if (filterIndexTo != -1) {
$scope.model.filter.searchFilters.splice(filterIndexTo, 1);
}
$scope.applyFilters();
break;
case 'startDateFrom':
if ($scope.model.filter.startValueFrom) {
//newValue = $scope.model.filter.startValue.toJSON();
//newValue = newValue.substr(0, newValue.length-1); // example: 17/10/2018 13:34, this is for external api
// for internal api we have another format: 01/10/2018 09:20
newValue = $scope.model.filter.startValueFrom;
newValue = moment(newValue).format(getMomentDefaultDateFormat());
} else {
newValue = '';
}
systemType = 'System.FullDateTime';
concreteType = 'FullDateTime';
operator = '2'; // after date
columnName = 'StartDate';
property = 'startDateFrom';
break;
case 'startDateTo':
if ($scope.model.filter.startValueTo) {
//newValue = $scope.model.filter.startValue.toJSON();
//newValue = newValue.substr(0, newValue.length-1); // example: 17/10/2018 13:34, this is for external api
// for internal api we have another format: 01/10/2018 09:20
newValue = $scope.model.filter.startValueTo;
newValue = moment(newValue).format(getMomentDefaultDateFormat());
} else {
newValue = '';
}
systemType = 'System.FullDateTime';
concreteType = 'FullDateTime';
operator = '3'; // before date
columnName = 'StartDate';
property = 'startDateTo';
break;
case 'endDateFrom':
if ($scope.model.filter.endValueFrom) {
//newValue = $scope.model.filter.endValue.toJSON(); // external api
//newValue = newValue.substr(0, newValue.length-1); // example: 17/10/2018 13:34
newValue = $scope.model.filter.endValueFrom; // internal api
newValue = moment(newValue).format(getMomentDefaultDateFormat());
} else {
newValue = '';
}
systemType = 'System.FullDateTime';
concreteType = 'FullDateTime';
operator = '2'; // after
columnName = 'EndDate';
property = 'endDateFrom';
break;
case 'endDateTo':
if ($scope.model.filter.endValueTo) {
//newValue = $scope.model.filter.endValue.toJSON(); // external api
//newValue = newValue.substr(0, newValue.length-1); // example: 17/10/2018 13:34
newValue = $scope.model.filter.endValueTo; // internal api
newValue = moment(newValue).format(getMomentDefaultDateFormat());
} else {
newValue = '';
}
systemType = 'System.FullDateTime';
concreteType = 'FullDateTime';
operator = '3'; // before
columnName = 'EndDate';
property = 'endDateTo';
break;
}
if (newValue != null) {
var node = $scope.model.filter.searchFilters.filter(function(item) { return item.property == property; });
var filterModel = node[0];
if (!filterModel) {
$scope.model.filter.searchFilters.push({ 'property': property, 'ColumnName': columnName, 'Value': '', 'Operator': operator, 'Type': systemType, 'ConcreteType': concreteType });
var node = $scope.model.filter.searchFilters.filter(function(item) { return item.property == property; });
filterModel = node[0];
}
if (newValue) {
filterModel.Value = newValue;
} else {
var filterIndex = $scope.model.filter.searchFilters.findIndex(function(o) { return o.property == property});
if (filterIndex != -1) {
$scope.model.filter.searchFilters.splice(filterIndex, 1);
}
}
if (! skipApply) {
$scope.applyFilters();
}
}
};
$scope.applyFilters = function () {
$scope.model.filter.pageNum = 0;
$scope.model.filter.totalCount = 0;
$scope.model.items = [];
$scope.model.filter.totalPagesCount = 0;
// remove all previous chaied qb conditions
$scope.model.filter.searchFilters.map(function(filter) {
filter.Condition = null;
});
// set QB filter
var newOperand = null, prevOperand = {
ColumnName: '',
ConcreteType: '',
Condition: 'And',
Operator: 1,
Type: '',
Value: ''
};
var filterOperands = $scope.model.filter.searchFilters.slice(0); // clone the array as we don't need to override the existing array
for (var i = 0; i < filterOperands.length; i ++) { // stupidity, overnesting
var operand = filterOperands[i];
newOperand = operand;
prevOperand.Condition = {
Name: 'And', Right: newOperand
};
prevOperand = newOperand;
}
$.ajax({
type: 'POST',
url: '/QuerysBuilder/ApplyFilter',
data: {
parameters: [{
configurationName: 'ChangeRequest',
qbOperand: null,
gridOperand: filterOperands[0]
}]
},
success: function(data, success) {
$scope.loadPagedTecrs();
}
});
_setFilter($scope.model.filter);
};
var loadingTecrs = false;
$scope.loadPagedTecrs = function () {
if (!loadingTecrs && $scope.model.filter.pageNum <= $scope.model.filter.totalPagesCount) {
loadingTecrs = true;
$scope.loadTecrs('.barclays-tecr', function() {
loadingTecrs = false;
});
}
};
$scope.$on('barclays-update-grids-trigger', function(event, args) {
// clear filter
// _clearFilter();
var storedFilter = _getFilter();
if (storedFilter) {
$scope.model.filter = storedFilter;
if ($scope.model.filter.startValueFrom) {
$scope.model.filter.startValueFrom = new Date($scope.model.filter.startValueFrom);
}
if ($scope.model.filter.startValueTo) {
$scope.model.filter.startValueTo = new Date($scope.model.filter.startValueTo);
}
if ($scope.model.filter.endValueFrom) {
$scope.model.filter.endValueFrom = new Date($scope.model.filter.endValueFrom);
}
if ($scope.model.filter.endValueTo) {
$scope.model.filter.endValueTo = new Date($scope.model.filter.endValueTo);
}
if ($scope.model.filter.raisedValueFrom) {
$scope.model.filter.raisedValueFrom = new Date($scope.model.filter.raisedValueFrom);
}
if ($scope.model.filter.raisedValueTo) {
$scope.model.filter.raisedValueTo = new Date($scope.model.filter.raisedValueTo);
}
$scope.applyFilters();
}
$scope.$on('barclays-common-usergroups-trigger', function(event, args) {
if (args.list) {
Array.prototype.push.apply($scope.model.suggestions['ass'].list, args.list);
}
});
$scope.$on('barclays-common-user-trigger', function(event, args) {
if (args.list) {
Array.prototype.push.apply($scope.model.suggestions['ass'].list, args.list);
}
});
$scope.loadStatusesTypes(function() {
$scope.loadPagedTecrs();
});
});
}]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment