-
+
+
+
+
+
+
+
+ Available: {{ filter.availableValues }}
+
+
+
+
+
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 f2e600e..5190c2b 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
@@ -597,6 +597,7 @@ export class EditnewdashComponent implements OnInit {
}
modelid: number;
+ // Update the editGadget method to initialize filter properties
editGadget(item) {
this.modeledit = true;
this.modelid = item.chartid;
@@ -639,6 +640,65 @@ export class EditnewdashComponent implements OnInit {
this.filterOptionsString = '';
}
+ // Initialize base filters with type and options if not present
+ if (item['baseFilters'] === undefined) {
+ this.gadgetsEditdata['baseFilters'] = [];
+ } else {
+ // Ensure each base filter has type and options properties
+ this.gadgetsEditdata['baseFilters'] = this.gadgetsEditdata['baseFilters'].map(filter => ({
+ field: filter.field || '',
+ value: filter.value || '',
+ type: filter.type || 'text',
+ options: filter.options || '',
+ availableValues: filter.availableValues || ''
+ }));
+ }
+
+ // Initialize drilldown filters with type and options if not present
+ if (item['drilldownFilters'] === undefined) {
+ this.gadgetsEditdata['drilldownFilters'] = [];
+ } else {
+ // Ensure each drilldown filter has type and options properties
+ this.gadgetsEditdata['drilldownFilters'] = this.gadgetsEditdata['drilldownFilters'].map(filter => ({
+ field: filter.field || '',
+ value: filter.value || '',
+ type: filter.type || 'text',
+ options: filter.options || '',
+ availableValues: filter.availableValues || ''
+ }));
+ }
+
+ // Initialize drilldown layers with proper filter structure if not present
+ if (item['drilldownLayers'] === undefined) {
+ this.gadgetsEditdata['drilldownLayers'] = [];
+ } else {
+ // Ensure each layer has proper filter structure
+ this.gadgetsEditdata['drilldownLayers'] = this.gadgetsEditdata['drilldownLayers'].map(layer => {
+ // Initialize parameter if not present
+ if (layer['parameter'] === undefined) {
+ layer['parameter'] = '';
+ }
+ // Initialize filters if not present
+ if (layer['filters'] === undefined) {
+ layer['filters'] = [];
+ } else {
+ // Ensure each layer filter has type and options properties
+ layer['filters'] = layer['filters'].map(filter => ({
+ field: filter.field || '',
+ value: filter.value || '',
+ type: filter.type || 'text',
+ options: filter.options || '',
+ availableValues: filter.availableValues || ''
+ }));
+ }
+ // Initialize common filter property for layer if not present
+ if (layer['commonFilterEnabled'] === undefined) {
+ layer['commonFilterEnabled'] = false;
+ }
+ return layer;
+ });
+ }
+
this.getStores();
// Set default connection if none is set and we have connections
@@ -666,37 +726,6 @@ export class EditnewdashComponent implements OnInit {
this.gadgetsEditdata['drilldownParameter'] = '';
}
- // Initialize base filters if not present
- if (item['baseFilters'] === undefined) {
- this.gadgetsEditdata['baseFilters'] = [];
- }
-
- // Initialize drilldown filters if not present
- if (item['drilldownFilters'] === undefined) {
- this.gadgetsEditdata['drilldownFilters'] = [];
- }
-
- // Initialize drilldown layers if not present
- if (item['drilldownLayers'] === undefined) {
- this.gadgetsEditdata['drilldownLayers'] = [];
- } else {
- // Ensure each layer has proper structure (removed parameterKey, added parameter)
- this.gadgetsEditdata['drilldownLayers'].forEach((layer, index) => {
- // Initialize parameter if not present
- if (layer['parameter'] === undefined) {
- layer['parameter'] = '';
- }
- // Initialize filters if not present
- if (layer['filters'] === undefined) {
- layer['filters'] = [];
- }
- // Initialize common filter property for layer if not present
- if (layer['commonFilterEnabled'] === undefined) {
- layer['commonFilterEnabled'] = false;
- }
- });
- }
-
// Reset drilldown column data
this.drilldownColumnData = [];
@@ -784,6 +813,7 @@ export class EditnewdashComponent implements OnInit {
// }
}
+ // Update the onSubmit method to properly save filter data
onSubmit(id) {
console.log(id);
if (!isNullArray(this.selectedyAxis)) {
@@ -978,8 +1008,8 @@ export class EditnewdashComponent implements OnInit {
drilldownXAxis: item['drilldownXAxis'],
drilldownYAxis: item['drilldownYAxis'],
drilldownParameter: item['drilldownParameter'], // Add drilldown parameter
- baseFilters: item['baseFilters'] || [], // Add base filters
- drilldownFilters: item['drilldownFilters'] || [], // Add drilldown filters
+ baseFilters: item['baseFilters'] || [], // Add base filters with type information
+ drilldownFilters: item['drilldownFilters'] || [], // Add drilldown filters with type information
// Multi-layer drilldown configurations
drilldownLayers: item['drilldownLayers'] || []
};
@@ -994,6 +1024,7 @@ export class EditnewdashComponent implements OnInit {
return chartInputs;
}
+ // Update the applyChanges method to properly save filter data
applyChanges(id) {
console.log('Apply changes for chart ID:', id);
@@ -1293,46 +1324,239 @@ export class EditnewdashComponent implements OnInit {
// We're now using removeBaseFilter and removeLayerFilter methods instead
}
- // Add method to add a base filter
+ // Add method to handle base filter field change
+ onBaseFilterFieldChange(index: number, field: string) {
+ const filter = this.gadgetsEditdata.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.gadgetsEditdata.table) {
+ this.loadFilterValuesForField(
+ this.gadgetsEditdata.table,
+ this.gadgetsEditdata.connection,
+ field,
+ index,
+ 'base'
+ );
+ }
+ }
+ }
+
+ // Add method to handle base filter type change
+ onBaseFilterTypeChange(index: number, type: string) {
+ const filter = this.gadgetsEditdata.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.gadgetsEditdata.table) {
+ this.loadFilterValuesForField(
+ this.gadgetsEditdata.table,
+ this.gadgetsEditdata.connection,
+ filter.field,
+ index,
+ 'base'
+ );
+ }
+ }
+ }
+
+ // Add method to handle drilldown filter field change
+ onDrilldownFilterFieldChange(index: number, field: string) {
+ const filter = this.gadgetsEditdata.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.gadgetsEditdata.drilldownApiUrl) {
+ this.loadFilterValuesForField(
+ this.gadgetsEditdata.drilldownApiUrl,
+ this.gadgetsEditdata.connection,
+ field,
+ index,
+ 'drilldown'
+ );
+ }
+ }
+ }
+
+ // Add method to handle drilldown filter type change
+ onDrilldownFilterTypeChange(index: number, type: string) {
+ const filter = this.gadgetsEditdata.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.gadgetsEditdata.drilldownApiUrl) {
+ this.loadFilterValuesForField(
+ this.gadgetsEditdata.drilldownApiUrl,
+ this.gadgetsEditdata.connection,
+ filter.field,
+ index,
+ 'drilldown'
+ );
+ }
+ }
+ }
+
+ // Add method to handle layer filter field change
+ onLayerFilterFieldChange(layerIndex: number, filterIndex: number, field: string) {
+ const layer = this.gadgetsEditdata.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) {
+ this.loadFilterValuesForField(
+ layer.apiUrl,
+ this.gadgetsEditdata.connection,
+ field,
+ filterIndex,
+ 'layer',
+ layerIndex
+ );
+ }
+ }
+ }
+ }
+
+ // Add method to handle layer filter type change
+ onLayerFilterTypeChange(layerIndex: number, filterIndex: number, type: string) {
+ const layer = this.gadgetsEditdata.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.gadgetsEditdata.connection,
+ filter.field,
+ filterIndex,
+ 'layer',
+ layerIndex
+ );
+ }
+ }
+ }
+ }
+
+ // Add method to load filter values for a specific field
+ loadFilterValuesForField(
+ apiUrl: string,
+ connectionId: string | undefined,
+ field: string,
+ filterIndex: number,
+ filterType: 'base' | 'drilldown' | 'layer',
+ layerIndex?: number
+ ) {
+ if (apiUrl && field) {
+ const connectionIdNum = connectionId ? parseInt(connectionId, 10) : undefined;
+ this.alertService.getValuesFromUrl(apiUrl, connectionIdNum, field).subscribe(
+ (values: string[]) => {
+ // Update the filter with available values
+ if (filterType === 'base') {
+ const filter = this.gadgetsEditdata.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.gadgetsEditdata.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.gadgetsEditdata.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);
+ }
+ );
+ }
+ }
+
+ // Add method to add a base filter with default properties
addBaseFilter() {
const newFilter = {
field: '',
- value: ''
+ value: '',
+ type: 'text',
+ options: '',
+ availableValues: ''
};
this.gadgetsEditdata.baseFilters.push(newFilter);
}
+
+ // Add method to add a drilldown filter with default properties
+ addDrilldownFilter() {
+ const newFilter = {
+ field: '',
+ value: '',
+ type: 'text',
+ options: '',
+ availableValues: ''
+ };
+ this.gadgetsEditdata.drilldownFilters.push(newFilter);
+ }
+
+ // Add method to add a layer filter with default properties
+ addLayerFilter(layerIndex: number) {
+ const newFilter = {
+ field: '',
+ value: '',
+ type: 'text',
+ options: '',
+ availableValues: ''
+ };
+ if (!this.gadgetsEditdata.drilldownLayers[layerIndex].filters) {
+ this.gadgetsEditdata.drilldownLayers[layerIndex].filters = [];
+ }
+ this.gadgetsEditdata.drilldownLayers[layerIndex].filters.push(newFilter);
+ }
// Add method to remove a base filter
removeBaseFilter(index: number) {
this.gadgetsEditdata.baseFilters.splice(index, 1);
}
- // Add method to add a drilldown filter
- addDrilldownFilter() {
- const newFilter = {
- field: '',
- value: ''
- };
- this.gadgetsEditdata.drilldownFilters.push(newFilter);
- }
-
// Add method to remove a drilldown filter
removeDrilldownFilter(index: number) {
this.gadgetsEditdata.drilldownFilters.splice(index, 1);
}
- // Add method to add a layer filter
- addLayerFilter(layerIndex: number) {
- const newFilter = {
- field: '',
- value: ''
- };
- if (!this.gadgetsEditdata.drilldownLayers[layerIndex].filters) {
- this.gadgetsEditdata.drilldownLayers[layerIndex].filters = [];
- }
- this.gadgetsEditdata.drilldownLayers[layerIndex].filters.push(newFilter);
- }
-
// Add method to remove a layer filter
removeLayerFilter(layerIndex: number, filterIndex: number) {
this.gadgetsEditdata.drilldownLayers[layerIndex].filters.splice(filterIndex, 1);