! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

cellEditEnded 및 formatitem의 class를 추가시 문제 > Q&A | 토론

본문 바로가기

VueJS cellEditEnded 및 formatitem의 class를 추가시 문제

페이지 정보

작성자 liilililil 작성일 2023-10-11 12:00 조회 291회 댓글 1건
제품 버전 : 5.20221.857
컨트롤 이름 : FlexGrid

본문

안녕하세요. 

특정 상황에 따른 cell의 class 추가시 문제가 발생하여 문의드립니다. 


1.http://demo.grapecity.co.kr/wijmo/learn-wijmo/Grid/Editing/HighlightEdits/vue 

해당 데모에서 아래와 같이 코드를 수정하였을때, 

celllEditEnded 시점에 class를 추가합니다.  

그러나, 타 행의 cell을 클릭하면 추가한 class가 사라지는 현상이 발생합니다. 

( 동일 행은 유지 되고 있습니다.) 

class를 유지시키려면 어떻게 해야 하나요?  

import { isUndefined, isDate, toggleClass, addClass} from '@grapecity/wijmo';
/**
 * Class that highlights cells that have been edited in a FlexGrid.
 */
export class EditHighlighter {
    /**
     * Initializes a new instance of the {@link EditHighlighter} class.
     *
     * @param grid FlexGrid to highlight.
     * @param cssClass Class name to apply to changed cells.
     */
    constructor(grid, cssClass) {
        this._originalValue = null;
        this._originalValues = new Map();
        this._grid = grid;
        let cellChanging = this._cellChanging.bind(this),
            cellChanged = this._cellChanged.bind(this);
        grid.beginningEdit.addHandler(cellChanging);
        grid.cellEditEnded.addHandler(cellChanged);
        grid.pastingCell.addHandler(cellChanging);
        grid.pastedCell.addHandler(cellChanged);
        // grid.formatItem.addHandler((s, e) => {
        //     if (e.panel == s.cells) {
        //         let changed = this._hasChange(e.getRow().dataItem, e.getColumn().binding);
        //         toggleClass(e.cell, 'cell-changed', changed);
        //     }
        // });
    }
    /**
     * Clears all the changes and removes all highlights.
     */
    clearChanges() {
        this._originalValues.clear();
        this._grid.invalidate();
    }
    // checks whether a cell has changed
    _hasChange(item, binding) {
        item = this._originalValues.get(item);
        return item != null && !isUndefined(item[binding]);
    }
    // handles cell changing (edit or paste)
    _cellChanging(s, e) {
        this._originalValue = s.getCellData(e.row, e.col, false);
    }
    // handles cell changed (edit or paste)
    _cellChanged(s, e) {
        let newValue = s.getCellData(e.row, e.col, false);
        this._storeChange(e.getRow().dataItem, e.getColumn().binding, this._originalValue, newValue);
        const cellElement = e.panel.getCellElement(e.row, e.col);
        addClass(cellElement, 'cell-changed');
    
    }
    // store a change into the _originalValues map
    _storeChange(item, binding, originalValue, newValue) {
        // get the item with the original values
        let editItem = this._originalValues.get(item);
        if (editItem == null) {
            editItem = {};
            this._originalValues.set(item, editItem);
        }
        // get the original value from the item if possible
        let editValue = editItem[binding];
        if (!isUndefined(editValue)) {
            originalValue = editValue;
        }
        // store or clear the change
        if (this._sameValue(originalValue, newValue)) {
            delete editItem[binding];
            if (Object.keys(editItem).length == 0) {
                this._originalValues.delete(item);
            }
        }
        else {
            editItem[binding] = originalValue;
        }
    }
    // compare two values taking dates into account
    _sameValue(item1, item2) {
        if (item1 === item2) {
            return true;
        }
        if (isDate(item1) && isDate(item2)) {
            return item1.getTime() == item2.getTime();
        }
        return false;
    }
}

2. formatitem에서 class지정시 문제.
위의 데모를 코드 변경하지 않고 그대로 실행시에도 문제가 있습니다.

재현 방법:
첫 행의 sales의 value를 더블클릭하여 수정(엔터키 입력하지 않고 포커스 유지 상태) =>
동일 행의 expensed를 를 한번만 클릭.

이 경우에 class가 추가되지 않으며, 타 행을 클릭하여야 class가 활성화 됩니다.


정리하면 1번의 경우, 타 행을 클릭하면 class가 사라지며
2번의 경우, 타 행을 클릭해야만 class가 활성화됩니다.
현재 두 가지 이벤트에 거의 동일한 로직을 두번 적용하여 처리하고 있으나, 이는 매우 비효율적으로 보입니다.

처리 방법에 대한 안내 부탁드립니다.

감사합니다.


 


   





  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

GCK루시님의 댓글

GCK루시 작성일

안녕하세요 그레이프시티입니다.

현재 문의가 급증하여 순차적으로 답변 중에 있습니다. 확인이 끝나는 대로 답변드리도록 하겠습니다.

감사합니다.
그레이프시티 드림

2 답변

VueJS Re: cellEditEnded 및 formatitem의 class를 추가시 문제

추천0 이 글을 추천하셨습니다 비추천0 채택채택

페이지 정보

작성자 GCK루시 작성일 2023-10-17 16:58 댓글 0건

본문

안녕하세요 그레이프시티입니다.


먼저 답변이 지연된 점 죄송드리며 문의에 대한 답변드립니다.


1번 문의의 경우, 현재 본사 개발팀과 추가적으로 확인 중에 있으며 관련되어 업데이트가 되는대로 안내드리도록 하겠습니다.


2. 타 행을 클릭할 때 class 활성화 현상

=>  해당 기능의 경우, cellEditEnded 이벤트에서 셀 편집이 종료될 때 CollectionView의 commitEdit() 메서드를 이용하여 변경사항을 commit 할 수 있습니다. 해당 메서드를 통해 그리드의 변경사항이 commit되고 스타일링이 바로 적용됩니다. 아래 간단한 샘플을 공유드리오니 참고 부탁드립니다.



- commitEdit API 문서


관련 API 문서를 공유드리오니 참고 부탁드립니다.


감사합니다.

그레이프시티 드림

댓글목록

등록된 댓글이 없습니다.

VueJS Re: cellEditEnded 및 formatitem의 class를 추가시 문제

추천0 이 글을 추천하셨습니다 비추천0

페이지 정보

작성자 GCK루시 작성일 2023-10-18 09:53 댓글 0건

본문

안녕하세요 그레이프시티입니다.


1번 문의에 대해 추가 답변드립니다. 


해당 현상이 나타난 이유는"cellEditEnded" 이벤트 내에서 클래스를 적용한 뒤, 다른 행을 클릭하면 "rowEditEnding" 이벤트가 트리거가 되고 셀이 새로 고쳐지면서 "cellEditEnded" 이벤트에서 적용한 클래스가 제거되기 때문입니다. 이를 방지하기 위해 셀이 새로 고쳐지더라도 클래스 유지를 위해 클래스를 일관되게 업데이트해야하며 이는 "formatItem" 이벤트를 사용하는 이유입니다. 


이전에 나눠드렸던 샘플에서 수정된 셀에 클래스가 바로 업데이트되고 유지되는 기능이 구현됐기 때문에 요구사항이 충족되었으리라 생각됩니다. 만일 샘플에서 충족되지 않는 구체적인 요구사항이 더 있다면 확인 후 회신 부탁드립니다.


감사합니다.

그레이프시티 드림

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.