Commit 4dd19fa0 authored by Marco Ortiz's avatar Marco Ortiz

Preparación para la integración con el nuevo jenkins

parent 9fb7b93f
This source diff could not be displayed because it is too large. You can view the blob instead.
{ {
"name": "bytebot-projects", "name": "bytebot-projects",
"version": "0.0.0", "version": "1.0.1",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
...@@ -32,12 +32,12 @@ ...@@ -32,12 +32,12 @@
"@swimlane/ngx-datatable": "^16.0.3", "@swimlane/ngx-datatable": "^16.0.3",
"@swimlane/ngx-graph": "^6.2.0", "@swimlane/ngx-graph": "^6.2.0",
"@types/jquery": "^3.3.34", "@types/jquery": "^3.3.34",
"@xdf/commons": "file:../../XDF/ng-byte-framework/dist/xdf-commons/xdf-commons-1.0.0.tgz", "@xdf/commons": "file:./libs/xdf-commons-1.0.1.tgz",
"@xdf/gallery": "file:../../XDF/ng-byte-framework/dist/xdf-gallery/xdf-gallery-1.0.15.tgz", "@xdf/gallery": "file:./libs/xdf-gallery-1.0.16.tgz",
"@xdf/graph": "file:../../Cuenta corriente/ccb-workspace/dist/xdf-graph/xdf-graph-0.0.1.tgz", "@xdf/graph": "file:./libs/xdf-graph-0.0.1.tgz",
"@xdf/layouts": "^1.0.3", "@xdf/layouts": "file:./libs/xdf-layouts-1.0.1.tgz",
"@xdf/security": "file:../../XDF/ng-byte-framework/dist/xdf-security/xdf-security-1.0.0.tgz", "@xdf/security": "file:./libs/xdf-security-1.0.0.tgz",
"@xdf/settings": "file:../../XDF/ng-byte-framework/dist/xdf-settings/xdf-settings-1.0.3.tgz", "@xdf/settings": "file:./libs/xdf-settings-1.0.3.tgz",
"ace-builds": "^1.4.8", "ace-builds": "^1.4.8",
"angular-gauge-chart": "^0.7.2", "angular-gauge-chart": "^0.7.2",
"angular-highcharts": "^9.0.2", "angular-highcharts": "^9.0.2",
...@@ -65,9 +65,9 @@ ...@@ -65,9 +65,9 @@
"ngx-bootstrap": "^4.3.0", "ngx-bootstrap": "^4.3.0",
"ngx-color": "^4.1.1", "ngx-color": "^4.1.1",
"ngx-echarts": "^4.2.2", "ngx-echarts": "^4.2.2",
"ngx-material-file-input": "^2.0.0", "ngx-material-file-input": "2.0.0",
"ngx-moment": "^3.5.0", "ngx-moment": "^3.5.0",
"ngx-scrollbar": "^7.1.0", "ngx-scrollbar": "7.1.0",
"ngx-slick-carousel": "^0.5.1", "ngx-slick-carousel": "^0.5.1",
"ngx-toastr": "^10.0.4", "ngx-toastr": "^10.0.4",
"ngx-translate-multi-http-loader": "^3.0.0", "ngx-translate-multi-http-loader": "^3.0.0",
......
...@@ -11,18 +11,22 @@ import { TranslateModule, TranslateLoader, TranslateService } from '@ngx-transla ...@@ -11,18 +11,22 @@ import { TranslateModule, TranslateLoader, TranslateService } from '@ngx-transla
// XDF // XDF
import { XdfLayoutsModule, SettingsService, ByteSettingsService, SettingsFakeBackendInterceptor } from '@xdf/layouts'; import { XdfLayoutsModule, SettingsService, ByteSettingsService, SettingsFakeBackendInterceptor } from '@xdf/layouts';
import { XdfSecurityModule, ByteAuthenticationService, AuthGuard, OAuthGuard, OAuthAuthenticationService, ResourceAuthGuard, AuthenticationFakeBackendInterceptor, ProgramsFakeBackendInterceptor } from '@xdf/security'; import { XdfSecurityModule, ByteAuthenticationService, AuthGuard, OAuthGuard, OAuthAuthenticationService } from '@xdf/security';
import { XdfCommonsModule, NotificationService, ToastNotificationService, AuthenticationService, INITSERVICE_OPTIONS, InitCommonsService, ErrorsHandler } from '@xdf/commons'; import { ResourceAuthGuard, AuthenticationFakeBackendInterceptor, ProgramsFakeBackendInterceptor } from '@xdf/security';
import { XdfCommonsModule, NotificationService, ToastNotificationService, AuthenticationService } from '@xdf/commons';
import { INITSERVICE_OPTIONS, InitCommonsService, ErrorsHandler } from '@xdf/commons';
//Components // Components
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { HomeComponent } from './views/home/home.component'; import { HomeComponent } from './views/home/home.component';
import { ToastrModule } from 'ngx-toastr'; import { ToastrModule } from 'ngx-toastr';
import localeEs from '@angular/common/locales/es-PE'; import localeEs from '@angular/common/locales/es-PE';
import localeEn from '@angular/common/locales/en'; import localeEn from '@angular/common/locales/en';
import { MAT_DATE_LOCALE, MatDialog, MatButtonModule, MatDialogModule, MatPaginatorIntl, DateAdapter, MAT_DATE_FORMATS, MatIconModule } from '@angular/material'; import { MAT_DATE_LOCALE, MatDialog, MatButtonModule, MatDialogModule, MatPaginatorIntl, DateAdapter } from '@angular/material';
import { XdfGalleryModule, CustomMatPaginatorIntl, DATERANGEPICKER_LOCALE, DaterangepickerLocaleService, ConflictErrorDialogService, HttpErrorHandleInterceptor } from '@xdf/gallery'; import { MAT_DATE_FORMATS, MatIconModule } from '@angular/material';
import { XdfGalleryModule, CustomMatPaginatorIntl, DATERANGEPICKER_LOCALE, DaterangepickerLocaleService } from '@xdf/gallery';
import { ConflictErrorDialogService, HttpErrorHandleInterceptor } from '@xdf/gallery';
import { BytebotSettingsService } from './services/bytebot-settings-service'; import { BytebotSettingsService } from './services/bytebot-settings-service';
import { MultiTranslateHttpLoader } from 'ngx-translate-multi-http-loader'; import { MultiTranslateHttpLoader } from 'ngx-translate-multi-http-loader';
...@@ -126,7 +130,7 @@ export function createTranslateLoader(http: HttpClient) { ...@@ -126,7 +130,7 @@ export function createTranslateLoader(http: HttpClient) {
{ provide: HTTP_INTERCEPTORS, useClass: SettingsFakeBackendInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: SettingsFakeBackendInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: CustomProgramsFakeBackendInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: CustomProgramsFakeBackendInterceptor, multi: true },
{ provide: HTTP_INTERCEPTORS, useClass: AgentFakeBackendInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: AgentFakeBackendInterceptor, multi: true },
//{ provide: HTTP_INTERCEPTORS, useClass: OperativeDashboardFakeBackendInterceptor, multi: true }, // { provide: HTTP_INTERCEPTORS, useClass: OperativeDashboardFakeBackendInterceptor, multi: true },
{ provide: APP_INITIALIZER, useFactory: init_app, deps: [InitCommonsService, TranslateService], multi: true } { provide: APP_INITIALIZER, useFactory: init_app, deps: [InitCommonsService, TranslateService], multi: true }
...@@ -147,4 +151,4 @@ export function init_app(appLoaderService: InitCommonsService) { ...@@ -147,4 +151,4 @@ export function init_app(appLoaderService: InitCommonsService) {
// Para OAUTH // Para OAUTH
export function loginLoaderFactory(provider: OAuthAuthenticationService) { export function loginLoaderFactory(provider: OAuthAuthenticationService) {
return () => provider.login(null, null).toPromise(); return () => provider.login(null, null).toPromise();
} }
\ No newline at end of file
...@@ -34,7 +34,7 @@ const tableData: Array<any> = [ ...@@ -34,7 +34,7 @@ const tableData: Array<any> = [
status: 'Activo', status: 'Activo',
country: 'Perú', country: 'Perú',
timezone: 'GMT-5', timezone: 'GMT-5',
avatar: 'data:image/jpeg;base64,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' avatar: 'https://www.w3schools.com/howto/img_avatar.png'
}, },
{ {
id: 364, id: 364,
...@@ -61,27 +61,27 @@ const data: Array<any> = [ ...@@ -61,27 +61,27 @@ const data: Array<any> = [
const countries: Array<any> = [ const countries: Array<any> = [
{ {
"id": 1, id: 1,
"name": "Perú", name: 'Perú',
"timezones": [ timezones: [
"GMT-5" 'GMT-5'
] ]
}, },
{ {
"id": 2, id: 2,
"name": "Argentina", name: 'Argentina',
"timezones": [ timezones: [
"GMT-3" 'GMT-3'
] ]
}, },
{ {
"id": 3, id: 3,
"name": "Brazil", name: 'Brazil',
"timezones": [ timezones: [
"GMT-5", 'GMT-5',
"GMT-4", 'GMT-4',
"GMT-3", 'GMT-3',
"GMT-2" 'GMT-2'
] ]
} }
]; ];
...@@ -163,7 +163,7 @@ const channels = [ ...@@ -163,7 +163,7 @@ const channels = [
maxlength: 200, maxlength: 200,
type: 'text', type: 'text',
required: true, required: true,
traductions: { "es": "URL de devolución de llamada", "en": "Webhook" } traductions: { es: 'URL de devolución de llamada', en: 'Webhook' }
}, },
{ {
name: 'verification-token', name: 'verification-token',
...@@ -171,7 +171,7 @@ const channels = [ ...@@ -171,7 +171,7 @@ const channels = [
maxlength: 80, maxlength: 80,
type: 'text', type: 'text',
required: true, required: true,
traductions: { "es": "Token de verificación", "en": "Verification token" } traductions: { es: 'Token de verificación', en: 'Verification token' }
}, },
{ {
name: 'access-token', name: 'access-token',
...@@ -179,7 +179,7 @@ const channels = [ ...@@ -179,7 +179,7 @@ const channels = [
maxlength: 80, maxlength: 80,
type: 'text', type: 'text',
required: true, required: true,
traductions: { "es": "Token de acceso", "en": "Access token" } traductions: { es: 'Token de acceso', en: 'Access token' }
} }
] ]
}, },
...@@ -194,7 +194,7 @@ const channels = [ ...@@ -194,7 +194,7 @@ const channels = [
maxlength: 80, maxlength: 80,
type: 'text', type: 'text',
required: true, required: true,
traductions: { "es": "Identificador de cuenta", "en": "Account identifier" } traductions: { es: 'Identificador de cuenta', en: 'Account identifier' }
}, },
{ {
name: 'authentication-token', name: 'authentication-token',
...@@ -202,27 +202,27 @@ const channels = [ ...@@ -202,27 +202,27 @@ const channels = [
maxlength: 80, maxlength: 80,
type: 'text', type: 'text',
required: true, required: true,
traductions: { "es": "Token de autenticación", "en": "Authentication token" } traductions: { es: 'Token de autenticación', en: 'Authentication token' }
}, },
{ {
name: 'twillio-number', name: 'twillio-number',
label: 'twillio-number', label: 'twillio-number',
type: 'number', type: 'number',
required: true, required: true,
traductions: { "es": "Número de Twillio", "en": "Twillio number" } traductions: { es: 'Número de Twillio', en: 'Twillio number' }
} }
] ]
} }
]; ];
const fileOK = { const fileOK = {
"uuid": "6850b631-5cb1-4614-8f0e-e43441d7bd35", uuid: '6850b631-5cb1-4614-8f0e-e43441d7bd35',
"id": 100, id: 100,
"fileName": "vacaciones-preguntas.xls", fileName: 'vacaciones-preguntas.xls',
"description": "Preguntas Vacaciones", description: 'Preguntas Vacaciones',
"status": "PS", status: 'PS',
"user": "", user: '',
"uploadDate": "" uploadDate: ''
}; };
@Injectable() @Injectable()
...@@ -257,16 +257,16 @@ export class AgentFakeBackendInterceptor implements HttpInterceptor { ...@@ -257,16 +257,16 @@ export class AgentFakeBackendInterceptor implements HttpInterceptor {
} }
} }
function pagination(data: any) { function pagination(dataRecibida: any) {
data.totalItems = tableData.length; dataRecibida.totalItems = tableData.length;
const pageNumber = data.currentPage; const pageNumber = dataRecibida.currentPage;
const pageSize = data.itemsPerPage ? data.itemsPerPage : 5; const pageSize = dataRecibida.itemsPerPage ? dataRecibida.itemsPerPage : 5;
data.totalPages = Math.ceil(data.totalItems / pageSize); dataRecibida.totalPages = Math.ceil(dataRecibida.totalItems / pageSize);
if (data.sortFields.length > 0) { if (dataRecibida.sortFields.length > 0) {
const sortField: any = data.sortFields[0]; const sortField: any = dataRecibida.sortFields[0];
if (sortField.direction === DIRECTION.asc) { if (sortField.direction === DIRECTION.asc) {
tableData.sort((a, b) => { tableData.sort((a, b) => {
if (JSON.stringify(a[sortField.field]) > JSON.stringify(b[sortField.field])) { if (JSON.stringify(a[sortField.field]) > JSON.stringify(b[sortField.field])) {
...@@ -288,9 +288,9 @@ export class AgentFakeBackendInterceptor implements HttpInterceptor { ...@@ -288,9 +288,9 @@ export class AgentFakeBackendInterceptor implements HttpInterceptor {
} }
} }
data.data = tableData.slice(pageNumber * pageSize, (pageNumber + 1) * pageSize); dataRecibida.data = tableData.slice(pageNumber * pageSize, (pageNumber + 1) * pageSize);
return ok(data); return ok(dataRecibida);
} }
...@@ -304,4 +304,4 @@ export class AgentFakeBackendInterceptor implements HttpInterceptor { ...@@ -304,4 +304,4 @@ export class AgentFakeBackendInterceptor implements HttpInterceptor {
} }
} }
\ No newline at end of file
...@@ -6,81 +6,80 @@ import { ...@@ -6,81 +6,80 @@ import {
HttpInterceptor, HttpInterceptor,
HttpErrorResponse HttpErrorResponse
} from '@angular/common/http'; } from '@angular/common/http';
import { Observable, throwError, of, EMPTY } from 'rxjs'; import { Observable, throwError, of, EMPTY } from 'rxjs';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { catchError, tap, map } from 'rxjs/operators'; import { catchError, tap, map } from 'rxjs/operators';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { NotificationService, NotificationType, AuthenticationService } from '@xdf/commons'; import { NotificationService, NotificationType, AuthenticationService } from '@xdf/commons';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { ConflictErrorDialogService } from '@xdf/gallery'; import { ConflictErrorDialogService } from '@xdf/gallery';
@Injectable() @Injectable()
export class CustomErrorHandlerInterceptor implements HttpInterceptor { export class CustomErrorHandlerInterceptor implements HttpInterceptor {
constructor( constructor(
private router: Router, private router: Router,
private translate: TranslateService, private translate: TranslateService,
private authenticationService: AuthenticationService, private authenticationService: AuthenticationService,
private notificationService: NotificationService, private notificationService: NotificationService,
private conflictErrorDialogService: ConflictErrorDialogService) { private conflictErrorDialogService: ConflictErrorDialogService) {
} }
intercept( intercept(
req: HttpRequest<any>, next: HttpHandler): Observable<any> { req: HttpRequest<any>, next: HttpHandler): Observable<any> {
return next.handle(req).pipe( return next.handle(req).pipe(
catchError((error: HttpErrorResponse) => { catchError((error: HttpErrorResponse) => {
switch (error.status) { switch (error.status) {
case 401: case 401:
const message = this.translate.instant('message.error.unauthorized'); const message = this.translate.instant('message.error.unauthorized');
this.notificationService.showMessage(message, this.translate.instant('title.error'), NotificationType.error); this.notificationService.showMessage(message, this.translate.instant('title.error'), NotificationType.error);
break; break;
case 404: case 404:
const messageError = error.error ? error.error : error.message; const messageError = error.error ? error.error : error.message;
this.notificationService.showMessage(messageError, this.translate.instant('title.error'), NotificationType.error); this.notificationService.showMessage(messageError, this.translate.instant('title.error'), NotificationType.error);
break; break;
case 409: case 409:
const messageDuplicate = this.translate.instant('message.error.duplicated'); const messageDuplicate = this.translate.instant('message.error.duplicated');
this.notificationService.showMessage(messageDuplicate, this.translate.instant('title.error'), NotificationType.error); this.notificationService.showMessage(messageDuplicate, this.translate.instant('title.error'), NotificationType.error);
break; break;
case 419:// validar cual es el código correcto case 419: // validar cual es el código correcto
this.conflictErrorDialogService.loadComponent( this.conflictErrorDialogService.loadComponent(
null, null,
'title.error.conflict', 'title.error.conflict',
'message.error.conflict', 'message.error.conflict',
error.error); error.error);
break; break;
default: default:
if (error.status === 0) { if (error.status === 0) {
this.authenticationService.login(null, null).subscribe( this.authenticationService.login(null, null).subscribe(
data => { data => {
window.location.href = './'; window.location.href = './';
});
} else {
let messageDefault = '';
if (error.error) {
if (error.error.params) {
const params = [];
error.error.params.forEach(element => {
params.push(this.translate.instant(element));
}); });
} else { messageDefault = this.translate.instant(error.error.message, params);
let message = ''; } else {
if (error.error) { if (error.error.message) {
if (error.error.params) { messageDefault = this.translate.instant(error.error.message);
const params = [];
error.error.params.forEach(element => {
params.push(this.translate.instant(element));
});
message = this.translate.instant(error.error.message, params);
} else { } else {
if (error.error.message) { messageDefault = this.translate.instant(error.error);
message = this.translate.instant(error.error.message);
} else {
message = this.translate.instant(error.error);
}
} }
} else {
message = this.translate.instant(error.message);
} }
this.notificationService.showMessage(message, this.translate.instant('title.error'), NotificationType.error); } else {
messageDefault = this.translate.instant(error.message);
} }
this.notificationService.showMessage(messageDefault, this.translate.instant('title.error'), NotificationType.error);
} }
}
return throwError(error);
}) return throwError(error);
); })
} );
} }
}
\ No newline at end of file
...@@ -28,7 +28,7 @@ export class CustomProgramsFakeBackendInterceptor implements HttpInterceptor { ...@@ -28,7 +28,7 @@ export class CustomProgramsFakeBackendInterceptor implements HttpInterceptor {
case url.match('.*' + basePath) && method === 'GET': case url.match('.*' + basePath) && method === 'GET':
return getList(); return getList();
case url.match('.*'+ basePathCotnrols + '.*') && method === 'GET': case url.match('.*' + basePathCotnrols + '.*') && method === 'GET':
return getControls(); return getControls();
default: default:
// pass through any requests not handled above // pass through any requests not handled above
......
...@@ -12,7 +12,7 @@ import { CountryDataForWizardResolver } from './resolver/country-data-wizard.res ...@@ -12,7 +12,7 @@ import { CountryDataForWizardResolver } from './resolver/country-data-wizard.res
const routes: Routes = [ const routes: Routes = [
{ {
path: 'agent', component: AgentListComponent, canActivate: [AuthGuard, ResourceAuthGuard], path: 'agent', component: AgentListComponent, canActivate: [AuthGuard, ResourceAuthGuard],
data: { data: {
program: 'CONVERSATIONAL_AGENT', program: 'CONVERSATIONAL_AGENT',
// breadcrumb: '' // breadcrumb: ''
...@@ -20,7 +20,7 @@ const routes: Routes = [ ...@@ -20,7 +20,7 @@ const routes: Routes = [
}, },
{ {
path: 'agent/detail/new', path: 'agent/detail/new',
//component: AgentDetailComponent, // component: AgentDetailComponent,
component: AgentComponent, component: AgentComponent,
resolve: { resolve: {
countryData : CountryDataForWizardResolver countryData : CountryDataForWizardResolver
...@@ -36,7 +36,7 @@ const routes: Routes = [ ...@@ -36,7 +36,7 @@ const routes: Routes = [
}, },
{ {
path: 'agent/detail/edit/:code', path: 'agent/detail/edit/:code',
//component: AgentDetailComponent, // component: AgentDetailComponent,
component: AgentComponent, component: AgentComponent,
resolve: { resolve: {
agentDetail: AgentDetailResolver, agentDetail: AgentDetailResolver,
...@@ -50,9 +50,9 @@ const routes: Routes = [ ...@@ -50,9 +50,9 @@ const routes: Routes = [
breadcrumb: 'Agentes', breadcrumb: 'Agentes',
backButton: true backButton: true
} }
},{ }, {
path: 'agent/detail/view/:code', path: 'agent/detail/view/:code',
//component: AgentDetailComponent, // component: AgentDetailComponent,
component: AgentComponent, component: AgentComponent,
resolve: { resolve: {
agentDetail: AgentDetailResolver, agentDetail: AgentDetailResolver,
......
...@@ -6,7 +6,15 @@ import {NgxTributeModule} from 'ngx-tribute'; ...@@ -6,7 +6,15 @@ import {NgxTributeModule} from 'ngx-tribute';
import { MaterialFileInputModule } from 'ngx-material-file-input'; import { MaterialFileInputModule } from 'ngx-material-file-input';
import { XdfGalleryModule } from '@xdf/gallery'; import { XdfGalleryModule } from '@xdf/gallery';
import { MatProgressSpinnerModule, MatDividerModule, MatSidenavModule, MatListModule, MatStepperModule, MatDialogModule, MatMenuModule, MatIconModule, MatSlideToggleModule, MatCheckboxModule, MatRippleModule, MatNativeDateModule, MatChipsModule, MatExpansionModule, MatTooltipModule, MatToolbarModule, MatTabsModule, MatTableModule, MatSortModule, MatSelectModule, MatRadioModule, MatPaginatorModule, MatInputModule, MatFormFieldModule, MatButtonToggleModule, MatButtonModule, MatCardModule, MatAutocompleteModule, MatSnackBarModule, MatProgressBarModule } from '@angular/material'; import { MatProgressSpinnerModule, MatDividerModule, MatSidenavModule, MatListModule } from '@angular/material';
import { MatStepperModule, MatDialogModule, MatMenuModule, MatIconModule } from '@angular/material';
import { MatSlideToggleModule, MatCheckboxModule, MatRippleModule, MatNativeDateModule } from '@angular/material';
import { MatChipsModule, MatExpansionModule, MatTooltipModule, MatToolbarModule } from '@angular/material';
import { MatTabsModule, MatTableModule, MatSortModule, MatSelectModule, MatRadioModule } from '@angular/material';
import { MatPaginatorModule, MatInputModule, MatFormFieldModule, MatButtonToggleModule } from '@angular/material';
import { MatButtonModule, MatCardModule, MatAutocompleteModule, MatSnackBarModule } from '@angular/material';
import { MatProgressBarModule } from '@angular/material';
import { SlickCarouselModule } from 'ngx-slick-carousel'; import { SlickCarouselModule } from 'ngx-slick-carousel';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
...@@ -23,17 +31,15 @@ import { CaDeploymentChannelsModalComponent } from './view/components/ca-deploym ...@@ -23,17 +31,15 @@ import { CaDeploymentChannelsModalComponent } from './view/components/ca-deploym
import { AgentStatusPipe } from './pipe/agent-status.pipe'; import { AgentStatusPipe } from './pipe/agent-status.pipe';
import { CaFileUploadModalComponent } from './view/components/ca-file-upload-modal/ca-file-upload-modal.component'; import { CaFileUploadModalComponent } from './view/components/ca-file-upload-modal/ca-file-upload-modal.component';
@NgModule({ @NgModule({
entryComponents: [ entryComponents: [
CaDeploymentChannelsModalComponent, CaDeploymentChannelsModalComponent,
CaFileUploadModalComponent CaFileUploadModalComponent
], ],
declarations: [ declarations: [
AgentComponent, AgentComponent,
AgentListComponent, AgentListComponent,
AgentDetailComponent, AgentDetailComponent,
DynamicTranslatePipe, DynamicTranslatePipe,
CaGeneralInformationComponent, CaGeneralInformationComponent,
CaFrequentQuestionsComponent, CaFrequentQuestionsComponent,
......
...@@ -11,7 +11,7 @@ export class DynamicTranslatePipe implements PipeTransform { ...@@ -11,7 +11,7 @@ export class DynamicTranslatePipe implements PipeTransform {
} }
transform(value: any, ...args: any[]): any { transform(value: any, ...args: any[]): any {
let lang = this.translateService.currentLang ? this.translateService.currentLang : this.translateService.defaultLang; const lang = this.translateService.currentLang ? this.translateService.currentLang : this.translateService.defaultLang;
let traductions; let traductions;
......
...@@ -5,7 +5,7 @@ import { Observable } from 'rxjs'; ...@@ -5,7 +5,7 @@ import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class AgentDataForWizardResolver implements Resolve<any> { export class AgentDataForWizardResolver implements Resolve<any> {
constructor(private service: AgentService) {} constructor(private service: AgentService) {}
resolve( resolve(
...@@ -13,8 +13,8 @@ export class AgentDataForWizardResolver implements Resolve<any> { ...@@ -13,8 +13,8 @@ export class AgentDataForWizardResolver implements Resolve<any> {
state: RouterStateSnapshot state: RouterStateSnapshot
): Observable<any>|Promise<any>|any { ): Observable<any>|Promise<any>|any {
let code = route.paramMap.get('code'); const code = route.paramMap.get('code');
return this.service.getDataForWizard(parseInt(code)); return this.service.getDataForWizard(parseInt(code, 10));
} }
} }
...@@ -5,7 +5,7 @@ import { Observable } from 'rxjs'; ...@@ -5,7 +5,7 @@ import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class AgentDetailResolver implements Resolve<any> { export class AgentDetailResolver implements Resolve<any> {
constructor(private service: AgentService) {} constructor(private service: AgentService) {}
resolve( resolve(
...@@ -13,8 +13,8 @@ export class AgentDetailResolver implements Resolve<any> { ...@@ -13,8 +13,8 @@ export class AgentDetailResolver implements Resolve<any> {
state: RouterStateSnapshot state: RouterStateSnapshot
): Observable<any>|Promise<any>|any { ): Observable<any>|Promise<any>|any {
let code = route.paramMap.get('code'); const code = route.paramMap.get('code');
return this.service.getResult(code); return this.service.getResult(code);
} }
} }
...@@ -5,7 +5,7 @@ import { Observable } from 'rxjs'; ...@@ -5,7 +5,7 @@ import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class CountryDataForWizardResolver implements Resolve<any> { export class CountryDataForWizardResolver implements Resolve<any> {
constructor(private service: AgentService) {} constructor(private service: AgentService) {}
resolve( resolve(
......
...@@ -21,7 +21,7 @@ export class AgentService extends DynaDataService { ...@@ -21,7 +21,7 @@ export class AgentService extends DynaDataService {
}; };
} }
return this.httpClient.get(this.serviceURL + '/connection/data', { return this.httpClient.get(this.serviceURL + '/connection/data', {
params: params params
}); });
} }
...@@ -40,7 +40,7 @@ export class AgentService extends DynaDataService { ...@@ -40,7 +40,7 @@ export class AgentService extends DynaDataService {
return this.httpClient.get(this.serviceURL + '/channels'); return this.httpClient.get(this.serviceURL + '/channels');
} }
synchronize(id: number, user:string) { synchronize(id: number, user: string) {
return this.httpClient.get(this.serviceURL + '/synchronize/' + id, { return this.httpClient.get(this.serviceURL + '/synchronize/' + id, {
params: { params: {
user user
......
import { Component, OnInit, ViewChild, ViewContainerRef, Input } from '@angular/core'; import { Component, OnInit, ViewChild, ViewContainerRef, Input, AfterViewInit } from '@angular/core';
import { MatPaginator, MatSort } from '@angular/material'; import { MatPaginator, MatSort } from '@angular/material';
import { ColumnTemplate, DynaDataSource, ConfirmationDialogService, extractRSQL, FieldFilter } from '@xdf/gallery'; import { ColumnTemplate, DynaDataSource, ConfirmationDialogService, extractRSQL, FieldFilter } from '@xdf/gallery';
import { Pagination, SortField, NotificationType, NotificationService, AuthenticationService } from '@xdf/commons'; import { Pagination, SortField, NotificationType, NotificationService, AuthenticationService } from '@xdf/commons';
...@@ -135,7 +135,9 @@ const columnTemplateArray = [ ...@@ -135,7 +135,9 @@ const columnTemplateArray = [
const fieldFilters = [ const fieldFilters = [
new FieldFilter('agent_code', 'id', 'id', 'number', undefined), new FieldFilter('agent_code', 'id', 'id', 'number', undefined),
new FieldFilter('agent_name', 'name', 'name', 'string', undefined), new FieldFilter('agent_name', 'name', 'name', 'string', undefined),
new FieldFilter('agent_status', 'status', 'status', 'valpos', ({ 'DP': 'label.deployed', 'PS': 'label.sync-pending' }) as any), new FieldFilter('agent_status', 'status', 'status', 'valpos', (
{ DP: 'label.deployed', PS: 'label.sync-pending' }
) as any),
]; ];
@Component({ @Component({
...@@ -143,7 +145,7 @@ const fieldFilters = [ ...@@ -143,7 +145,7 @@ const fieldFilters = [
templateUrl: './agent-list.component.html', templateUrl: './agent-list.component.html',
styleUrls: ['./agent-list.component.scss'] styleUrls: ['./agent-list.component.scss']
}) })
export class AgentListComponent implements OnInit { export class AgentListComponent implements OnInit, AfterViewInit {
@ViewChild(MatPaginator, { static: false }) paginator: MatPaginator; @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator;
@ViewChild(MatSort, { static: false }) sort: MatSort; @ViewChild(MatSort, { static: false }) sort: MatSort;
...@@ -232,7 +234,7 @@ export class AgentListComponent implements OnInit { ...@@ -232,7 +234,7 @@ export class AgentListComponent implements OnInit {
this.pagination.currentPage = 0; this.pagination.currentPage = 0;
this.pagination.itemsPerPage = this.pagingSize; this.pagination.itemsPerPage = this.pagingSize;
this.pagination.filterExpression = "id != 0"; this.pagination.filterExpression = 'id != 0';
// Ordenación por defecto // Ordenación por defecto
if (this.sortColumn && this.sortDirection) { if (this.sortColumn && this.sortDirection) {
...@@ -264,14 +266,14 @@ export class AgentListComponent implements OnInit { ...@@ -264,14 +266,14 @@ export class AgentListComponent implements OnInit {
for (let i = 0; i < tagsTemp.length; i++) { for (let i = 0; i < tagsTemp.length; i++) {
if (tagsTemp[i].column !== 'id') { if (tagsTemp[i].column !== 'id') {
tagsTemp[i].value = tagsTemp[i].value; tagsTemp[i].value = tags[i].value;
} }
} }
this.pagination.filterExpression = extractRSQL(tagsTemp); this.pagination.filterExpression = extractRSQL(tagsTemp);
if (this.pagination.filterExpression == null || this.pagination.filterExpression == undefined) { if (this.pagination.filterExpression === null || this.pagination.filterExpression === undefined) {
this.pagination.filterExpression = "id != 0"; this.pagination.filterExpression = 'id != 0';
} }
this.dataSource.load(this.pagination); this.dataSource.load(this.pagination);
...@@ -289,9 +291,10 @@ export class AgentListComponent implements OnInit { ...@@ -289,9 +291,10 @@ export class AgentListComponent implements OnInit {
if (result) { if (result) {
this.agentService.delete(item.id).subscribe((rslt: any) => { this.agentService.delete(item.id).subscribe((rslt: any) => {
if (rslt.statusCode != 200) { if (rslt.statusCode !== 200) {
this.notificationService.showMessage( this.notificationService.showMessage(
this.translateService.instant(rslt.message), this.translateService.instant('label.error.message.title'), NotificationType.error); this.translateService.instant(rslt.message), this.translateService.instant('label.error.message.title'),
NotificationType.error);
} else { } else {
this.dataSource.load(this.pagination); this.dataSource.load(this.pagination);
} }
...@@ -308,10 +311,10 @@ export class AgentListComponent implements OnInit { ...@@ -308,10 +311,10 @@ export class AgentListComponent implements OnInit {
} }
synchronize(item) { synchronize(item) {
let user = (this.authenticationService.currentUserValue ? this.authenticationService.currentUserValue.username : 'admin'); const user = (this.authenticationService.currentUserValue ? this.authenticationService.currentUserValue.username : 'admin');
this.agentService.synchronize(item.id, user).pipe(first()).subscribe(() => { this.agentService.synchronize(item.id, user).pipe(first()).subscribe(() => {
this.notificationService.showMessage(this.translateService.instant("agent.synchronize.success"), undefined, NotificationType.success); this.notificationService.showMessage(this.translateService.instant('agent.synchronize.success'), undefined, NotificationType.success);
this.onRefresh(); this.onRefresh();
}); });
} }
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
{{'label.general-information.description' | translate}} {{'label.general-information.description' | translate}}
</div> </div>
</ng-template> </ng-template>
<byte-ca-general-information [stepper]="stepper" (onNextPage)="updateDirtyStatus($event)"></byte-ca-general-information> <byte-ca-general-information [stepper]="stepper" (nextPage)="updateDirtyStatus($event)"></byte-ca-general-information>
</mat-step> </mat-step>
<mat-step state="questions"> <mat-step state="questions">
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
{{'label.questions.description' | translate}} {{'label.questions.description' | translate}}
</div> </div>
</ng-template> </ng-template>
<byte-ca-frequent-questions [stepper]="stepper" (onNextPage)="updateDirtyStatus($event)"></byte-ca-frequent-questions> <byte-ca-frequent-questions [stepper]="stepper" (nextPage)="updateDirtyStatus($event)"></byte-ca-frequent-questions>
</mat-step> </mat-step>
<mat-step state="deployment-channels"> <mat-step state="deployment-channels">
......
import { Component, OnInit, ViewChild, Input, AfterContentChecked, AfterViewInit, ChangeDetectionStrategy, AfterContentInit, ViewContainerRef } from '@angular/core'; import { Component, OnInit, ViewChild, Input, AfterContentChecked, AfterViewInit } from '@angular/core';
import { ChangeDetectionStrategy, AfterContentInit, ViewContainerRef } from '@angular/core';
import { FormGroup, Validators, FormBuilder } from '@angular/forms'; import { FormGroup, Validators, FormBuilder } from '@angular/forms';
import { CaGeneralInformationComponent } from '../components/ca-general-information/ca-general-information.component'; import { CaGeneralInformationComponent } from '../components/ca-general-information/ca-general-information.component';
import { MAT_STEPPER_GLOBAL_OPTIONS } from '@angular/cdk/stepper'; import { STEPPER_GLOBAL_OPTIONS } from '@angular/cdk/stepper';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { NavigationService } from '@xdf/layouts'; import { NavigationService } from '@xdf/layouts';
import { IDirty } from '@xdf/gallery'; import { IDirty } from '@xdf/gallery';
...@@ -14,7 +15,7 @@ import { CaDeploymentChannelsComponent } from '../components/ca-deployment-chann ...@@ -14,7 +15,7 @@ import { CaDeploymentChannelsComponent } from '../components/ca-deployment-chann
templateUrl: './agent.component.html', templateUrl: './agent.component.html',
styleUrls: ['./agent.component.scss'], styleUrls: ['./agent.component.scss'],
providers: [{ providers: [{
provide: MAT_STEPPER_GLOBAL_OPTIONS, useValue: { displayDefaultIndicatorType: false } provide: STEPPER_GLOBAL_OPTIONS, useValue: { displayDefaultIndicatorType: false }
}] }]
}) })
...@@ -38,18 +39,18 @@ export class AgentComponent implements OnInit, IDirty { ...@@ -38,18 +39,18 @@ export class AgentComponent implements OnInit, IDirty {
resourceAuth: any; resourceAuth: any;
//dirty acumulado // dirty acumulado
generalDirty: boolean = false; generalDirty = false;
constructor( constructor(
private _vcRef: ViewContainerRef, private vcRef: ViewContainerRef,
private _activatedRoute: ActivatedRoute, private activatedRoute: ActivatedRoute,
private _backService: NavigationService, private backService: NavigationService,
private _router: Router private router: Router
) { ) {
this._backService.backAnnounced$.subscribe(data => { this.backService.backAnnounced$.subscribe(data => {
this._router.navigate(['/configuration/agent']); this.router.navigate(['/configuration/agent']);
}); });
} }
...@@ -60,21 +61,21 @@ export class AgentComponent implements OnInit, IDirty { ...@@ -60,21 +61,21 @@ export class AgentComponent implements OnInit, IDirty {
|| this.frequentQuestionsComponent.isDirty(); || this.frequentQuestionsComponent.isDirty();
if (dirty) { if (dirty) {
dirty = this.deploymentChannelsComponent.isDirty() dirty = this.deploymentChannelsComponent.isDirty();
} }
return dirty; return dirty;
} }
getRef(): ViewContainerRef { getRef(): ViewContainerRef {
return this._vcRef; return this.vcRef;
} }
ngOnInit() { ngOnInit() {
this.stepper.selectedIndex = 0; this.stepper.selectedIndex = 0;
const authList = this._activatedRoute.snapshot.paramMap['authorization']; const authList = this.activatedRoute.snapshot.paramMap['authorization'];
this.resourceAuth = new Object(); this.resourceAuth = new Object();
...@@ -86,13 +87,13 @@ export class AgentComponent implements OnInit, IDirty { ...@@ -86,13 +87,13 @@ export class AgentComponent implements OnInit, IDirty {
console.log(this.resourceAuth); console.log(this.resourceAuth);
this.isNew = this._activatedRoute.snapshot.data.mode === 'create'; this.isNew = this.activatedRoute.snapshot.data.mode === 'create';
if (this.isNew) { if (this.isNew) {
this.agentDetail = { this.agentDetail = {
}; };
} else { } else {
this.agentDetail = this._activatedRoute.snapshot.data.agentDetail; this.agentDetail = this.activatedRoute.snapshot.data.agentDetail;
} }
......
...@@ -10,7 +10,7 @@ export class CaDeploymentChannelsModalComponent implements OnInit { ...@@ -10,7 +10,7 @@ export class CaDeploymentChannelsModalComponent implements OnInit {
channels: Array<any>; channels: Array<any>;
selectedChannel: any; selectedChannel: any;
applicationSettings:any; applicationSettings: any;
constructor( constructor(
public dialogRef: MatDialogRef<CaDeploymentChannelsModalComponent>, public dialogRef: MatDialogRef<CaDeploymentChannelsModalComponent>,
......
...@@ -15,9 +15,11 @@ import { Form, FormControl, FormGroup, FormGroupDirective, NgForm } from '@angul ...@@ -15,9 +15,11 @@ import { Form, FormControl, FormGroup, FormGroupDirective, NgForm } from '@angul
}) })
export class CaDeploymentChannelsComponent implements OnInit { export class CaDeploymentChannelsComponent implements OnInit {
@Input() stepper: MatStepper; @Input()
stepper: MatStepper;
@Input() changes: boolean = false; @Input()
changes = false;
@ViewChild('fieldForm', {static: false}) @ViewChild('fieldForm', {static: false})
fieldFormList: any; fieldFormList: any;
...@@ -25,13 +27,13 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -25,13 +27,13 @@ export class CaDeploymentChannelsComponent implements OnInit {
agentDetail: any; agentDetail: any;
channels: Array<any>; channels: Array<any>;
deploymentChannels: Array<any> = new Array<any>(); deploymentChannels: Array<any> = new Array<any>();
dirty: boolean = true; dirty = true;
step = -1; step = -1;
viewMode: boolean = false; viewMode = false;
isAvaliableChannels: boolean = false; isAvaliableChannels = false;
mode: string = 'new'; mode = 'new';
detailText: string = "Detail"; detailText = 'Detail';
titleText: string = "Titulo" titleText = 'Titulo';
constructor( constructor(
private activatedRoute: ActivatedRoute, private activatedRoute: ActivatedRoute,
...@@ -70,8 +72,8 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -70,8 +72,8 @@ export class CaDeploymentChannelsComponent implements OnInit {
buildList() { buildList() {
if (this.channels && this.deploymentChannels) { if (this.channels && this.deploymentChannels) {
for (let deploymentChannel of this.deploymentChannels) { for (const deploymentChannel of this.deploymentChannels) {
for (let channel of this.channels) { for (const channel of this.channels) {
if (channel.id === deploymentChannel.channelId) { if (channel.id === deploymentChannel.channelId) {
...@@ -82,8 +84,8 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -82,8 +84,8 @@ export class CaDeploymentChannelsComponent implements OnInit {
deploymentChannel.suggestDetail = channel.suggestDetail; deploymentChannel.suggestDetail = channel.suggestDetail;
for (let parameter of deploymentChannel.parameters) { for (const parameter of deploymentChannel.parameters) {
for (let field of channel.parameters) { for (const field of channel.parameters) {
if (parameter.channelParamName === field.name) { if (parameter.channelParamName === field.name) {
parameter.label = field.label; parameter.label = field.label;
...@@ -107,10 +109,10 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -107,10 +109,10 @@ export class CaDeploymentChannelsComponent implements OnInit {
buildAvaliableChannels() { buildAvaliableChannels() {
this.isAvaliableChannels = false; this.isAvaliableChannels = false;
mainLoop: for (let channel of this.channels) { mainLoop: for (const channel of this.channels) {
channel.disabled = false; channel.disabled = false;
for (let deploymentChannel of this.deploymentChannels) { for (const deploymentChannel of this.deploymentChannels) {
if (channel.id === deploymentChannel.channelId) { if (channel.id === deploymentChannel.channelId) {
channel.disabled = true; channel.disabled = true;
continue mainLoop; continue mainLoop;
...@@ -123,7 +125,7 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -123,7 +125,7 @@ export class CaDeploymentChannelsComponent implements OnInit {
} }
addChannel() { addChannel() {
let dialog = this.matDialog.open(CaDeploymentChannelsModalComponent, { const dialog = this.matDialog.open(CaDeploymentChannelsModalComponent, {
width: '500px', width: '500px',
data: { data: {
message: '', message: '',
...@@ -133,7 +135,7 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -133,7 +135,7 @@ export class CaDeploymentChannelsComponent implements OnInit {
dialog.afterClosed().subscribe(result => { dialog.afterClosed().subscribe(result => {
if (result) { if (result) {
let selectedChannel = { ...result }; const selectedChannel = { ...result };
selectedChannel.channelId = selectedChannel.id; selectedChannel.channelId = selectedChannel.id;
selectedChannel.channelName = selectedChannel.name; selectedChannel.channelName = selectedChannel.name;
...@@ -163,7 +165,7 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -163,7 +165,7 @@ export class CaDeploymentChannelsComponent implements OnInit {
} }
save() { save() {
let isValid: boolean = this.validate(); const isValid: boolean = this.validate();
if (!isValid) { if (!isValid) {
if (this.fieldFormList && this.fieldFormList.control) { if (this.fieldFormList && this.fieldFormList.control) {
...@@ -172,7 +174,7 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -172,7 +174,7 @@ export class CaDeploymentChannelsComponent implements OnInit {
return; return;
} }
let agent: any = {}; const agent: any = {};
agent.id = this.agentDetail.id; agent.id = this.agentDetail.id;
agent.name = this.agentDetail.name; agent.name = this.agentDetail.name;
...@@ -186,8 +188,8 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -186,8 +188,8 @@ export class CaDeploymentChannelsComponent implements OnInit {
agent.status = this.agentDetail.status; agent.status = this.agentDetail.status;
agent.deploymentChannels = []; agent.deploymentChannels = [];
for (let deploymentChannel of this.deploymentChannels) { for (const deploymentChannel of this.deploymentChannels) {
let deploymentChannelTmp: any = {}; const deploymentChannelTmp: any = {};
deploymentChannelTmp.id = deploymentChannel.id; deploymentChannelTmp.id = deploymentChannel.id;
deploymentChannelTmp.name = deploymentChannel.name; deploymentChannelTmp.name = deploymentChannel.name;
...@@ -195,8 +197,8 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -195,8 +197,8 @@ export class CaDeploymentChannelsComponent implements OnInit {
deploymentChannelTmp.channelId = deploymentChannel.channelId; deploymentChannelTmp.channelId = deploymentChannel.channelId;
deploymentChannelTmp.parameters = []; deploymentChannelTmp.parameters = [];
for (let parameter of deploymentChannel.parameters) { for (const parameter of deploymentChannel.parameters) {
let parameterTmp: any = {}; const parameterTmp: any = {};
parameterTmp.id = parameter.id; parameterTmp.id = parameter.id;
parameterTmp.value = parameter.value; parameterTmp.value = parameter.value;
...@@ -238,22 +240,22 @@ export class CaDeploymentChannelsComponent implements OnInit { ...@@ -238,22 +240,22 @@ export class CaDeploymentChannelsComponent implements OnInit {
validate(): boolean { validate(): boolean {
let valid = true; let valid = true;
mainLoop: for (let deploymentChannel of this.deploymentChannels) { mainLoop: for (const deploymentChannel of this.deploymentChannels) {
let deploymentChannelTmp: any = {}; const deploymentChannelTmp: any = {};
// if (!deploymentChannel.name) { // if (!deploymentChannel.name) {
// valid = false; // valid = false;
// break; // break;
// } // }
for (let parameter of deploymentChannel.parameters) { for (const parameter of deploymentChannel.parameters) {
parameter.error = false; parameter.error = false;
if (!parameter.value) { if (!parameter.value) {
valid = false; valid = false;
break mainLoop; break mainLoop;
} }
if (parameter.regex) { if (parameter.regex) {
let regex = new RegExp(parameter.regex); const regex = new RegExp(parameter.regex);
if (!regex.test(parameter.value)) { if (!regex.test(parameter.value)) {
parameter.error = true; parameter.error = true;
valid = false; valid = false;
......
...@@ -39,19 +39,19 @@ export class CaFileUploadModalComponent implements OnInit { ...@@ -39,19 +39,19 @@ export class CaFileUploadModalComponent implements OnInit {
dataSource = new MatTableDataSource([]); dataSource = new MatTableDataSource([]);
displayedColumns: string[] = []; displayedColumns: string[] = [];
applicationSettings:any; applicationSettings: any;
constructor( constructor(
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private agentService: AgentService, private agentService: AgentService,
private _notificationService: NotificationService, private notificationService: NotificationService,
private _translateService: TranslateService, private translateService: TranslateService,
public dialogRef: MatDialogRef<CaFileUploadModalComponent>, public dialogRef: MatDialogRef<CaFileUploadModalComponent>,
@Inject(MAT_DIALOG_DATA) public data: any @Inject(MAT_DIALOG_DATA) public data: any
) { ) {
this.formGroup = this.formBuilder.group({ this.formGroup = this.formBuilder.group({
description: new FormControl({ value: "", disabled: false }), description: new FormControl({ value: '', disabled: false }),
file: new FormControl({ value: '', disabled: false }), file: new FormControl({ value: '', disabled: false }),
filename: new FormControl({ value: '', disabled: true }) filename: new FormControl({ value: '', disabled: true })
}); });
...@@ -72,20 +72,20 @@ export class CaFileUploadModalComponent implements OnInit { ...@@ -72,20 +72,20 @@ export class CaFileUploadModalComponent implements OnInit {
buildErrorDetail(status, detail) { buildErrorDetail(status, detail) {
this.fileErrorDetail = undefined; this.fileErrorDetail = undefined;
if ("CONTENT_ERROR" === status) { if ('CONTENT_ERROR' === status) {
this.displayedColumns = ['line', 'type', 'value']; this.displayedColumns = ['line', 'type', 'value'];
if (detail) { if (detail) {
let fileErrorDetailTemp = []; const fileErrorDetailTemp = [];
for (let line of Object.keys(detail)) { for (const line of Object.keys(detail)) {
let object = detail[line]; const object = detail[line];
let type = Object.keys(object)[0]; const type = Object.keys(object)[0];
fileErrorDetailTemp.push({ fileErrorDetailTemp.push({
line: line, line,
type: type, type,
value: object[type], value: object[type],
}); });
} }
...@@ -97,18 +97,18 @@ export class CaFileUploadModalComponent implements OnInit { ...@@ -97,18 +97,18 @@ export class CaFileUploadModalComponent implements OnInit {
} }
} else if ("HEADER_ERROR" === status) { } else if ('HEADER_ERROR' === status) {
this.displayedColumns = ['header', 'value']; this.displayedColumns = ['header', 'value'];
if (detail) { if (detail) {
let fileErrorDetailTemp = []; const fileErrorDetailTemp = [];
for (let header of Object.keys(detail)) { for (const header of Object.keys(detail)) {
let value = detail[header]; const value = detail[header];
fileErrorDetailTemp.push({ fileErrorDetailTemp.push({
header: header, header,
value: value, value,
}); });
} }
...@@ -131,17 +131,17 @@ export class CaFileUploadModalComponent implements OnInit { ...@@ -131,17 +131,17 @@ export class CaFileUploadModalComponent implements OnInit {
if (event[i] instanceof File) { if (event[i] instanceof File) {
const reader = new FileReader(); const reader = new FileReader();
reader.onload = () => { reader.onload = () => {
//this.formGroup.controls['imageAvatar'].setValue(reader.result as string); // this.formGroup.controls['imageAvatar'].setValue(reader.result as string);
}; };
reader.readAsDataURL(event[i]); reader.readAsDataURL(event[i]);
let fileSelected = { const fileSelected = {
data: event[i], data: event[i],
state: 'in', state: 'in',
inProgress: false, inProgress: false,
progress: 0, progress: 0,
canRetry: false canRetry: false
} };
this.validateFile(fileSelected); this.validateFile(fileSelected);
} }
...@@ -174,12 +174,12 @@ export class CaFileUploadModalComponent implements OnInit { ...@@ -174,12 +174,12 @@ export class CaFileUploadModalComponent implements OnInit {
if (typeof (event) === 'object') { if (typeof (event) === 'object') {
this.fileErrorDetail = undefined; this.fileErrorDetail = undefined;
this.enabledOK = false; this.enabledOK = false;
let info = event.body; const info = event.body;
this.fileInfo = new FileUploadModel(); this.fileInfo = new FileUploadModel();
if (info) { if (info) {
let status = info.fileValidationResult.status; const status = info.fileValidationResult.status;
if ("OK" === status) { if ('OK' === status) {
this.fileInfo.id = info.id; this.fileInfo.id = info.id;
this.fileInfo.description = this.formGroup.controls.description.value; this.fileInfo.description = this.formGroup.controls.description.value;
this.fileInfo.uuid = info.uuid; this.fileInfo.uuid = info.uuid;
...@@ -191,20 +191,21 @@ export class CaFileUploadModalComponent implements OnInit { ...@@ -191,20 +191,21 @@ export class CaFileUploadModalComponent implements OnInit {
this.enabledOK = true; this.enabledOK = true;
this.fileErrorDetail = undefined; this.fileErrorDetail = undefined;
} else if ("INCOMPATIBLE_EXTENSION" === status) { } else if ('INCOMPATIBLE_EXTENSION' === status) {
this.formGroup.controls.file.setValue(null); this.formGroup.controls.file.setValue(null);
let message = "label.file.incompatible.extension"; const message = 'label.file.incompatible.extension';
this.enabledOK = false; this.enabledOK = false;
this.fileErrorDetail = undefined; this.fileErrorDetail = undefined;
this._notificationService.showMessage(this._translateService.instant(message) + "[" + this.accept + "]", null, NotificationType.error); this.notificationService.showMessage(this.translateService.instant(message)
+ '[' + this.accept + ']', null, NotificationType.error);
} else if ("CONTENT_ERROR" === status) { } else if ('CONTENT_ERROR' === status) {
this.formGroup.controls.file.setValue(null); this.formGroup.controls.file.setValue(null);
this.enabledOK = false; this.enabledOK = false;
this.buildErrorDetail(status, info.fileValidationResult.recordsErrorMap); this.buildErrorDetail(status, info.fileValidationResult.recordsErrorMap);
} else if ("HEADER_ERROR" === status) { } else if ('HEADER_ERROR' === status) {
this.formGroup.controls.file.setValue(null); this.formGroup.controls.file.setValue(null);
this.enabledOK = false; this.enabledOK = false;
......
import { Component, OnInit, Input, ViewContainerRef, ViewChild, Output, EventEmitter } from '@angular/core'; import { Component, OnInit, Input, ViewContainerRef, ViewChild, Output } from '@angular/core';
import { AfterViewInit, EventEmitter } from '@angular/core';
import { MatStepper, MatDialog, MatTableDataSource, MatSort } from '@angular/material'; import { MatStepper, MatDialog, MatTableDataSource, MatSort } from '@angular/material';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Router } from '@angular/router';
import { animate, trigger, state, transition, style } from '@angular/animations'; import { animate, trigger, state, transition, style } from '@angular/animations';
...@@ -19,16 +20,18 @@ import { CaFileUploadModalComponent, FileUploadModel } from '../ca-file-upload-m ...@@ -19,16 +20,18 @@ import { CaFileUploadModalComponent, FileUploadModel } from '../ca-file-upload-m
]) ])
] ]
}) })
export class CaFrequentQuestionsComponent implements OnInit { export class CaFrequentQuestionsComponent implements OnInit, AfterViewInit {
@ViewChild(MatSort, { static: false }) sort: MatSort; @ViewChild(MatSort, { static: false }) sort: MatSort;
@Input() stepper: MatStepper; @Input()
stepper: MatStepper;
@Output() onNextPage: EventEmitter<boolean> = new EventEmitter<boolean>(); @Output()
nextPage: EventEmitter<boolean> = new EventEmitter<boolean>();
public resourceAuth = new Object(); public resourceAuth = new Object();
dirty: boolean = false; dirty = false;
...@@ -38,29 +41,30 @@ export class CaFrequentQuestionsComponent implements OnInit { ...@@ -38,29 +41,30 @@ export class CaFrequentQuestionsComponent implements OnInit {
dataSource = new MatTableDataSource<FileUploadModel>([]); dataSource = new MatTableDataSource<FileUploadModel>([]);
mapStatus = { mapStatus = {
"LO": { LO: {
"class": "label label-primary", class: 'label label-primary',
"text": "label.status.loaded" text: 'label.status.loaded'
}, },
"PS": { PS: {
"class": "label label-warning", class: 'label label-warning',
"text": "label.status.pending" text: 'label.status.pending'
} }
}; };
files = []; files = [];
viewMode: boolean; viewMode: boolean;
constructor(protected route: ActivatedRoute, constructor(
protected route: ActivatedRoute,
protected router: Router, protected router: Router,
protected vcRef: ViewContainerRef, protected vcRef: ViewContainerRef,
protected authorizationService: AuthorizationService, protected authorizationService: AuthorizationService,
private translate: TranslateService, private translate: TranslateService,
private _activatedRoute: ActivatedRoute, private activatedRoute: ActivatedRoute,
private matDialog: MatDialog private matDialog: MatDialog
) { ) {
this.viewMode = this._activatedRoute.snapshot.data.mode === 'view'; this.viewMode = this.activatedRoute.snapshot.data.mode === 'view';
} }
...@@ -89,7 +93,7 @@ export class CaFrequentQuestionsComponent implements OnInit { ...@@ -89,7 +93,7 @@ export class CaFrequentQuestionsComponent implements OnInit {
} }
setDataForWizard(result: any) { setDataForWizard(result: any) {
console.log(result) console.log(result);
/* /*
this.protocols = result.connectionProtocolOptions; this.protocols = result.connectionProtocolOptions;
this.generalProperties = result.generalProperties; this.generalProperties = result.generalProperties;
...@@ -112,15 +116,15 @@ export class CaFrequentQuestionsComponent implements OnInit { ...@@ -112,15 +116,15 @@ export class CaFrequentQuestionsComponent implements OnInit {
} }
addFile() { addFile() {
let dialog = this.matDialog.open(CaFileUploadModalComponent, { const dialog = this.matDialog.open(CaFileUploadModalComponent, {
width: '600px', width: '600px',
data: null data: null
}); });
dialog.afterClosed().subscribe(result => { dialog.afterClosed().subscribe(result => {
if (result) { if (result) {
let fileAdded = { ...result }; const fileAdded = { ...result };
let listTemp = this.dataSource.data; const listTemp = this.dataSource.data;
listTemp.push(fileAdded); listTemp.push(fileAdded);
this.dataSource.data = listTemp; this.dataSource.data = listTemp;
this.dirty = true; this.dirty = true;
...@@ -131,27 +135,25 @@ export class CaFrequentQuestionsComponent implements OnInit { ...@@ -131,27 +135,25 @@ export class CaFrequentQuestionsComponent implements OnInit {
onEditRecord(item, index) { onEditRecord(item, index) {
item.editable = true; item.editable = true;
let dialog = this.matDialog.open(CaFileUploadModalComponent, { const dialog = this.matDialog.open(CaFileUploadModalComponent, {
width: '500px', width: '500px',
data: item data: item
}); });
dialog.afterClosed().subscribe(result => { dialog.afterClosed().subscribe(result => {
if (result) { if (result) {
let fileEdited = { ...result }; const fileEdited = { ...result };
let listTemp = this.dataSource.data; const listTemp = this.dataSource.data;
listTemp[index] = fileEdited; listTemp[index] = fileEdited;
this.dataSource.data = listTemp; this.dataSource.data = listTemp;
} }
}); });
} }
saveQuestions(validateForm: boolean) { saveQuestions(validateForm: boolean) {
let success = true; const success = true;
this.agentDetail.frequentQuestions = this.dataSource.data; this.agentDetail.frequentQuestions = this.dataSource.data;
...@@ -159,7 +161,7 @@ export class CaFrequentQuestionsComponent implements OnInit { ...@@ -159,7 +161,7 @@ export class CaFrequentQuestionsComponent implements OnInit {
} }
onDeleteRecord(item, index) { onDeleteRecord(item, index) {
let listTemp = this.dataSource.data; const listTemp = this.dataSource.data;
listTemp.splice(index, 1); listTemp.splice(index, 1);
this.dataSource.data = listTemp; this.dataSource.data = listTemp;
this.dirty = true; this.dirty = true;
...@@ -176,7 +178,7 @@ export class CaFrequentQuestionsComponent implements OnInit { ...@@ -176,7 +178,7 @@ export class CaFrequentQuestionsComponent implements OnInit {
} }
if (this.saveQuestions(true)) { if (this.saveQuestions(true)) {
this.onNextPage.emit(this.isDirty()); this.nextPage.emit(this.isDirty());
this.stepper.next(); this.stepper.next();
} }
} }
......
...@@ -25,17 +25,19 @@ export const FILE_TYPE = { ...@@ -25,17 +25,19 @@ export const FILE_TYPE = {
}) })
export class CaGeneralInformationComponent implements OnInit { export class CaGeneralInformationComponent implements OnInit {
@Input() stepper: MatStepper; @Input()
stepper: MatStepper;
@Output() onNextPage: EventEmitter<boolean> = new EventEmitter<boolean>(); @Output()
nextPage: EventEmitter<boolean> = new EventEmitter<boolean>();
agentDetail: any; agentDetail: any;
formGroup: FormGroup; formGroup: FormGroup;
viewMode: boolean; viewMode: boolean;
mode: string = 'new'; mode = 'new';
imageName = "imageAvatar"; imageName = 'imageAvatar';
urlBase = ''; urlBase = '';
countries = []; countries = [];
...@@ -43,41 +45,41 @@ export class CaGeneralInformationComponent implements OnInit { ...@@ -43,41 +45,41 @@ export class CaGeneralInformationComponent implements OnInit {
languages = [ languages = [
{ {
"code": "ES", code: 'ES',
"name": "Español" name: 'Español'
} }
]; ];
types = [ types = [
{ {
"code": "FQ", code: 'FQ',
"name": "Agente de preguntas frecuentes" name: 'Agente de preguntas frecuentes'
} }
]; ];
acceptedImageTypes = ['image/png', 'image/jpeg', 'image/gif']; acceptedImageTypes = ['image/png', 'image/jpeg', 'image/gif'];
acceptedTypes = "PNG, JPEG, GIF"; acceptedTypes = 'PNG, JPEG, GIF';
constructor( constructor(
private formBuilder: FormBuilder, private formBuilder: FormBuilder,
private _activatedRoute: ActivatedRoute, private activatedRoute: ActivatedRoute,
private _notificationService: NotificationService, private notificationService: NotificationService,
private _translateService: TranslateService private translateService: TranslateService
) { ) {
this.mode = this._activatedRoute.snapshot.data.mode; this.mode = this.activatedRoute.snapshot.data.mode;
this.viewMode = this.mode === 'view'; this.viewMode = this.mode === 'view';
this.countries = this._activatedRoute.snapshot.data.countryData; this.countries = this.activatedRoute.snapshot.data.countryData;
this.formGroup = this.formBuilder.group({ this.formGroup = this.formBuilder.group({
name: new FormControl({ value: "", disabled: this.viewMode }), name: new FormControl({ value: '', disabled: this.viewMode }),
description: new FormControl({ value: "", disabled: this.viewMode }), description: new FormControl({ value: '', disabled: this.viewMode }),
version: new FormControl({ value: "", disabled: this.viewMode }), version: new FormControl({ value: '', disabled: this.viewMode }),
imageAvatar: new FormControl({ value: "", disabled: this.viewMode }, { validators: [Validators.required] }), imageAvatar: new FormControl({ value: '', disabled: this.viewMode }, { validators: [Validators.required] }),
country: new FormControl({ value: "", disabled: this.viewMode }), country: new FormControl({ value: '', disabled: this.viewMode }),
timezone: new FormControl({ value: "", disabled: this.viewMode }), timezone: new FormControl({ value: '', disabled: this.viewMode }),
language: new FormControl({ value: "", disabled: this.viewMode }), language: new FormControl({ value: '', disabled: this.viewMode }),
type: new FormControl({ value: "", disabled: this.viewMode }) type: new FormControl({ value: '', disabled: this.viewMode })
}); });
} }
...@@ -128,7 +130,7 @@ export class CaGeneralInformationComponent implements OnInit { ...@@ -128,7 +130,7 @@ export class CaGeneralInformationComponent implements OnInit {
uploadFiles(event) { uploadFiles(event) {
for (const i in event) { for (const i in event) {
if (event[i] instanceof File) { if (event[i] instanceof File) {
let eventTemp = event[i]; const eventTemp = event[i];
if (this.acceptedImageTypes.includes(eventTemp.type)) { if (this.acceptedImageTypes.includes(eventTemp.type)) {
...@@ -138,15 +140,16 @@ export class CaGeneralInformationComponent implements OnInit { ...@@ -138,15 +140,16 @@ export class CaGeneralInformationComponent implements OnInit {
}; };
reader.readAsDataURL(event[i]); reader.readAsDataURL(event[i]);
} else { } else {
let message = "label.imageAvatar.incompatible.extension"; const message = 'label.imageAvatar.incompatible.extension';
this._notificationService.showMessage(this._translateService.instant(message) + "[" + this.acceptedTypes + "]", null, NotificationType.error); this.notificationService.showMessage(this.translateService.instant(message) +
'[' + this.acceptedTypes + ']', null, NotificationType.error);
} }
} }
} }
} }
onCountryChange(obj, deleteTimeZone?: boolean) { onCountryChange(obj, deleteTimeZone?: boolean) {
let selectedCountry = obj.value; const selectedCountry = obj.value;
this.timezones = []; this.timezones = [];
if (deleteTimeZone) { if (deleteTimeZone) {
...@@ -154,7 +157,7 @@ export class CaGeneralInformationComponent implements OnInit { ...@@ -154,7 +157,7 @@ export class CaGeneralInformationComponent implements OnInit {
} }
if (selectedCountry) { if (selectedCountry) {
for (var index in this.countries) { for (const index in this.countries) {
if (selectedCountry === this.countries[index].id) { if (selectedCountry === this.countries[index].id) {
this.timezones = this.countries[index].timezones; this.timezones = this.countries[index].timezones;
break; break;
...@@ -170,7 +173,7 @@ export class CaGeneralInformationComponent implements OnInit { ...@@ -170,7 +173,7 @@ export class CaGeneralInformationComponent implements OnInit {
} }
if (this.saveGeneralInformation(true)) { if (this.saveGeneralInformation(true)) {
this.onNextPage.emit(this.isDirty()); this.nextPage.emit(this.isDirty());
this.stepper.next(); this.stepper.next();
} }
} }
......
import { HttpClient, HttpEvent, HttpErrorResponse, HttpEventType } from '@angular/common/http'; import { HttpClient, HttpEvent, HttpErrorResponse, HttpEventType } from '@angular/common/http';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class UploadService { export class UploadService {
SERVER_URL: string = "./service/agent"; SERVER_URL = './service/agent';
constructor(private httpClient: HttpClient) { } constructor(private httpClient: HttpClient) { }
public upload(formData) { public upload(formData) {
return this.httpClient.post<any>(this.SERVER_URL, formData, { return this.httpClient.post<any>(this.SERVER_URL, formData, {
reportProgress: true, reportProgress: true,
observe: 'events' observe: 'events'
}); });
} }
} }
...@@ -19,7 +19,7 @@ import { LayoutModule } from '@angular/cdk/layout'; ...@@ -19,7 +19,7 @@ import { LayoutModule } from '@angular/cdk/layout';
TranslateModule, TranslateModule,
LayoutModule LayoutModule
], ],
entryComponents:[ entryComponents: [
], ],
exports: [ exports: [
BytebotLayoutComponent BytebotLayoutComponent
......
...@@ -8,7 +8,7 @@ import { detectBody } from '../app.helpers'; ...@@ -8,7 +8,7 @@ import { detectBody } from '../app.helpers';
}) })
export class BytebotLayoutComponent implements OnInit { export class BytebotLayoutComponent implements OnInit {
constructor(//protected toogleService: ToogleService constructor(// protected toogleService: ToogleService
) { } ) { }
ngOnInit() { ngOnInit() {
...@@ -25,8 +25,8 @@ export class BytebotLayoutComponent implements OnInit { ...@@ -25,8 +25,8 @@ export class BytebotLayoutComponent implements OnInit {
} }
onToggle() { onToggle() {
console.log("test"); console.log('test');
//this.toogleService.onToggle(true); // this.toogleService.onToggle(true);
} }
} }
...@@ -5,7 +5,7 @@ import { CustomerInteractionComponent } from './views/customer-interaction-dashb ...@@ -5,7 +5,7 @@ import { CustomerInteractionComponent } from './views/customer-interaction-dashb
const routes: Routes = [ const routes: Routes = [
{ {
path: 'operative', component: OperativeDashboardComponent, path: 'operative', component: OperativeDashboardComponent,
data: { data: {
program: 'CONVERSATIONAL_AGENT', program: 'CONVERSATIONAL_AGENT',
breadcrumb: 'Operativo', breadcrumb: 'Operativo',
......
...@@ -4,7 +4,8 @@ import { DashboardsRoutingModule } from './dashboards-routing.module'; ...@@ -4,7 +4,8 @@ import { DashboardsRoutingModule } from './dashboards-routing.module';
import { TranslateModule } from '@ngx-translate/core'; import { TranslateModule } from '@ngx-translate/core';
import { ReactiveFormsModule, FormsModule } from '@angular/forms'; import { ReactiveFormsModule, FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { MatFormFieldModule, MatSelectModule, MatTooltipModule, MatButtonModule, MatDatepickerModule, MatInputModule, MatPaginatorModule, MatSortModule, MatIconModule } from '@angular/material'; import { MatFormFieldModule, MatSelectModule, MatTooltipModule, MatButtonModule, MatDatepickerModule,
MatInputModule, MatPaginatorModule, MatSortModule, MatIconModule } from '@angular/material';
import { XdfSettingsModule } from '@xdf/settings'; import { XdfSettingsModule } from '@xdf/settings';
import { XdfLayoutsModule } from '@xdf/layouts'; import { XdfLayoutsModule } from '@xdf/layouts';
import { OperativeDashboardComponent } from './views/operative-dashboard/components/operative-dashboard/operative-dashboard.component'; import { OperativeDashboardComponent } from './views/operative-dashboard/components/operative-dashboard/operative-dashboard.component';
...@@ -23,7 +24,7 @@ import { GaugeChartComponent } from './views/operative-dashboard/components/gaug ...@@ -23,7 +24,7 @@ import { GaugeChartComponent } from './views/operative-dashboard/components/gaug
import { GaugeChartModule } from 'angular-gauge-chart'; import { GaugeChartModule } from 'angular-gauge-chart';
import { InactivitySesionComponent } from './views/operative-dashboard/components/inactivity-sesion/inactivity-sesion.component'; import { InactivitySesionComponent } from './views/operative-dashboard/components/inactivity-sesion/inactivity-sesion.component';
import { HeatMapComponent } from './views/operative-dashboard/components/heat-map/heat-map.component'; import { HeatMapComponent } from './views/operative-dashboard/components/heat-map/heat-map.component';
import { OperativeDashboardFilterComponent } from './views/operative-dashboard/components/operative-dashboard-filter/operative-dashboard-filter.component' import { OperativeDashboardFilterComponent } from './views/operative-dashboard/components/operative-dashboard-filter/operative-dashboard-filter.component';
import { NgxMatDateAdapter, NgxMatDatetimePickerModule, NgxMatNativeDateModule, NgxMatTimepickerModule } from '@angular-material-components/datetime-picker'; import { NgxMatDateAdapter, NgxMatDatetimePickerModule, NgxMatNativeDateModule, NgxMatTimepickerModule } from '@angular-material-components/datetime-picker';
import { LocalizedDateModule } from '@xdf/commons'; import { LocalizedDateModule } from '@xdf/commons';
import { StackedColumnChartComponent } from './views/customer-interaction-dashboard/componentes/stacked-column-chart/stacked-column-chart.component'; import { StackedColumnChartComponent } from './views/customer-interaction-dashboard/componentes/stacked-column-chart/stacked-column-chart.component';
...@@ -38,9 +39,8 @@ import { AvgIntentByCustomerComponent } from './views/customer-interaction-dashb ...@@ -38,9 +39,8 @@ import { AvgIntentByCustomerComponent } from './views/customer-interaction-dashb
import { TracingIntentByCustomerComponent } from './views/customer-interaction-dashboard/componentes/tracing-intent-by-customer/tracing-intent-by-customer.component'; import { TracingIntentByCustomerComponent } from './views/customer-interaction-dashboard/componentes/tracing-intent-by-customer/tracing-intent-by-customer.component';
import { MillisToDayHourMinuteSecond } from './pipes/millis-to-day-hour-minute-second.pipe'; import { MillisToDayHourMinuteSecond } from './pipes/millis-to-day-hour-minute-second.pipe';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
export function highchartsModules() { export function highchartsModules() {
// apply Highcharts Modules to this array // apply Highcharts Modules to this array
return [ more, exporting, highmaps, sankey]; return [ more, exporting, highmaps, sankey];
} }
......
...@@ -9,26 +9,26 @@ export class MillisToDayHourMinuteSecond implements PipeTransform { ...@@ -9,26 +9,26 @@ export class MillisToDayHourMinuteSecond implements PipeTransform {
constructor(private translateService: TranslateService) {} constructor(private translateService: TranslateService) {}
transform(value: any, ...args: any[]) { transform(value: any, ...args: any[]) {
let valueNumber: number; let valueNumber: number;
let type = typeof value; const type = typeof value;
if (type === 'number') { if (type === 'number') {
valueNumber = value; valueNumber = value;
} else if (type === 'string') { } else if (type === 'string') {
valueNumber = + value; valueNumber = + value;
} }
if (valueNumber > 0) { if (valueNumber > 0) {
let days = Math.trunc(valueNumber / 86400); const days = Math.trunc(valueNumber / 86400);
valueNumber = valueNumber % 86400; valueNumber = valueNumber % 86400;
let hours = Math.trunc(valueNumber / 3600); const hours = Math.trunc(valueNumber / 3600);
valueNumber = valueNumber % 3600; valueNumber = valueNumber % 3600;
let minutes = Math.trunc(valueNumber / 60); const minutes = Math.trunc(valueNumber / 60);
valueNumber = valueNumber % 60; valueNumber = valueNumber % 60;
let seconds = valueNumber; const seconds = valueNumber;
return (days < 10 ? '0' : '') + days + this.translateService.instant("pipe.format.day") return (days < 10 ? '0' : '') + days + this.translateService.instant('pipe.format.day')
+ ' ' + (hours < 10 ? '0' : '') + hours + this.translateService.instant("pipe.format.hour") + ' ' + (hours < 10 ? '0' : '') + hours + this.translateService.instant('pipe.format.hour')
+ ' ' + (minutes < 10 ? '0' : '') + minutes + this.translateService.instant("pipe.format.minute") + ' ' + (minutes < 10 ? '0' : '') + minutes + this.translateService.instant('pipe.format.minute')
+ ' ' + (seconds < 10 ? '0' : '') + seconds + this.translateService.instant("pipe.format.seconds"); + ' ' + (seconds < 10 ? '0' : '') + seconds + this.translateService.instant('pipe.format.seconds');
} }
return value; return value;
} }
} }
\ No newline at end of file
...@@ -5,7 +5,7 @@ import { Injectable } from '@angular/core'; ...@@ -5,7 +5,7 @@ import { Injectable } from '@angular/core';
providedIn: 'root' providedIn: 'root'
}) })
export class CustomerInteractionService { export class CustomerInteractionService {
constructor(protected http: HttpClient) { constructor(protected http: HttpClient) {
} }
...@@ -14,7 +14,7 @@ export class CustomerInteractionService { ...@@ -14,7 +14,7 @@ export class CustomerInteractionService {
return './dashboard/customer-interaction'; return './dashboard/customer-interaction';
} }
getSummary(startDate:Date, endDate:Date, channel:string) { getSummary(startDate: Date, endDate: Date, channel: string) {
return this.http.post(this.serviceURL, {startDate, endDate, channel}); return this.http.post(this.serviceURL, {startDate, endDate, channel});
} }
......
...@@ -5,7 +5,7 @@ import { Injectable } from '@angular/core'; ...@@ -5,7 +5,7 @@ import { Injectable } from '@angular/core';
providedIn: 'root' providedIn: 'root'
}) })
export class OperationalConsultationService { export class OperationalConsultationService {
constructor(protected http: HttpClient) { constructor(protected http: HttpClient) {
} }
...@@ -14,7 +14,7 @@ export class OperationalConsultationService { ...@@ -14,7 +14,7 @@ export class OperationalConsultationService {
return './dashboard/operative'; return './dashboard/operative';
} }
getSummary(startDate:Date, endDate:Date, channel:string) { getSummary(startDate: Date, endDate: Date, channel: string) {
return this.http.post(this.serviceURL, {startDate, endDate, channel}); return this.http.post(this.serviceURL, {startDate, endDate, channel});
} }
......
...@@ -48,7 +48,7 @@ export class AvgIntentByCustomerComponent implements OnInit { ...@@ -48,7 +48,7 @@ export class AvgIntentByCustomerComponent implements OnInit {
type: 'datetime', type: 'datetime',
tickInterval: 86400000, tickInterval: 86400000,
labels: { labels: {
formatter: function() { formatter() {
return Highcharts.dateFormat('%e - %b', return Highcharts.dateFormat('%e - %b',
this.value); this.value);
} }
......
...@@ -15,19 +15,19 @@ export class CustomerInteractionFilterComponent implements OnInit { ...@@ -15,19 +15,19 @@ export class CustomerInteractionFilterComponent implements OnInit {
channels = [ channels = [
{ {
value: "W", value: 'W',
label: "Whatsapp" label: 'Whatsapp'
}, },
{ {
value: "F", value: 'F',
label: "Facebook" label: 'Facebook'
} }
]; ];
endDateTime: Date; endDateTime: Date;
startDateTime: Date; startDateTime: Date;
selectedChannel: string; selectedChannel: string;
isLoading: Boolean = false; isLoading = false;
@Input() @Input()
header: string; header: string;
...@@ -36,10 +36,10 @@ export class CustomerInteractionFilterComponent implements OnInit { ...@@ -36,10 +36,10 @@ export class CustomerInteractionFilterComponent implements OnInit {
headerDesc: string; headerDesc: string;
@Input() @Input()
icon: string = '<i class="fa fa-bar-chart-o"></i>'; icon = '<i class="fa fa-bar-chart-o"></i>';
@Output() @Output()
onFilter: EventEmitter<any> = new EventEmitter(); filtered: EventEmitter<any> = new EventEmitter();
constructor( constructor(
protected route: ActivatedRoute, protected route: ActivatedRoute,
...@@ -63,8 +63,8 @@ export class CustomerInteractionFilterComponent implements OnInit { ...@@ -63,8 +63,8 @@ export class CustomerInteractionFilterComponent implements OnInit {
} }
search() { search() {
const filters = {startDateTime: this.startDateTime, endDateTime: this.endDateTime, channel: this.selectedChannel} const filters = {startDateTime: this.startDateTime, endDateTime: this.endDateTime, channel: this.selectedChannel};
this.onFilter.emit(filters); this.filtered.emit(filters);
} }
private getStartDate(endDate: Date): Date { private getStartDate(endDate: Date): Date {
...@@ -75,7 +75,7 @@ export class CustomerInteractionFilterComponent implements OnInit { ...@@ -75,7 +75,7 @@ export class CustomerInteractionFilterComponent implements OnInit {
event.preventDefault(); event.preventDefault();
} }
clickEvent (event: NgxMatDatetimePicker<any>) { clickEvent(event: NgxMatDatetimePicker<any>) {
event.open(); event.open();
} }
......
<byte-customer-interaction-filter (onFilter)="filter($event)"></byte-customer-interaction-filter> <byte-customer-interaction-filter (filtered)="filter($event)"></byte-customer-interaction-filter>
<ng-container *ngIf="isLoading"> <ng-container *ngIf="isLoading">
<div class="spiner-example"> <div class="spiner-example">
<div class="sk-spinner sk-spinner-circle"> <div class="sk-spinner sk-spinner-circle">
......
...@@ -13,38 +13,22 @@ export class CustomerInteractionComponent implements OnInit { ...@@ -13,38 +13,22 @@ export class CustomerInteractionComponent implements OnInit {
links = ['Graph', 'Detail']; links = ['Graph', 'Detail'];
activeLink = this.links[0]; activeLink = this.links[0];
latestDate = new Date(); latestDate = new Date();
existDateRange: Boolean = false; existDateRange = false;
isLoading: Boolean = false; isLoading = false;
startDate: Date; startDate: Date;
endDate: Date; endDate: Date;
data: any; data: any;
isDataLoaded: Boolean = false; isDataLoaded = false;
background: ThemePalette = undefined; background: ThemePalette = undefined;
constructor(
protected customerInteractionService: CustomerInteractionService,
protected notificationService: NotificationService
) { }
ngOnInit() {
}
toggleBackground() {
this.background = this.background ? undefined : 'primary';
}
addLink() {
this.links.push(`Link ${this.links.length + 1}`);
}
panelOptions = { panelOptions = {
elevation: false, elevation: false,
title: { title: {
primary: 'Mensajes por horario de actividad del cliente', primary: 'Mensajes por horario de actividad del cliente',
secondary: '' secondary: ''
} }
} };
tracingPanelOptions = { tracingPanelOptions = {
elevation: false, elevation: false,
...@@ -52,7 +36,7 @@ export class CustomerInteractionComponent implements OnInit { ...@@ -52,7 +36,7 @@ export class CustomerInteractionComponent implements OnInit {
primary: 'dashboards.customer.interaction.tracing.intent', primary: 'dashboards.customer.interaction.tracing.intent',
secondary: '' secondary: ''
} }
} };
avgIntentOptions = { avgIntentOptions = {
elevation: false, elevation: false,
...@@ -60,7 +44,7 @@ export class CustomerInteractionComponent implements OnInit { ...@@ -60,7 +44,7 @@ export class CustomerInteractionComponent implements OnInit {
primary: 'dashboards.customer.interaction.avg.intent', primary: 'dashboards.customer.interaction.avg.intent',
secondary: '' secondary: ''
} }
} };
goalPanelOptions = { goalPanelOptions = {
elevation: false, elevation: false,
...@@ -68,7 +52,7 @@ export class CustomerInteractionComponent implements OnInit { ...@@ -68,7 +52,7 @@ export class CustomerInteractionComponent implements OnInit {
primary: 'dashboards.customer.interaction.goals', primary: 'dashboards.customer.interaction.goals',
secondary: '' secondary: ''
} }
} };
intentCustomer = { intentCustomer = {
elevation: false, elevation: false,
...@@ -86,6 +70,22 @@ export class CustomerInteractionComponent implements OnInit { ...@@ -86,6 +70,22 @@ export class CustomerInteractionComponent implements OnInit {
} }
}; };
constructor(
protected customerInteractionService: CustomerInteractionService,
protected notificationService: NotificationService
) { }
ngOnInit() {
}
toggleBackground() {
this.background = this.background ? undefined : 'primary';
}
addLink() {
this.links.push(`Link ${this.links.length + 1}`);
}
filter(filters) { filter(filters) {
this.isDataLoaded = false; this.isDataLoaded = false;
this.isLoading = true; this.isLoading = true;
...@@ -97,13 +97,13 @@ export class CustomerInteractionComponent implements OnInit { ...@@ -97,13 +97,13 @@ export class CustomerInteractionComponent implements OnInit {
this.isLoading = false; this.isLoading = false;
this.isDataLoaded = this.isValidData(this.data); this.isDataLoaded = this.isValidData(this.data);
if (!this.isDataLoaded) { if (!this.isDataLoaded) {
this.notificationService.showMessage("No se encontró información para el rango de fechas seleccionado", "", NotificationType.error); this.notificationService.showMessage('No se encontró información para el rango de fechas seleccionado', '', NotificationType.error);
} }
}, err => { }, err => {
this.isLoading = false; this.isLoading = false;
}); });
} }
private isValidData(data:any): Boolean { private isValidData(data: any): boolean {
if (data['sessionFlow'] && data['sessionFlow']['intent'] && data['sessionFlow']['sentence']) { if (data['sessionFlow'] && data['sessionFlow']['intent'] && data['sessionFlow']['sentence']) {
if (data['sessionFlow']['intent']['total'] > 0 || data['sessionFlow']['sentence']['total'] > 0) { if (data['sessionFlow']['intent']['total'] > 0 || data['sessionFlow']['sentence']['total'] > 0) {
return true; return true;
......
import { DataSource } from '@angular/cdk/table'; import { DataSource } from '@angular/cdk/table';
import { Component, Input, OnInit, ViewChild } from '@angular/core'; import { AfterViewInit, Component, Input, OnInit, ViewChild } from '@angular/core';
import { MatPaginator, MatSort } from '@angular/material'; import { MatPaginator, MatSort } from '@angular/material';
import { Pagination, SortField } from '@xdf/commons'; import { Pagination, SortField } from '@xdf/commons';
import { DynaDataSource } from '@xdf/gallery'; import { DynaDataSource } from '@xdf/gallery';
...@@ -11,15 +11,15 @@ import { MessageByIntentService } from './services/message-by-intent.service'; ...@@ -11,15 +11,15 @@ import { MessageByIntentService } from './services/message-by-intent.service';
templateUrl: './message-by-intent-table.component.html', templateUrl: './message-by-intent-table.component.html',
styleUrls: ['./message-by-intent-table.component.scss'] styleUrls: ['./message-by-intent-table.component.scss']
}) })
export class MessageByIntentTableComponent implements OnInit { export class MessageByIntentTableComponent implements OnInit, AfterViewInit {
displayedColumns: string[] = ['sentence', 'identifier', 'count', 'customer']; displayedColumns: string[] = ['sentence', 'identifier', 'count', 'customer'];
dataSource: DynaDataSource; dataSource: DynaDataSource;
@ViewChild(MatPaginator, { static: false }) paginator: MatPaginator; @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator;
@ViewChild(MatSort, { static: false }) sort: MatSort; @ViewChild(MatSort, { static: false }) sort: MatSort;
sortColumn: string = "count"; sortColumn = 'count';
sortDirection: string = "desc"; sortDirection = 'desc';
statusQuickFilter: string; statusQuickFilter: string;
pagingSize = 8; pagingSize = 8;
...@@ -36,22 +36,22 @@ export class MessageByIntentTableComponent implements OnInit { ...@@ -36,22 +36,22 @@ export class MessageByIntentTableComponent implements OnInit {
ngOnInit() { ngOnInit() {
this.dataSource = new DynaDataSource(this.service); this.dataSource = new DynaDataSource(this.service);
// Paginación // Paginación
this.pagination = new Pagination(); this.pagination = new Pagination();
this.pagination.currentPage = 0; this.pagination.currentPage = 0;
this.pagination.itemsPerPage = this.pagingSize; this.pagination.itemsPerPage = this.pagingSize;
this.pagination.filterExpression = "startDate=" + this.minDate.getTime() + "&&endDate=" + this.maxDate.getTime(); this.pagination.filterExpression = 'startDate=' + this.minDate.getTime() + '&&endDate=' + this.maxDate.getTime();
// Ordenación por defecto // Ordenación por defecto
if (this.sortColumn && this.sortDirection) { if (this.sortColumn && this.sortDirection) {
this.pagination.sortFields = new Array(); this.pagination.sortFields = new Array();
const sortField: SortField = new SortField(); const sortField: SortField = new SortField();
sortField.direction = this.sortDirection; sortField.direction = this.sortDirection;
sortField.field = this.sortColumn; sortField.field = this.sortColumn;
this.pagination.sortFields.push(sortField); this.pagination.sortFields.push(sortField);
} }
this.dataSource.load(this.pagination); this.dataSource.load(this.pagination);
} }
...@@ -80,7 +80,7 @@ export class MessageByIntentTableComponent implements OnInit { ...@@ -80,7 +80,7 @@ export class MessageByIntentTableComponent implements OnInit {
.subscribe(); .subscribe();
} }
disabledPopper(value: number): Boolean { disabledPopper(value: number): boolean {
return value <= 30; return value <= 30;
} }
......
export interface MessageByIntent{ export interface MessageByIntent {
sentence: string; sentence: string;
intent: string; intent: string;
ocurrency: number; ocurrency: number;
customers: number; customers: number;
} }
\ No newline at end of file
...@@ -11,7 +11,7 @@ import { map } from 'rxjs/operators'; ...@@ -11,7 +11,7 @@ import { map } from 'rxjs/operators';
}) })
export class MessageByIntentService extends DynaDataService { export class MessageByIntentService extends DynaDataService {
serviceURL = "./dashboard/customer-interaction/message-by-intent"; serviceURL = './dashboard/customer-interaction/message-by-intent';
constructor(private httpClient: HttpClient) { constructor(private httpClient: HttpClient) {
super(httpClient); super(httpClient);
...@@ -20,4 +20,4 @@ export class MessageByIntentService extends DynaDataService { ...@@ -20,4 +20,4 @@ export class MessageByIntentService extends DynaDataService {
getResultPagination(pagination: Pagination): Observable<Pagination> { getResultPagination(pagination: Pagination): Observable<Pagination> {
return this.httpClient.post(this.serviceURL + '/page', pagination).pipe(map(data => this.getPage(data as Pagination))); return this.httpClient.post(this.serviceURL + '/page', pagination).pipe(map(data => this.getPage(data as Pagination)));
} }
} }
\ No newline at end of file
...@@ -10,7 +10,7 @@ import { Chart } from 'angular-highcharts'; ...@@ -10,7 +10,7 @@ import { Chart } from 'angular-highcharts';
export class SankeyDiagramComponent implements OnInit { export class SankeyDiagramComponent implements OnInit {
chart: Chart; chart: Chart;
startPoint:string = "Session start"; startPoint = 'Session start';
private percentDetail = {}; private percentDetail = {};
@Input() @Input()
...@@ -22,7 +22,7 @@ export class SankeyDiagramComponent implements OnInit { ...@@ -22,7 +22,7 @@ export class SankeyDiagramComponent implements OnInit {
if (!this.data) { if (!this.data) {
return; return;
} }
let dataDiagram = this.generateData(this.data); const dataDiagram = this.generateData(this.data);
if (!dataDiagram) { if (!dataDiagram) {
return; return;
} }
...@@ -61,21 +61,20 @@ export class SankeyDiagramComponent implements OnInit { ...@@ -61,21 +61,20 @@ export class SankeyDiagramComponent implements OnInit {
// dataLabels: { // dataLabels: {
// formatter: function () { // formatter: function () {
// console.log(this); // console.log(this);
// return ""; // return '';
// } // }
// }, // },
}] as Array<any> }] as Array<any>
});
});
} }
private generateData(data: any) { private generateData(data: any) {
if (!data['topList']) { if (!data['topList']) {
return undefined; return undefined;
} }
let dataForDiagram = []; const dataForDiagram = [];
data['topList'].forEach(x => { data['topList'].forEach(x => {
//PercentageInventary.getInstance().setPercent(x['identifier'], x['count']/data['total']*100); // PercentageInventary.getInstance().setPercent(x['identifier'], x['count']/data['total']*100);
dataForDiagram.push([this.startPoint, x['identifier'], x['count']]); dataForDiagram.push([this.startPoint, x['identifier'], x['count']]);
}); });
return dataForDiagram; return dataForDiagram;
...@@ -89,9 +88,9 @@ function update(key) { ...@@ -89,9 +88,9 @@ function update(key) {
export class PercentageInventary { export class PercentageInventary {
private percentages: any = {};
private static instance: PercentageInventary; private static instance: PercentageInventary;
private percentages: any = {};
public static getInstance(): PercentageInventary { public static getInstance(): PercentageInventary {
if (!PercentageInventary.instance) { if (!PercentageInventary.instance) {
PercentageInventary.instance = new PercentageInventary(); PercentageInventary.instance = new PercentageInventary();
...@@ -99,10 +98,10 @@ export class PercentageInventary { ...@@ -99,10 +98,10 @@ export class PercentageInventary {
return PercentageInventary.instance; return PercentageInventary.instance;
} }
getPercent(name: string) { getPercent(name: string) {
if (this.percentages[name]) { if (this.percentages[name]) {
return (this.percentages[name] as number).toFixed(2) + "%"; return (this.percentages[name] as number).toFixed(2) + '%';
} }
return null; return null;
} }
......
...@@ -21,8 +21,8 @@ export class StackedColumnChartComponent implements OnInit { ...@@ -21,8 +21,8 @@ export class StackedColumnChartComponent implements OnInit {
if (!this.data) { if (!this.data) {
return; return;
} }
let categories = this.generateData(this.data, 'goal'); const categories = this.generateData(this.data, 'goal');
let dataSeries = this.generateData(this.data, 'count'); const dataSeries = this.generateData(this.data, 'count');
this.chart = new Chart({ this.chart = new Chart({
chart: { chart: {
type: 'column' type: 'column'
...@@ -37,7 +37,7 @@ export class StackedColumnChartComponent implements OnInit { ...@@ -37,7 +37,7 @@ export class StackedColumnChartComponent implements OnInit {
text: '' text: ''
}, },
xAxis: { xAxis: {
categories: categories categories
}, },
credits: { credits: {
enabled: false enabled: false
...@@ -82,7 +82,7 @@ export class StackedColumnChartComponent implements OnInit { ...@@ -82,7 +82,7 @@ export class StackedColumnChartComponent implements OnInit {
} }
private generateData(data: Array<any>, field: string) { private generateData(data: Array<any>, field: string) {
let dataGenerated = []; const dataGenerated = [];
data.forEach(x => { data.forEach(x => {
dataGenerated.push(x[field]); dataGenerated.push(x[field]);
}); });
......
...@@ -25,7 +25,7 @@ export class TracingIntentByCustomerComponent implements OnInit { ...@@ -25,7 +25,7 @@ export class TracingIntentByCustomerComponent implements OnInit {
ngOnInit() { ngOnInit() {
console.log(this.minDate); console.log(this.minDate);
console.log(this.maxDate); console.log(this.maxDate);
let series: Array<any> = this.getGenerateData(this.data); const series: Array<any> = this.getGenerateData(this.data);
this.chart = new Chart({ this.chart = new Chart({
chart: { chart: {
type: 'line' type: 'line'
...@@ -54,9 +54,8 @@ export class TracingIntentByCustomerComponent implements OnInit { ...@@ -54,9 +54,8 @@ export class TracingIntentByCustomerComponent implements OnInit {
min: this.getDate(this.minDate), min: this.getDate(this.minDate),
max: this.getDate(this.maxDate), max: this.getDate(this.maxDate),
labels: { labels: {
formatter: function() { formatter() {
return Highcharts.dateFormat('%e - %b', return Highcharts.dateFormat('%e - %b', this.value * 1000);
this.value * 1000);
} }
} }
}, },
...@@ -66,7 +65,7 @@ export class TracingIntentByCustomerComponent implements OnInit { ...@@ -66,7 +65,7 @@ export class TracingIntentByCustomerComponent implements OnInit {
}, },
}, },
tooltip: { tooltip: {
formatter: function() { formatter() {
return '<b>' + this.series.name + '</b><br/>' + return '<b>' + this.series.name + '</b><br/>' +
Highcharts.dateFormat('%e - %b', Highcharts.dateFormat('%e - %b',
this.x * 1000) + this.x * 1000) +
...@@ -80,18 +79,20 @@ export class TracingIntentByCustomerComponent implements OnInit { ...@@ -80,18 +79,20 @@ export class TracingIntentByCustomerComponent implements OnInit {
} }
} }
}, },
series: series series
}); });
} }
private getGenerateData(data: any): Array<any> { private getGenerateData(data: any): Array<any> {
let series: Array<any> = []; const series: Array<any> = [];
for (const intent in data) { for (const intent in data) {
let serie = {}; if (data.hasOwnProperty(intent)) {
serie['name'] = intent; const serie = {};
serie['data'] = data[intent]; serie['name'] = intent;
series.push(serie); serie['data'] = data[intent];
console.log(serie); series.push(serie);
console.log(serie);
}
} }
return series; return series;
} }
......
...@@ -11,7 +11,7 @@ import { map } from 'rxjs/operators'; ...@@ -11,7 +11,7 @@ import { map } from 'rxjs/operators';
}) })
export class UnidentifiedSentenceService extends DynaDataService { export class UnidentifiedSentenceService extends DynaDataService {
serviceURL = "./dashboard/operative/sentence-by-intent"; serviceURL = './dashboard/operative/sentence-by-intent';
constructor(private httpClient: HttpClient) { constructor(private httpClient: HttpClient) {
super(httpClient); super(httpClient);
...@@ -20,4 +20,4 @@ export class UnidentifiedSentenceService extends DynaDataService { ...@@ -20,4 +20,4 @@ export class UnidentifiedSentenceService extends DynaDataService {
getResultPagination(pagination: Pagination): Observable<Pagination> { getResultPagination(pagination: Pagination): Observable<Pagination> {
return this.httpClient.post(this.serviceURL + '/page', pagination).pipe(map(data => this.getPage(data as Pagination))); return this.httpClient.post(this.serviceURL + '/page', pagination).pipe(map(data => this.getPage(data as Pagination)));
} }
} }
\ No newline at end of file
import { Component, Input, OnInit, ViewChild } from '@angular/core'; import { AfterViewInit, Component, Input, OnInit, ViewChild } from '@angular/core';
import { MatPaginator, MatSort } from '@angular/material'; import { MatPaginator, MatSort } from '@angular/material';
import { Pagination, SortField } from '@xdf/commons'; import { Pagination, SortField } from '@xdf/commons';
import { DynaDataSource } from '@xdf/gallery'; import { DynaDataSource } from '@xdf/gallery';
...@@ -10,15 +10,15 @@ import { UnidentifiedSentenceService } from './services/unidentified-sentences.s ...@@ -10,15 +10,15 @@ import { UnidentifiedSentenceService } from './services/unidentified-sentences.s
templateUrl: './unidentified-sentences-table.component.html', templateUrl: './unidentified-sentences-table.component.html',
styleUrls: ['./unidentified-sentences-table.component.scss'] styleUrls: ['./unidentified-sentences-table.component.scss']
}) })
export class UnidentifiedSentencesTableComponent implements OnInit { export class UnidentifiedSentencesTableComponent implements OnInit, AfterViewInit {
displayedColumns: string[] = ['identifier', 'count']; displayedColumns: string[] = ['identifier', 'count'];
dataSource: DynaDataSource; dataSource: DynaDataSource;
@ViewChild(MatPaginator, { static: false }) paginator: MatPaginator; @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator;
@ViewChild(MatSort, { static: false }) sort: MatSort; @ViewChild(MatSort, { static: false }) sort: MatSort;
sortColumn: string = "count"; sortColumn = 'count';
sortDirection: string = "desc"; sortDirection = 'desc';
statusQuickFilter: string; statusQuickFilter: string;
pagingSize = 8; pagingSize = 8;
...@@ -35,22 +35,22 @@ export class UnidentifiedSentencesTableComponent implements OnInit { ...@@ -35,22 +35,22 @@ export class UnidentifiedSentencesTableComponent implements OnInit {
ngOnInit() { ngOnInit() {
this.dataSource = new DynaDataSource(this.service); this.dataSource = new DynaDataSource(this.service);
// Paginación // Paginación
this.pagination = new Pagination(); this.pagination = new Pagination();
this.pagination.currentPage = 0; this.pagination.currentPage = 0;
this.pagination.itemsPerPage = this.pagingSize; this.pagination.itemsPerPage = this.pagingSize;
this.pagination.filterExpression = "startDate=" + this.minDate.getTime() + "&&endDate=" + this.maxDate.getTime(); this.pagination.filterExpression = 'startDate=' + this.minDate.getTime() + '&&endDate=' + this.maxDate.getTime();
// Ordenación por defecto // Ordenación por defecto
if (this.sortColumn && this.sortDirection) { if (this.sortColumn && this.sortDirection) {
this.pagination.sortFields = new Array(); this.pagination.sortFields = new Array();
const sortField: SortField = new SortField(); const sortField: SortField = new SortField();
sortField.direction = this.sortDirection; sortField.direction = this.sortDirection;
sortField.field = this.sortColumn; sortField.field = this.sortColumn;
this.pagination.sortFields.push(sortField); this.pagination.sortFields.push(sortField);
} }
this.dataSource.load(this.pagination); this.dataSource.load(this.pagination);
} }
......
...@@ -26,7 +26,6 @@ export class CustomerActivityWidgetComponent implements OnInit { ...@@ -26,7 +26,6 @@ export class CustomerActivityWidgetComponent implements OnInit {
xAxis: { xAxis: {
allowDecimals: false, allowDecimals: false,
labels: { labels: {
}, },
accessibility: { accessibility: {
rangeDescription: 'Range: 1940 to 2017.' rangeDescription: 'Range: 1940 to 2017.'
...@@ -37,7 +36,7 @@ export class CustomerActivityWidgetComponent implements OnInit { ...@@ -37,7 +36,7 @@ export class CustomerActivityWidgetComponent implements OnInit {
text: 'Nuclear weapon states' text: 'Nuclear weapon states'
}, },
labels: { labels: {
formatter: function () { formatter() {
return this.value / 1000 + 'k'; return this.value / 1000 + 'k';
} }
} }
......
...@@ -19,7 +19,7 @@ export const DEFAULT_OPTIONS_GAUGE_CHART: GaugeChart = { ...@@ -19,7 +19,7 @@ export const DEFAULT_OPTIONS_GAUGE_CHART: GaugeChart = {
arcDelimiters: [16, 33], arcDelimiters: [16, 33],
rangeLabel: ['0', '6'], rangeLabel: ['0', '6'],
needleStartValue: 1, needleStartValue: 1,
} };
@Component({ @Component({
selector: 'byte-gauge-chart', selector: 'byte-gauge-chart',
...@@ -29,25 +29,25 @@ export const DEFAULT_OPTIONS_GAUGE_CHART: GaugeChart = { ...@@ -29,25 +29,25 @@ export const DEFAULT_OPTIONS_GAUGE_CHART: GaugeChart = {
export class GaugeChartComponent implements OnInit { export class GaugeChartComponent implements OnInit {
@Input() @Input()
name: string = "Gauge chart"; name = 'Gauge chart';
@Input() @Input()
value: any = 1.2; value: any = 1.2;
@Input() @Input()
unit: string = ""; unit = '';
@Input() @Input()
options: GaugeChart; options: GaugeChart;
@Input() @Input()
format: Boolean = false; format = false;
@Input() @Input()
maxValue: number = 6; maxValue = 6;
canvasWidth = 250 canvasWidth = 250;
centralLabel = '25' centralLabel = '25';
bottomLabel = ''; bottomLabel = '';
constructor() { } constructor() { }
...@@ -60,18 +60,18 @@ export class GaugeChartComponent implements OnInit { ...@@ -60,18 +60,18 @@ export class GaugeChartComponent implements OnInit {
valueNumber = valueNumber / 1000; valueNumber = valueNumber / 1000;
} }
let valueFormater:number = 0; let valueFormater = 0;
if (valueNumber >= 86400) { if (valueNumber >= 86400) {
this.unit = "d"; this.unit = 'd';
valueFormater = valueNumber / 86400; valueFormater = valueNumber / 86400;
} else if (valueNumber >= 3600) { } else if (valueNumber >= 3600) {
this.unit = "h"; this.unit = 'h';
valueFormater = valueNumber / 3600; valueFormater = valueNumber / 3600;
} else if (valueNumber >= 60){ } else if (valueNumber >= 60) {
this.unit = "m"; this.unit = 'm';
valueFormater = valueNumber / 60; valueFormater = valueNumber / 60;
} else { } else {
this.unit = "s"; this.unit = 's';
valueFormater = valueNumber; valueFormater = valueNumber;
} }
this.bottomLabel = valueFormater.toFixed(1) + ' ' + this.unit; this.bottomLabel = valueFormater.toFixed(1) + ' ' + this.unit;
......
import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Component, Input, OnDestroy, OnInit } from '@angular/core';
//import { ToogleService } from '@xdf/layouts'; // import { ToogleService } from '@xdf/layouts';
import { Chart } from 'angular-highcharts'; import { Chart } from 'angular-highcharts';
import * as Highcharts from 'highcharts'; import * as Highcharts from 'highcharts';
import { Subscription } from 'rxjs'; import { Subscription } from 'rxjs';
...@@ -23,8 +23,10 @@ export class HeatMapComponent implements OnInit, OnDestroy { ...@@ -23,8 +23,10 @@ export class HeatMapComponent implements OnInit, OnDestroy {
subscriptionToogle: Subscription; subscriptionToogle: Subscription;
chart: Chart;
constructor( constructor(
//protected toogleService: ToogleService // protected toogleService: ToogleService
) { ) {
} }
...@@ -34,8 +36,6 @@ export class HeatMapComponent implements OnInit, OnDestroy { ...@@ -34,8 +36,6 @@ export class HeatMapComponent implements OnInit, OnDestroy {
} }
} }
chart: Chart;
ngOnInit() { ngOnInit() {
if (!this.maxDate || !this.minDate) { if (!this.maxDate || !this.minDate) {
return; return;
...@@ -48,7 +48,7 @@ export class HeatMapComponent implements OnInit, OnDestroy { ...@@ -48,7 +48,7 @@ export class HeatMapComponent implements OnInit, OnDestroy {
marginRight: 40, marginRight: 40,
type: 'heatmap', type: 'heatmap',
events: { events: {
load: function (event: any) { load: (event: any) => {
event.target.reflow(); event.target.reflow();
} }
} }
...@@ -91,9 +91,9 @@ export class HeatMapComponent implements OnInit, OnDestroy { ...@@ -91,9 +91,9 @@ export class HeatMapComponent implements OnInit, OnDestroy {
text: null text: null
}, },
labels: { labels: {
formatter: function () { formatter() {
//return 'H' + (this.value + 1) + ': ' + (this.value < 10 ? '0' : '') + this.value + ':00' ; // return 'H' + (this.value + 1) + ': ' + (this.value < 10 ? '0' : '') + this.value + ':00' ;
return 'H' + (this.value + 1) + ': ' + (3 * this.value < 10 ? '0' : '') + 3 * this.value + ':00' return 'H' + (this.value + 1) + ': ' + (3 * this.value < 10 ? '0' : '') + 3 * this.value + ':00'
+ ' - ' + ((3 * this.value + 3) < 10 ? '0' : '') + (3 * this.value + 3) + ':00'; + ' - ' + ((3 * this.value + 3) < 10 ? '0' : '') + (3 * this.value + 3) + ':00';
}, },
format: 'H{value:}:{3*value}:00 - {value + 3}:00' format: 'H{value:}:{3*value}:00 - {value + 3}:00'
...@@ -132,7 +132,7 @@ export class HeatMapComponent implements OnInit, OnDestroy { ...@@ -132,7 +132,7 @@ export class HeatMapComponent implements OnInit, OnDestroy {
colsize: 24 * 36e5, // one day colsize: 24 * 36e5, // one day
tooltip: { tooltip: {
headerFormat: '{point.x:%e %b}', headerFormat: '{point.x:%e %b}',
//pointFormat: '{point.x:%e %b, %Y} {point.y}:00: <b>{point.value} ℃</b>' // pointFormat: '{point.x:%e %b, %Y} {point.y}:00: <b>{point.value} ℃</b>'
pointFormat: '<b>{point.value} mensajes</b>' pointFormat: '<b>{point.value} mensajes</b>'
}, },
turboThreshold: Number.MAX_VALUE, // #3404, remove after 4.0.5 release turboThreshold: Number.MAX_VALUE, // #3404, remove after 4.0.5 release
......
...@@ -12,8 +12,8 @@ export class InactivitySesionComponent implements OnInit, AfterViewInit { ...@@ -12,8 +12,8 @@ export class InactivitySesionComponent implements OnInit, AfterViewInit {
@Input() options = { @Input() options = {
width: 200, width: 200,
height: 60, height: 60,
fill: "#dfecf9", fill: '#dfecf9',
stroke: "#024990", stroke: '#024990',
strokeWidth: 1 strokeWidth: 1
}; };
@Input() values = [1, 12, 3, 15, 5, -1, 10]; @Input() values = [1, 12, 3, 15, 5, -1, 10];
...@@ -36,7 +36,7 @@ export class InactivitySesionComponent implements OnInit, AfterViewInit { ...@@ -36,7 +36,7 @@ export class InactivitySesionComponent implements OnInit, AfterViewInit {
} }
} }
@HostListener('window:resize',['$event']) @HostListener('window:resize', ['$event'])
public onResize(event) { public onResize(event) {
const width = event.target.innerWidth; const width = event.target.innerWidth;
this.updateWidth(width); this.updateWidth(width);
...@@ -45,12 +45,12 @@ export class InactivitySesionComponent implements OnInit, AfterViewInit { ...@@ -45,12 +45,12 @@ export class InactivitySesionComponent implements OnInit, AfterViewInit {
private updateWidth(width: number) { private updateWidth(width: number) {
if (width >= 1600) { if (width >= 1600) {
this.options.width = 300 this.options.width = 300;
} else if (width >= 1350) { } else if (width >= 1350) {
this.options.width = 200 this.options.width = 200;
} else if (width >= 768){ } else if (width >= 768) {
this.options.width = 150; this.options.width = 150;
} else if (width >= 576){ } else if (width >= 576) {
this.options.width = 200; this.options.width = 200;
} else { } else {
this.options.width = 300; this.options.width = 300;
......
...@@ -14,19 +14,19 @@ export class OperativeDashboardFilterComponent implements OnInit { ...@@ -14,19 +14,19 @@ export class OperativeDashboardFilterComponent implements OnInit {
channels = [ channels = [
{ {
value: "W", value: 'W',
label: "Whatsapp" label: 'Whatsapp'
}, },
{ {
value: "F", value: 'F',
label: "Facebook" label: 'Facebook'
} }
]; ];
endDateTime: Date; endDateTime: Date;
startDateTime: Date; startDateTime: Date;
selectedChannel: string; selectedChannel: string;
isLoading: Boolean = false; isLoading = false;
@Input() @Input()
header: string; header: string;
...@@ -35,10 +35,10 @@ export class OperativeDashboardFilterComponent implements OnInit { ...@@ -35,10 +35,10 @@ export class OperativeDashboardFilterComponent implements OnInit {
headerDesc: string; headerDesc: string;
@Input() @Input()
icon: string = '<i class="fa fa-bar-chart-o"></i>'; icon = '<i class="fa fa-bar-chart-o"></i>';
@Output() @Output()
onFilter: EventEmitter<any> = new EventEmitter(); filtered: EventEmitter<any> = new EventEmitter();
constructor( constructor(
protected route: ActivatedRoute, protected route: ActivatedRoute,
...@@ -62,8 +62,8 @@ export class OperativeDashboardFilterComponent implements OnInit { ...@@ -62,8 +62,8 @@ export class OperativeDashboardFilterComponent implements OnInit {
} }
search() { search() {
const filters = {startDateTime: this.startDateTime, endDateTime: this.endDateTime, channel: this.selectedChannel} const filters = { startDateTime: this.startDateTime, endDateTime: this.endDateTime, channel: this.selectedChannel };
this.onFilter.emit(filters); this.filtered.emit(filters);
} }
private getStartDate(endDate: Date): Date { private getStartDate(endDate: Date): Date {
...@@ -74,8 +74,7 @@ export class OperativeDashboardFilterComponent implements OnInit { ...@@ -74,8 +74,7 @@ export class OperativeDashboardFilterComponent implements OnInit {
event.preventDefault(); event.preventDefault();
} }
clickEvent (event: NgxMatDatetimePicker<any>) { clickEvent(event: NgxMatDatetimePicker<any>) {
event.open(); event.open();
} }
} }
<byte-operative-dashboard-filter (onFilter)="filter($event)"></byte-operative-dashboard-filter> <byte-operative-dashboard-filter (filtered)="filter($event)"></byte-operative-dashboard-filter>
<ng-container *ngIf="isLoading"> <ng-container *ngIf="isLoading">
<div class="spiner-example"> <div class="spiner-example">
<div class="sk-spinner sk-spinner-circle"> <div class="sk-spinner sk-spinner-circle">
......
...@@ -14,51 +14,51 @@ import { PetyWidgetModel } from '../summary-peti-widget/summary-peti-widget.comp ...@@ -14,51 +14,51 @@ import { PetyWidgetModel } from '../summary-peti-widget/summary-peti-widget.comp
export class OperativeDashboardComponent implements OnInit { export class OperativeDashboardComponent implements OnInit {
latestDate = new Date(); latestDate = new Date();
existDateRange: Boolean = false; existDateRange = false;
isLoading: Boolean = false; isLoading = false;
startDate: Date; startDate: Date;
endDate: Date; endDate: Date;
data: any; data: any;
isDataLoaded: Boolean = false; isDataLoaded = false;
formatterNumber: PetiFormatter = new MessageCountFormatter(); formatterNumber: PetiFormatter = new MessageCountFormatter();
panelOptions = { panelOptions = {
elevation: false, elevation: false,
title: { title: {
primary: 'dashboards.operative.message.customer.activity', primary: 'dashboards.operative.message.customer.activity',
secondary: '' secondary: ''
} }
} };
optionsInactivitySesion = { optionsInactivitySesion = {
width: 300, width: 300,
height: 60, height: 60,
fill: "#C8FEFF", fill: '#C8FEFF',
stroke: "#23c6c8", stroke: '#23c6c8',
strokeWidth: 1 strokeWidth: 1
}; };
totalSesionsOptions = { totalSesionsOptions = {
width: 300, width: 300,
height: 60, height: 60,
fill: "#CFECFF", fill: '#CFECFF',
stroke: "#1c84c6", stroke: '#1c84c6',
strokeWidth: 1 strokeWidth: 1
}; };
totalReceivedOptions = { totalReceivedOptions = {
width: 300, width: 300,
height: 60, height: 60,
fill: "#D2EEE9", fill: '#D2EEE9',
stroke: "#1ab394", stroke: '#1ab394',
strokeWidth: 1 strokeWidth: 1
}; };
totalSentOptions = { totalSentOptions = {
width: 300, width: 300,
height: 60, height: 60,
fill: "#FFD9DD", fill: '#FFD9DD',
stroke: "#ed5565", stroke: '#ed5565',
strokeWidth: 1 strokeWidth: 1
}; };
......
export interface PetiFormatter { export interface PetiFormatter {
format(value: number): string; format(value: number): string;
} }
\ No newline at end of file
...@@ -3,9 +3,9 @@ import { PetiFormatter } from './formatter'; ...@@ -3,9 +3,9 @@ import { PetiFormatter } from './formatter';
export class MessageCountFormatter implements PetiFormatter { export class MessageCountFormatter implements PetiFormatter {
format(value: number): string { format(value: number): string {
if (value < 1000) { if (value < 1000) {
return "" + value; return '' + value;
} }
let newNumber: number = value/1000; const newNumber: number = value / 1000;
return newNumber.toFixed(1) + "K"; return newNumber.toFixed(1) + 'K';
} }
} }
\ No newline at end of file
import { Component, HostListener, Input, OnInit, ViewChild } from '@angular/core'; import { AfterViewInit, Component, HostListener, Input, OnInit, ViewChild } from '@angular/core';
import { PeityComponent } from '@xdf/graph'; import { PeityComponent } from '@xdf/graph';
import { PetiFormatter } from './formatter/formatter'; import { PetiFormatter } from './formatter/formatter';
declare var jQuery: any; declare var jQuery: any;
...@@ -16,20 +16,20 @@ export class PetyWidgetModel { ...@@ -16,20 +16,20 @@ export class PetyWidgetModel {
templateUrl: './summary-peti-widget.component.html', templateUrl: './summary-peti-widget.component.html',
styleUrls: ['./summary-peti-widget.component.scss'] styleUrls: ['./summary-peti-widget.component.scss']
}) })
export class SummaryPetiWidgetComponent implements OnInit { export class SummaryPetiWidgetComponent implements OnInit, AfterViewInit {
@Input() options = { @Input() options = {
width: 200, width: 200,
height: 60, height: 60,
fill: "#dfecf9", fill: '#dfecf9',
stroke: "#024990", stroke: '#024990',
strokeWidth: 1 strokeWidth: 1
}; };
@Input() values = [1, 12, 3, 15, 5, -1, 10]; @Input() values = [1, 12, 3, 15, 5, -1, 10];
@Input() header; @Input() header;
@Input() value: PetyWidgetModel; @Input() value: PetyWidgetModel;
@Input() tooltip: string; @Input() tooltip: string;
@Input() formatter: PetiFormatter @Input() formatter: PetiFormatter;
@ViewChild('peti', { static: false }) @ViewChild('peti', { static: false })
peti: PeityComponent; peti: PeityComponent;
...@@ -52,12 +52,11 @@ export class SummaryPetiWidgetComponent implements OnInit { ...@@ -52,12 +52,11 @@ export class SummaryPetiWidgetComponent implements OnInit {
return this.formatter.format(this.value.value); return this.formatter.format(this.value.value);
} }
return this.value.value; return this.value.value;
} }
@HostListener('window:resize',['$event']) @HostListener('window:resize', ['$event'])
public onResize(event) { public onResize(event) {
console.log("aea"); console.log('aea');
const width = event.target.innerWidth; const width = event.target.innerWidth;
this.updateWidth(width); this.updateWidth(width);
this.peti.updateSize(); this.peti.updateSize();
...@@ -65,12 +64,12 @@ export class SummaryPetiWidgetComponent implements OnInit { ...@@ -65,12 +64,12 @@ export class SummaryPetiWidgetComponent implements OnInit {
private updateWidth(width: number) { private updateWidth(width: number) {
if (width >= 1600) { if (width >= 1600) {
this.options.width = 300 this.options.width = 300;
} else if (width >= 1350) { } else if (width >= 1350) {
this.options.width = 200 this.options.width = 200;
} else if (width >= 768){ } else if (width >= 768) {
this.options.width = 150; this.options.width = 150;
} else if (width >= 576){ } else if (width >= 576) {
this.options.width = 200; this.options.width = 200;
} else { } else {
this.options.width = 300; this.options.width = 300;
......
...@@ -7,7 +7,7 @@ import { UserRoleFormComponent, AccessDetailResolver } from '@xdf/settings'; ...@@ -7,7 +7,7 @@ import { UserRoleFormComponent, AccessDetailResolver } from '@xdf/settings';
const routes: Routes = [ const routes: Routes = [
{ {
path: 'user-role', component: GridViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], path: 'user-role', component: GridViewComponent, canActivate: [AuthGuard, ResourceAuthGuard],
resolve: { template: TemplateResolver }, resolve: { template: TemplateResolver },
data: { data: {
program: 'user_role', program: 'user_role',
...@@ -15,7 +15,8 @@ const routes: Routes = [ ...@@ -15,7 +15,8 @@ const routes: Routes = [
} }
}, },
{ {
path: 'user-role/detail/:mode', component: UserRoleFormComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard], path: 'user-role/detail/:mode', component: UserRoleFormComponent, canActivate: [AuthGuard, ResourceAuthGuard],
canDeactivate: [DirtyGuard],
resolve: { record: RecordResolver, accessList: AccessDetailResolver }, resolve: { record: RecordResolver, accessList: AccessDetailResolver },
data: { data: {
program: 'user_role', program: 'user_role',
...@@ -23,7 +24,7 @@ const routes: Routes = [ ...@@ -23,7 +24,7 @@ const routes: Routes = [
} }
}, },
{ {
path: 'user', component: CrudGridComponent, canActivate: [AuthGuard, ResourceAuthGuard], path: 'user', component: CrudGridComponent, canActivate: [AuthGuard, ResourceAuthGuard],
resolve: { template: TemplateResolver }, resolve: { template: TemplateResolver },
data: { data: {
innerTemplate: 'none', innerTemplate: 'none',
......
...@@ -19,7 +19,7 @@ import { XdfSettingsModule } from '@xdf/settings'; ...@@ -19,7 +19,7 @@ import { XdfSettingsModule } from '@xdf/settings';
XdfSettingsModule, XdfSettingsModule,
SecurityRoutingModule SecurityRoutingModule
], ],
entryComponents:[ entryComponents: [
], ],
providers: [ providers: [
{ provide: DirtyGuard, useClass: DirtyGuard } { provide: DirtyGuard, useClass: DirtyGuard }
......
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router'; import { Routes, RouterModule } from '@angular/router';
import { AuthGuard } from '@xdf/security'; import { AuthGuard } from '@xdf/security';
import { DirtyGuard, TemplateResolver, CrudGridComponent, EditableDataTableTemplateResolver, CrudDetailComponent, FormViewComponent, ListResolver, RecordResolver } from '@xdf/gallery'; import { DirtyGuard, TemplateResolver, CrudGridComponent, EditableDataTableTemplateResolver } from '@xdf/gallery';
import { CrudDetailComponent, FormViewComponent, ListResolver, RecordResolver } from '@xdf/gallery';
import { ResourceAuthGuard } from '@xdf/security'; import { ResourceAuthGuard } from '@xdf/security';
import { ApplicationFormComponent, ValposFormComponent } from '@xdf/settings'; import { ApplicationFormComponent, ValposFormComponent } from '@xdf/settings';
import { TabsLayoutComponent, TabsTemplateResolver } from '@xdf/layouts'; import { TabsLayoutComponent, TabsTemplateResolver } from '@xdf/layouts';
const routes: Routes = [ const routes: Routes = [
{ {
path: "system-settings", component: TabsLayoutComponent, path: 'system-settings', component: TabsLayoutComponent,
resolve: { template: TabsTemplateResolver }, resolve: { template: TabsTemplateResolver },
data: { data: {
templateName: "system-settings", templateName: 'system-settings',
}, },
children: [ children: [
{ path: 'information', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard], { path: 'information', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard],
...@@ -19,8 +20,8 @@ const routes: Routes = [ ...@@ -19,8 +20,8 @@ const routes: Routes = [
data: { data: {
option: 'information', option: 'information',
program: 'system_settings_information', program: 'system_settings_information',
breadcrumb: 'breadcrumb.settings.information' breadcrumb: 'breadcrumb.settings.information'
} }
}, },
{ path: 'information/:mode', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard], { path: 'information/:mode', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard],
resolve: { ecord: ListResolver }, resolve: { ecord: ListResolver },
...@@ -28,16 +29,16 @@ const routes: Routes = [ ...@@ -28,16 +29,16 @@ const routes: Routes = [
withoutGrid: true, withoutGrid: true,
option: 'information', option: 'information',
program: 'system_settings_information', program: 'system_settings_information',
breadcrumb: 'breadcrumb.settings.information' breadcrumb: 'breadcrumb.settings.information'
} }
}, },
{ path: 'password', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard], { path: 'password', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard],
resolve: { record: ListResolver }, resolve: { record: ListResolver },
data: { data: {
option: 'password', option: 'password',
program: 'system_settings_password', program: 'system_settings_password',
breadcrumb: 'breadcrumb.settings.password' breadcrumb: 'breadcrumb.settings.password'
} }
}, },
{ path: 'password/:mode', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard], { path: 'password/:mode', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard],
resolve: { record: ListResolver }, resolve: { record: ListResolver },
...@@ -45,16 +46,16 @@ const routes: Routes = [ ...@@ -45,16 +46,16 @@ const routes: Routes = [
withoutGrid: true, withoutGrid: true,
option: 'password', option: 'password',
program: 'system_settings_password', program: 'system_settings_password',
breadcrumb: 'breadcrumb.settings.password' breadcrumb: 'breadcrumb.settings.password'
} }
}, },
{ path: 'userpolicy', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard], { path: 'userpolicy', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard],
resolve: { record: ListResolver }, resolve: { record: ListResolver },
data: { data: {
option: 'userpolicy', option: 'userpolicy',
program: 'system_settings_userpolicy', program: 'system_settings_userpolicy',
breadcrumb: 'breadcrumb.settings.userpolicy' breadcrumb: 'breadcrumb.settings.userpolicy'
} }
}, },
{ path: 'userpolicy/:mode', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard], { path: 'userpolicy/:mode', component: FormViewComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard],
resolve: { record: ListResolver }, resolve: { record: ListResolver },
...@@ -62,8 +63,8 @@ const routes: Routes = [ ...@@ -62,8 +63,8 @@ const routes: Routes = [
withoutGrid: true, withoutGrid: true,
option: 'userpolicy', option: 'userpolicy',
program: 'system_settings_userpolicy', program: 'system_settings_userpolicy',
breadcrumb: 'breadcrumb.settings.userpolicy' breadcrumb: 'breadcrumb.settings.userpolicy'
} }
} }
] ]
}, },
...@@ -76,7 +77,8 @@ const routes: Routes = [ ...@@ -76,7 +77,8 @@ const routes: Routes = [
} }
}, },
{ {
path: 'application/detail/:mode', component: ApplicationFormComponent, canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard], path: 'application/detail/:mode', component: ApplicationFormComponent,
canActivate: [AuthGuard, ResourceAuthGuard], canDeactivate: [DirtyGuard],
resolve: { record: RecordResolver }, resolve: { record: RecordResolver },
data: { data: {
program: 'application', program: 'application',
......
...@@ -4,23 +4,23 @@ import { Injectable } from '@angular/core'; ...@@ -4,23 +4,23 @@ import { Injectable } from '@angular/core';
providedIn: 'root' providedIn: 'root'
}) })
export class SharedFilterService { export class SharedFilterService {
private _startDate:Date; private myStartDate: Date;
private _endDate:Date; private myEndDate: Date;
get startDate():Date { get startDate(): Date {
return this._startDate; return this.myStartDate;
} }
get endDate():Date { get endDate(): Date {
return this._endDate; return this.myEndDate;
} }
setStartDate(date: Date) { setStartDate(date: Date) {
this._startDate = date; this.myStartDate = date;
} }
setEndDate(date: Date) { setEndDate(date: Date) {
this._endDate = date; this.myEndDate = date;
} }
} }
{
"extends": "tslint:recommended",
"rulesDirectory": [
"codelyzer"
],
"rules": {
"no-string-literal": false,
"array-type": false,
"arrow-parens": false,
"deprecation": {
"severity": "warning"
},
"import-blacklist": [
true,
"rxjs/Rx"
],
"interface-name": false,
"max-classes-per-file": false,
"max-line-length": [
false,
240
],
"member-access": false,
"member-ordering": [
true,
{
"order": [
"static-field",
"instance-field",
"static-method",
"instance-method"
]
}
],
"no-consecutive-blank-lines": false,
"no-console": [
true,
"debug",
"info",
"time",
"timeEnd",
"trace"
],
"no-empty": false,
"no-inferrable-types": [
true,
"ignore-params"
],
"no-non-null-assertion": true,
"no-redundant-jsdoc": true,
"no-switch-case-fall-through": true,
"no-var-requires": false,
"object-literal-key-quotes": [
true,
"as-needed"
],
"object-literal-sort-keys": false,
"ordered-imports": false,
"quotemark": [
true,
"single"
],
"trailing-comma": false,
"component-class-suffix": true,
"contextual-lifecycle": true,
"directive-class-suffix": true,
"no-conflicting-lifecycle": true,
"no-host-metadata-property": true,
"no-input-rename": true,
"no-inputs-metadata-property": true,
"no-output-native": true,
"no-output-on-prefix": true,
"no-output-rename": true,
"no-outputs-metadata-property": true,
"template-banana-in-box": true,
"template-no-negated-async": true,
"use-lifecycle-interface": true,
"use-pipe-transform-interface": true
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment