Base solution for your next web application
Open Closed

RAD Tool - Entity Regeneration Issue #5114


User avatar
0
gbadenhorst created

Hi,

Just want to start this off with: well done with the new Rad Tool features, they are extremely helpful and will make life so much easier with the generation from existing tables especially. Thanks!

I am not sure if this has been mention before by someone.

When an entity is generated it is correct. however, when you load the entity again and regenerate it, it seems to mess up the bindings on the grids.

[attachment=0:53psbal7]ServiceCallTaskFieldsSwappedAroundAfterRegeneration.PNG[/attachment:53psbal7]

Example of fields in the grid that is mixed up.
Task is correct Details -> Text under completed(Supposed to be a bool) Hours Required -> Numbers under subject Completed -> Under 2nd subject.

I am using Core + Angular 5.4.1

Thanks, Gideon Badenhorst


9 Answer(s)
  • User Avatar
    0
    yekalkan created

    When you regenerate an entity, are the fields correctly loaded to extension interface?

    Also, can you share the component.html file here?

  • User Avatar
    0
    hitaspdotnet created

    I had this problem too. It's happen when we make changes to our properties (remove/add).

  • User Avatar
    0
    gbadenhorst created

    Yes, the entity loads correctly.

    The bindings in the html side looks fine and i can't really see anything wrong on the componen.ts either.

    Here is the component.ts:

    import { Component, Injector, ViewEncapsulation, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { Http } from '@angular/http'; import { ServiceCallTasksServiceProxy, ServiceCallTaskDto } from '@shared/service-proxies/service-proxies'; import { NotifyService } from '@abp/notify/notify.service'; import { AppComponentBase } from '@shared/common/app-component-base'; import { TokenAuthServiceProxy } from '@shared/service-proxies/service-proxies'; import { CreateOrEditServiceCallTaskModalComponent } from './create-or-edit-serviceCallTask-modal.component'; import { ViewServiceCallTaskModalComponent } from './view-serviceCallTask-modal.component'; import { appModuleAnimation } from '@shared/animations/routerTransition'; import { Table } from 'primeng/components/table/table'; import { Paginator } from 'primeng/components/paginator/paginator'; import { LazyLoadEvent } from 'primeng/components/common/lazyloadevent'; import { FileDownloadService } from '@shared/utils/file-download.service'; import * as moment from 'moment';

    @Component({ templateUrl: './serviceCallTasks.component.html', encapsulation: ViewEncapsulation.None, animations: [appModuleAnimation()] }) export class ServiceCallTasksComponent extends AppComponentBase {

    @ViewChild('createOrEditServiceCallTaskModal') createOrEditServiceCallTaskModal: CreateOrEditServiceCallTaskModalComponent;
    @ViewChild('viewServiceCallTaskModalComponent') viewServiceCallTaskModal: ViewServiceCallTaskModalComponent;
    @ViewChild('dataTable') dataTable: Table;
    @ViewChild('paginator') paginator: Paginator;
    
    advancedFiltersAreShown = false;
    filterText = '';
    	taskFilter = '';
    	detailsFilter = '';
    	maxHoursRequiredFilter : number;
    	maxHoursRequiredFilterEmpty : number;
    	minHoursRequiredFilter : number;
    	minHoursRequiredFilterEmpty : number;
    	completedFilter = -1;
    	serviceCallSubjectFilter = '';
    	serviceCallScheduleSubjectFilter = '';
    
    
    
    constructor(
        injector: Injector,
        private _http: Http,
        private _serviceCallTasksServiceProxy: ServiceCallTasksServiceProxy,
        private _notifyService: NotifyService,
        private _tokenAuth: TokenAuthServiceProxy,
        private _activatedRoute: ActivatedRoute,
        private _fileDownloadService: FileDownloadService
    ) {
        super(injector);
    }
    
    getServiceCallTasks(event?: LazyLoadEvent) {
        if (this.primengTableHelper.shouldResetPaging(event)) {
            this.paginator.changePage(0);
            return;
        }
    
        this.primengTableHelper.showLoadingIndicator();
    
        this._serviceCallTasksServiceProxy.getAll(
    		this.filterText,
    		this.taskFilter,
    		this.detailsFilter,
    		this.maxHoursRequiredFilter == null ? this.maxHoursRequiredFilterEmpty: this.maxHoursRequiredFilter,
    		this.minHoursRequiredFilter == null ? this.minHoursRequiredFilterEmpty: this.minHoursRequiredFilter,
    		this.completedFilter,
    		this.serviceCallSubjectFilter,
    		this.serviceCallScheduleSubjectFilter,
            this.primengTableHelper.getSorting(this.dataTable),
            this.primengTableHelper.getSkipCount(this.paginator, event),
            this.primengTableHelper.getMaxResultCount(this.paginator, event)
        ).subscribe(result => {
            this.primengTableHelper.totalRecordsCount = result.totalCount;
            this.primengTableHelper.records = result.items;
            this.primengTableHelper.hideLoadingIndicator();
        });
    }
    
    reloadPage(): void {
        this.paginator.changePage(this.paginator.getPage());
    }
    
    createServiceCallTask(): void {
        this.createOrEditServiceCallTaskModal.show();
    }
    
    deleteServiceCallTask(serviceCallTask: ServiceCallTaskDto): void {
        this.message.confirm(
            '',
            (isConfirmed) => {
                if (isConfirmed) {
                    this._serviceCallTasksServiceProxy.delete(serviceCallTask.id)
                        .subscribe(() => {
                            this.reloadPage();
                            this.notify.success(this.l('SuccessfullyDeleted'));
                        });
                }
            }
        );
    }
    
    exportToExcel(): void {
        this._serviceCallTasksServiceProxy.getServiceCallTasksToExcel(
    	this.filterText,
    		this.taskFilter,
    		this.detailsFilter,
    		this.maxHoursRequiredFilter == null ? this.maxHoursRequiredFilterEmpty: this.maxHoursRequiredFilter,
    		this.minHoursRequiredFilter == null ? this.minHoursRequiredFilterEmpty: this.minHoursRequiredFilter,
    		this.completedFilter,
    		this.serviceCallSubjectFilter,
    		this.serviceCallScheduleSubjectFilter,
    	)
        .subscribe(result => {
            this._fileDownloadService.downloadTempFile(result);
         });
    }
    

    }

  • User Avatar
    0
    gbadenhorst created

    The entity itself is fine by the looks of it and the updating and viewing handles the data correctly. The only weird part is the grid.

  • User Avatar
    0
    yekalkan created

    I've just tested it again and grid bindings were fine. I couldn't reproduce your issue.

    Could you also share the component.html file?

  • User Avatar
    0
    gbadenhorst created

    sure, here it is:

    That is what I don't understand, everything looks fine and it is an extremely weird scenario where I can't find where the data mappings go wrong.

    i have about 4 entities if i remember correctly which is currently doing this.

    <div [@routerTransition]> <div class="m-subheader"> <div class="d-flex align-items-center"> <div class="mr-auto col-xs-6"> <h3 class="m-subheader__title m-subheader__title--separator"> <span>{{l("ServiceCallTasks")}}</span> </h3> <span class="m-section__sub"> {{l("ServiceCallTasksHeaderInfo")}} </span> </div> <div class="col-xs-6 text-right"> <button (click)="exportToExcel()" class="btn btn-outline-success"><i class="fa fa-file-excel-o"></i> {{l("ExportToExcel")}}</button> <button *ngIf="isGranted('Pages.ServiceCallTasks.Create')" (click)="createServiceCallTask()" class="btn btn-primary blue"><i class="fa fa-plus"></i> {{l("CreateNewServiceCallTask")}}</button> </div> </div> </div> <div class="m-content"> <div class="m-portlet m-portlet--mobile"> <div class="m-portlet__body">

    			&lt;form class=&quot;horizontal-form&quot; autocomplete=&quot;off&quot;&gt;
                    &lt;div class=&quot;m-form m-form--label-align-right&quot;&gt;
                        &lt;div class=&quot;row align-items-center m--margin-bottom-10&quot;&gt;
                            &lt;div class=&quot;col-xl-12&quot;&gt;
                                &lt;div class=&quot;form-group m-form__group align-items-center&quot;&gt;
                                    &lt;div class=&quot;input-group&quot;&gt;
                                        &lt;input [(ngModel)]=&quot;filterText&quot; name=&quot;filterText&quot; autoFocus class=&quot;form-control m-input&quot; [placeholder]=&quot;l(&#39;SearchWithThreeDot&#39;)&quot; type=&quot;text&quot;&gt;
                                        &lt;span class=&quot;input-group-btn&quot;&gt;
                                            &lt;button (click)=&quot;getServiceCallTasks()&quot; class=&quot;btn btn-primary&quot; type=&quot;submit&quot;&gt;&lt;i class=&quot;flaticon-search-1&quot;&gt;&lt;/i&gt;&lt;/button&gt;
                                        &lt;/span&gt;
                                    &lt;/div&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
    					 &lt;div class=&quot;row m--margin-bottom-10&quot; [hidden]=&quot;!advancedFiltersAreShown&quot;&gt;
    					 	&lt;div class=&quot;col-md-12&quot;&gt;
    					         &lt;div class=&quot;m-separator m-separator--dashed&quot;&gt;&lt;/div&gt;
    					     &lt;/div&gt;
    
    
    						&lt;div class=&quot;col-md-3&quot;&gt;
                                &lt;div class=&quot;m-stack m-stack--ver m-stack--general m-stack--demo&quot;&gt;
    								&lt;div class=&quot;form-group&quot;&gt;
                                         &lt;div class=&quot;m-stack__item&quot;&gt;
    										 &lt;label&gt;{{l("Task")}}&lt;/label&gt;
    										 &lt;div class=&quot;m-separator m-separator--dashed&quot;&gt;&lt;/div&gt;
    										 &lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;taskFilter&quot; [(ngModel)]=&quot;taskFilter&quot;&gt;
    								     &lt;/div&gt;
    								&lt;/div&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
    						&lt;div class=&quot;col-md-3&quot;&gt;
                                &lt;div class=&quot;m-stack m-stack--ver m-stack--general m-stack--demo&quot;&gt;
    								&lt;div class=&quot;form-group&quot;&gt;
                                         &lt;div class=&quot;m-stack__item&quot;&gt;
    										 &lt;label&gt;{{l("Details")}}&lt;/label&gt;
    										 &lt;div class=&quot;m-separator m-separator--dashed&quot;&gt;&lt;/div&gt;
    										 &lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;detailsFilter&quot; [(ngModel)]=&quot;detailsFilter&quot;&gt;
    								     &lt;/div&gt;
    								&lt;/div&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                            &lt;div class=&quot;col-md-3&quot;&gt;
                                &lt;div class=&quot;m-stack m-stack--ver m-stack--general m-stack--demo&quot;&gt;
                                    &lt;div class=&quot;form-group&quot;&gt;
                                        &lt;div class=&quot;m-stack__item&quot;&gt;
    											&lt;label&gt;{{l("MinMax")}} {{l("HoursRequired")}}&lt;/label&gt;
    											&lt;div class=&quot;m-separator m-separator--dashed&quot;&gt;&lt;/div&gt;
                                                &lt;input type=&quot;number&quot; class=&quot;form-control&quot; [(ngModel)]=&quot;minHoursRequiredFilter&quot; placeholder=&quot;{{l(&#39;MinValue&#39;)}}&quot; name=&quot;minHoursRequiredFilter&quot; /&gt;
                                        &lt;/div&gt;
                                        &lt;div class=&quot;m-stack__item&quot;&gt;
                                                &lt;input type=&quot;number&quot; class=&quot;form-control&quot; [(ngModel)]=&quot;maxHoursRequiredFilter&quot; placeholder=&quot;{{l(&#39;MaxValue&#39;)}}&quot; name=&quot;maxHoursRequiredFilter&quot; /&gt;
                                        &lt;/div&gt;
                                    &lt;/div&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;	
    						&lt;div class=&quot;col-md-3&quot;&gt;
                                &lt;div class=&quot;m-stack m-stack--ver m-stack--general m-stack--demo&quot;&gt;
                                    &lt;div class=&quot;m-stack__item&quot;&gt;
    									&lt;label for=&quot;CompletedFilterSelect&quot;&gt;{{l("Completed")}}&lt;/label&gt;
    									&lt;div class=&quot;m-separator m-separator--dashed&quot;&gt;&lt;/div&gt;
    									&lt;select class=&quot;form-control&quot; name=&quot;CompletedFilter&quot; id=&quot;CompletedFilterSelect&quot; [(ngModel)]=&quot;completedFilter&quot;&gt;
    									&lt;option value=&quot;-1&quot;&gt;{{l("All")}}&lt;/option&gt;
    									&lt;option value=&quot;0&quot;&gt;{{l("False")}}&lt;/option&gt;
    									&lt;option value=&quot;1&quot;&gt;{{l("True")}}&lt;/option&gt;
    									&lt;/select&gt;
    								&lt;/div&gt;
    							&lt;/div&gt;
                            &lt;/div&gt;
    						&lt;div class=&quot;col-md-3&quot;&gt;
                                &lt;div class=&quot;m-stack m-stack--ver m-stack--general m-stack--demo&quot;&gt;
    								&lt;div class=&quot;form-group&quot;&gt;
    									&lt;div class=&quot;m-stack__item&quot;&gt;
    										&lt;label&gt;({{l("ServiceCall")}}) {{l("Subject")}}&lt;/label&gt;
    										 &lt;div class=&quot;m-separator m-separator--dashed&quot;&gt;&lt;/div&gt;
    									    &lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;serviceCallSubjectFilter&quot; [(ngModel)]=&quot;serviceCallSubjectFilter&quot;&gt;
    									&lt;/div&gt;
    								&lt;/div&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
    						&lt;div class=&quot;col-md-3&quot;&gt;
                                &lt;div class=&quot;m-stack m-stack--ver m-stack--general m-stack--demo&quot;&gt;
    								&lt;div class=&quot;form-group&quot;&gt;
    									&lt;div class=&quot;m-stack__item&quot;&gt;
    										&lt;label&gt;({{l("ServiceCallSchedule")}}) {{l("Subject")}}&lt;/label&gt;
    										 &lt;div class=&quot;m-separator m-separator--dashed&quot;&gt;&lt;/div&gt;
    									    &lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;serviceCallScheduleSubjectFilter&quot; [(ngModel)]=&quot;serviceCallScheduleSubjectFilter&quot;&gt;
    									&lt;/div&gt;
    								&lt;/div&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
    
                        &lt;/div&gt;
                        &lt;div class=&quot;row margin-bottom-10&quot;&gt;
                            &lt;div class=&quot;col-sm-12&quot;&gt;
                                &lt;span class=&quot;clickable-item text-muted&quot; *ngIf=&quot;!advancedFiltersAreShown&quot; (click)=&quot;advancedFiltersAreShown=!advancedFiltersAreShown&quot;&gt;&lt;i class=&quot;fa fa-angle-down&quot;&gt;&lt;/i&gt; {{l("ShowAdvancedFilters")}}&lt;/span&gt;
                                &lt;span class=&quot;clickable-item text-muted&quot; *ngIf=&quot;advancedFiltersAreShown&quot; (click)=&quot;advancedFiltersAreShown=!advancedFiltersAreShown&quot;&gt;&lt;i class=&quot;fa fa-angle-up&quot;&gt;&lt;/i&gt; {{l("HideAdvancedFilters")}}&lt;/span&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                &lt;/form&gt;
    
                &lt;div class=&quot;row align-items-center&quot;&gt;
                    
                    &lt;div class=&quot;primeng-datatable-container&quot;
                         [busyIf]=&quot;primengTableHelper.isLoading&quot;&gt;
                        &lt;p-table #dataTable
                                     (onLazyLoad)=&quot;getServiceCallTasks($event)&quot;
                                     [value]=&quot;primengTableHelper.records&quot;
                                     rows=&quot;{{primengTableHelper.defaultRecordsCountPerPage}}&quot;
                                     [paginator]=&quot;false&quot;
                                     [lazy]=&quot;true&quot;
                                     [scrollable]=&quot;true&quot;
                                     ScrollWidth=&quot;100%&quot;
                                     [responsive]=&quot;primengTableHelper.isResponsive&quot;
                                     [resizableColumns]=&quot;primengTableHelper.resizableColumns&quot;&gt;
                            &lt;ng-template pTemplate=&quot;header&quot;&gt;
                                &lt;tr&gt;
                                    &lt;th style=&quot;width: 130px&quot; [hidden]=&quot;!isGrantedAny(&#39;Pages.ServiceCallTasks.Edit&#39;, &#39;Pages.ServiceCallTasks.Delete&#39;)&quot;&gt;{{l('Actions')}}&lt;/th&gt;
                                    &lt;th style=&quot;width: 150px&quot; pSortableColumn=&quot;serviceCallTask.task&quot;&gt;
                                        {{l('Task')}}
                                        &lt;p-sortIcon field=&quot;serviceCallTask.task&quot;&gt;&lt;/p-sortIcon&gt;
                                    &lt;/th&gt;
                                    &lt;th style=&quot;width: 150px&quot; pSortableColumn=&quot;serviceCallTask.details&quot;&gt;
                                        {{l('Details')}}
                                        &lt;p-sortIcon field=&quot;serviceCallTask.details&quot;&gt;&lt;/p-sortIcon&gt;
                                    &lt;/th&gt;
                                    &lt;th style=&quot;width: 150px&quot; pSortableColumn=&quot;serviceCallTask.hoursRequired&quot;&gt;
                                        {{l('HoursRequired')}}
                                        &lt;p-sortIcon field=&quot;serviceCallTask.hoursRequired&quot;&gt;&lt;/p-sortIcon&gt;
                                    &lt;/th&gt;
                                    &lt;th style=&quot;width: 150px&quot; pSortableColumn=&quot;serviceCallTask.completed&quot;&gt;
                                        {{l('Completed')}}
                                        &lt;p-sortIcon field=&quot;serviceCallTask.completed&quot;&gt;&lt;/p-sortIcon&gt;
                                    &lt;/th&gt;
                                    &lt;th style=&quot;width: 150px&quot; pSortableColumn=&quot;serviceCallSubject&quot;&gt;
                                        {{l('Subject')}}
                                        &lt;p-sortIcon field=&quot;serviceCallSubject&quot;&gt;&lt;/p-sortIcon&gt;
                                    &lt;/th&gt;
                                    &lt;th style=&quot;width: 150px&quot; pSortableColumn=&quot;serviceCallScheduleSubject&quot;&gt;
                                        {{l('Subject')}}
                                        &lt;p-sortIcon field=&quot;serviceCallScheduleSubject&quot;&gt;&lt;/p-sortIcon&gt;
                                    &lt;/th&gt;
    
                                &lt;/tr&gt;
                            &lt;/ng-template&gt;                           
    						&lt;ng-template pTemplate=&quot;body&quot; let-record=&quot;$implicit&quot;&gt;
                                &lt;tr&gt;
                                    &lt;td style=&quot;width: 130px&quot;
                                        [hidden]=&quot;!isGrantedAny(&#39;Pages.ServiceCallTasks.Edit&#39;, &#39;Pages.ServiceCallTasks.Delete&#39;)&quot;&gt;
                                        &lt;div class=&quot;btn-group dropdown&quot; normalizePosition&gt;
                                            &lt;button class=&quot;dropdown-toggle btn btn-sm btn-primary&quot;
                                                    data-toggle=&quot;dropdown&quot;
                                                    aria-haspopup=&quot;true&quot;
                                                    aria-expanded=&quot;false&quot;&gt;
                                                &lt;i class=&quot;fa fa-cog&quot;&gt;&lt;/i&gt;&lt;span class=&quot;caret&quot;&gt;&lt;/span&gt; {{l("Actions")}}
                                            &lt;/button&gt;
    											&lt;ul class=&quot;dropdown-menu&quot;&gt;
    											&lt;li&gt;
    												&lt;a 
    													(click)=&quot;viewServiceCallTaskModal.show(record)&quot;&gt;{{l('View')}}&lt;/a&gt;
    											&lt;/li&gt;
    											&lt;li&gt;
    												&lt;a *ngIf=&quot;permission.isGranted(&#39;Pages.ServiceCallTasks.Edit&#39;)&quot;
    													(click)=&quot;createOrEditServiceCallTaskModal.show(record.serviceCallTask.id)&quot;&gt;{{l('Edit')}}&lt;/a&gt;
    											&lt;/li&gt;
    											&lt;li&gt;
    										        &lt;a *ngIf=&quot;permission.isGranted(&#39;Pages.ServiceCallTasks.Delete&#39;)&quot;
    													(click)=&quot;deleteServiceCallTask(record.serviceCallTask)&quot;&gt;{{l('Delete')}}&lt;/a&gt;
    											&lt;/li&gt;
                                            &lt;/ul&gt;
                                        &lt;/div&gt;
                                    &lt;/td&gt;
                                    &lt;td style=&quot;width:150px&quot;&gt;{{record.serviceCallSubject}}&lt;/td&gt;
                                    &lt;td style=&quot;width:150px&quot;&gt;{{record.serviceCallScheduleSubject}}&lt;/td&gt;
                                    &lt;td style=&quot;width:150px&quot;&gt;{{record.serviceCallTask.task}}&lt;/td&gt;
                                    &lt;td style=&quot;width:150px&quot;&gt;{{record.serviceCallTask.details}}&lt;/td&gt;
                                    &lt;td style=&quot;width:150px&quot;&gt;{{record.serviceCallTask.hoursRequired}}&lt;/td&gt;
                                    &lt;td style=&quot;width:150px&quot;&gt;
                                        &lt;div *ngIf=&quot;record.serviceCallTask.completed&quot; class=&quot;text-center&quot;&gt;&lt;i class=&quot;fa fa-check-circle m--font-success&quot; title=&quot;True&quot;&gt;&lt;/i&gt;&lt;/div&gt;
    									&lt;div *ngIf=&quot;!record.serviceCallTask.completed&quot; class=&quot;text-center&quot;&gt;&lt;i class=&quot;fa fa-times-circle&quot; title=&quot;False&quot;&gt;&lt;/i&gt;&lt;/div&gt;
                                    &lt;/td&gt;
    
                                &lt;/tr&gt;
                            &lt;/ng-template&gt;
                        &lt;/p-table&gt;
    
    
                        &lt;div class=&quot;primeng-paging-container&quot;&gt;
                            &lt;p-paginator rows=&quot;{{primengTableHelper.defaultRecordsCountPerPage}}&quot;
                                         #paginator
                                         (onPageChange)=&quot;getServiceCallTasks($event)&quot;
                                         [totalRecords]=&quot;primengTableHelper.totalRecordsCount&quot;
                                         [rowsPerPageOptions]=&quot;primengTableHelper.predefinedRecordsCountPerPage&quot;&gt;
                            &lt;/p-paginator&gt;
                            &lt;span class=&quot;total-records-count&quot;&gt;
                                {{l('TotalRecordsCount', primengTableHelper.totalRecordsCount)}}
                            &lt;/span&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                    
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    
    &lt;createOrEditServiceCallTaskModal #createOrEditServiceCallTaskModal (modalSave)=&quot;getServiceCallTasks()&quot;&gt;&lt;/createOrEditServiceCallTaskModal&gt;
    &lt;viewServiceCallTaskModal #viewServiceCallTaskModal&gt;&lt;/viewServiceCallTaskModal&gt;
    

    </div>

  • User Avatar
    0
    gbadenhorst created

    The problem only occurs when i have navigation properties included it seems. normal entities with only primitive properties work as should.

  • User Avatar
    0
    yekalkan created

    Hi, I've just reproduce it. The bug is simple but annoying.

    In the header section; primitive properties first, then navigation properties, But in the data section; navigation properties first, then primitive properties.

    So re-ordering them should fix this issue. And we have to fix this of course.

  • User Avatar
    0
    gbadenhorst created

    Thank you Yekalkan