new
This commit is contained in:
		
							parent
							
								
									64752c0970
								
							
						
					
					
						commit
						16c83ec322
					
				| @ -54,6 +54,9 @@ | |||||||
|          |          | ||||||
|       <clr-dg-column [clrDgField]="'sure_connect_id'"> <ng-container *clrDgHideableColumn="{hidden: false}"> SureConnect |       <clr-dg-column [clrDgField]="'sure_connect_id'"> <ng-container *clrDgHideableColumn="{hidden: false}"> SureConnect | ||||||
|         </ng-container></clr-dg-column> |         </ng-container></clr-dg-column> | ||||||
|  |          | ||||||
|  |       <clr-dg-column [clrDgField]="'calculated_field_json'"> <ng-container *clrDgHideableColumn="{hidden: false}"> Calculated Fields | ||||||
|  |         </ng-container></clr-dg-column> | ||||||
| 
 | 
 | ||||||
|       <!-- who column --> |       <!-- who column --> | ||||||
|       <clr-dg-column> <ng-container *clrDgHideableColumn="{hidden: false}"> |       <clr-dg-column> <ng-container *clrDgHideableColumn="{hidden: false}"> | ||||||
| @ -82,8 +85,9 @@ | |||||||
| 
 | 
 | ||||||
|         <clr-dg-cell> |         <clr-dg-cell> | ||||||
|           <div style="display: flex; align-items: center; max-width: 200px;"> |           <div style="display: flex; align-items: center; max-width: 200px;"> | ||||||
|             <span style="margin-right: 8px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex-grow: 1;"  |             <span | ||||||
|                   title="{{user.url}}" (click)="showFullUrl(user.url)"> |               style="margin-right: 8px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex-grow: 1;" | ||||||
|  |               title="{{user.url}}" (click)="showFullUrl(user.url)"> | ||||||
|               {{user.url | slice:0:30}}{{user.url.length > 30 ? '...' : ''}} |               {{user.url | slice:0:30}}{{user.url.length > 30 ? '...' : ''}} | ||||||
|             </span> |             </span> | ||||||
|             <button class="btn btn-icon btn-sm" (click)="copyToClipboard(user.url)" title="Copy URL"> |             <button class="btn btn-icon btn-sm" (click)="copyToClipboard(user.url)" title="Copy URL"> | ||||||
| @ -93,7 +97,10 @@ | |||||||
|         </clr-dg-cell> |         </clr-dg-cell> | ||||||
|         <clr-dg-cell>{{user.batch_volume}}</clr-dg-cell> |         <clr-dg-cell>{{user.batch_volume}}</clr-dg-cell> | ||||||
|          |          | ||||||
|         <clr-dg-cell>{{getSureConnectNameById(user.sure_connect_id)}}</clr-dg-cell> |         <clr-dg-cell>{{user.sureconnect_name}}</clr-dg-cell> | ||||||
|  |          | ||||||
|  |         <clr-dg-cell (click)="goToReplaceStringjson(user.calculated_field_json)" style="cursor: pointer; align-items: center;"><clr-icon | ||||||
|  |             shape="details" *ngIf="user.calculated_field_json"></clr-icon></clr-dg-cell> | ||||||
| 
 | 
 | ||||||
|         <!-- who column --> |         <!-- who column --> | ||||||
|         <clr-dg-cell> |         <clr-dg-cell> | ||||||
| @ -114,6 +121,11 @@ | |||||||
|           <button class="btn btn-icon" (click)="updateJson(user.id)" title="Update JSON"> |           <button class="btn btn-icon" (click)="updateJson(user.id)" title="Update JSON"> | ||||||
|             <clr-icon shape="refresh"></clr-icon> |             <clr-icon shape="refresh"></clr-icon> | ||||||
|           </button> |           </button> | ||||||
|  | 
 | ||||||
|  |           <!-- Calculated Field button --> | ||||||
|  |           <button class="btn btn-icon" (click)="fetchAvailableKeys(user)" title="Create Calculated Field"> | ||||||
|  |             <clr-icon shape="calculator"></clr-icon> | ||||||
|  |           </button> | ||||||
|         </clr-dg-cell> |         </clr-dg-cell> | ||||||
| 
 | 
 | ||||||
|         <!-- who colmn --> |         <!-- who colmn --> | ||||||
| @ -256,7 +268,8 @@ | |||||||
|                       [style.color]="item.conditionValue ==  app[transform(item.fieldtext) ] ? item.conditiontextcolor : item.textcolor"> |                       [style.color]="item.conditionValue ==  app[transform(item.fieldtext) ] ? item.conditiontextcolor : item.textcolor"> | ||||||
|                       <img id="filePreview" [src]="item.imageURL" alt="File Preview" |                       <img id="filePreview" [src]="item.imageURL" alt="File Preview" | ||||||
|                         [style.width]="item.imagewidth !== '' ? item.imagewidth + 'px' : '100px'" |                         [style.width]="item.imagewidth !== '' ? item.imagewidth + 'px' : '100px'" | ||||||
|                         [style.height]="item.imagewidth !== '' ? item.imagewidth + 'px' : '100px'"></div> |                         [style.height]="item.imagewidth !== '' ? item.imagewidth + 'px' : '100px'"> | ||||||
|  |                     </div> | ||||||
|                   </div> |                   </div> | ||||||
|                 </ng-container> |                 </ng-container> | ||||||
|               </div> |               </div> | ||||||
| @ -292,17 +305,6 @@ | |||||||
|   <h3 class="modal-title">Update Data lake |   <h3 class="modal-title">Update Data lake | ||||||
|     <!--update button --> |     <!--update button --> | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   </h3> |   </h3> | ||||||
|   <div class="modal-body" *ngIf="rowSelected.id"> |   <div class="modal-body" *ngIf="rowSelected.id"> | ||||||
|     <h2 class="heading">{{rowSelected.id}}</h2> |     <h2 class="heading">{{rowSelected.id}}</h2> | ||||||
| @ -329,7 +331,9 @@ | |||||||
|         <div class="clr-col-sm-12"> |         <div class="clr-col-sm-12"> | ||||||
|           <label>cron job</label> |           <label>cron job</label> | ||||||
|           <input class="clr-input" type="text" [(ngModel)]="rowSelected.cron_job" name="cron_job" /> |           <input class="clr-input" type="text" [(ngModel)]="rowSelected.cron_job" name="cron_job" /> | ||||||
|           <app-cron-job-builder [cronExpression]="editCronExpression" (cronExpressionChange)="onEditCronExpressionChange($event)" instanceId="edit-form-{{rowSelected.id}}"></app-cron-job-builder> |           <app-cron-job-builder [cronExpression]="editCronExpression" | ||||||
|  |             (cronExpressionChange)="onEditCronExpressionChange($event)" | ||||||
|  |             instanceId="edit-form-{{rowSelected.id}}"></app-cron-job-builder> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <div class="clr-col-sm-12"> |         <div class="clr-col-sm-12"> | ||||||
| @ -347,28 +351,17 @@ | |||||||
|           <label>Batch Volume</label> |           <label>Batch Volume</label> | ||||||
|           <input class="clr-input" type="number" [(ngModel)]="rowSelected.batch_volume" name="batch_volume" /> |           <input class="clr-input" type="number" [(ngModel)]="rowSelected.batch_volume" name="batch_volume" /> | ||||||
|         </div> |         </div> | ||||||
|          | 
 | ||||||
|         <div class="clr-col-sm-12"> |         <div class="clr-col-sm-12"> | ||||||
|           <label>SureConnect</label> |           <label>SureConnect</label> | ||||||
|           <select class="clr-input" [(ngModel)]="rowSelected.sure_connect_id" name="sure_connect_id" (change)="onEditSureConnectChange($event)"> |           <select class="clr-input" [(ngModel)]="rowSelected.sure_connect_id" name="sure_connect_id"> | ||||||
|             <option value="">Select SureConnect</option> |             <option value="">Select SureConnect</option> | ||||||
|             <option *ngFor="let sureConnect of sureConnectList" [value]="sureConnect.id">{{sureConnect.name}}</option> |             <option *ngFor="let sureConnect of sureConnectList" [value]="sureConnect.id">{{sureConnect.connection_name}} | ||||||
|  |             </option> | ||||||
|           </select> |           </select> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|       </div> |       </div> | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       <!-- form code start --> |       <!-- form code start --> | ||||||
|       <div *ngIf="checkFormCode"> |       <div *ngIf="checkFormCode"> | ||||||
|         <h4 style="font-weight: 300;display: inline;">Extension</h4> |         <h4 style="font-weight: 300;display: inline;">Extension</h4> | ||||||
| @ -405,6 +398,9 @@ | |||||||
|     </form> |     </form> | ||||||
|   </div> |   </div> | ||||||
| </clr-modal> | </clr-modal> | ||||||
|  | 
 | ||||||
|  | <!-- DELETE FORM ..... --> | ||||||
|  | 
 | ||||||
| <clr-modal [(clrModalOpen)]="modaldelete" [clrModalSize]="'lg'" [clrModalStaticBackdrop]="true"> | <clr-modal [(clrModalOpen)]="modaldelete" [clrModalSize]="'lg'" [clrModalStaticBackdrop]="true"> | ||||||
|   <div class="modal-body" *ngIf="rowSelected.id"> |   <div class="modal-body" *ngIf="rowSelected.id"> | ||||||
|     <h1 class="delete">Are You Sure Want to delete?</h1> |     <h1 class="delete">Are You Sure Want to delete?</h1> | ||||||
| @ -415,21 +411,11 @@ | |||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| </clr-modal> | </clr-modal> | ||||||
|  | 
 | ||||||
| <!-- ADD FORM ..... --> | <!-- ADD FORM ..... --> | ||||||
| <clr-modal [(clrModalOpen)]="modalAdd" [clrModalSize]="'lg'" [clrModalStaticBackdrop]="true"> | <clr-modal [(clrModalOpen)]="modalAdd" [clrModalSize]="'lg'" [clrModalStaticBackdrop]="true"> | ||||||
|   <h3 class="modal-title">Add Data lake |   <h3 class="modal-title">Add Data lake | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     <!-- aeroplane icon --> |     <!-- aeroplane icon --> | ||||||
|             |             | ||||||
|     <a *ngIf="userrole?.includes('ADMIN')" style="float: right;" href="javascript:void(0)" role="tooltip" |     <a *ngIf="userrole?.includes('ADMIN')" style="float: right;" href="javascript:void(0)" role="tooltip" | ||||||
| @ -466,7 +452,8 @@ | |||||||
|         <div class="clr-col-sm-12"> |         <div class="clr-col-sm-12"> | ||||||
|           <label> cron job</label> |           <label> cron job</label> | ||||||
|           <input class="clr-input" type="text" formControlName="cron_job" /> |           <input class="clr-input" type="text" formControlName="cron_job" /> | ||||||
|           <app-cron-job-builder [cronExpression]="addCronExpression" (cronExpressionChange)="onAddCronExpressionChange($event)" instanceId="add-form"></app-cron-job-builder> |           <app-cron-job-builder [cronExpression]="addCronExpression" | ||||||
|  |             (cronExpressionChange)="onAddCronExpressionChange($event)" instanceId="add-form"></app-cron-job-builder> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
|         <div class="clr-col-sm-12"> |         <div class="clr-col-sm-12"> | ||||||
| @ -484,12 +471,13 @@ | |||||||
|           <label> Batch Volume</label> |           <label> Batch Volume</label> | ||||||
|           <input class="clr-input" type="number" formControlName="batch_volume" /> |           <input class="clr-input" type="number" formControlName="batch_volume" /> | ||||||
|         </div> |         </div> | ||||||
|          | 
 | ||||||
|         <div class="clr-col-sm-12"> |         <div class="clr-col-sm-12"> | ||||||
|           <label>SureConnect</label> |           <label>SureConnect</label> | ||||||
|           <select class="clr-input" formControlName="sure_connect_id" (change)="onAddSureConnectChange($event)"> |           <select  formControlName="sure_connect_id"> | ||||||
|             <option value="">Select SureConnect</option> |             <option value="">Select SureConnect</option> | ||||||
|             <option *ngFor="let sureConnect of sureConnectList" [value]="sureConnect.id">{{sureConnect.name}}</option> |             <option *ngFor="let sureConnect of sureConnectList" [value]="sureConnect.id">{{sureConnect.connection_name}} | ||||||
|  |             </option> | ||||||
|           </select> |           </select> | ||||||
|         </div> |         </div> | ||||||
| 
 | 
 | ||||||
| @ -528,6 +516,116 @@ | |||||||
|   </div> |   </div> | ||||||
| </clr-modal> | </clr-modal> | ||||||
| 
 | 
 | ||||||
|  | <!-- Calculated Field Modal --> | ||||||
|  | <clr-modal [(clrModalOpen)]="calculatedFieldModalOpen" [clrModalSize]="'lg'" [clrModalStaticBackdrop]="true"> | ||||||
|  |   <h3 class="modal-title">Create Calculated Field</h3> | ||||||
|  |   <div class="modal-body"> | ||||||
|  |     <form [formGroup]="calculatedFieldForm"> | ||||||
|  |       <div class="clr-row"> | ||||||
|  |         <div class="clr-col-12"> | ||||||
|  |           <h4>Available Keys from API:</h4> | ||||||
|  |           <ul> | ||||||
|  |             <li *ngFor="let key of availableKeys">{{ key }}</li> | ||||||
|  |           </ul> | ||||||
|  |         </div> | ||||||
|  | 
 | ||||||
|  |         <div class="clr-col-12"> | ||||||
|  |           <label>Calculated Field Name</label> | ||||||
|  |           <input class="clr-input" type="text" formControlName="fieldName" placeholder="Enter field name" /> | ||||||
|  |         </div> | ||||||
|  | 
 | ||||||
|  |         <div class="clr-col-12"> | ||||||
|  |           <label>Operation</label> | ||||||
|  |           <select formControlName="operation"> | ||||||
|  |             <option value="">Select Operation</option> | ||||||
|  |             <option value="add">Addition (+)</option> | ||||||
|  |             <option value="subtract">Subtraction (-)</option> | ||||||
|  |             <option value="multiply">Multiplication (*)</option> | ||||||
|  |             <option value="divide">Division (/)</option> | ||||||
|  |             <option value="percentage">Percentage (%)</option> | ||||||
|  |             <option value="concat">Concatenation (||)</option> | ||||||
|  |           </select> | ||||||
|  |         </div> | ||||||
|  | 
 | ||||||
|  |         <!-- Multiple Fields Section --> | ||||||
|  |         <div class="clr-col-12" *ngIf="calculatedFieldForm.get('operation')?.value"> | ||||||
|  |           <label>Fields and Constants</label> | ||||||
|  |           <div class="clr-row"> | ||||||
|  |             <div class="clr-col-12"> | ||||||
|  |               <div formArrayName="fieldComponents"> | ||||||
|  |                 <div *ngFor="let fieldComponent of getFieldComponents().controls; let i = index"  | ||||||
|  |                      [formGroupName]="i" class="clr-row field-component-row"> | ||||||
|  |                   <div class="clr-col-5"> | ||||||
|  |                     <select formControlName="field"> | ||||||
|  |                       <option value="">Select Field</option> | ||||||
|  |                       <option *ngFor="let key of availableKeys" [value]="key">{{ key }}</option> | ||||||
|  |                     </select> | ||||||
|  |                   </div> | ||||||
|  |                   <div class="clr-col-5"> | ||||||
|  |                     <input type="text" formControlName="constant" placeholder="Or enter constant value" /> | ||||||
|  |                   </div> | ||||||
|  |                   <div class="clr-col-2"> | ||||||
|  |                     <button type="button" class="btn btn-icon btn-danger" (click)="removeFieldComponent(i)"  | ||||||
|  |                             *ngIf="getFieldComponents().length > 1"> | ||||||
|  |                       <clr-icon shape="trash"></clr-icon> | ||||||
|  |                     </button> | ||||||
|  |                   </div> | ||||||
|  |                 </div> | ||||||
|  |               </div> | ||||||
|  |               <button type="button" class="btn btn-sm" (click)="addFieldComponent()"> | ||||||
|  |                 <clr-icon shape="plus"></clr-icon> Add Field/Constant | ||||||
|  |               </button> | ||||||
|  |             </div> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |       </div> | ||||||
|  |     </form> | ||||||
|  | 
 | ||||||
|  |     <div class="clr-row" style="margin-top: 20px;"> | ||||||
|  |       <div class="clr-col-12"> | ||||||
|  |         <h4>Created Calculated Fields:</h4> | ||||||
|  |         <table class="table"> | ||||||
|  |           <thead> | ||||||
|  |             <tr> | ||||||
|  |               <th>Field Name</th> | ||||||
|  |               <th>Operation</th> | ||||||
|  |               <th>Fields/Values</th> | ||||||
|  |               <th>Actions</th> | ||||||
|  |             </tr> | ||||||
|  |           </thead> | ||||||
|  |           <tbody> | ||||||
|  |             <tr *ngFor="let field of calculatedFields"> | ||||||
|  |               <td>{{ field.fieldName }}</td> | ||||||
|  |               <td>{{ field.operation }}</td> | ||||||
|  |               <td> | ||||||
|  |                 <span *ngFor="let component of field.fieldComponents; let last = last"> | ||||||
|  |                   <span *ngIf="component.field && !component.isConstant">{{ component.field }}</span> | ||||||
|  |                   <span *ngIf="component.isConstant">"{{ component.constant }}"</span> | ||||||
|  |                   <span *ngIf="!component.field && component.constant">"{{ component.constant }}"</span> | ||||||
|  |                   <span *ngIf="!last"> {{ getOperationSymbol(field.operation) }} </span> | ||||||
|  |                 </span> | ||||||
|  |               </td> | ||||||
|  |               <td> | ||||||
|  |                 <button class="btn btn-icon btn-danger" (click)="deleteCalculatedField(field.id)"> | ||||||
|  |                   <clr-icon shape="trash"></clr-icon> | ||||||
|  |                 </button> | ||||||
|  |               </td> | ||||||
|  |             </tr> | ||||||
|  |           </tbody> | ||||||
|  |         </table> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  |   <div class="modal-footer"> | ||||||
|  |     <button type="button" class="btn btn-outline" (click)="calculatedFieldModalOpen = false">Cancel</button> | ||||||
|  |     <button type="button" class="btn btn-primary" (click)="addCalculatedField()">Add Field</button> | ||||||
|  |     <button type="button" class="btn btn-success" (click)="updateCalculatedFields()"  | ||||||
|  |             [disabled]="calculatedFields.length === 0"> | ||||||
|  |       Update Record | ||||||
|  |     </button> | ||||||
|  |   </div> | ||||||
|  | </clr-modal> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -8,6 +8,8 @@ import { DashboardContentModel2 } from 'src/app/models/builder/dashboard'; | |||||||
| import { Data_lakecardvariable } from './Data_lake_cardvariable'; | import { Data_lakecardvariable } from './Data_lake_cardvariable'; | ||||||
| import { UserInfoService } from 'src/app/services/user-info.service'; | import { UserInfoService } from 'src/app/services/user-info.service'; | ||||||
| import { SureconnectService } from '../sureconnect/sureconnect.service'; | import { SureconnectService } from '../sureconnect/sureconnect.service'; | ||||||
|  | import { HttpClient } from '@angular/common/http'; | ||||||
|  | import { ApiRequestService } from 'src/app/services/api/api-request.service'; | ||||||
| declare var JsBarcode: any; | declare var JsBarcode: any; | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-Data_lake', |   selector: 'app-Data_lake', | ||||||
| @ -60,6 +62,14 @@ export class Data_lakeComponent implements OnInit { | |||||||
|   sureConnectList; |   sureConnectList; | ||||||
|   selectedSureConnect: any = null; |   selectedSureConnect: any = null; | ||||||
| 
 | 
 | ||||||
|  |   // Calculated field properties
 | ||||||
|  |   calculatedFieldModalOpen = false; | ||||||
|  |   availableKeys: string[] = []; | ||||||
|  |   selectedDataLakeItem: any = null; | ||||||
|  |   calculatedFieldForm: FormGroup; | ||||||
|  |   calculatedFields: any[] = []; | ||||||
|  |   constantCounter = 1; // Persistent counter for unique constant names
 | ||||||
|  | 
 | ||||||
|   constructor( |   constructor( | ||||||
|     private extensionService: ExtensionService, |     private extensionService: ExtensionService, | ||||||
|     private userInfoService: UserInfoService, |     private userInfoService: UserInfoService, | ||||||
| @ -67,7 +77,9 @@ export class Data_lakeComponent implements OnInit { | |||||||
|     private alertService: AlertService, |     private alertService: AlertService, | ||||||
|     private toastr: ToastrService, |     private toastr: ToastrService, | ||||||
|     private _fb: FormBuilder, |     private _fb: FormBuilder, | ||||||
|     private sureConnectService: SureconnectService |     private sureConnectService: SureconnectService, | ||||||
|  |     private http: HttpClient, | ||||||
|  |     private apiRequest: ApiRequestService | ||||||
|   ) { } |   ) { } | ||||||
|   private editInterval: any; |   private editInterval: any; | ||||||
|   // component button 
 |   // component button 
 | ||||||
| @ -120,15 +132,37 @@ export class Data_lakeComponent implements OnInit { | |||||||
|     console.log(this.entryForm.value); |     console.log(this.entryForm.value); | ||||||
|     // form code end 
 |     // form code end 
 | ||||||
| 
 | 
 | ||||||
| 
 |     // Initialize calculated field form with FormArray for multiple fields
 | ||||||
| 
 |     this.calculatedFieldForm = this._fb.group({ | ||||||
| 
 |       fieldName: [''], | ||||||
| 
 |       operation: [''], | ||||||
| 
 |       fieldComponents: this._fb.array([this.createFieldComponent()]) | ||||||
| 
 |     }); | ||||||
| 
 |   } | ||||||
| 
 |    | ||||||
| 
 |   // Helper method to create a field component group
 | ||||||
|  |   createFieldComponent(): FormGroup { | ||||||
|  |     return this._fb.group({ | ||||||
|  |       field: [''], | ||||||
|  |       constant: [''] | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   // Getter for field components FormArray
 | ||||||
|  |   getFieldComponents(): FormArray { | ||||||
|  |     return this.calculatedFieldForm.get('fieldComponents') as FormArray; | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   // Method to add a new field component
 | ||||||
|  |   addFieldComponent(): void { | ||||||
|  |     this.getFieldComponents().push(this.createFieldComponent()); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   // Method to remove a field component
 | ||||||
|  |   removeFieldComponent(index: number): void { | ||||||
|  |     if (this.getFieldComponents().length > 1) { | ||||||
|  |       this.getFieldComponents().removeAt(index); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|   ngOnDestroy(): void { |   ngOnDestroy(): void { | ||||||
|     if (this.editInterval) { |     if (this.editInterval) { | ||||||
| @ -138,15 +172,6 @@ export class Data_lakeComponent implements OnInit { | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   error; |   error; | ||||||
|   getData() { |   getData() { | ||||||
|     this.mainService.getAll().subscribe((data) => { |     this.mainService.getAll().subscribe((data) => { | ||||||
| @ -165,7 +190,7 @@ export class Data_lakeComponent implements OnInit { | |||||||
| 
 | 
 | ||||||
|   // Fetch SureConnect list
 |   // Fetch SureConnect list
 | ||||||
|   getSureConnectList() { |   getSureConnectList() { | ||||||
|     this.sureConnectService.getAll().subscribe((data) => { |     this.sureConnectService.getAll().subscribe((data: any[]) => { | ||||||
|       this.sureConnectList = data; |       this.sureConnectList = data; | ||||||
|       console.log('SureConnect List:', this.sureConnectList); |       console.log('SureConnect List:', this.sureConnectList); | ||||||
|     }, (error) => { |     }, (error) => { | ||||||
| @ -173,14 +198,144 @@ export class Data_lakeComponent implements OnInit { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // Get SureConnect name by ID for display in grid
 |   // Get operation symbol for display
 | ||||||
|   getSureConnectNameById(id: number): string { |   getOperationSymbol(operation: string): string { | ||||||
|     if (!id || !this.sureConnectList || this.sureConnectList.length === 0) { |     switch(operation) { | ||||||
|       return ''; |       case 'add': return '+'; | ||||||
|  |       case 'subtract': return '-'; | ||||||
|  |       case 'multiply': return '*'; | ||||||
|  |       case 'divide': return '/'; | ||||||
|  |       case 'percentage': return '%'; | ||||||
|  |       case 'concat': return '||'; // Concatenation symbol
 | ||||||
|  |       default: return ''; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Fetch available keys from API
 | ||||||
|  |   fetchAvailableKeys(dataLakeItem: any) { | ||||||
|  |     if (!dataLakeItem.url || !dataLakeItem.sure_connect_id) { | ||||||
|  |       this.toastr.error('URL and SureConnect ID are required to fetch keys'); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     this.selectedDataLakeItem = dataLakeItem; | ||||||
|  |      | ||||||
|  |     // Call the service method to get all keys
 | ||||||
|  |     this.mainService.fetchAvailableKeys(dataLakeItem.url, dataLakeItem.sure_connect_id).subscribe( | ||||||
|  |       (keys: string[]) => { | ||||||
|  |         this.availableKeys = keys; | ||||||
|  |         // Reset the calculated field form to ensure it starts fresh
 | ||||||
|  |         this.resetCalculatedFieldForm(); | ||||||
|  |         this.calculatedFieldModalOpen = true; | ||||||
|  |         console.log('Available keys:', keys); | ||||||
|  |       }, | ||||||
|  |       (error) => { | ||||||
|  |         console.error('Error fetching keys:', error); | ||||||
|  |         this.toastr.error('Failed to fetch available keys from API'); | ||||||
|  |       } | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   // Reset the calculated field form to initial state
 | ||||||
|  |   resetCalculatedFieldForm(): void { | ||||||
|  |     this.calculatedFieldForm.reset({ | ||||||
|  |       fieldName: '', | ||||||
|  |       operation: '', | ||||||
|  |       fieldComponents: [{}] // Start with one empty field component
 | ||||||
|  |     }); | ||||||
|  |      | ||||||
|  |     // Ensure we have exactly one empty field component
 | ||||||
|  |     const fieldComponents = this.getFieldComponents(); | ||||||
|  |     fieldComponents.clear(); | ||||||
|  |     fieldComponents.push(this.createFieldComponent()); | ||||||
|  |      | ||||||
|  |     // Reset the constant counter for new calculations
 | ||||||
|  |     this.constantCounter = 1; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Add calculated field
 | ||||||
|  |   addCalculatedField() { | ||||||
|  |     const formData = this.calculatedFieldForm.value; | ||||||
|  | 
 | ||||||
|  |     if (!formData.fieldName || !formData.operation) { | ||||||
|  |       this.toastr.error('Field name and operation are required'); | ||||||
|  |       return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const sureConnect = this.sureConnectList.find(item => item.id === id); |     // Filter out empty field components
 | ||||||
|     return sureConnect ? sureConnect.name : ''; |     const validFieldComponents = formData.fieldComponents.filter(component =>  | ||||||
|  |       component.field || component.constant | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     if (validFieldComponents.length === 0) { | ||||||
|  |       this.toastr.error('At least one field or constant is required'); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Validate constant values - must be numeric for all operations except concatenation
 | ||||||
|  |     if (formData.operation !== 'concat') { | ||||||
|  |       for (const component of validFieldComponents) { | ||||||
|  |         if (component.constant && component.constant.trim() !== '') { | ||||||
|  |           const numericValue = Number(component.constant); | ||||||
|  |           if (isNaN(numericValue)) { | ||||||
|  |             this.toastr.error('Constant values must be numeric for this operation'); | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |      | ||||||
|  |     // Validate that constant values are unique within this calculated field
 | ||||||
|  |     const constantValues = validFieldComponents | ||||||
|  |       .map(component => component.constant) | ||||||
|  |       .filter(constant => constant && constant.trim() !== ''); | ||||||
|  |      | ||||||
|  |     if (constantValues.length !== new Set(constantValues).size) { | ||||||
|  |       this.toastr.error('Constant values must be unique within a calculated field'); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Generate unique names for constants using the persistent counter
 | ||||||
|  |     const processedFieldComponents = validFieldComponents.map(component => { | ||||||
|  |       if (component.constant && component.constant.trim() !== '') { | ||||||
|  |         // Generate a unique name for the constant using the persistent counter
 | ||||||
|  |         const constantName = `constant_${this.constantCounter++}`; | ||||||
|  |         return { | ||||||
|  |           field: constantName, | ||||||
|  |           constant: component.constant, | ||||||
|  |           isConstant: true // Flag to indicate this is a constant with a generated name
 | ||||||
|  |         }; | ||||||
|  |       } | ||||||
|  |       return { | ||||||
|  |         field: component.field, | ||||||
|  |         constant: component.constant, | ||||||
|  |         isConstant: false // Flag to indicate this is a regular field
 | ||||||
|  |       }; | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     // Create calculated field object with multiple field components
 | ||||||
|  |     const calculatedField = { | ||||||
|  |       id: Date.now(), // Simple ID generation
 | ||||||
|  |       fieldName: formData.fieldName, | ||||||
|  |       operation: formData.operation, | ||||||
|  |       fieldComponents: processedFieldComponents | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     this.calculatedFields.push(calculatedField); | ||||||
|  |     this.toastr.success('Calculated field added successfully'); | ||||||
|  | 
 | ||||||
|  |     // Reset form but keep one empty field component
 | ||||||
|  |     this.calculatedFieldForm.reset({ | ||||||
|  |       fieldName: '', | ||||||
|  |       operation: '', | ||||||
|  |       fieldComponents: [{}] | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // Delete calculated field
 | ||||||
|  |   deleteCalculatedField(id: number) { | ||||||
|  |     this.calculatedFields = this.calculatedFields.filter(field => field.id !== id); | ||||||
|  |     this.toastr.success('Calculated field deleted'); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   onEdit(row) { |   onEdit(row) { | ||||||
| @ -210,17 +365,6 @@ export class Data_lakeComponent implements OnInit { | |||||||
|   onUpdate(id) { |   onUpdate(id) { | ||||||
|     this.modalEdit = false; |     this.modalEdit = false; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     //console.log("in update");
 |     //console.log("in update");
 | ||||||
|     console.log("id  " + id); |     console.log("id  " + id); | ||||||
|     console.log(this.rowSelected); |     console.log(this.rowSelected); | ||||||
| @ -237,15 +381,6 @@ export class Data_lakeComponent implements OnInit { | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       }, (error) => { |       }, (error) => { | ||||||
|         console.log(error); |         console.log(error); | ||||||
|         if (error.status >= 200 && error.status <= 299) { |         if (error.status >= 200 && error.status <= 299) { | ||||||
| @ -323,36 +458,11 @@ export class Data_lakeComponent implements OnInit { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // Handle SureConnect selection change in add form
 |  | ||||||
|   onAddSureConnectChange(event: any) { |  | ||||||
|     const selectedId = event.target.value; |  | ||||||
|     if (this.entryForm && this.entryForm.get('sure_connect_id')) { |  | ||||||
|       this.entryForm.get('sure_connect_id')?.setValue(selectedId); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // Handle SureConnect selection change in edit form
 |  | ||||||
|   onEditSureConnectChange(event: any) { |  | ||||||
|     const selectedId = event.target.value; |  | ||||||
|     if (this.rowSelected) { |  | ||||||
|       this.rowSelected.sure_connect_id = selectedId; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   onCreate() { |   onCreate() { | ||||||
|     this.modalAdd = false; |     this.modalAdd = false; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     this.mainService.create(this.entryForm.value).subscribe( |     this.mainService.create(this.entryForm.value).subscribe( | ||||||
|       (data) => { |       (data) => { | ||||||
|         console.log(data); |         console.log(data); | ||||||
| @ -365,15 +475,6 @@ export class Data_lakeComponent implements OnInit { | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|       }, (error) => { |       }, (error) => { | ||||||
|         console.log(error); |         console.log(error); | ||||||
|         if (error.status >= 200 && error.status <= 299) { |         if (error.status >= 200 && error.status <= 299) { | ||||||
| @ -400,9 +501,7 @@ export class Data_lakeComponent implements OnInit { | |||||||
|       if (this.entryForm.get('cron_job')) { |       if (this.entryForm.get('cron_job')) { | ||||||
|         this.entryForm.get('cron_job')?.setValue(''); |         this.entryForm.get('cron_job')?.setValue(''); | ||||||
|       } |       } | ||||||
|       if (this.entryForm.get('sure_connect_id')) { | 
 | ||||||
|         this.entryForm.get('sure_connect_id')?.setValue(null); |  | ||||||
|       } |  | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   submitted = false; |   submitted = false; | ||||||
| @ -422,16 +521,45 @@ export class Data_lakeComponent implements OnInit { | |||||||
|   goTourlUrl(val) { window.open(val) } |   goTourlUrl(val) { window.open(val) } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   rsModaljson = false; |   rsModaljson = false; | ||||||
|   goToReplaceStringjson(row) { |   goToReplaceStringjson(row) { | ||||||
|     this.rowSelected = row; this.rsModaljson = true; |     this.rowSelected = row; this.rsModaljson = true; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| 
 |   // Generate JSON from calculated fields and update the record
 | ||||||
| 
 |   updateCalculatedFields() { | ||||||
|   // updateaction
 |     if (!this.selectedDataLakeItem || this.calculatedFields.length === 0) { | ||||||
| } |       this.toastr.error('No calculated fields to update'); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Convert calculated fields to JSON string
 | ||||||
|  |     const calculatedFieldJson = JSON.stringify(this.calculatedFields); | ||||||
|  |      | ||||||
|  |     // Call the service method to update the record
 | ||||||
|  |     this.mainService.updateCalculatedFields( | ||||||
|  |       this.selectedDataLakeItem.id,  | ||||||
|  |       calculatedFieldJson,  | ||||||
|  |       true // iscalculatedfield = true
 | ||||||
|  |     ).subscribe( | ||||||
|  |       (response) => { | ||||||
|  |         console.log('Calculated fields updated successfully:', response); | ||||||
|  |         this.toastr.success('Calculated fields updated successfully'); | ||||||
|  |          | ||||||
|  |         // Update the local data
 | ||||||
|  |         const index = this.product.findIndex(item => item.id === this.selectedDataLakeItem.id); | ||||||
|  |         if (index !== -1) { | ||||||
|  |           this.product[index].calculated_field_json = calculatedFieldJson; | ||||||
|  |           this.product[index].iscalculatedfield = true; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // Close the modal
 | ||||||
|  |         this.calculatedFieldModalOpen = false; | ||||||
|  |       }, | ||||||
|  |       (error) => { | ||||||
|  |         console.error('Error updating calculated fields:', error); | ||||||
|  |         this.toastr.error('Failed to update calculated fields'); | ||||||
|  |       } | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | |||||||
| @ -35,6 +35,21 @@ export class Data_lakeservice{ | |||||||
|     const _http = this.baseURL + "/json/" + id; |     const _http = this.baseURL + "/json/" + id; | ||||||
|     return this.apiRequest.put(_http, {}); |     return this.apiRequest.put(_http, {}); | ||||||
|   } |   } | ||||||
|  |    | ||||||
|  |   // Method to fetch available keys from API
 | ||||||
|  |   fetchAvailableKeys(url: string, sureId: number): Observable<string[]> { | ||||||
|  |     const apiUrl = `chart/getAllKeys?apiUrl=${encodeURIComponent(url)}&sureId=${sureId}`; | ||||||
|  |     return this.apiRequest.get(apiUrl); | ||||||
|  |   } | ||||||
| 
 | 
 | ||||||
|  |   // Method to update calculated fields for a data lake item
 | ||||||
|  |   updateCalculatedFields(id: number, calculatedFieldJson: string, isCalculatedField: boolean): Observable<any> { | ||||||
|  |     const _http = this.baseURL + "/" + id; | ||||||
|  |     const data = { | ||||||
|  |       calculated_field_json: calculatedFieldJson, | ||||||
|  |       iscalculatedfield: isCalculatedField | ||||||
|  |     }; | ||||||
|  |     return this.apiRequest.put(_http, data); | ||||||
|  |   } | ||||||
| // updateaction
 | // updateaction
 | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user