fin
This commit is contained in:
		
							parent
							
								
									cf4fc1be93
								
							
						
					
					
						commit
						9b775a8c63
					
				| @ -91,14 +91,14 @@ export class EditnewdashComponent implements OnInit { | |||||||
|       name: 'Scatter Chart', |       name: 'Scatter Chart', | ||||||
|       identifier: 'scatter_chart' |       identifier: 'scatter_chart' | ||||||
|     }, |     }, | ||||||
|     // {
 |     { | ||||||
|     // name: 'Dynamic Chart',
 |     name: 'Dynamic Chart', | ||||||
|     // identifier: 'dynamic_chart'
 |     identifier: 'dynamic_chart' | ||||||
|     // },
 |     }, | ||||||
|     // {
 |     { | ||||||
|     // name: 'Financial Chart',
 |     name: 'Financial Chart', | ||||||
|     // identifier: 'financial_chart'
 |     identifier: 'financial_chart' | ||||||
|     // },
 |     }, | ||||||
|     { |     { | ||||||
|       name: 'To Do', |       name: 'To Do', | ||||||
|       identifier: 'to_do_chart' |       identifier: 'to_do_chart' | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/cor | |||||||
| import { Dashboard3Service } from 'src/app/services/builder/dashboard3.service'; | import { Dashboard3Service } from 'src/app/services/builder/dashboard3.service'; | ||||||
| import { FilterService } from '../../common-filter/filter.service'; | import { FilterService } from '../../common-filter/filter.service'; | ||||||
| import { Subscription } from 'rxjs'; | import { Subscription } from 'rxjs'; | ||||||
|  | import { AlertsService } from 'src/app/services/fnd/alerts.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-financial-chart', |   selector: 'app-financial-chart', | ||||||
| @ -37,7 +38,8 @@ export class FinancialChartComponent implements OnInit, OnChanges { | |||||||
| 
 | 
 | ||||||
|   constructor( |   constructor( | ||||||
|     private dashboardService: Dashboard3Service, |     private dashboardService: Dashboard3Service, | ||||||
|     private filterService: FilterService |     private filterService: FilterService, | ||||||
|  |     private alertService: AlertsService | ||||||
|   ) { } |   ) { } | ||||||
| 
 | 
 | ||||||
|   ngOnInit(): void { |   ngOnInit(): void { | ||||||
| @ -59,6 +61,8 @@ export class FinancialChartComponent implements OnInit, OnChanges { | |||||||
|     // Initialize filter values if they haven't been initialized yet
 |     // Initialize filter values if they haven't been initialized yet
 | ||||||
|     if (!this.filtersInitialized && (changes.baseFilters || changes.drilldownFilters || changes.drilldownLayers)) { |     if (!this.filtersInitialized && (changes.baseFilters || changes.drilldownFilters || changes.drilldownLayers)) { | ||||||
|       this.initializeFilterValues(); |       this.initializeFilterValues(); | ||||||
|  |       // Load filter options for dropdown/multiselect filters
 | ||||||
|  |       this.loadFilterOptions(); | ||||||
|       this.filtersInitialized = true; |       this.filtersInitialized = true; | ||||||
|     } |     } | ||||||
|      |      | ||||||
| @ -573,6 +577,11 @@ export class FinancialChartComponent implements OnInit, OnChanges { | |||||||
|     // Initialize base filters
 |     // Initialize base filters
 | ||||||
|     if (this.baseFilters) { |     if (this.baseFilters) { | ||||||
|       this.baseFilters.forEach(filter => { |       this.baseFilters.forEach(filter => { | ||||||
|  |         // Ensure filter has required properties
 | ||||||
|  |         if (!filter.type) filter.type = 'text'; | ||||||
|  |         if (!filter.options) filter.options = ''; | ||||||
|  |         if (!filter.availableValues) filter.availableValues = ''; | ||||||
|  |          | ||||||
|         if (filter.value === undefined || filter.value === null) { |         if (filter.value === undefined || filter.value === null) { | ||||||
|           switch (filter.type) { |           switch (filter.type) { | ||||||
|             case 'multiselect': |             case 'multiselect': | ||||||
| @ -594,6 +603,11 @@ export class FinancialChartComponent implements OnInit, OnChanges { | |||||||
|     // Initialize drilldown filters
 |     // Initialize drilldown filters
 | ||||||
|     if (this.drilldownFilters) { |     if (this.drilldownFilters) { | ||||||
|       this.drilldownFilters.forEach(filter => { |       this.drilldownFilters.forEach(filter => { | ||||||
|  |         // Ensure filter has required properties
 | ||||||
|  |         if (!filter.type) filter.type = 'text'; | ||||||
|  |         if (!filter.options) filter.options = ''; | ||||||
|  |         if (!filter.availableValues) filter.availableValues = ''; | ||||||
|  |          | ||||||
|         if (filter.value === undefined || filter.value === null) { |         if (filter.value === undefined || filter.value === null) { | ||||||
|           switch (filter.type) { |           switch (filter.type) { | ||||||
|             case 'multiselect': |             case 'multiselect': | ||||||
| @ -617,6 +631,11 @@ export class FinancialChartComponent implements OnInit, OnChanges { | |||||||
|       this.drilldownLayers.forEach(layer => { |       this.drilldownLayers.forEach(layer => { | ||||||
|         if (layer.filters) { |         if (layer.filters) { | ||||||
|           layer.filters.forEach((filter: any) => { |           layer.filters.forEach((filter: any) => { | ||||||
|  |             // Ensure filter has required properties
 | ||||||
|  |             if (!filter.type) filter.type = 'text'; | ||||||
|  |             if (!filter.options) filter.options = ''; | ||||||
|  |             if (!filter.availableValues) filter.availableValues = ''; | ||||||
|  |              | ||||||
|             if (filter.value === undefined || filter.value === null) { |             if (filter.value === undefined || filter.value === null) { | ||||||
|               switch (filter.type) { |               switch (filter.type) { | ||||||
|                 case 'multiselect': |                 case 'multiselect': | ||||||
| @ -883,4 +902,187 @@ export class FinancialChartComponent implements OnInit, OnChanges { | |||||||
|     // Remove document click handler if it exists
 |     // Remove document click handler if it exists
 | ||||||
|     this.removeDocumentClickHandler(); |     this.removeDocumentClickHandler(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   // Load filter options for dropdown and multiselect filters
 | ||||||
|  |   private loadFilterOptions(): void { | ||||||
|  |     console.log('Loading filter options'); | ||||||
|  |      | ||||||
|  |     // Load options for base filters
 | ||||||
|  |     if (this.baseFilters && this.table) { | ||||||
|  |       this.baseFilters.forEach((filter, index) => { | ||||||
|  |         if ((filter.type === 'dropdown' || filter.type === 'multiselect') && filter.field) { | ||||||
|  |           this.loadFilterValuesForField(this.table, this.connection, filter.field, index, 'base'); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Load options for drilldown filters
 | ||||||
|  |     if (this.drilldownFilters && this.drilldownApiUrl) { | ||||||
|  |       this.drilldownFilters.forEach((filter, index) => { | ||||||
|  |         if ((filter.type === 'dropdown' || filter.type === 'multiselect') && filter.field) { | ||||||
|  |           this.loadFilterValuesForField(this.drilldownApiUrl, this.connection, filter.field, index, 'drilldown'); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Load options for layer filters
 | ||||||
|  |     if (this.drilldownLayers) { | ||||||
|  |       this.drilldownLayers.forEach((layer, layerIndex) => { | ||||||
|  |         if (layer.filters && layer.apiUrl) { | ||||||
|  |           layer.filters.forEach((filter, filterIndex) => { | ||||||
|  |             if ((filter.type === 'dropdown' || filter.type === 'multiselect') && filter.field) { | ||||||
|  |               this.loadFilterValuesForField(layer.apiUrl, this.connection, filter.field, filterIndex, 'layer', layerIndex); | ||||||
|  |             } | ||||||
|  |           }); | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Load filter values for a specific field
 | ||||||
|  |   private loadFilterValuesForField( | ||||||
|  |     apiUrl: string,  | ||||||
|  |     connectionId: number | undefined,  | ||||||
|  |     field: string,  | ||||||
|  |     filterIndex: number,  | ||||||
|  |     filterType: 'base' | 'drilldown' | 'layer', | ||||||
|  |     layerIndex?: number | ||||||
|  |   ): void { | ||||||
|  |     if (apiUrl && field) { | ||||||
|  |       this.alertService.getValuesFromUrl(apiUrl, connectionId, field).subscribe( | ||||||
|  |         (values: string[]) => { | ||||||
|  |           console.log(`Loaded filter values for ${filterType} filter ${field}:`, values); | ||||||
|  |            | ||||||
|  |           // Update the filter with available values
 | ||||||
|  |           if (filterType === 'base') { | ||||||
|  |             const filter = this.baseFilters[filterIndex]; | ||||||
|  |             if (filter) { | ||||||
|  |               filter.availableValues = values.join(', '); | ||||||
|  |               // For dropdown/multiselect types, also update the options
 | ||||||
|  |               if (filter.type === 'dropdown' || filter.type === 'multiselect') { | ||||||
|  |                 filter.options = filter.availableValues; | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } else if (filterType === 'drilldown') { | ||||||
|  |             const filter = this.drilldownFilters[filterIndex]; | ||||||
|  |             if (filter) { | ||||||
|  |               filter.availableValues = values.join(', '); | ||||||
|  |               // For dropdown/multiselect types, also update the options
 | ||||||
|  |               if (filter.type === 'dropdown' || filter.type === 'multiselect') { | ||||||
|  |                 filter.options = filter.availableValues; | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } else if (filterType === 'layer' && layerIndex !== undefined) { | ||||||
|  |             const layer = this.drilldownLayers[layerIndex]; | ||||||
|  |             if (layer && layer.filters) { | ||||||
|  |               const filter = layer.filters[filterIndex]; | ||||||
|  |               if (filter) { | ||||||
|  |                 filter.availableValues = values.join(', '); | ||||||
|  |                 // For dropdown/multiselect types, also update the options
 | ||||||
|  |                 if (filter.type === 'dropdown' || filter.type === 'multiselect') { | ||||||
|  |                   filter.options = filter.availableValues; | ||||||
|  |                 } | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         (error) => { | ||||||
|  |           console.error('Error loading available values for field:', field, error); | ||||||
|  |         } | ||||||
|  |       ); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Handle base filter field change
 | ||||||
|  |   onBaseFilterFieldChange(index: number, field: string): void { | ||||||
|  |     const filter = this.baseFilters[index]; | ||||||
|  |     if (filter) { | ||||||
|  |       filter.field = field; | ||||||
|  |       // If field changes, reset value and options
 | ||||||
|  |       filter.value = ''; | ||||||
|  |       filter.options = ''; | ||||||
|  |       filter.availableValues = ''; | ||||||
|  |        | ||||||
|  |       // If we have a field and table URL, load available values
 | ||||||
|  |       if (field && this.table && (filter.type === 'dropdown' || filter.type === 'multiselect')) { | ||||||
|  |         this.loadFilterValuesForField(this.table, this.connection, field, index, 'base'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Handle base filter type change
 | ||||||
|  |   onBaseFilterTypeChange(index: number, type: string): void { | ||||||
|  |     const filter = this.baseFilters[index]; | ||||||
|  |     if (filter) { | ||||||
|  |       filter.type = type; | ||||||
|  |       // If type changes to dropdown/multiselect and we have a field, load available values
 | ||||||
|  |       if ((type === 'dropdown' || type === 'multiselect') && filter.field && this.table) { | ||||||
|  |         this.loadFilterValuesForField(this.table, this.connection, filter.field, index, 'base'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Handle drilldown filter field change
 | ||||||
|  |   onDrilldownFilterFieldChange(index: number, field: string): void { | ||||||
|  |     const filter = this.drilldownFilters[index]; | ||||||
|  |     if (filter) { | ||||||
|  |       filter.field = field; | ||||||
|  |       // If field changes, reset value and options
 | ||||||
|  |       filter.value = ''; | ||||||
|  |       filter.options = ''; | ||||||
|  |       filter.availableValues = ''; | ||||||
|  |        | ||||||
|  |       // If we have a field and drilldown API URL, load available values
 | ||||||
|  |       if (field && this.drilldownApiUrl && (filter.type === 'dropdown' || filter.type === 'multiselect')) { | ||||||
|  |         this.loadFilterValuesForField(this.drilldownApiUrl, this.connection, field, index, 'drilldown'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Handle drilldown filter type change
 | ||||||
|  |   onDrilldownFilterTypeChange(index: number, type: string): void { | ||||||
|  |     const filter = this.drilldownFilters[index]; | ||||||
|  |     if (filter) { | ||||||
|  |       filter.type = type; | ||||||
|  |       // If type changes to dropdown/multiselect and we have a field, load available values
 | ||||||
|  |       if ((type === 'dropdown' || type === 'multiselect') && filter.field && this.drilldownApiUrl) { | ||||||
|  |         this.loadFilterValuesForField(this.drilldownApiUrl, this.connection, filter.field, index, 'drilldown'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Handle layer filter field change
 | ||||||
|  |   onLayerFilterFieldChange(layerIndex: number, filterIndex: number, field: string): void { | ||||||
|  |     const layer = this.drilldownLayers[layerIndex]; | ||||||
|  |     if (layer && layer.filters) { | ||||||
|  |       const filter = layer.filters[filterIndex]; | ||||||
|  |       if (filter) { | ||||||
|  |         filter.field = field; | ||||||
|  |         // If field changes, reset value and options
 | ||||||
|  |         filter.value = ''; | ||||||
|  |         filter.options = ''; | ||||||
|  |         filter.availableValues = ''; | ||||||
|  |          | ||||||
|  |         // If we have a field and layer API URL, load available values
 | ||||||
|  |         if (field && layer.apiUrl && (filter.type === 'dropdown' || filter.type === 'multiselect')) { | ||||||
|  |           this.loadFilterValuesForField(layer.apiUrl, this.connection, field, filterIndex, 'layer', layerIndex); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Handle layer filter type change
 | ||||||
|  |   onLayerFilterTypeChange(layerIndex: number, filterIndex: number, type: string): void { | ||||||
|  |     const layer = this.drilldownLayers[layerIndex]; | ||||||
|  |     if (layer && layer.filters) { | ||||||
|  |       const filter = layer.filters[filterIndex]; | ||||||
|  |       if (filter) { | ||||||
|  |         filter.type = type; | ||||||
|  |         // If type changes to dropdown/multiselect and we have a field, load available values
 | ||||||
|  |         if ((type === 'dropdown' || type === 'multiselect') && filter.field && layer.apiUrl) { | ||||||
|  |           this.loadFilterValuesForField(layer.apiUrl, this.connection, filter.field, filterIndex, 'layer', layerIndex); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user