UNPKG

dynamic-display-shared

Version:

A library for dynamic view

1,065 lines (1,047 loc) 168 kB
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 }, {