Как сфокусировать обновленную запись после обновления сетки Syncfusion Grid - PullRequest
0 голосов
/ 25 марта 2019

Я использую сетку Syncfusion в своем проекте angular (v.6.0.8).На одной из страниц пользователи могут отмечать месяцы как завершенные с помощью флажков.

Это приводит к некоторым изменениям статуса в модели.Следовательно, я обновляю модель, используя «соединение», после завершения внутреннего вызова.Чтобы отразить изменения в сетке, я должен вызвать this.deliveryItemsGrid.refresh ();но это приводит к потере позиции, над которой работает пользователь (сетка прокручивается вверх).

Есть ли способ, которым я мог бы обновить сетку, не меняя положение полосы прокрутки?

[HTML]

            <!-- JAN -->
            <e-column headerText="JAN" [customAttributes]="{class: 'textAlignment'}">
              <ng-template #template let-data>
                  <div> <i class="fa fa-wrench fa-2x" [style.color]="getMonthColorRM(data, 0)"></i></div>
                  <div *ngIf="!isReadOnlyUser" class="custom-control custom-checkbox">
                    <input id="chkChangeStatusRM{{data.rmDetailId + 'JAN'}}" type="checkbox" class="custom-control-input"
                           [checked]="getMonthCompletionStatus(data, 0)" (change)="saveStatusRM(data,'0')" aria-label="Complete Task" />
                    <label *ngIf="getMonthCompletionStatus(data, 0)" class="custom-control-label rm-month" for="chkChangeStatusRM{{data.rmDetailId + 'JAN'}}" data-toggle="tooltip" data-placement="top" title="Mark as not complete"></label>
                    <label *ngIf="!getMonthCompletionStatus(data, 0)" class="custom-control-label rm-month" for="chkChangeStatusRM{{data.rmDetailId + 'JAN'}}" data-toggle="tooltip" data-placement="top" title="Mark as complete"></label>
                  </div>
                <div *ngIf="data.type != 'RM' && ((data?.plannedDate?.getMonth()) == 0)"> <i id="{{'JAN'+ data.type + data.id}}" class="fa fa-wrench fa-2x" [style.color]="getMonthColorCM(data)"></i></div>
              </ng-template>
            </e-column>

[ts file]

private saveStatusRM(row: DeliveryPlanModel, monthId) {
    if (row && row.rmYears) {
      let selectedRmYear: IYearModel = row.rmYears.filter(y => y.year == this.selectedYear.toString())[0];
      selectedRmYear.schoolNumber = this.schoolNumber;
      selectedRmYear.completedMonthsList.filter(m => m.month == monthId)[0].completed = !selectedRmYear.completedMonthsList.filter(m => m.month == monthId)[0].completed;
      selectedRmYear.completed = selectedRmYear.completedMonthsList.every(m => m.completed);

      if (selectedRmYear.completed)
        row.statusDisplay = "Completed";
      else {
        if (selectedRmYear.completedMonthsList.some(m => m.completed))
          row.statusDisplay = "In progress";
        else
          row.statusDisplay = "Planned";
      }

      // Set the color of the spanners (This is only for front-end use)
      selectedRmYear.completedMonthsList.forEach(x => {
        let color: string = "";
        if (x.completed) {
          color = "green";
        }
        else {
          let dueOn: Date = new Date(+selectedRmYear.year, +x.month + 1, 1);
          let currentDate: Date = new Date();
          color = currentDate < dueOn ? "black" : "red";
        }
        x.color = color;
      })
      // Update the record on the Database.
      this.deliveryPlanService.updateStatusRM(selectedRmYear).subscribe(
        data => {
          if (data) {
            // Replace the updated record in 'gridRows'
            var selectedRow = this.gridRows.filter(x => x.rmDetailId == row.rmDetailId)[0]
            var selectedRecordIndex = this.gridRows.indexOf(selectedRow);
            this.gridRows.splice(selectedRecordIndex, 1, row);
            this.calculateRmProgress(this.gridRows);
            //this.deliveryItemsGrid.refresh();
          }
        });
    }
  }


private getMonthCompletionStatus(row: DeliveryPlanModel, monthId): boolean {
      if (row && row.rmYears) {
        let selectedRmYear: IYearModel = row.rmYears.filter(y => y.year == this.selectedYear.toString())[0];
        if (selectedRmYear && selectedRmYear.completedMonthsList) {
          var month = selectedRmYear.completedMonthsList.filter(m => m.month == monthId)[0];
          return month ? month.completed : null;
        }
        else {
          return null;
        }
      }    
  }

enter image description here

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Мы проанализировали ваш запрос и предлагаем получить значение scrollTop до вызова метода refresh и привязать его к полосе прокрутки сетки после завершения операции обновления с использованием события actionComplete.Пожалуйста, обратитесь к приведенному ниже образцу и документации для справки:

complete(args){
  if(args.requestType == 'refresh' && this.scrollVal){
    this.grid.getContent().firstElementChild.scrollTop = this.scrollVal;
    this.scrollVal = 0;
  }
}
refresh(){
  this.scrollVal = this.grid.getContent().firstElementChild.scrollTop;
  this.grid.refresh();
}

Образец: https://stackblitz.com/edit/angular-gg4hgd-hrxcwr?file=default.component.ts

Документация: https://ej2.syncfusion.com/documentation/api/grid/#actioncomplete

ПожалуйстаОбратитесь к нам за дополнительной помощью.

С уважением, Thavasianand S.

0 голосов
/ 27 марта 2019

Мне удалось найти решение проблемы. Для этого я использовал события "rowDataBound" и "dataBound". Пожалуйста, обратитесь к коду ниже.

[HTML]

<ejs-grid #deliveryItemsGrid id="deliveryItemsGrid"
                      [dataSource]="gridRows"
                      [gridLines]="componentVariables.gridLines"
                      [allowPaging]="componentVariables.allowPaging"
                      [allowGrouping]="componentVariables.allowGrouping"
                      [allowSorting]="componentVariables.allowSorting"
                      [allowSelection]="componentVariables.allowSelection"
                      [allowTextWrap]="componentVariables.allowTextWrap"
                      [allowFiltering]="componentVariables.allowFiltering"
                      [pageSettings]="componentVariables.pageSettings"
                      [filterSettings]="componentVariables.filterOptions"
                      [selectedRowIndex]="selectedRowIndex"
                      [selectionSettings]="selectionOptions"
                      [toolbar]="componentVariables.toolbarOptions"
                      (toolbarClick)="toolbarClick($event)"
                      (rowDataBound)="rowDataBound($event)"
                      (dataBound)="dataBound($event)">

[ц]

Я создал две глобальные переменные для хранения выбранных индексов.

  selectedIndexes: number[] = [];
  justNowUpdatedId = 0;

Затем во всех функциях обновления перед вызовом метода refresh() я сохраняю соответствующий идентификатор в переменной 'justNowUpdatedId'.

Наконец, я реализую события "rowDataBound" и "dataBound", чтобы сохранить положение, с которым пользователь работал раньше.

public rowDataBound(args): void {
    if (args.data['type'] == 'RM' && args.data['rmDetailId'] == this.justNowUpdatedId ||
      (args.data['type'] == 'CM' || args.data['type'] == 'DP' || args.data['type'] == 'CMC' || args.data['type'] == 'DPC') && args.data['id'] == this.justNowUpdatedId) {
      this.selectedIndexes.push(parseInt(args.row.getAttribute('aria-rowindex')));
    }
  }

  public dataBound(args): void {
    if (this.selectedIndexes.length) {
      this.deliveryItemsGrid.selectRows(this.selectedIndexes);
      this.selectedIndexes = [];
    }
  }
...