dynamic-display-shared
Version:
A library for dynamic view
1,065 lines (1,047 loc) • 168 kB
JavaScript
import * as i0 from '@angular/core';
import { Injectable, Component, NgModule, Inject, ChangeDetectionStrategy, Input, EventEmitter, ElementRef, Output, ViewChild, HostListener, Pipe, APP_INITIALIZER } from '@angular/core';
import * as i1$3 from '@angular/common';
import { CommonModule } from '@angular/common';
import * as i2$4 from '@angular/forms';
import { FormControl, NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule } from '@angular/forms';
import { plural } from 'pluralize';
import * as i1 from '@angular/material/dialog';
import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
import * as i2 from '@angular/material/icon';
import { MatIconModule } from '@angular/material/icon';
import * as i2$2 from '@angular/material/expansion';
import { MatExpansionModule } from '@angular/material/expansion';
import { Observable, BehaviorSubject, Subscription, Subject, merge, fromEvent, timer } from 'rxjs';
import * as i1$1 from '@angular/common/http';
import { HttpHeaders } from '@angular/common/http';
import * as i2$1 from '@ngrx/store';
import { createAction, props, createReducer, on } from '@ngrx/store';
import * as i1$2 from 'angular-oauth2-oidc';
import { NullValidationHandler, OAuthErrorEvent } from 'angular-oauth2-oidc';
import * as i6 from '@angular/material/tooltip';
import { MatTooltipModule } from '@angular/material/tooltip';
import * as i2$3 from '@angular/material/button';
import { MatButtonModule } from '@angular/material/button';
import * as i4 from '@angular/material/menu';
import { MatMenuModule } from '@angular/material/menu';
import { FlexLayoutModule } from '@angular/flex-layout';
import { RouterModule } from '@angular/router';
import { ENTER, COMMA } from '@angular/cdk/keycodes';
import * as i5 from '@angular/material/form-field';
import { MatFormFieldModule } from '@angular/material/form-field';
import * as i6$1 from '@angular/material/chips';
import { MatChipsModule } from '@angular/material/chips';
import { __awaiter } from 'tslib';
import { BidiModule } from '@angular/cdk/bidi';
import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatCardModule } from '@angular/material/card';
import { MatDividerModule } from '@angular/material/divider';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatInputModule } from '@angular/material/input';
import { MatListModule } from '@angular/material/list';
import { MatBadgeModule } from '@angular/material/badge';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import * as i1$4 from '@angular/material/snack-bar';
import { MatSnackBarModule } from '@angular/material/snack-bar';
import { MatSelectModule } from '@angular/material/select';
import { MatDatepickerModule } from '@angular/material/datepicker';
import { MatProgressBarModule } from '@angular/material/progress-bar';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatNativeDateModule } from '@angular/material/core';
import { MatTabsModule } from '@angular/material/tabs';
import * as i1$5 from '@angular/platform-browser';
class DynamicDisplaySharedService {
constructor() { }
}
DynamicDisplaySharedService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
DynamicDisplaySharedService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return []; } });
class DynamicDisplaySharedComponent {
constructor() { }
ngOnInit() {
}
}
DynamicDisplaySharedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
DynamicDisplaySharedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: DynamicDisplaySharedComponent, selector: "lib-dynamic-display-shared", ngImport: i0, template: `
<p>
dynamic-display-shared works!
</p>
`, isInline: true });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedComponent, decorators: [{
type: Component,
args: [{ selector: 'lib-dynamic-display-shared', template: `
<p>
dynamic-display-shared works!
</p>
` }]
}], ctorParameters: function () { return []; } });
class DynamicDisplaySharedModule {
}
DynamicDisplaySharedModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
DynamicDisplaySharedModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedModule, declarations: [DynamicDisplaySharedComponent], exports: [DynamicDisplaySharedComponent] });
DynamicDisplaySharedModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedModule });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DynamicDisplaySharedModule, decorators: [{
type: NgModule,
args: [{
declarations: [
DynamicDisplaySharedComponent
],
imports: [],
exports: [
DynamicDisplaySharedComponent
]
}]
}] });
class Guid {
static newGuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
}
function getFileName(entityId, parameterMetadataId, originalFileName) {
return `${Guid.newGuid()}_${parameterMetadataId}.${getFileExtension(originalFileName)}`;
}
function getFileExtension(fileName) {
return fileName ? fileName.slice((Math.max(0, fileName.lastIndexOf('.')) || Infinity) + 1) : '';
}
function applyDownloadLink(href, fileName, openInNewWindow = false) {
const downloadLink = document.createElement('a');
downloadLink.href = href;
if (openInNewWindow) {
downloadLink.setAttribute('target', '_blank');
}
if (fileName) {
downloadLink.setAttribute('download', fileName);
}
document.body.appendChild(downloadLink);
downloadLink.click();
downloadLink.parentNode.removeChild(downloadLink);
}
class EntityBase {
}
class Entity extends EntityBase {
}
class ParametersGroup {
}
class EntityDetailsViewModel extends EntityBase {
}
class MasterEntityDetailsViewModel extends EntityDetailsViewModel {
}
function getTime(date) {
return date != null ? new Date(date).getTime() : 0;
}
var EntityTypeInstance;
(function (EntityTypeInstance) {
EntityTypeInstance[EntityTypeInstance["range"] = 1] = "range";
EntityTypeInstance[EntityTypeInstance["taxationSubRange"] = 2] = "taxationSubRange";
EntityTypeInstance[EntityTypeInstance["program"] = 3] = "program";
EntityTypeInstance[EntityTypeInstance["building"] = 4] = "building";
EntityTypeInstance[EntityTypeInstance["apartment"] = 5] = "apartment";
EntityTypeInstance[EntityTypeInstance["blockParcel"] = 6] = "blockParcel";
EntityTypeInstance[EntityTypeInstance["contact"] = 7] = "contact";
EntityTypeInstance[EntityTypeInstance["discussion"] = 10] = "discussion";
EntityTypeInstance[EntityTypeInstance["landZoning"] = 13] = "landZoning";
EntityTypeInstance[EntityTypeInstance["parcel"] = 14] = "parcel";
EntityTypeInstance[EntityTypeInstance["localAuthoritieSubRange"] = 15] = "localAuthoritieSubRange";
EntityTypeInstance[EntityTypeInstance["tama38"] = 16] = "tama38";
EntityTypeInstance[EntityTypeInstance["preliminaryRequest"] = 17] = "preliminaryRequest";
EntityTypeInstance[EntityTypeInstance["declarationRequest"] = 18] = "declarationRequest";
EntityTypeInstance[EntityTypeInstance["parcelRequest"] = 21] = "parcelRequest";
EntityTypeInstance[EntityTypeInstance["constructionEvacuationRequest"] = 22] = "constructionEvacuationRequest";
EntityTypeInstance[EntityTypeInstance["barry"] = 23] = "barry";
EntityTypeInstance[EntityTypeInstance["contract"] = 24] = "contract";
EntityTypeInstance[EntityTypeInstance["entrepreneurContacts"] = 25] = "entrepreneurContacts";
EntityTypeInstance[EntityTypeInstance["RangeRequest"] = 26] = "RangeRequest";
EntityTypeInstance[EntityTypeInstance["SubRangeRequest"] = 27] = "SubRangeRequest";
EntityTypeInstance[EntityTypeInstance["task"] = 28] = "task";
EntityTypeInstance[EntityTypeInstance["permitCondition"] = 29] = "permitCondition";
EntityTypeInstance[EntityTypeInstance["programRequest"] = 30] = "programRequest";
EntityTypeInstance[EntityTypeInstance["permitExpect"] = 31] = "permitExpect";
EntityTypeInstance[EntityTypeInstance["document"] = 32] = "document";
EntityTypeInstance[EntityTypeInstance["firstSort"] = 34] = "firstSort";
EntityTypeInstance[EntityTypeInstance["secondSort"] = 35] = "secondSort";
EntityTypeInstance[EntityTypeInstance["landUse"] = 36] = "landUse";
EntityTypeInstance[EntityTypeInstance["withoutFunding"] = 37] = "withoutFunding";
EntityTypeInstance[EntityTypeInstance["tiyuv_tama38"] = 101] = "tiyuv_tama38";
EntityTypeInstance[EntityTypeInstance["request"] = 102] = "request";
EntityTypeInstance[EntityTypeInstance["permit"] = 103] = "permit";
EntityTypeInstance[EntityTypeInstance["certificate"] = 104] = "certificate";
EntityTypeInstance[EntityTypeInstance["stage"] = 105] = "stage";
EntityTypeInstance[EntityTypeInstance["use"] = 106] = "use";
})(EntityTypeInstance || (EntityTypeInstance = {}));
function getMasterEntityViewModel(entity) {
return getViewModel(entity, true);
}
function getEntityViewModel(entity) {
return getViewModel(entity, false);
}
// function getTime(date?: Date) {
// return date != null ? new Date(date).getTime() : 0;
// }
function getViewModel(entity, isMaster) {
const groupsMap = new Map();
entity.parameters.forEach((param) => {
const key = param.parametersGroupOrder;
const collection = groupsMap.get(key);
if (!collection) {
groupsMap.set(key, [param]);
}
else {
collection.push(param);
}
});
// tslint:disable-next-line: one-variable-per-declaration
const groups = [...groupsMap.entries()].sort()
.map((params) => {
const grp = new ParametersGroup();
grp.order = params[0];
grp.parameters = params[1]
.map(p => {
if (isSimpleParameter(p)) {
return p;
}
else {
const entityParameter = p;
return Object.assign(Object.assign({}, entityParameter), { value: entityParameter.value ? entityParameter.value.map(ntt => getEntityViewModel(ntt)) : [] });
}
})
.sort((p1, p2) => p1.order - p2.order);
return grp;
});
const processes = entity.processes
.map(prcs => (Object.assign(Object.assign({}, prcs), { entities: prcs.entities.map(ntt => getEntityViewModel(ntt)), editEntities: prcs.editEntities ? prcs.editEntities.map(ntt => getEntityViewModel(ntt)) : null,
// resAppExpansionView: prcs.resAppExpansionView ? getEntityViewModel(prcs.resAppExpansionView) : null,
resAppToggledView: prcs.resAppToggledView ? getEntityViewModel(prcs.resAppToggledView) : null })))
.sort((p1, p2) => p1.order - p2.order);
const comments = entity.comments ? entity.comments.map(c => {
const newComment = Object.assign(c, {});
newComment.date = new Date(c.date);
return newComment;
}).sort((c1, c2) => getTime(c2.date) - getTime(c1.date)) : [];
processes.forEach(p => {
p.statuses = p.statuses.sort((s1, s2) => s1.order - s2.order);
p.statuses.forEach(status => status.entitiesStatus = status.entitiesStatus.sort((e1, e2) => getTime(e2.date) - getTime(e1.date)));
});
const entityBase = entity;
const viewModel = Object.assign(Object.assign({}, entityBase), { id: entity.id, description: entity.entityMetadata.description, shortDescription: entity.entityMetadata.shortDescription, type: entity.entityMetadata.id, parametersGroups: groups, processes,
comments, gisIdFieldName: entity.entityMetadata.gisIdFieldName, gisLayers: entity.entityMetadata.gisLayers, gisBs: entity.entityMetadata.gisBs });
if (isMaster) {
const masterViewModel = Object.assign(Object.assign({}, viewModel), { parametersGroups: groups.filter(group => group.order !== 0 && group.order !== 1), headersParameters: groups.find(group => group.order === 0), subHeadersParameters: groups.find(group => group.order === 1) });
return masterViewModel;
}
else {
return viewModel;
}
}
function isSimpleParameter(parameter) {
return parameter && 'valueCssClassName' in parameter;
}
function isEntityParameter(parameter) {
return parameter && 'isDisplayEntityType' in parameter;
}
function getPluralEntityTypeName(metadataId) {
return plural(EntityTypeInstance[metadataId]);
}
function getSimpleParameters(parameters) {
return parameters.filter(p => isSimpleParameter(p)).map(p => p);
}
function getEntityParameters(parameters) {
return parameters.filter(p => isEntityParameter(p)).map(p => p);
}
class LongTextDialogComponent {
constructor(dialogRef, data) {
this.dialogRef = dialogRef;
this.data = data;
}
ngOnInit() {
}
close() {
this.dialogRef.close();
}
}
LongTextDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: LongTextDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
LongTextDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: LongTextDialogComponent, selector: "app-long-text-dialog", ngImport: i0, template: "<div class=\"dialog-container\">\r\n <div class=\"dialog-title\" mat-dialog-title>\r\n <div class=\"title\">{{data.title}}</div>\r\n <a (click)=\"close()\" class=\"float-left-icon\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n </div>\r\n {{data.longText}}\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: LongTextDialogComponent, decorators: [{
type: Component,
args: [{ selector: 'app-long-text-dialog', template: "<div class=\"dialog-container\">\r\n <div class=\"dialog-title\" mat-dialog-title>\r\n <div class=\"title\">{{data.title}}</div>\r\n <a (click)=\"close()\" class=\"float-left-icon\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n </div>\r\n {{data.longText}}\r\n</div>\r\n" }]
}], ctorParameters: function () {
return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
type: Inject,
args: [MAT_DIALOG_DATA]
}] }];
} });
const addCategoriesFilter = createAction('[Filter] Add Categories Filters', props());
const clearFilter = createAction('[Filter] Clear Filter');
const removeCategoriesFilter = createAction('[Filter] Remove Category Filter', props());
const removeCategoriesFilterRange = createAction('[Filter] Remove Category Filter Range', props());
const updateFreeFilter = createAction('[Filter] Update Free Filter', props());
const updateRangesFilter = createAction('[Filter] Update Range Filter', props());
const fetchFiltersOptions = createAction('[Filter] Fetch Filters Options');
const loadFiltersOptionsSuccess = createAction('[Filter] Load Filters Options', props());
// export const loadFiltersOptionsSuccess = createAction(
// '[Filter] Load Filters Options Success',
// );
const loadFiltersOptionsFailure = createAction('[Filter] Load Filters Options Failure', props());
const downloadFileStarted = createAction('[Filter] Download File Started');
const downloadFileFinished = createAction('[Filter] Download File Finished');
// Statistic actions
const updateSelectedChart = createAction('[Statistic] Update Selected Chart', props());
const refreshEntities = createAction('[Filter] Refresh Entities', props());
const sortIdChange = createAction('[Filter] Sort id changed', props());
class Logger {
fatal(message, ...additional) { }
error(message, ...additional) { }
warn(message, ...additional) { }
info(message, ...additional) { }
log(message, ...additional) { }
debug(message, ...additional) { }
trace(message, ...additional) { }
}
Logger.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: Logger, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
Logger.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: Logger });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: Logger, decorators: [{
type: Injectable
}] });
class EntityService {
constructor(httpClient, store, logger, env) {
this.httpClient = httpClient;
this.store = store;
this.logger = logger;
this.env = env;
// public pageSize = 5;
// private _entities: Entity[] = [];
// private _entitiesSubject: Subject<Entity[]> = new BehaviorSubject<Entity[]>(this._entities);
this.innerEntitiesProcessHeight = [];
this.cardProcessHeight = [];
}
getEntities(filterCategories, filtersParametersRange, filterTerm, skip, take, presentationTypeId, administrativeCode, entrepreneurCode, sortId) {
const self = this;
return new Observable(observer => {
const url = `${this.getBaseUrl()}/entities`;
const filtersParameters = filterCategories.map(f => {
return {
parameterId: f.parameterId,
values: f.data.map((d) => {
return { value: d.dataItem };
})
};
});
const requestBody = {
filterTerm,
skip,
take,
presentationTypeId,
filtersParameters,
filtersParametersRange,
sortId
};
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
this.httpClient.post(url, requestBody, options).subscribe(response => {
observer.next(response);
observer.complete();
this.logger.debug(`${response.length} Entities have been fetched successfully`);
}, error => {
self.logger.error('An error occurred while fetching entities', error);
observer.error(error);
});
});
}
downloadResultFile(filterCategories, filterParametersRange, filterTerm) {
// : Observable<{ disposition: string; blobFile: Blob }> {
const self = this;
this.store.dispatch(downloadFileStarted());
return new Observable(observer => {
const url = `${this.getBaseUrl()}/ExcelExport`;
const filtersParameters = filterCategories.map(f => {
return {
parameterId: f.parameterId,
values: f.data.map((d) => {
return { value: d.dataItem };
})
};
});
const filtersParametersRange = filterParametersRange.map(f => {
return {
parameterMetadataId: f.parameterMetadataId,
valueFrom: f.valueFrom,
valueTo: f.valueTo
};
});
const requestBody = {
filterTerm,
skip: 0,
take: 1000000,
presentationTypeId: 7,
filtersParameters,
filtersParametersRange
};
const options = {
responseType: 'blob',
observe: 'response',
// withCredentials: true,
headers: new HttpHeaders({
'content-type': 'application/json',
'response-type': 'blob',
'Access-Control-Expose-Headers': 'Content-Disposition'
// authorization: 'Bearer my JWT',
// accept: 'text/plain, */*',
// 'Cache-Control': 'no-cache',
})
};
this.httpClient.post(url, requestBody, options).subscribe(
// @ts-ignore
(response) => {
const result = {
// @ts-ignore
blobFile: new Blob([response.body], { type: response.headers.get('Content-Type') }),
disposition: response.headers.get('Content-Disposition')
};
const dataType = result.blobFile.type;
const binaryData = [];
binaryData.push(result.blobFile);
const href = window.URL.createObjectURL(new Blob(binaryData, { type: dataType }));
let filename = null;
if (result.disposition) {
const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
const matches = filenameRegex.exec(result.disposition);
if (matches != null && matches[1]) {
filename = matches[1].replace(/['"]/g, '');
}
}
applyDownloadLink(href, filename);
this.store.dispatch(downloadFileFinished());
// observer.next(result);
observer.complete();
this.logger.debug(`File have been fetched successfully`);
}, error => {
self.logger.error('An error occurred while fetching file', error);
observer.error(error);
this.store.dispatch(downloadFileFinished());
});
});
}
getEntity(fixedId, entityType, presentationTypeId) {
const url = `${this.getBaseUrl()}/entities/${fixedId}/${Number(entityType)}/${presentationTypeId}`;
// todo: return native observble
return this.httpClient.get(url);
// }
}
getEntityByBlockParcel(block, parcel, entityType, presentationTypeId) {
// let ntt = this.entities.find((e => e.id === entityCode));
// if (ntt) {
// return of(ntt);
// } else {
const url = `${this.getBaseUrl()}/entities/${block}/${parcel}/${Number(entityType)}/${presentationTypeId}`;
// todo: return native observble
return this.httpClient.get(url);
// }
}
getEntityBySpecificPresentation(presentationId, relatedEntityId) {
const url = `${this.getBaseUrl()}/entities/GetEntityBySpecificPresentation/${presentationId}/${relatedEntityId}`;
// todo: return native observble
return this.httpClient.get(url);
// }
}
getBaseUrl() {
return this.env.apiUrl;
}
getSearchCategories(filterCategories, filterRangeParameters, filterTerm, sortId) {
const self = this;
return new Observable(observer => {
const url = `${this.getBaseUrl()}/entities/GetFilterCategories`;
const filtersParameters = filterCategories.map(f => {
return {
parameterId: f.parameterId,
values: f.data.map((d) => {
return { value: d.dataItem };
})
};
});
const requestBody = {
filtersParameters, filterRangeParameters, filterTerm, sortId
};
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
this.httpClient.post(url, requestBody, options).subscribe(response => {
observer.next(response);
self.logger.info('Fetch search categories completed');
observer.complete();
}, error => {
self.logger.error('An error occurred while fetching search categories', error);
observer.error(error);
});
});
}
getHousingUnitsCharts(filterCategories, filtersCategoryRange, filterTerm) {
const self = this;
return new Observable(observer => {
const url = `${this.getBaseUrl()}/entities/GetHousingUnitsCharts`;
const filtersParameters = filterCategories.map(f => {
return {
parameterId: f.parameterId,
values: f.data.map((d) => {
return { value: d.dataItem };
})
};
});
const filtersParametersRange = filtersCategoryRange.map(f => {
return {
parameterMetadataId: f.parameterMetadataId,
valueFrom: f.valueFrom,
valueTo: f.valueTo
};
});
const requestBody = {
filtersParameters, filtersParametersRange, filterTerm
};
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
this.httpClient.post(url, requestBody, options).subscribe(response => {
observer.next(response);
self.logger.info('Fetch housing units charts completed');
observer.complete();
}, error => {
self.logger.error('An error occurred while fetching housing units charts', error);
observer.error(error);
});
});
}
getHousingUnitsChartsHeaders(filterCategories, filtersCategoryRange, filterTerm) {
const self = this;
return new Observable(observer => {
const url = `${this.getBaseUrl()}/entities/GetHousingUnitsChartsHeaders`;
const filtersParameters = filterCategories.map(f => {
return {
parameterId: f.parameterId,
values: f.data.map((d) => {
return { value: d.dataItem };
})
};
});
const filtersParametersRange = filtersCategoryRange.map(f => {
return {
parameterMetadataId: f.parameterMetadataId,
valueFrom: f.valueFrom,
valueTo: f.valueTo
};
});
const requestBody = {
filtersParameters, filtersParametersRange, filterTerm
};
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
this.httpClient.post(url, requestBody, options).subscribe(response => {
observer.next(response);
self.logger.info('Fetch housing units charts headers completed');
observer.complete();
}, error => {
self.logger.error('An error occurred while fetching housing units charts headers.', error);
observer.error(error);
});
});
}
getTargetCharts() {
const self = this;
return new Observable(observer => {
const url = `${this.getBaseUrl()}/entities/GetTargetCharts`;
// const filtersParameters = filterCategories.map(f => {
// return {
// parameterId: f.parameterId,
// values: f.data.map(d => {
// return { value: d.dataItem };
// })
// };
// }
// );
const requestBody = {
//filtersParameters, filterTerm
};
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
this.httpClient.get(url, options).subscribe(response => {
observer.next(response);
self.logger.info('Fetch target charts completed');
observer.complete();
}, error => {
self.logger.error('An error occurred while fetching target charts', error);
observer.error(error);
});
});
}
getStatusEntities(processId) {
const self = this;
return new Observable(observer => {
const url = `${this.getBaseUrl()}/entities/GetStatusEntities`;
const requestBody = { processId };
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
this.httpClient.post(url, requestBody, options).subscribe(response => {
observer.next(response);
self.logger.info(`Get entitiesStatus completed`);
observer.complete();
}, error => {
self.logger.error(`An error occurred while get entitiesStatus`, error);
observer.error(error);
});
});
}
getEntityTemplate(entityTypeId, presentationTypeId, parentRangeId) {
const self = this;
return new Observable(observer => {
let url;
if (parentRangeId) {
url = `${this.getBaseUrl()}/entities/GetEntityTemplate/${entityTypeId}/${presentationTypeId}/${parentRangeId}`;
}
else {
url = `${this.getBaseUrl()}/entities/GetEntityTemplate/${entityTypeId}/${presentationTypeId}/0`;
}
// const requestBody = { entityTypeId: entityTypeId };
// const options = {
// headers: new HttpHeaders({
// 'Content-Type': 'application/json',
// })
// };
this.httpClient.get(url).subscribe(response => {
observer.next(response);
self.logger.info(`Add&Get entitiy completed`);
observer.complete();
}, error => {
self.logger.error(`An error occurred while add&get entity`, error);
observer.error(error);
});
});
}
markSuperRange(entityId, isSuperRange) {
const self = this;
return new Observable(observer => {
const url = `${this.getBaseUrl()}/entities/MarkSuperRange/${entityId}`;
const options = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
})
};
this.httpClient.post(url, isSuperRange, options).subscribe(response => {
observer.next(response);
self.logger.info(`Mark entity ${entityId} as super range completed`);
observer.complete();
}, error => {
self.logger.error(`An error occurred while mark entity ${entityId} as super range`, error);
observer.error(error);
});
});
}
deleteEntity(entityId) {
const self = this;
return new Observable(observer => {
const url = `${this.getBaseUrl()}/entities/Delete/${entityId}`;
this.httpClient.delete(url).subscribe(response => {
observer.next(response);
self.logger.info(`Delete entitiy completed`);
observer.complete();
}, error => {
self.logger.error(`An error occurred while delete entity`, error);
observer.error(error);
});
});
}
getSortOptions(entityMetadataId) {
const url = `${this.getBaseUrl()}/entities/GetSortOptions/${entityMetadataId}`;
// todo: return native observble
return this.httpClient.get(url);
// }
}
}
EntityService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: EntityService, deps: [{ token: i1$1.HttpClient }, { token: i2$1.Store }, { token: Logger }, { token: 'env' }], target: i0.ɵɵFactoryTarget.Injectable });
EntityService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: EntityService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: EntityService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () {
return [{ type: i1$1.HttpClient }, { type: i2$1.Store }, { type: Logger }, { type: undefined, decorators: [{
type: Inject,
args: ['env']
}] }];
} });
class DeviceTypeService {
constructor() {
this.isMobile = new BehaviorSubject(false);
this.isMobile$ = this.isMobile.asObservable();
window.innerWidth <= 700 || window.innerHeight <= 550 ? this.isMobile.next(true) : this.isMobile.next(false);
window.addEventListener('resize', () => {
window.innerWidth <= 700 || window.innerHeight <= 550 ? this.isMobile.next(true) : this.isMobile.next(false);
});
}
}
DeviceTypeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DeviceTypeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
DeviceTypeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DeviceTypeService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: DeviceTypeService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return []; } });
class ApiBaseService {
constructor(http, logger, oauthService, env) {
this.http = http;
this.logger = logger;
this.oauthService = oauthService;
this.env = env;
}
get baseUrl() {
return `${this.env.apiUrl}`;
}
}
ApiBaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: ApiBaseService, deps: [{ token: i1$1.HttpClient }, { token: Logger }, { token: i1$2.OAuthService }, { token: 'env' }], target: i0.ɵɵFactoryTarget.Injectable });
ApiBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: ApiBaseService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: ApiBaseService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () {
return [{ type: i1$1.HttpClient }, { type: Logger }, { type: i1$2.OAuthService }, { type: undefined, decorators: [{
type: Inject,
args: ['env']
}] }];
} });
class AzurestorageService {
constructor(http) {
this.http = http;
}
generateBlobUrl(params, filename, useAzureStorageEmulator = false, azureStorageEmulatorBaseUrl = '') {
const url = useAzureStorageEmulator ? azureStorageEmulatorBaseUrl : `https://${params.storageAccount}.blob.core.windows.net`;
return `${url}/${params.containerName}/${filename}`;
}
uploadFileInBlocks(reader, state) {
if (!state.cancelled) {
if (state.totalBytesRemaining > 0) {
const fileContent = state.file.slice(state.currentFilePointer, state.currentFilePointer + state.maxBlockSize);
const blockId = state.blockIdPrefix + this.prependZeros(state.blockIds.length, 6);
state.blockIds.push(btoa(blockId));
reader.readAsArrayBuffer(fileContent);
state.currentFilePointer += state.maxBlockSize;
state.totalBytesRemaining -= state.maxBlockSize;
if (state.totalBytesRemaining < state.maxBlockSize) {
state.maxBlockSize = state.totalBytesRemaining;
}
}
else {
this.commitBlockList(state);
}
}
}
commitBlockList(state) {
const uri = state.fileUrl + '&comp=blocklist';
const headers = new HttpHeaders({ 'x-ms-blob-content-type': state.file.type });
let requestBody = '<?xml version=\'1.0\' encoding=\'utf-8\'?><BlockList>';
for (let i = 0; i < state.blockIds.length; i++) {
requestBody += '<Latest>' + state.blockIds[i] + '</Latest>';
}
requestBody += '</BlockList>';
this.http.put(uri, requestBody, { headers, responseType: 'text' })
.subscribe(elem => {
if (state.complete) {
state.complete();
}
}, err => {
console.log({ error: err });
if (state.error) {
state.error(err);
}
});
}
initializeState(config) {
let blockSize = AzurestorageService.DefaultBlockSize;
if (config.blockSize) {
blockSize = config.blockSize;
}
let maxBlockSize = blockSize;
let numberOfBlocks = 1;
const file = config.file;
const fileSize = file.size;
if (fileSize < blockSize) {
maxBlockSize = fileSize;
}
if (fileSize % maxBlockSize === 0) {
numberOfBlocks = fileSize / maxBlockSize;
}
else {
numberOfBlocks = fileSize / maxBlockSize + 1;
}
return {
maxBlockSize,
numberOfBlocks,
totalBytesRemaining: fileSize,
currentFilePointer: 0,
blockIds: new Array(),
blockIdPrefix: 'block-',
bytesUploaded: 0,
submitUri: null,
file,
baseUrl: config.baseUrl,
sasToken: config.sasToken,
fileUrl: `${config.baseUrl}?${config.sasToken}`,
progress: config.progress,
complete: config.complete,
error: config.error,
cancelled: false
};
}
upload(config) {
const state = this.initializeState(config);
const reader = new FileReader();
reader.onloadend = (evt) => {
if (evt.target.readyState === 2 && !state.cancelled) {
const uri = state.fileUrl + '&comp=block&blockid=' + state.blockIds[state.blockIds.length - 1];
const requestData = evt.target.result;
const requestData2 = new Uint8Array(evt.target.result);
const headers = new HttpHeaders({ 'x-ms-blob-type': 'BlockBlob', 'Content-Type': 'application/octet-stream' });
this.http.put(uri, requestData, { headers, responseType: 'text' })
.subscribe(elem => {
state.bytesUploaded += requestData2.length;
const percentComplete = Math.round((state.bytesUploaded / state.file.size) * 1000) / 10;
if (state.progress) {
state.progress(percentComplete);
}
this.uploadFileInBlocks(reader, state);
}, err => {
console.log({ error: err });
if (state.error) {
state.error(err);
}
});
}
};
this.uploadFileInBlocks(reader, state);
return {
cancel: () => {
state.cancelled = true;
}
};
}
prependZeros(num, length) {
let str = '' + num;
while (str.length < length) {
str = '0' + str;
}
return str;
}
}
AzurestorageService.DefaultBlockSize = 1024 * 500;
AzurestorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AzurestorageService, deps: [{ token: i1$1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
AzurestorageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AzurestorageService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: AzurestorageService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i1$1.HttpClient }]; } });
class StorageService extends ApiBaseService {
constructor(http, logger, oauthService, blobService, env) {
super(http, logger, oauthService, env);
this.http = http;
this.logger = logger;
this.oauthService = oauthService;
this.blobService = blobService;
this.env = env;
this.subscriptions = [];
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => {
if (subscription) {
subscription.unsubscribe();
}
});
}
getSAS(fileName) {
const self = this;
return new Observable(observer => {
const url = `${this.baseUrl}/storage/GetSAS?fileName=${fileName}`;
// const requestBody = entityForUpdate;
const options = {
responseType: 'text',
headers: new HttpHeaders({
'Content-Type': 'application/text',
})
};
self.subscriptions.push(this.http.get(url, options).subscribe(response => {
observer.next(response);
observer.complete();
}, error => {
self.logger.error(`An error occurred while get SAS token`, error);
observer.error(error);
}));
});
}
getReadSASTokenURL(fileName) {
const self = this;
return new Observable(observer => {
const url = `${this.baseUrl}/storage/GetReadSASTokenURL?fileName=${fileName}`;
const options = {
responseType: 'text',
headers: new HttpHeaders({
'Content-Type': 'application/text',
})
};
self.subscriptions.push(this.http.get(url, options).subscribe(response => {
observer.next(response);
observer.complete();
}, error => {
self.logger.error(`An error occurred while get SAS token url`, error);
observer.error(error);
}));
});
}
UploadFilesData(uploadFilesData) {
const self = this;
let filesUploadCounter = 0;
return new Observable(observer => {
for (const fileData of uploadFilesData) {
// const originalFileName = fileData.file.name;
// const fileName = getFileName(entityId, fileData.parameterMetadataId, originalFileName);
self.subscriptions.push(this.uploadFileByToken(fileData.file, fileData.storedFileName, fileData.file.type)
.subscribe(isUpload => {
if (isUpload) {
filesUploadCounter++;
if (filesUploadCounter == uploadFilesData.length) {
observer.next(true);
observer.complete();
}
}
else {
observer.error();
}
}, error => {
observer.error();
}));
}
});
}
// upload(formData: FormData) {
// return this.http.post<{ path: string }>(
// 'https://localhost:5001/api/storage/uploadfile',
// formData
// );
// }
// public uploadFile(fileName: string)
// : Observable<any> {
// const self = this;
// return new Observable(observer => {
// const url = `${this.baseUrl}/storage/GetSAS?fileName=` + fileName;
// // const requestBody = entityForUpdate;
// const options = {
// responseType: 'text',
// headers: new HttpHeaders({
// 'Content-Type': 'application/text',
// })
// };
// this.http.get<string>(url).subscribe(
// response => {
// observer.next(response);
// observer.complete();
// },
// error => {
// self.logger.error(`An error occurred while get SAS token`, error);
// observer.error(error);
// }
// );
// });
// }
uploadFileByToken(file, fileName, mimeType) {
const self = this;
return new Observable(observer => {
// this.signalr.startConnection().then(connectionId => {
// console.log('SIGNALR ConnectionId', connectionId);
self.currentFileName = fileName;
const fileToSAS = { FileName: fileName, MimeType: mimeType };
// const fileToSAS: FileToToken = { FileName: fileName, MimeType: mimeType };
self.subscriptions.push(self.getSasTokenWrite(fileName).subscribe(sas => {
self.subscriptions.push(self.uploadFile(file, sas, fileName).subscribe(isUpload => {
observer.next(isUpload);
//observer.complete();
}));
}));
// }).catch(
// err => {
// this.showErrr(err);
// }
// );
});
}
getSasTokenWrite(file) {
// return this.azureFileUploadService.getSasTokenWrite(file);
return this.getSAS(file);
}
uploadFile(file, token, fileName) {
const self = this;
return new Observable(observer => {
const Config = {
sas: token,
storageAccount: this.env.azureStorageConfig.storageAccount,
containerName: this.env.azureStorageConfig.containerName
};
const res = false;
if (file !== null) {
const fileTitle = fileName == null ? file.name : fileName;
const baseUrl = 'https://' + Config.storageAccount + '/' + Config.containerName + '/' + fileTitle;
this.uploadConfig = {
baseUrl,
blockSize: 1024 * 500,
sasToken: Config.sas,
file,
complete: () => {
console.log('Transfer completed !');
observer.next(true);
observer.complete();
// this.saveFileSuccess(isSave);
},
error: (err) => {
console.log('Transfer Error:', err);
this.saveFileError(err);
observer.next(false);
observer.error(err);
},
progress: (percent) => {
this.percent = percent;
}
};
this.blobService.upload(this.uploadConfig);
}
});
}
saveFileError(error) {
console.log('saveFileError', error);
}
}
StorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: StorageService, deps: [{ token: i1$1.HttpClient }, {