@@ -507,4 +526,87 @@
-
\ No newline at end of file
+
+
+
+
+ Configure Common Filter
+
+
+
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/editnewdash/editnewdash.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/editnewdash/editnewdash.component.ts
index 7b3006e..3a668c7 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/editnewdash/editnewdash.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/editnewdash/editnewdash.component.ts
@@ -40,7 +40,9 @@ export class EditnewdashComponent implements OnInit {
editId: number;
toggle: boolean;
modeledit: boolean = false;
+ commonFilterModalOpen: boolean = false; // Add common filter modal state
public entryForm: FormGroup;
+ public commonFilterForm: FormGroup; // Add common filter form
WidgetsMock: WidgetModel[] = [
{
@@ -118,6 +120,17 @@ export class EditnewdashComponent implements OnInit {
model: any;
linesdata: any;
id: any;
+
+ // Add common filter data property
+ commonFilterData = {
+ connection: '',
+ apiUrl: '',
+ filters: [] as any[]
+ };
+
+ // Add common filter column data property
+ commonFilterColumnData: any[] = [];
+
gadgetsEditdata = {
donut: '',
chartlegend: '',
@@ -146,12 +159,17 @@ export class EditnewdashComponent implements OnInit {
drilldownFilters: [] as any[], // Add separate drilldown filters
// Multi-layer drilldown configurations
drilldownLayers: [] as any[],
+ // Common filter property
+ commonFilterEnabled: false
};
-
+
// Add sureconnect data property
sureconnectData: any[] = [];
layerColumnData: { [key: number]: any[] } = {}; // Add layer column data property
+ // Add drilldown column data property
+ drilldownColumnData = []; // Add drilldown column data property
+
constructor(private route: ActivatedRoute,
private router: Router,
private dashboardService: Dashboard3Service,
@@ -224,8 +242,17 @@ export class EditnewdashComponent implements OnInit {
// Note: Dynamic drilldown layers and filters will be handled separately since they're complex objects
});
+ // Initialize common filter form
+ this.commonFilterForm = this._fb.group({
+ connection: [''],
+ apiUrl: ['']
+ });
+
// Load sureconnect data first, then load dashboard data
this.loadSureconnectData();
+
+ // Load common filter data if it exists
+ this.loadCommonFilterData();
}
// Add method to load sureconnect data
@@ -241,7 +268,14 @@ export class EditnewdashComponent implements OnInit {
this.getData();
});
}
-
+
+ // Add method to load common filter data
+ loadCommonFilterData() {
+ // In a real implementation, this would fetch common filter data from the server
+ // For now, we'll initialize with empty values
+ console.log('Loading common filter data');
+ }
+
toggleMenu() {
this.toggle = !this.toggle;
}
@@ -499,6 +533,10 @@ export class EditnewdashComponent implements OnInit {
if (item.showlabel === undefined) { item.showlabel = true; }
if (item.chartcolor === undefined) { item.chartcolor = true; }
if (item.chartlegend === undefined) { item.chartlegend = true; }
+ // Initialize common filter property if not present
+ if (item['commonFilterEnabled'] === undefined) {
+ this.gadgetsEditdata['commonFilterEnabled'] = false;
+ }
this.getStores();
// Set default connection if none is set and we have connections
@@ -662,6 +700,7 @@ export class EditnewdashComponent implements OnInit {
xyz.baseFilters = this.gadgetsEditdata.baseFilters; // Add base filters
xyz.drilldownFilters = this.gadgetsEditdata.drilldownFilters; // Add drilldown filters
xyz.drilldownLayers = this.gadgetsEditdata.drilldownLayers;
+ xyz.commonFilterEnabled = this.gadgetsEditdata.commonFilterEnabled; // Add common filter property
console.log(xyz);
return xyz;
@@ -755,6 +794,7 @@ export class EditnewdashComponent implements OnInit {
updatedItem.baseFilters = this.gadgetsEditdata.baseFilters; // Add base filters
updatedItem.drilldownFilters = this.gadgetsEditdata.drilldownFilters; // Add drilldown filters
updatedItem.drilldownLayers = this.gadgetsEditdata.drilldownLayers;
+ updatedItem.commonFilterEnabled = this.gadgetsEditdata.commonFilterEnabled; // Add common filter property
console.log('Updated item:', updatedItem);
return updatedItem;
@@ -820,7 +860,6 @@ export class EditnewdashComponent implements OnInit {
}
selectedyAxis;
columnData;
- drilldownColumnData = []; // Add drilldown column data property
getColumns(id, table) {
const connectionId = this.gadgetsEditdata.connection ? parseInt(this.gadgetsEditdata.connection, 10) : undefined;
@@ -1017,4 +1056,97 @@ export class EditnewdashComponent implements OnInit {
removeLayerFilter(layerIndex: number, filterIndex: number) {
this.gadgetsEditdata.drilldownLayers[layerIndex].filters.splice(filterIndex, 1);
}
+
+ // Add method to open common filter modal
+ openCommonFilterModal() {
+ this.commonFilterModalOpen = true;
+ }
+
+ // Add method to add a common filter
+ addCommonFilter() {
+ const newFilter = {
+ field: '',
+ value: ''
+ };
+ this.commonFilterData.filters.push(newFilter);
+ }
+
+ // Add method to remove a common filter
+ removeCommonFilter(index: number) {
+ this.commonFilterData.filters.splice(index, 1);
+ }
+
+ // Add method to refresh common filter columns
+ refreshCommonFilterColumns() {
+ if (this.commonFilterData.apiUrl) {
+ const connectionId = this.commonFilterData.connection ? parseInt(this.commonFilterData.connection, 10) : undefined;
+ this.alertService.getColumnfromurl(this.commonFilterData.apiUrl, connectionId).subscribe(data => {
+ console.log('Common filter column data:', data);
+ this.commonFilterColumnData = data;
+ }, (error) => {
+ console.log('Error fetching common filter columns:', error);
+ this.commonFilterColumnData = [];
+ });
+ }
+ }
+
+ // Add method to save common filter
+ saveCommonFilter() {
+ // Here we would typically make an API call to save the common filter
+ // For now, we'll just close the modal
+ console.log('Saving common filter:', this.commonFilterData);
+
+ // Update all charts that have common filter enabled
+ this.updateChartsWithCommonFilter();
+
+ this.commonFilterModalOpen = false;
+ }
+
+ // Add method to update charts with common filter data
+ updateChartsWithCommonFilter() {
+ // This method will be called when common filter is saved
+ // It will update all charts that have common filter enabled
+ console.log('Updating charts with common filter data');
+
+ // Update the dashboardArray to reflect changes
+ this.dashboardArray = this.dashboardArray.map(item => {
+ if (item.commonFilterEnabled) {
+ // Update the chart with common filter data
+ return {
+ ...item,
+ table: this.commonFilterData.apiUrl,
+ connection: this.commonFilterData.connection,
+ baseFilters: [...this.commonFilterData.filters]
+ };
+ }
+ return item;
+ });
+
+ // Also update the dashboardCollection to persist changes
+ this.dashboardCollection.dashboard = this.dashboardCollection.dashboard.map(item => {
+ if (item.commonFilterEnabled) {
+ // Update the chart with common filter data
+ return {
+ ...item,
+ table: this.commonFilterData.apiUrl,
+ connection: this.commonFilterData.connection,
+ baseFilters: [...this.commonFilterData.filters]
+ } as DashboardContentModel;
+ }
+ return item;
+ });
+ }
+
+ // Add method to handle common filter toggle
+ onCommonFilterToggle() {
+ console.log('Common filter toggled:', this.gadgetsEditdata.commonFilterEnabled);
+
+ if (this.gadgetsEditdata.commonFilterEnabled) {
+ // When enabling common filter, save current values and apply common filter data
+ this.gadgetsEditdata.table = this.commonFilterData.apiUrl;
+ this.gadgetsEditdata.connection = this.commonFilterData.connection;
+ this.gadgetsEditdata.baseFilters = [...this.commonFilterData.filters];
+ }
+ // When disabling, the user can edit the filters normally
+ }
}
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/bar-chart/bar-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/bar-chart/bar-chart.component.ts
index aed77dc..ee9938d 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/bar-chart/bar-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/bar-chart/bar-chart.component.ts
@@ -320,7 +320,7 @@ export class BarChartComponent implements OnInit, OnChanges, OnDestroy {
drilldownConfig.apiUrl, 'bar',
this.drilldownXAxis, this.drilldownYAxis,
this.connection,
- parameterField, parameterValue,
+ '', parameterValue,
drilldownFilterParams
).subscribe(
(data: any) => {
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/bubble-chart/bubble-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/bubble-chart/bubble-chart.component.ts
index c231cea..d23e208 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/bubble-chart/bubble-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/bubble-chart/bubble-chart.component.ts
@@ -307,32 +307,13 @@ export class BubbleChartComponent implements OnInit, OnChanges {
}
}
- // Convert drilldownFilters to filter parameters for drilldown level
- let drilldownFilterParams = '';
- if (this.drilldownFilters && this.drilldownFilters.length > 0) {
- const filterObj = {};
- this.drilldownFilters.forEach(filter => {
- if (filter.field && filter.value) {
- filterObj[filter.field] = filter.value;
- }
- });
- if (Object.keys(filterObj).length > 0) {
- drilldownFilterParams = JSON.stringify(filterObj);
- }
- }
- console.log('Drilldown filter parameters:', drilldownFilterParams);
-
- // Use drilldown filters if available, otherwise use layer filters
- const finalFilterParams = drilldownFilterParams || filterParams;
- console.log('Final filter parameters:', finalFilterParams);
-
// Log the URL that will be called
const url = `chart/getdashjson/bubble?tableName=${actualApiUrl}&xAxis=${drilldownConfig.xAxis}&yAxes=${drilldownConfig.yAxis}${this.connection ? `&sureId=${this.connection}` : ''}`;
console.log('Drilldown data URL:', url);
// Fetch data from the dashboard service with parameter field and value
// Backend handles filtering, we just pass the parameter field and value
- this.dashboardService.getChartData(actualApiUrl, 'bubble', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, finalFilterParams).subscribe(
+ this.dashboardService.getChartData(actualApiUrl, 'bubble', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, filterParams).subscribe(
(data: any) => {
console.log('Received drilldown data:', data);
if (data === null) {
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/doughnut-chart/doughnut-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/doughnut-chart/doughnut-chart.component.ts
index 9ca6a50..6582acc 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/doughnut-chart/doughnut-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/doughnut-chart/doughnut-chart.component.ts
@@ -402,32 +402,13 @@ export class DoughnutChartComponent implements OnInit, OnChanges, AfterViewCheck
}
}
- // Convert drilldownFilters to filter parameters for drilldown level
- let drilldownFilterParams = '';
- if (this.drilldownFilters && this.drilldownFilters.length > 0) {
- const filterObj = {};
- this.drilldownFilters.forEach(filter => {
- if (filter.field && filter.value) {
- filterObj[filter.field] = filter.value;
- }
- });
- if (Object.keys(filterObj).length > 0) {
- drilldownFilterParams = JSON.stringify(filterObj);
- }
- }
- console.log('Drilldown filter parameters:', drilldownFilterParams);
-
- // Use drilldown filters if available, otherwise use layer filters
- const finalFilterParams = drilldownFilterParams || filterParams;
- console.log('Final filter parameters:', finalFilterParams);
-
// Log the URL that will be called
const url = `chart/getdashjson/doughnut?tableName=${actualApiUrl}&xAxis=${drilldownConfig.xAxis}&yAxes=${drilldownConfig.yAxis}${this.connection ? `&sureId=${this.connection}` : ''}`;
console.log('Drilldown data URL:', url);
// Fetch data from the dashboard service with parameter field and value
// Backend handles filtering, we just pass the parameter field and value
- this.dashboardService.getChartData(actualApiUrl, 'doughnut', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, finalFilterParams).subscribe(
+ this.dashboardService.getChartData(actualApiUrl, 'doughnut', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, filterParams).subscribe(
(data: any) => {
console.log('Received drilldown data:', data);
if (data === null) {
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/dynamic-chart/dynamic-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/dynamic-chart/dynamic-chart.component.ts
index b567bd5..a7523e2 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/dynamic-chart/dynamic-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/dynamic-chart/dynamic-chart.component.ts
@@ -298,32 +298,13 @@ export class DynamicChartComponent implements OnInit, OnChanges {
}
}
- // Convert drilldownFilters to filter parameters for drilldown level
- let drilldownFilterParams = '';
- if (this.drilldownFilters && this.drilldownFilters.length > 0) {
- const filterObj = {};
- this.drilldownFilters.forEach(filter => {
- if (filter.field && filter.value) {
- filterObj[filter.field] = filter.value;
- }
- });
- if (Object.keys(filterObj).length > 0) {
- drilldownFilterParams = JSON.stringify(filterObj);
- }
- }
- console.log('Drilldown filter parameters:', drilldownFilterParams);
-
- // Use drilldown filters if available, otherwise use layer filters
- const finalFilterParams = drilldownFilterParams || filterParams;
- console.log('Final filter parameters:', finalFilterParams);
-
// Log the URL that will be called
const url = `chart/getdashjson/dynamic?tableName=${actualApiUrl}&xAxis=${drilldownConfig.xAxis}&yAxes=${drilldownConfig.yAxis}${this.connection ? `&sureId=${this.connection}` : ''}`;
console.log('Drilldown data URL:', url);
// Fetch data from the dashboard service with parameter field and value
// Backend handles filtering, we just pass the parameter field and value
- this.dashboardService.getChartData(actualApiUrl, 'dynamic', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, finalFilterParams).subscribe(
+ this.dashboardService.getChartData(actualApiUrl, 'dynamic', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, filterParams).subscribe(
(data: any) => {
console.log('Received drilldown data:', data);
if (data === null) {
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/financial-chart/financial-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/financial-chart/financial-chart.component.ts
index adcbf29..7c11055 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/financial-chart/financial-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/financial-chart/financial-chart.component.ts
@@ -289,32 +289,13 @@ export class FinancialChartComponent implements OnInit, OnChanges {
}
}
- // Convert drilldownFilters to filter parameters for drilldown level
- let drilldownFilterParams = '';
- if (this.drilldownFilters && this.drilldownFilters.length > 0) {
- const filterObj = {};
- this.drilldownFilters.forEach(filter => {
- if (filter.field && filter.value) {
- filterObj[filter.field] = filter.value;
- }
- });
- if (Object.keys(filterObj).length > 0) {
- drilldownFilterParams = JSON.stringify(filterObj);
- }
- }
- console.log('Drilldown filter parameters:', drilldownFilterParams);
-
- // Use drilldown filters if available, otherwise use layer filters
- const finalFilterParams = drilldownFilterParams || filterParams;
- console.log('Final filter parameters:', finalFilterParams);
-
// Log the URL that will be called
const url = `chart/getdashjson/financial?tableName=${actualApiUrl}&xAxis=${drilldownConfig.xAxis}&yAxes=${drilldownConfig.yAxis}${this.connection ? `&sureId=${this.connection}` : ''}`;
console.log('Drilldown data URL:', url);
// Fetch data from the dashboard service with parameter field and value
// Backend handles filtering, we just pass the parameter field and value
- this.dashboardService.getChartData(actualApiUrl, 'financial', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, finalFilterParams).subscribe(
+ this.dashboardService.getChartData(actualApiUrl, 'financial', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, filterParams).subscribe(
(data: any) => {
console.log('Received drilldown data:', data);
if (data === null) {
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/line-chart/line-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/line-chart/line-chart.component.ts
index 4315b6c..92b8826 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/line-chart/line-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/line-chart/line-chart.component.ts
@@ -313,32 +313,13 @@ export class LineChartComponent implements OnInit, OnChanges {
}
}
- // Convert drilldownFilters to filter parameters for drilldown level
- let drilldownFilterParams = '';
- if (this.drilldownFilters && this.drilldownFilters.length > 0) {
- const filterObj = {};
- this.drilldownFilters.forEach(filter => {
- if (filter.field && filter.value) {
- filterObj[filter.field] = filter.value;
- }
- });
- if (Object.keys(filterObj).length > 0) {
- drilldownFilterParams = JSON.stringify(filterObj);
- }
- }
- console.log('Drilldown filter parameters:', drilldownFilterParams);
-
- // Use drilldown filters if available, otherwise use layer filters
- const finalFilterParams = drilldownFilterParams || filterParams;
- console.log('Final filter parameters:', finalFilterParams);
-
// Log the URL that will be called
const url = `chart/getdashjson/line?tableName=${actualApiUrl}&xAxis=${drilldownConfig.xAxis}&yAxes=${drilldownConfig.yAxis}${this.connection ? `&sureId=${this.connection}` : ''}`;
console.log('Drilldown data URL:', url);
// Fetch data from the dashboard service with parameter field and value
// Backend handles filtering, we just pass the parameter field and value
- this.dashboardService.getChartData(actualApiUrl, 'line', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, finalFilterParams).subscribe(
+ this.dashboardService.getChartData(actualApiUrl, 'line', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, filterParams).subscribe(
(data: any) => {
console.log('Received drilldown data:', data);
if (data === null) {
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/pie-chart/pie-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/pie-chart/pie-chart.component.ts
index 6a09c89..523feb4 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/pie-chart/pie-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/pie-chart/pie-chart.component.ts
@@ -362,32 +362,13 @@ export class PieChartComponent implements OnInit, OnChanges, AfterViewChecked {
}
}
- // Convert drilldownFilters to filter parameters for drilldown level
- let drilldownFilterParams = '';
- if (this.drilldownFilters && this.drilldownFilters.length > 0) {
- const filterObj = {};
- this.drilldownFilters.forEach(filter => {
- if (filter.field && filter.value) {
- filterObj[filter.field] = filter.value;
- }
- });
- if (Object.keys(filterObj).length > 0) {
- drilldownFilterParams = JSON.stringify(filterObj);
- }
- }
- console.log('Drilldown filter parameters:', drilldownFilterParams);
-
- // Use drilldown filters if available, otherwise use layer filters
- const finalFilterParams = drilldownFilterParams || filterParams;
- console.log('Final filter parameters:', finalFilterParams);
-
// Log the URL that will be called
const url = `chart/getdashjson/pie?tableName=${actualApiUrl}&xAxis=${drilldownConfig.xAxis}&yAxes=${drilldownConfig.yAxis}${this.connection ? `&sureId=${this.connection}` : ''}`;
console.log('Drilldown data URL:', url);
// Fetch data from the dashboard service with parameter field and value
// Backend handles filtering, we just pass the parameter field and value
- this.dashboardService.getChartData(actualApiUrl, 'pie', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, finalFilterParams).subscribe(
+ this.dashboardService.getChartData(actualApiUrl, 'pie', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, filterParams).subscribe(
(data: any) => {
console.log('Received drilldown data:', data);
if (data === null) {
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/polar-chart/polar-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/polar-chart/polar-chart.component.ts
index a592fb9..871b8c2 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/polar-chart/polar-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/polar-chart/polar-chart.component.ts
@@ -1,13 +1,12 @@
-import { Component, Input, OnInit, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
-import { Dashboard3Service } from '../../../../../../services/builder/dashboard3.service';
-import { Subscription } from 'rxjs';
+import { Component, OnInit, Input, OnChanges, SimpleChanges } from '@angular/core';
+import { Dashboard3Service } from 'src/app/services/builder/dashboard3.service';
@Component({
selector: 'app-polar-chart',
templateUrl: './polar-chart.component.html',
styleUrls: ['./polar-chart.component.scss']
})
-export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
+export class PolarChartComponent implements OnInit, OnChanges {
@Input() xAxis: string;
@Input() yAxis: string | string[];
@Input() table: string;
@@ -36,24 +35,6 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
constructor(private dashboardService: Dashboard3Service) { }
- public polarAreaChartLabels: string[] = [ 'Download Sales', 'In-Store Sales', 'Mail Sales', 'Telesales', 'Corporate Sales' ];
- public polarAreaChartData: any = [
- { data: [ 300, 500, 100, 40, 120 ], label: 'Series 1'}
- ];
- public polarAreaChartType: string = 'polarArea';
-
- // Multi-layer drilldown state tracking
- drilldownStack: any[] = []; // Stack to track drilldown navigation history
- currentDrilldownLevel: number = 0; // Current drilldown level (0 = base level)
- originalPolarAreaChartLabels: string[] = [];
- originalPolarAreaChartData: any = [];
-
- // No data state
- noDataAvailable: boolean = false;
-
- // Flag to prevent infinite loops
- private isFetchingData: boolean = false;
-
ngOnInit(): void {
// Initialize with default data
this.fetchChartData();
@@ -84,7 +65,26 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
this.fetchChartData();
}
}
+
+ public polarAreaChartLabels: string[] = [ 'Download Sales', 'In-Store Sales', 'Mail Sales', 'Telesales', 'Corporate Sales' ];
+ public polarAreaChartData: any = [
+ { data: [ 300, 500, 100, 40, 120 ], label: 'Series 1'}
+ ];
+ public polarAreaChartType: string = 'polarArea';
+
+ // Multi-layer drilldown state tracking
+ drilldownStack: any[] = []; // Stack to track drilldown navigation history
+ currentDrilldownLevel: number = 0; // Current drilldown level (0 = base level)
+ originalPolarAreaChartLabels: string[] = [];
+ originalPolarAreaChartData: any = [];
+
+ // No data state
+ noDataAvailable: boolean = false;
+
+ // Flag to prevent infinite loops
+ private isFetchingData: boolean = false;
+
fetchChartData(): void {
// Set flag to prevent recursive calls
this.isFetchingData = true;
@@ -133,8 +133,6 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
this.noDataAvailable = true;
this.polarAreaChartLabels = [];
this.polarAreaChartData = [];
- // Validate and sanitize data to show default data
- this.validateChartData();
// Reset flag after fetching
this.isFetchingData = false;
return;
@@ -145,36 +143,26 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
// For polar charts, we need to extract the data differently
// The first dataset's data array contains the values for the polar chart
this.noDataAvailable = data.chartLabels.length === 0;
- this.polarAreaChartLabels = data.chartLabels || [];
+ this.polarAreaChartLabels = data.chartLabels;
if (data.chartData && data.chartData.length > 0) {
this.polarAreaChartData = data.chartData[0].data.map(value => {
// Convert to number if it's not already
- const numValue = Number(value);
- return isNaN(numValue) ? 0 : numValue;
+ return isNaN(Number(value)) ? 0 : Number(value);
});
} else {
this.polarAreaChartData = [];
}
- // Ensure labels and data arrays have the same length
- this.syncLabelAndDataArrays();
- // Validate and sanitize data
- this.validateChartData();
// Trigger change detection
this.polarAreaChartData = [...this.polarAreaChartData];
console.log('Updated polar chart with data:', { labels: this.polarAreaChartLabels, data: this.polarAreaChartData });
} else if (data && data.labels && data.data) {
// Handle the original expected format as fallback
this.noDataAvailable = data.labels.length === 0;
- this.polarAreaChartLabels = data.labels || [];
+ this.polarAreaChartLabels = data.labels;
this.polarAreaChartData = data.data.map(value => {
// Convert to number if it's not already
- const numValue = Number(value);
- return isNaN(numValue) ? 0 : numValue;
+ return isNaN(Number(value)) ? 0 : Number(value);
});
- // Ensure labels and data arrays have the same length
- this.syncLabelAndDataArrays();
- // Validate and sanitize data
- this.validateChartData();
// Trigger change detection
this.polarAreaChartData = [...this.polarAreaChartData];
console.log('Updated polar chart with legacy data format:', { labels: this.polarAreaChartLabels, data: this.polarAreaChartData });
@@ -183,8 +171,6 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
this.noDataAvailable = true;
this.polarAreaChartLabels = [];
this.polarAreaChartData = [];
- // Validate and sanitize data
- this.validateChartData();
}
// Reset flag after fetching
this.isFetchingData = false;
@@ -194,8 +180,6 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
this.noDataAvailable = true;
this.polarAreaChartLabels = [];
this.polarAreaChartData = [];
- // Validate and sanitize data to show default data
- this.validateChartData();
// Reset flag after fetching
this.isFetchingData = false;
// Keep default data in case of error
@@ -206,8 +190,6 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
this.noDataAvailable = true;
this.polarAreaChartLabels = [];
this.polarAreaChartData = [];
- // Validate and sanitize data to show default data
- this.validateChartData();
// Reset flag after fetching
this.isFetchingData = false;
}
@@ -305,32 +287,13 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
}
}
- // Convert drilldownFilters to filter parameters for drilldown level
- let drilldownFilterParams = '';
- if (this.drilldownFilters && this.drilldownFilters.length > 0) {
- const filterObj = {};
- this.drilldownFilters.forEach(filter => {
- if (filter.field && filter.value) {
- filterObj[filter.field] = filter.value;
- }
- });
- if (Object.keys(filterObj).length > 0) {
- drilldownFilterParams = JSON.stringify(filterObj);
- }
- }
- console.log('Drilldown filter parameters:', drilldownFilterParams);
-
- // Use drilldown filters if available, otherwise use layer filters
- const finalFilterParams = drilldownFilterParams || filterParams;
- console.log('Final filter parameters:', finalFilterParams);
-
// Log the URL that will be called
const url = `chart/getdashjson/polar?tableName=${actualApiUrl}&xAxis=${drilldownConfig.xAxis}&yAxes=${drilldownConfig.yAxis}${this.connection ? `&sureId=${this.connection}` : ''}`;
console.log('Drilldown data URL:', url);
// Fetch data from the dashboard service with parameter field and value
// Backend handles filtering, we just pass the parameter field and value
- this.dashboardService.getChartData(actualApiUrl, 'polar', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, finalFilterParams).subscribe(
+ this.dashboardService.getChartData(actualApiUrl, 'polar', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, filterParams).subscribe(
(data: any) => {
console.log('Received drilldown data:', data);
if (data === null) {
@@ -346,36 +309,26 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
// For polar charts, we need to extract the data differently
// The first dataset's data array contains the values for the polar chart
this.noDataAvailable = data.chartLabels.length === 0;
- this.polarAreaChartLabels = data.chartLabels || [];
+ this.polarAreaChartLabels = data.chartLabels;
if (data.chartData && data.chartData.length > 0) {
this.polarAreaChartData = data.chartData[0].data.map(value => {
// Convert to number if it's not already
- const numValue = Number(value);
- return isNaN(numValue) ? 0 : numValue;
+ return isNaN(Number(value)) ? 0 : Number(value);
});
} else {
this.polarAreaChartData = [];
}
- // Ensure labels and data arrays have the same length
- this.syncLabelAndDataArrays();
- // Validate and sanitize data
- this.validateChartData();
// Trigger change detection
this.polarAreaChartData = [...this.polarAreaChartData];
console.log('Updated polar chart with drilldown data:', { labels: this.polarAreaChartLabels, data: this.polarAreaChartData });
} else if (data && data.labels && data.data) {
// Handle the original expected format as fallback
this.noDataAvailable = data.labels.length === 0;
- this.polarAreaChartLabels = data.labels || [];
+ this.polarAreaChartLabels = data.labels;
this.polarAreaChartData = data.data.map(value => {
// Convert to number if it's not already
- const numValue = Number(value);
- return isNaN(numValue) ? 0 : numValue;
+ return isNaN(Number(value)) ? 0 : Number(value);
});
- // Ensure labels and data arrays have the same length
- this.syncLabelAndDataArrays();
- // Validate and sanitize data
- this.validateChartData();
// Trigger change detection
this.polarAreaChartData = [...this.polarAreaChartData];
console.log('Updated polar chart with drilldown legacy data format:', { labels: this.polarAreaChartLabels, data: this.polarAreaChartData });
@@ -384,8 +337,6 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
this.noDataAvailable = true;
this.polarAreaChartLabels = [];
this.polarAreaChartData = [];
- // Validate and sanitize data
- this.validateChartData();
}
},
(error) => {
@@ -454,58 +405,6 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
}
}
- /**
- * Validate and sanitize chart data
- */
- private validateChartData(): void {
- // Ensure we have valid arrays
- if (!Array.isArray(this.polarAreaChartLabels)) {
- this.polarAreaChartLabels = [];
- }
-
- if (!Array.isArray(this.polarAreaChartData)) {
- this.polarAreaChartData = [];
- }
-
- // If we have no data, show default data
- if (this.polarAreaChartLabels.length === 0 && this.polarAreaChartData.length === 0) {
- // Add default data to ensure chart visibility
- this.polarAreaChartLabels = ['Download Sales', 'In-Store Sales', 'Mail Sales', 'Telesales', 'Corporate Sales'];
- this.polarAreaChartData = [300, 500, 100, 40, 120];
- }
-
- // Ensure we have matching arrays
- if (this.polarAreaChartLabels.length !== this.polarAreaChartData.length) {
- const maxLength = Math.max(this.polarAreaChartLabels.length, this.polarAreaChartData.length);
- while (this.polarAreaChartLabels.length < maxLength) {
- this.polarAreaChartLabels.push(`Label ${this.polarAreaChartLabels.length + 1}`);
- }
- while (this.polarAreaChartData.length < maxLength) {
- this.polarAreaChartData.push(0);
- }
- }
- }
-
- // Ensure labels and data arrays have the same length
- private syncLabelAndDataArrays(): void {
- if (this.polarAreaChartLabels && this.polarAreaChartData) {
- const labelCount = this.polarAreaChartLabels.length;
- const dataCount = this.polarAreaChartData.length;
-
- if (labelCount > dataCount) {
- // Add zeros to data array
- while (this.polarAreaChartData.length < labelCount) {
- this.polarAreaChartData.push(0);
- }
- } else if (dataCount > labelCount) {
- // Add labels to label array
- while (this.polarAreaChartLabels.length < dataCount) {
- this.polarAreaChartLabels.push(`Item ${this.polarAreaChartLabels.length + 1}`);
- }
- }
- }
- }
-
// events
public chartClicked(e: any): void {
console.log('Polar chart clicked:', e);
@@ -594,8 +493,4 @@ export class PolarChartComponent implements OnInit, OnChanges, OnDestroy {
public chartHovered(e: any): void {
console.log(e);
}
-
- ngOnDestroy(): void {
- // Clean up any subscriptions if needed
- }
}
\ No newline at end of file
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/radar-chart/radar-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/radar-chart/radar-chart.component.ts
index cd5d1e6..f470aed 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/radar-chart/radar-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/radar-chart/radar-chart.component.ts
@@ -298,32 +298,13 @@ export class RadarChartComponent implements OnInit, OnChanges {
}
}
- // Convert drilldownFilters to filter parameters for drilldown level
- let drilldownFilterParams = '';
- if (this.drilldownFilters && this.drilldownFilters.length > 0) {
- const filterObj = {};
- this.drilldownFilters.forEach(filter => {
- if (filter.field && filter.value) {
- filterObj[filter.field] = filter.value;
- }
- });
- if (Object.keys(filterObj).length > 0) {
- drilldownFilterParams = JSON.stringify(filterObj);
- }
- }
- console.log('Drilldown filter parameters:', drilldownFilterParams);
-
- // Use drilldown filters if available, otherwise use layer filters
- const finalFilterParams = drilldownFilterParams || filterParams;
- console.log('Final filter parameters:', finalFilterParams);
-
// Log the URL that will be called
const url = `chart/getdashjson/radar?tableName=${actualApiUrl}&xAxis=${drilldownConfig.xAxis}&yAxes=${drilldownConfig.yAxis}${this.connection ? `&sureId=${this.connection}` : ''}`;
console.log('Drilldown data URL:', url);
// Fetch data from the dashboard service with parameter field and value
// Backend handles filtering, we just pass the parameter field and value
- this.dashboardService.getChartData(actualApiUrl, 'radar', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, finalFilterParams).subscribe(
+ this.dashboardService.getChartData(actualApiUrl, 'radar', drilldownConfig.xAxis, drilldownConfig.yAxis, this.connection, parameterField, parameterValue, filterParams).subscribe(
(data: any) => {
console.log('Received drilldown data:', data);
if (data === null) {
diff --git a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/scatter-chart/scatter-chart.component.ts b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/scatter-chart/scatter-chart.component.ts
index 90b5857..9cac735 100644
--- a/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/scatter-chart/scatter-chart.component.ts
+++ b/frontend/angular-clarity-master/src/app/modules/main/builder/dashboardnew/gadgets/scatter-chart/scatter-chart.component.ts
@@ -515,4 +515,4 @@ export class ScatterChartComponent implements OnInit, OnChanges {
public chartHovered(e: any): void {
console.log(e);
}
-}
\ No newline at end of file
+}