Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import {Component, OnInit, OnDestroy, ViewEncapsulation, NgZone} from '@angular/core';
- import {ActivatedRoute, Router} from "@angular/router";
- import {TaskService} from "../../services/task.service";
- import { DomSanitizer } from "@angular/platform-browser";
- import {ReferencesService} from "../../services/references.service";
- import {RouterService} from "../../services/router.service";
- import {HelperService} from "../../services/helper.service";
- import {FileService} from "../../services/file.service";
- @Component({
- selector: 'app-blocks',
- templateUrl: './blocks.page.html',
- styleUrls: ['./blocks.page.scss'],
- encapsulation: ViewEncapsulation.None
- })
- export class BlocksPage implements OnInit, OnDestroy {
- emptyField = '-';
- inProcess = false;
- currentGroup: any = {};
- groupIcons;
- informationString: any = {};
- categoryIcons;
- resultBlocks: any[] = [];
- encodeSymbols = {
- '/': '#SLASH#'
- };
- compSubscribtion;
- noTasksMessage = 'Задания отсутствуют';
- initialised = false;
- countTaskPage = 2; //кол-во задач на одной странице
- pages: any[] = [];
- currentPage;
- constructor(
- private route: ActivatedRoute,
- private routerService: RouterService,
- private router: Router,
- private taskService: TaskService,
- private sanitizer: DomSanitizer,
- private zone: NgZone,
- private helperService: HelperService,
- private fileService: FileService,
- private refService: ReferencesService,
- ) {
- }
- ngOnInit() {
- this.compSubscribtion = this.taskService.thereIsChanges.subscribe((res) => {
- if (res) {
- this.updateStatuses();
- }
- });
- this.makeBlocks();
- this.taskService.onTasksUpdates().subscribe((tasksUpdated:any) => {
- if (!this.inProcess) {
- this.makeBlocks();
- this.updateStatuses();
- }
- });
- }
- ngOnDestroy() {
- this.compSubscribtion.unsubscribe();
- }
- makeBlocks() {
- this.inProcess = true;
- this.getBlockCodes().then(() => this.getBlocks());
- }
- updateStatuses() {
- let currentTasks = [];
- if (this.resultBlocks.length) {
- this.taskService.getTasks().then((tasks:any) => {
- if (tasks && tasks.length) {
- this.resultBlocks.forEach(block => {
- currentTasks = tasks.filter(storedTask => block.tasks.map(task => task.ID).includes(storedTask.ID));
- block.isNew = currentTasks.some(it => it.isNew);
- currentTasks.every(task => +task.UF_STATUS === this.taskService.statuses.COMPLETE_SUCCESS) ? block.status = 'success' : (currentTasks.some(task => [this.taskService.statuses.COMPLETE_INCORRECT,this.taskService.statuses.NOT_COMPLETE].includes(+task.UF_STATUS)) ? block.status = 'unsuccess' : block.status = 'wait');
- currentTasks.every(task => +task.UF_STATUS === this.taskService.statuses.COMPLETE_SUCCESS) ? block.statusSort = 3 : (currentTasks.some(task => [this.taskService.statuses.COMPLETE_INCORRECT,this.taskService.statuses.NOT_COMPLETE].includes(+task.UF_STATUS)) ? block.statusSort = 2 : block.statusSort = 1);
- });
- this.sortBlocks();
- }
- this.zone.run(() => {});
- this.taskService.unsetUpdateEvent();
- });
- }
- }
- getBlockCodes() {
- return new Promise(resolve => {
- this.refService.getRefs('categories').then((categories:any) => {
- this.categoryIcons = categories.map(category => {
- return {
- id: category.ID,
- name: category.UF_NAME,
- icon: category.UF_PICTOGRAM_CAT_SVG_XML
- }
- });
- }).then(() => {
- this.refService.getRefs('informationString').then((informationString:any)=>{
- if (informationString.length > 0)
- {
- this.informationString = informationString.map(informationStr => {
- return {
- id: informationStr.ID,
- color: informationStr.UF_COLOR,
- field: informationStr.UF_FIELD_NAME,
- text: informationStr.UF_TASK_LOG
- }
- });
- }
- })
- })
- .then(() => {
- return this.refService.getRefs('taskGroups')
- })
- .then((groups:any) => {
- this.currentGroup.id = this.route.snapshot.params['blockFirstCode'];
- if (this.currentGroup.id === 'unsorted') {
- this.currentGroup.name = 'Прочее';
- }
- else {
- this.currentGroup.name = groups.find(group => group.ID === this.currentGroup.id).UF_NAME;
- this.currentGroup.infostring = groups.find(group => group.ID === this.currentGroup.id).UF_INFO_STRING;
- this.currentGroup.categoryId = groups.find(group => group.ID === this.currentGroup.id).UF_CATEGORY;
- this.currentGroup.categoryName = this.categoryIcons.find(cat => cat.id === this.currentGroup.categoryId).name;
- this.currentGroup.groupingCodeFirst = groups.find(group => group.ID === this.currentGroup.id).UF_GR_FIELD_CODE ;
- this.currentGroup.groupingCodeFirstValue = this.route.snapshot.params['blockSecondCode'] || false;
- if (this.currentGroup.groupingCodeFirstValue) {
- for (let key in this.encodeSymbols) {
- this.currentGroup.groupingCodeFirstValue = this.currentGroup.groupingCodeFirstValue.replace(this.encodeSymbols[key], key);
- }
- }
- this.currentGroup.groupingCodeFirstValue = this.currentGroup.groupingCodeFirstValue === this.emptyField ? '' : this.currentGroup.groupingCodeFirstValue;
- this.currentGroup.groupingCodeSecond = groups.find(group => group.ID === this.currentGroup.id).UF_GR_FIELD_CODE2 || false;
- this.currentGroup.isNextSecondLevel = (this.route.snapshot.params['blockSecondCode'] === undefined) && !!this.currentGroup.groupingCodeSecond;
- this.groupIcons = groups.map(group => {
- return {
- id: group.ID,
- categoryId: group.UF_CATEGORY,
- icon: group.UF_PICTOGRAM_GROUP_SVG_XML
- }
- });
- }
- resolve(this.currentGroup);
- })
- })
- }
- //проверка объекта на пустоту
- isEmpty(obj) {
- for (let key in obj) {
- // если тело цикла начнет выполняться - значит в объекте есть свойства
- return false;
- }
- return true;
- }
- getBlocks(page = 0) {
- this.currentPage = page+1;
- let tasks;
- let tasksFullFilter;
- let blocks: any[] = [];
- let blockGroupsFull = {};
- let infostring_group = null;
- let infostring_values = [];
- this.taskService.getTasks().then((tasksFull:any) => {
- if (this.currentGroup.infostring !== null && this.informationString && !this.isEmpty(this.informationString))
- {
- infostring_group = this.informationString.filter(infostr => infostr.id == this.currentGroup.infostring);
- }
- if (this.currentGroup.id === 'unsorted') {
- this.resultBlocks = tasksFull.filter(task => !task.GROUPS).map(task => {
- return {
- link: task.ID,
- groupsIcons: ['<svg xmlns="http://www.w3.org/2000/svg" width="21.294" height="5.691" viewBox="0 0 21.294 5.691">' +
- '<g transform="translate(-10.2 -35.5)">' +
- '<path d="M13.045,35.5A2.845,2.845,0,1,1,10.2,38.345,2.86,2.86,0,0,1,13.045,35.5" transform="translate(0)" fill="#168ec8"/>' +
- '<path d="M38.545,35.5A2.845,2.845,0,1,1,35.7,38.345,2.86,2.86,0,0,1,38.545,35.5" transform="translate(-17.698)" fill="#168ec8"/>' +
- '<path d="M64.045,35.5A2.845,2.845,0,1,1,61.2,38.345,2.86,2.86,0,0,1,64.045,35.5" transform="translate(-35.397)" fill="#168ec8"/></g></svg>'],
- categoryIcons: task.UF_CATEGORY ? this.categoryIcons.find(cat => cat.id === task.UF_CATEGORY).icon : '',
- count: 1,
- priority: task.UF_PRIORITY,
- status: +task.UF_STATUS === this.taskService.statuses.COMPLETE_SUCCESS ? 'success' : ([this.taskService.statuses.COMPLETE_INCORRECT,this.taskService.statuses.NOT_COMPLETE].includes(+task.UF_STATUS) ? 'unsuccess' : 'wait'),
- statusSort: +task.UF_STATUS === this.taskService.statuses.COMPLETE_SUCCESS ? 3 : ([this.taskService.statuses.COMPLETE_INCORRECT,this.taskService.statuses.NOT_COMPLETE].includes(+task.UF_STATUS) ? 2 : 1),
- title: 'Задача №' + task.ID,
- comment: (task.UF_COMMENT) ? task.UF_COMMENT : '',
- isNew: task.isNew,
- importantCount: +(task.UF_COMMENT !== '' || task.UF_TIME_START !== '' && task.UF_TIME_FINISH !== ''),
- finishDate: task.UF_DATE_FINISH,
- finishTime: task.UF_TIME_FINISH,
- tasks: [task]
- }
- });
- } else {
- if (tasksFull && tasksFull.length) {
- /**
- * для второго уровня фильтруем по групе
- * но считаем без группы
- */
- if (this.currentGroup.groupingCodeFirstValue) { // 2 level
- tasks = tasksFull.filter(task => !!task && !!task.GROUPS && task.GROUPS.includes(this.currentGroup.id));
- if (this.currentGroup.groupingCodeFirstValue !== false) {
- tasks = tasks.filter(task => task[this.currentGroup.groupingCodeFirst] === this.currentGroup.groupingCodeFirstValue);
- }
- if (this.currentGroup.groupingCodeFirstValue !== false) {
- tasksFullFilter = tasksFull.filter(task => task[this.currentGroup.groupingCodeFirst] === this.currentGroup.groupingCodeFirstValue);
- }
- } else { // 1 level
- tasks = tasksFull.filter(task => !!task && !!task.GROUPS && task.GROUPS.includes(this.currentGroup.id));
- if (this.currentGroup.groupingCodeFirstValue !== false) {
- tasks = tasks.filter(task => task[this.currentGroup.groupingCodeFirst] === this.currentGroup.groupingCodeFirstValue);
- }
- }
- let blockGroups = {};
- if (!this.currentGroup.groupingCodeFirstValue) { // 1 level
- for (let alsoTask of tasks) {
- if (
- (this.currentGroup.groupingCodeFirst
- && alsoTask[this.currentGroup.groupingCodeFirst])
- || !alsoTask[this.currentGroup.groupingCodeFirst]
- ) {
- let val = alsoTask[this.currentGroup.groupingCodeFirst];
- if (blockGroups[val]) {
- blockGroups[val].push(alsoTask);
- } else {
- blockGroups[val] = [alsoTask];
- }
- }
- }
- } else { // 2 level
- for (let alsoTask of tasks) {
- if (
- (this.currentGroup.groupingCodeFirst
- && alsoTask[this.currentGroup.groupingCodeFirst])
- || !alsoTask[this.currentGroup.groupingCodeFirst]
- && (this.currentGroup.groupingCodeSecond
- && alsoTask[this.currentGroup.groupingCodeSecond])
- || !alsoTask[this.currentGroup.groupingCodeSecond]
- ) {
- let val1 = alsoTask[this.currentGroup.groupingCodeFirst];
- let val2 = alsoTask[this.currentGroup.groupingCodeSecond];
- if (blockGroups[val1+val2]) {
- blockGroups[val1+val2].push(alsoTask);
- } else {
- blockGroups[val1+val2] = [alsoTask];
- }
- }
- }
- /**
- * чтобы посчитать количество задач всего в деталке, т.к. они группируются без учета групп
- */
- for (let alsoTask of tasksFullFilter) {
- if (
- (this.currentGroup.groupingCodeFirst
- && alsoTask[this.currentGroup.groupingCodeFirst])
- || !alsoTask[this.currentGroup.groupingCodeFirst]
- && (this.currentGroup.groupingCodeSecond
- && alsoTask[this.currentGroup.groupingCodeSecond])
- || !alsoTask[this.currentGroup.groupingCodeSecond]
- ) {
- let val1 = alsoTask[this.currentGroup.groupingCodeFirst];
- let val2 = alsoTask[this.currentGroup.groupingCodeSecond];
- if (blockGroupsFull[val1+val2]) {
- blockGroupsFull[val1+val2].push(alsoTask);
- } else {
- blockGroupsFull[val1+val2] = [alsoTask];
- }
- }
- }
- }
- for (let code in blockGroups) {
- if (blockGroups.hasOwnProperty(code)) {
- blocks.push(blockGroups[code]);
- }
- }
- }
- this.resultBlocks = blocks.map(block => {
- let taskGroupsIcons = [],
- status = 'wait',
- statusSort = 1;
- if (block.filter(task => +task.UF_STATUS === this.taskService.statuses.COMPLETE_SUCCESS).length === block.length) {
- status = 'success';
- statusSort = 3;
- }
- if (block.map(task => task.UF_STATUS).some(status => [this.taskService.statuses.COMPLETE_INCORRECT,this.taskService.statuses.NOT_COMPLETE].includes(+status))) {
- status = 'unsuccess';
- statusSort = 2;
- }
- let commentsList = [];
- block.forEach(task => {
- /* собираем значения инфостроки для второго уровня если она не пустая (значения поля задачи указанного в инфостроке) */
- if (infostring_group !== null && !!this.currentGroup.groupingCodeFirstValue){
- if (task.hasOwnProperty(infostring_group[0].field) && task[infostring_group[0].field].length > 0 &&infostring_values.indexOf(task[infostring_group[0].field]) < 0){
- infostring_values.push(task[infostring_group[0].field]);
- }
- }
- taskGroupsIcons = Array.from(new Set(taskGroupsIcons.concat(task.GROUPS)));
- if (!commentsList.includes(task.UF_COMMENT)) {
- commentsList.push(task.UF_COMMENT);
- }
- });
- if (infostring_group !== null)
- {
- infostring_group[0]["infostring_value"] = "";
- if(infostring_values.length > 0){
- infostring_group[0]["infostring_value"] = infostring_values;
- }
- }
- let codeFirst:string = block[0][this.currentGroup.groupingCodeFirst];
- if (codeFirst) {
- for (let key in this.encodeSymbols) {
- codeFirst = codeFirst.replace(key, this.encodeSymbols[key]);
- }
- }
- let link = this.currentGroup.isNextSecondLevel ? (codeFirst === '' ? this.emptyField : codeFirst) + '/second-level' : block.map(task => task.ID).join('-');
- /**
- * Заголовок: адрес или номер квартиры
- */
- let title = '';
- /**
- * если второй уровень
- */
- if (!!this.currentGroup.groupingCodeFirstValue) {
- /**
- * если нет значения, ставим пробел
- */
- if (block[0][this.currentGroup.groupingCodeSecond] === '') {
- title = this.emptyField;
- } else {
- /**
- * если это номер квартира, обрезаем ведущие нули
- */
- if (this.currentGroup.groupingCodeSecond == 'UF_APARTMENT_NUMBER') {
- title = block[0][this.currentGroup.groupingCodeSecond].replace(/^0+/, '');
- } else {
- title = block[0][this.currentGroup.groupingCodeSecond];
- }
- }
- /**
- * если первый уровень
- */
- } else {
- /**
- * если нет значения, ставим пробел
- */
- if (block[0][this.currentGroup.groupingCodeFirst] === '') {
- title = this.emptyField;
- } else {
- /**
- * если это номер квартира, обрезаем ведущие нули
- */
- if (this.currentGroup.groupingCodeFirst == 'UF_APARTMENT_NUMBER') {
- title = block[0][this.currentGroup.groupingCodeFirst].replace(/^0+/, '');
- } else {
- title = block[0][this.currentGroup.groupingCodeFirst];
- }
- }
- }
- /**
- * считаем всего количество задач
- */
- let count = block.length;
- let importantCount = block.filter(task => (task.UF_COMMENT !== '' || !!task.UF_TIME_FINISH && task.UF_TIME_FINISH !== '')).length;
- let val1Group = block[0][this.currentGroup.groupingCodeFirst];
- let val2Group = block[0][this.currentGroup.groupingCodeSecond];
- if (blockGroupsFull) {
- for (let code in blockGroupsFull) {
- if (!blockGroupsFull.hasOwnProperty(code)) {
- continue;
- }
- if (code == val1Group+val2Group) {
- let tasksFullByCode = blockGroupsFull[code];
- if (tasksFullByCode && typeof tasksFullByCode === 'object' && tasksFullByCode.length) {
- count = tasksFullByCode.length;
- importantCount = tasksFullByCode.filter(task => (task.UF_COMMENT !== '' || !!task.UF_TIME_FINISH && task.UF_TIME_FINISH !== '')).length;
- break;
- }
- }
- }
- }
- return {
- link: link,
- groupsIcons: taskGroupsIcons.map(id => {
- return this.groupIcons.find(group => group.id === id).icon;
- }),
- categoryIcon: this.categoryIcons.find(cat => cat.id === this.currentGroup.categoryId).icon,
- count: count,
- priority: Math.min.apply(null, block.map(task => task.UF_PRIORITY)),
- status,
- statusSort,
- title: title,
- comment: commentsList.join('; '),
- isNew: block.some(item => item.isNew),
- importantCount: importantCount,
- finishDate: Math.min.apply(null, block.filter(task => !!task.UF_DATE_FINISH).map(task => +(task.UF_DATE_FINISH).split('-').join(''))),
- finishTime: Math.min.apply(null, block.filter(task => !!task.UF_TIME_FINISH).map(task => +task.UF_TIME_FINISH)),
- infostring: infostring_group !== null ? infostring_group[0] : null,
- tasks: block
- }
- });
- }
- this.sortBlocks();
- this.setPagination(page);
- console.log("result blocks");
- console.log(this.resultBlocks);
- this.inProcess = false;
- })
- }
- sortBlocks() {
- this.resultBlocks.sort( (a,b) => {
- return (parseInt(a.title) - parseInt(b.title)) // 6 по названию (квартира)
- });
- this.initialised = true;
- return;
- this.resultBlocks.sort( (a,b) => {
- return (a.statusSort - b.statusSort) // 1 по статусу
- || (a.finishDate - b.finishDate) // 2 по дате завершения
- || (b.importantCount - a.importantCount) // 3 с не пустыми комментариями
- || (a.finishTime - b.finishTime) // 4 по времени завершения
- || (a.priority - b.priority) // 5 по приоритету
- || (a.title - b.title) // 6 по названию (квартира)
- });
- }
- /**
- * @param page
- */
- setPagination(page) {
- this.pages = [];
- if (!!this.currentGroup.groupingCodeFirstValue && this.resultBlocks.length > this.countTaskPage){
- this.pages.push('Все');
- for (let i = 0;i< Math.ceil(this.resultBlocks.length/this.countTaskPage);i++){
- this.pages.push(i+1);
- }
- if (page != -1){
- this.resultBlocks = this.resultBlocks.filter((elem,index)=>{
- if (index >= page*this.countTaskPage && index < page*this.countTaskPage + this.countTaskPage){
- return elem;
- }
- });
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement