基础数据之航空公司修改优化
This commit is contained in:
@@ -1,94 +1,209 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Component, OnInit, ViewChild, Renderer2 } from '@angular/core';
|
||||
import { BasicDataService } from '../../../services/basic-data-service';
|
||||
import { ChangeDetectorRef } from '@angular/core';
|
||||
import { OperateSpinServiceService } from '../../../services/operate-spin-service.service';
|
||||
import * as $ from 'jquery';
|
||||
@Component({
|
||||
selector: 'app-airline',
|
||||
templateUrl: './airline.component.html',
|
||||
styleUrls: ['./airline.component.scss']
|
||||
styleUrls: ['../basic.scss']
|
||||
})
|
||||
export class AirlineComponent implements OnInit {
|
||||
|
||||
constructor(
|
||||
private renderer2: Renderer2,
|
||||
private basicDataService: BasicDataService,
|
||||
private changeDetectorRef: ChangeDetectorRef
|
||||
) { }
|
||||
private operateSpinServiceService: OperateSpinServiceService,
|
||||
) {
|
||||
this.operateSpinServiceService.showSpin();
|
||||
}
|
||||
|
||||
public col_lists = [
|
||||
{ col_code: 'airlineCode', col_chn: '航空公司代码' },
|
||||
{ col_code: 'airlineName', col_chn: '航空公司中文名' },
|
||||
{ col_code: 'briefNameChn', col_chn: '中文简称' },
|
||||
{ col_code: 'airlineNameEng', col_chn: '航空公司英文名' },
|
||||
{ col_code: 'briefNameEng', col_chn: '英文简称' },
|
||||
{ col_code: 'airlineCodeIata', col_chn: 'IATA码' },
|
||||
{ col_code: 'airlineCodeCaa', col_chn: 'CAA码' },
|
||||
{ col_code: 'airlineCodeIcao', col_chn: 'ICAO码' },
|
||||
{ col_code: 'parentAirlineId', col_chn: '上级母公司' },
|
||||
public render_col_lists = [
|
||||
{ COL_CODE: 'airlineCode', COL_CN: '航空公司代码', COL_WIDTH: "110px" },
|
||||
{ COL_CODE: 'airlineName', COL_CN: '航空公司中文名', COL_WIDTH: "180px" },
|
||||
{ COL_CODE: 'briefNameChn', COL_CN: '中文简称', COL_WIDTH: "180px" },
|
||||
{ COL_CODE: 'airlineNameEng', COL_CN: '航空公司英文名', COL_WIDTH: "180px" },
|
||||
{ COL_CODE: 'briefNameEng', COL_CN: '英文简称', COL_WIDTH: "120px" },
|
||||
{ COL_CODE: 'airlineCodeIata', COL_CN: 'IATA码', COL_WIDTH: "85px" },
|
||||
{ COL_CODE: 'airlineCodeCaa', COL_CN: 'CAA码', COL_WIDTH: "85px" },
|
||||
{ COL_CODE: 'airlineCodeIcao', COL_CN: 'ICAO码', COL_WIDTH: "85px" },
|
||||
{ COL_CODE: 'parentAirlineName', COL_CN: '上级母公司', COL_WIDTH: "120px" },
|
||||
]
|
||||
|
||||
// 搜索条件
|
||||
SEARCH = ''; //手动输入条件
|
||||
LASTSEARCH = '';
|
||||
FLT_POS = 1; //过滤还是定位
|
||||
SEL_COL = ''; //选择列名
|
||||
|
||||
airlinegroups: Array<any>; //航空集团
|
||||
airlines: Array<any>;
|
||||
public row_state: any = { renderFlight: {} };
|
||||
public render_data: Array<object> = []; //显示数据,即需要显示的数据
|
||||
LAST_SEL_COL = '';
|
||||
|
||||
//下拉框
|
||||
public filterItems = {
|
||||
airlineName: '',
|
||||
briefNameChn: '',
|
||||
}
|
||||
|
||||
public airlinegroups: Array<any>; //航空集团
|
||||
public airlines: Array<any>;
|
||||
|
||||
public wait_render_data: Array<object> = [];
|
||||
public render_data: Array<object> = []; //显示数据,即需要显示的数据
|
||||
public selectedFilterData: Array<object> = [];
|
||||
|
||||
public row_state: any = {};
|
||||
|
||||
@ViewChild('pageContent') pageContent;
|
||||
@ViewChild('searchFilter') searchFilter;
|
||||
@ViewChild('tableContainer') tableContainer;
|
||||
@ViewChild('tableHead') tableHead;
|
||||
@ViewChild('tableBody') tableBody;
|
||||
@ViewChild('tableContent') tableContent;
|
||||
|
||||
trItemHeight: number = 42;
|
||||
start: number = 0;
|
||||
end: number = 0;
|
||||
visibleCount: number = 0;
|
||||
scrollTop: number = 0;
|
||||
|
||||
ngOnInit() {
|
||||
this.airlinegroups = this.basicDataService.airlinegroup;
|
||||
window.onresize = function () {
|
||||
this.calcVisibleCount();
|
||||
}.bind(this)
|
||||
|
||||
this.airlines = this.basicDataService.airline;
|
||||
this.render_data = this.basicDataService.airline;
|
||||
this.basicDataService.airline_subject.subscribe(
|
||||
data => {
|
||||
this.airlines = data;
|
||||
this.render_data = data;
|
||||
}
|
||||
)
|
||||
this.basicDataService.airlinegroup_subject.subscribe(
|
||||
data => this.airlinegroups = data
|
||||
)
|
||||
/**
|
||||
* 固定表头
|
||||
*/
|
||||
var tableCont = document.querySelector('#table-container');
|
||||
function scrollHandle() {
|
||||
var scrollTop = this.scrollTop;
|
||||
this.querySelector('thead').style.transform = 'translateY(' + scrollTop + 'px)';
|
||||
this.airlinegroups = this.basicDataService.airlinegroup;
|
||||
|
||||
if (this.airlinegroups && Array.isArray(this.airlinegroups)) {
|
||||
this.dataTransfer();
|
||||
} else {
|
||||
this.basicDataService.airline_subject.subscribe(
|
||||
data => {
|
||||
this.airlines = data;
|
||||
}
|
||||
)
|
||||
this.basicDataService.airlinegroup_subject.subscribe(
|
||||
data => {
|
||||
this.airlinegroups = data;
|
||||
this.dataTransfer();
|
||||
}
|
||||
)
|
||||
}
|
||||
tableCont.addEventListener('scroll', scrollHandle);
|
||||
}
|
||||
|
||||
//上级母公司公司数据转换处理
|
||||
parentAirlinesTransHandle(item) {
|
||||
let airlinesLinkIndex = this.airlines.findIndex(val => val.airlineId === item['parentAirlineId']);
|
||||
if (airlinesLinkIndex > -1) {
|
||||
item['parentAirlineName'] = this.airlines[airlinesLinkIndex].airlineName;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据转换显示统一处理
|
||||
*/
|
||||
dataTransfer() {
|
||||
this.airlines.forEach(item => {
|
||||
this.parentAirlinesTransHandle(item);
|
||||
})
|
||||
|
||||
this.wait_render_data = this.airlines;
|
||||
this.selectedFilterData = this.airlines;
|
||||
this.calcVisibleCount();
|
||||
|
||||
//默认选中第一条
|
||||
if (this.render_data.length > 0) {
|
||||
this.row_state = this.render_data[0];
|
||||
}
|
||||
this.operateSpinServiceService.hideSpin();
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置动态设置单元格的宽度
|
||||
* @param isLast
|
||||
*/
|
||||
setWidth(isLast) {
|
||||
if (isLast) {
|
||||
$(".table-body tbody>tr").eq(0).find('td').each((index, element) => {
|
||||
$(".table-head table thead tr").eq(0).find('th').eq(index).attr('width', $(element).outerWidth() + 'px');
|
||||
})
|
||||
if (this.tableBody.nativeElement.scrollHeight <= (this.tableBody.nativeElement.innerHeight || this.tableBody.nativeElement.clientHeight)) {
|
||||
this.tableHead.nativeElement.style.overflowY = 'auto';
|
||||
} else {
|
||||
this.tableHead.nativeElement.style.overflowY = 'scroll';
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 纵向滚动条滚动渲染数据
|
||||
*/
|
||||
handleScroll() {
|
||||
const scrollTop = this.tableBody.nativeElement.scrollTop;
|
||||
$(".table-head").scrollLeft($('.table-body').scrollLeft());
|
||||
const fixedScrollTop = scrollTop - scrollTop % this.trItemHeight;
|
||||
this.tableContent.nativeElement.style.webkitTransform = `translateY(${fixedScrollTop}px)`;
|
||||
this.start = Math.floor(scrollTop / this.trItemHeight);
|
||||
this.end = this.start + this.visibleCount;
|
||||
this.render_data = this.wait_render_data.slice(this.start, this.end);
|
||||
}
|
||||
|
||||
/**
|
||||
* 计算可视区域数据的渲染
|
||||
*/
|
||||
calcVisibleCount() {
|
||||
this.renderer2.setStyle(this.tableContainer.nativeElement, 'height', this.pageContent.nativeElement.offsetHeight - this.searchFilter.nativeElement.offsetHeight - 35 + 'px');
|
||||
this.renderer2.setStyle(this.tableBody.nativeElement, 'height', this.tableContainer.nativeElement.offsetHeight - this.tableHead.nativeElement.offsetHeight + 'px');
|
||||
this.visibleCount = Math.ceil(this.tableBody.nativeElement.clientHeight / this.trItemHeight);
|
||||
const scrollTop = this.tableBody.nativeElement.scrollTop;
|
||||
const fixedScrollTop = scrollTop - scrollTop % this.trItemHeight;
|
||||
this.tableContent.nativeElement.style.transform = `translateY(${fixedScrollTop}px)`;
|
||||
|
||||
this.start = Math.floor(scrollTop / this.trItemHeight);
|
||||
this.end = this.start + this.visibleCount;
|
||||
this.render_data = this.wait_render_data.slice(this.start, this.end);
|
||||
}
|
||||
|
||||
/**
|
||||
* 选中某行
|
||||
* @param i
|
||||
* @param airline
|
||||
*/
|
||||
selectRow(i) {
|
||||
this.row_state = i;
|
||||
selectRow(airline) {
|
||||
this.row_state = airline;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断当前行是否是选中的行,是则高亮
|
||||
* @param airline
|
||||
*/
|
||||
getSelectedRow(airline) {
|
||||
if (airline.airlineCode === this.row_state.airlineCode) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
//输入框回车事件
|
||||
inputEnter() {
|
||||
if (this.FLT_POS === 1) {
|
||||
this.selectChange()
|
||||
this.LAST_SEL_COL = this.SEL_COL;
|
||||
this.LASTSEARCH = this.SEARCH;
|
||||
this.operateSpinServiceService.showSpin();
|
||||
this.inputFilter(this.selectedFilterData);
|
||||
} else {
|
||||
this.inputPosition(this.render_data)
|
||||
this.inputPosition(this.wait_render_data)
|
||||
}
|
||||
}
|
||||
|
||||
//下拉框选择筛选
|
||||
selectChange() {
|
||||
this.render_data = this.airlines.filter(item => {
|
||||
this.operateSpinServiceService.showSpin();
|
||||
this.positionedArray = [];
|
||||
this.positionArrayIndex = 0;
|
||||
let filter_data = this.airlines.filter(item => {
|
||||
let is_satis = true;
|
||||
for (const key in this.filterItems) {
|
||||
if (this.filterItems.hasOwnProperty(key) && this.filterItems[key]) {
|
||||
if (item[key] == this.filterItems[key]) {
|
||||
if (item[key] === +this.filterItems[key]) {
|
||||
is_satis = true;
|
||||
continue;
|
||||
} else {
|
||||
@@ -99,21 +214,41 @@ export class AirlineComponent implements OnInit {
|
||||
}
|
||||
return is_satis;
|
||||
})
|
||||
this.selectedFilterData = filter_data;
|
||||
|
||||
|
||||
if (this.FLT_POS === 1) {
|
||||
this.inputFilter(this.render_data);
|
||||
this.inputFilter(filter_data);
|
||||
} else {
|
||||
this.row_state = this.render_data.length > 0 ? this.render_data[0] : { renderFlight: {} };
|
||||
this.wait_render_data = filter_data;
|
||||
this.render_data = this.wait_render_data.slice(this.start, this.end);
|
||||
|
||||
let hasSelectedRow: boolean = false;
|
||||
for (let i = 0; i < this.wait_render_data.length; i++) {
|
||||
let airline = this.wait_render_data[i];
|
||||
if (airline['airlineCode'] === this.row_state.airlineCode) {
|
||||
this.row_state = airline;
|
||||
hasSelectedRow = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!hasSelectedRow) {
|
||||
if (this.render_data.length > 0) {
|
||||
this.row_state = this.render_data[0];
|
||||
}
|
||||
}
|
||||
this.operateSpinServiceService.hideSpin();
|
||||
}
|
||||
}
|
||||
|
||||
//输入框筛选
|
||||
inputFilter(filterData) {
|
||||
if (this.SEARCH) {
|
||||
if (this.SEL_COL) {
|
||||
let sel_col = this.SEL_COL;
|
||||
this.render_data = filterData.filter(item => {
|
||||
if (this.LASTSEARCH) {
|
||||
if (this.LAST_SEL_COL) {
|
||||
let sel_col = this.LAST_SEL_COL;
|
||||
filterData = filterData.filter(item => {
|
||||
if (item[sel_col]) {
|
||||
if (item[sel_col].toString().match(new RegExp(this.SEARCH, 'i'))) {
|
||||
if (item[sel_col].toString().match(new RegExp(this.LASTSEARCH, 'i'))) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
@@ -121,12 +256,12 @@ export class AirlineComponent implements OnInit {
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.render_data = filterData.filter(item => {
|
||||
filterData = filterData.filter(item => {
|
||||
let is_satis = false;
|
||||
let cols = this.col_lists;
|
||||
let cols = this.render_col_lists;
|
||||
for (let i = 0; i < cols.length; i++) {
|
||||
if (item[cols[i].col_code]) {
|
||||
if (item[cols[i].col_code].toString().match(new RegExp(this.SEARCH, 'i'))) {
|
||||
if (item[cols[i]['COL_CODE']]) {
|
||||
if (item[cols[i]['COL_CODE']].toString().match(new RegExp(this.LASTSEARCH, 'i'))) {
|
||||
is_satis = true;
|
||||
break;
|
||||
} else {
|
||||
@@ -141,72 +276,174 @@ export class AirlineComponent implements OnInit {
|
||||
return is_satis;
|
||||
})
|
||||
}
|
||||
} else {
|
||||
this.render_data = filterData;
|
||||
}
|
||||
this.wait_render_data = filterData;
|
||||
this.render_data = this.wait_render_data.slice(this.start, this.end);
|
||||
|
||||
let hasSelectedRow: boolean = false;
|
||||
for (let i = 0; i < this.wait_render_data.length; i++) {
|
||||
let airline = this.wait_render_data[i];
|
||||
if (airline['airlineCode'] === this.row_state.airlineCode) {
|
||||
this.row_state = airline;
|
||||
hasSelectedRow = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!hasSelectedRow) {
|
||||
if (this.render_data.length > 0) {
|
||||
this.row_state = this.render_data[0];
|
||||
}
|
||||
}
|
||||
this.operateSpinServiceService.hideSpin();
|
||||
}
|
||||
|
||||
positionArray: Array<any> = [];
|
||||
positionedArray: Array<any> = [];
|
||||
positionArrayIndex: number = 0;
|
||||
//输入框定位
|
||||
inputPosition(filterData) {
|
||||
let transArray = []
|
||||
let hasSearchData: boolean = false;
|
||||
let hasPositionedEle: boolean = false;
|
||||
if (this.SEL_COL) {
|
||||
let sel_col = this.SEL_COL;
|
||||
filterData.forEach(element => {
|
||||
if (element[sel_col]) {
|
||||
if (element[sel_col].toString().match(new RegExp(this.SEARCH, 'i'))) {
|
||||
transArray.push(element)
|
||||
for (let i = 0; i < filterData.length; i++) {
|
||||
if (i === filterData.length - 1) {
|
||||
this.positionedArray = [];
|
||||
this.positionArrayIndex = 0;
|
||||
}
|
||||
let fliterElement = filterData[i];
|
||||
if (fliterElement[sel_col]) {
|
||||
if (fliterElement[sel_col].toString().match(new RegExp(this.SEARCH, 'i'))) {
|
||||
let hasThisEle: boolean = false;
|
||||
hasSearchData = true;
|
||||
for (let k = 0; k < this.positionedArray.length; k++) {
|
||||
let positionedElement = this.positionedArray[k];
|
||||
let diffResult = (positionedElement.airlineCode === fliterElement.airlineCode);
|
||||
if (diffResult) {
|
||||
hasThisEle = true;
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
};
|
||||
if (!hasThisEle) {
|
||||
hasPositionedEle = true;
|
||||
this.row_state = fliterElement;
|
||||
this.positionArrayIndex = i;
|
||||
this.positionedArray.push(fliterElement);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (!this.SEARCH) {
|
||||
transArray.push(element)
|
||||
let hasThisEle: boolean = false;
|
||||
hasSearchData = true;
|
||||
for (let k = 0; k < this.positionedArray.length; k++) {
|
||||
let positionedElement = this.positionedArray[k];
|
||||
let diffResult = (positionedElement.airlineCode === fliterElement.airlineCode);
|
||||
if (diffResult) {
|
||||
hasThisEle = true;
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
};
|
||||
if (!hasThisEle) {
|
||||
hasPositionedEle = true;
|
||||
this.row_state = fliterElement;
|
||||
this.positionArrayIndex = i;
|
||||
this.positionedArray.push(fliterElement);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
filterData.forEach(element => {
|
||||
let cols = this.col_lists;
|
||||
for (let i = 0; i < cols.length; i++) {
|
||||
if (element[cols[i].col_code]) {
|
||||
if (element[cols[i].col_code].toString().match(new RegExp(this.SEARCH, 'i'))) {
|
||||
transArray.push(element)
|
||||
let cols = this.render_col_lists;
|
||||
for (let i = 0; i < filterData.length; i++) {
|
||||
if (i === filterData.length - 1) {
|
||||
this.positionedArray = [];
|
||||
this.positionArrayIndex = 0;
|
||||
}
|
||||
let positionIsOk: boolean = false;
|
||||
let filterElement = filterData[i];
|
||||
for (let j = 0; j < cols.length; j++) {
|
||||
let elementCol = cols[j];
|
||||
if (filterElement[elementCol['COL_CODE']]) {
|
||||
if (filterElement[elementCol['COL_CODE']].toString().match(new RegExp(this.SEARCH, 'i'))) {
|
||||
let hasThisEle: boolean = false;
|
||||
hasSearchData = true;
|
||||
for (let k = 0; k < this.positionedArray.length; k++) {
|
||||
let positionedElement = this.positionedArray[k];
|
||||
let diffResult = (positionedElement.airlineCode === filterElement.airlineCode);
|
||||
if (diffResult) {
|
||||
hasThisEle = true;
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
};
|
||||
if (!hasThisEle) {
|
||||
hasPositionedEle = true;
|
||||
positionIsOk = true;
|
||||
this.row_state = filterElement;
|
||||
this.positionArrayIndex = i;
|
||||
this.positionedArray.push(filterElement);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (this.SEARCH) {
|
||||
continue;
|
||||
} else {
|
||||
transArray.push(element)
|
||||
if (!this.SEARCH) {
|
||||
let hasThisEle: boolean = false;
|
||||
hasSearchData = true;
|
||||
for (let k = 0; k < this.positionedArray.length; k++) {
|
||||
let positionedElement = this.positionedArray[k];
|
||||
let diffResult = (positionedElement.airlineCode === filterElement.airlineCode);
|
||||
if (diffResult) {
|
||||
hasThisEle = true;
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
};
|
||||
if (!hasThisEle) {
|
||||
hasPositionedEle = true;
|
||||
positionIsOk = true;
|
||||
this.row_state = filterElement;
|
||||
this.positionArrayIndex = i;
|
||||
this.positionedArray.push(filterElement);
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
if (positionIsOk) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (transArray.length > 0) {
|
||||
if (transArray.toString() == this.positionArray.toString()) {
|
||||
this.positionArrayIndex++;
|
||||
if (this.positionArrayIndex === this.positionArray.length) {
|
||||
this.positionArrayIndex = 0;
|
||||
}
|
||||
this.row_state = this.positionArray[this.positionArrayIndex];
|
||||
} else {
|
||||
this.positionArray = transArray;
|
||||
this.positionArrayIndex = 0;
|
||||
this.row_state = this.positionArray[this.positionArrayIndex];
|
||||
}
|
||||
} else {
|
||||
alert('没有搜索到相关数据');
|
||||
if (!hasSearchData) {
|
||||
alert("没有搜索到相关数据");
|
||||
}
|
||||
this.changeDetectorRef.detectChanges();
|
||||
let tr = $(".selected");
|
||||
let objTr = tr[0];
|
||||
if (objTr) {
|
||||
$("#table-container").animate({ scrollTop: objTr.offsetTop - 42 }, "slow");
|
||||
if (hasPositionedEle) {
|
||||
const scrollTop = this.positionArrayIndex * this.trItemHeight
|
||||
this.tableBody.nativeElement.scrollTop = scrollTop;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置定位数组
|
||||
*/
|
||||
resetPositionArray() {
|
||||
this.positionedArray = [];
|
||||
this.positionArrayIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user