guide Editing

신규 데이터행을 추가하거나 기존 행의 필드 값들을 변경은 기본적으로 데이터소스 API 메소드들을 통해서 실행할 수 있지만, 행 편집 페이지를 이용하거나, 데이터행에 표시된 editor의 값을 변경해서 필드 값을 즉시 수정(inline-update)하거나, 데이터행을 편집 가능한 layout으로 변경한 후 직접 사용자 입력(inline-editing)을 통해 처리할 수도 있다.

편집 페이지

컨트롤 위에 팝업으로 표시되는 편집 페이지를 이용해 데이터행을 수정하거나 신규 행을 추가할 수 있다.


페이지는 라이브러리에서 제공하는 기본 template을 사용하거나, 사용자 template으로 편집 내용을 구성할 수 있다.
편집 페이지는 컨트롤 api 함수를 직접 호출하거나, 버튼 등에 action을 지정해서 호출할 수 있다.

편집 페이지를 이용한 데이터행 수정/추가에 대한 자세한 내용은 편집 페이지 도움말을 참조한다.

직접 수정 (inline update)

데이터행 template에 편집기를 설정하고 RtEditOptions.autoUpdatetrue(기본값)으로 지정하고 실행 시간 사용자가 편집기 값 변경을 완료하면 즉시 연결된 데이터소스에 반영한다.


(두번째 행의 개수를 변경하여 rowStyle의 'updated' 스타일이 적용되었다.)
autoUpdatefalse로 지정하면 편집기의 값을 변경해도 이 전 값으로 되돌려 표시된다.

직접 입력 편집 (inline editing)

기본 데이터행 template에 편집기를 지정해서 편집기 수정 시 즉시 데이터소스에 반영하는 대신, 편집을 위한 template을 별도로 구성하고, 모든 필드들의 값이 변경되면 명시적으로 데이터소스에 행 단위로 반영시키는 입력 방식이다. 몇 필드 값을 변경한 후 입력 취소를 해서 편집을 종료할 수도 있다.


기존 데이터행을 수정하거나, 마지막 행 다음이나, 지정한 행 위치에 신규 행을 삽입 추가할 수 있다.

편집 가능 데이터소스

직접 입력을 통한 데이터행 편집을 UI로 진행하기 위해서는, 수정 및 추가되는 데이터행의 상태 관리가 필요한데, 이를 위해 RtEditableDataView 데이터소스 모델을 제공한다. 즉, 직접 입력 UI를 구현하기 위해서는 RtEditableDataView를 생성해서 컨트롤에 연결해야 한다. 이 데이터뷰는 RtListDatacreateEditableView를 호출해서 생성한다.

const dv = RealTouch.createListData('main', options).createEditableView('view', {});
list.data = dv;

RtEditableDataView는 RtDataView 데이터소스 모델에 데이터행 편집 관리 기능이 추가된 것이다.

데이터행 수정

편집 옵션 모델 속성인 RtListOptions.edit에 행 수정을 위한 template을 설정하고, 지정한 행 수정 편집을 시작한다.

const config = {
    options: {
        edit: {
            template: edit_template
        },
        header: {
            buttons: [{
                label: '수정',
                onClick: args => {
                    const row = args.control.focusedRow;
                    if (row >= 0) {
                        args.control.data.beginUpdate(row);
                    } else {
                        alert('수정할 행을 먼저 선택하세요.');
                    }
                }
            }]
        }
    }
}

혹은, 콜백 대신 버튼의 action을 'update'로 지정할 수도 있다.

데이터행 추가

편집 옵션 모델 속성인 RtListOptions.edit에 행 추가를 위한 template을 설정하고, 마지막 행 다음에 신규 행 추가 편집을 시작한다. 편집할 행이 표시되도록 자동 스크롤된다.

const config = {
    options: {
        edit: {
            // createTemplate을 지정하지 않으면 template이 사용된다.
            createTemplate: new_template
        },
        header: {
            buttons: [{
                label: '추가',
                onClick: args => {
                    args.control.data.beginAppend();
                }
            }]
        }
    }
}

혹은, 콜백 대신 버튼의 action을 'append'로 지정할 수도 있다.


데이터행 삽입

특정한 데이터행 위치에 신규 행을 삽입 추가한다.

const config = {
    options: {
        edit: {
            // createTemplate을 지정하지 않으면 template이 사용된다.
            createTemplate: new_template
        },
        header: {
            buttons: [{
                label: '삽입',
                onClick: args => {
                    const row = args.control.focusedRow;
                    if (row >= 0) {
                        args.control.data.beginInsert(row);
                    } else {
                        alert('신규 행을 삽입할 행 위치를 먼저 지정하세요.');
                    }
                }
            }]
        }
    }
}

기본적으로 지정한 행 위치에 추가하지만, 아래처럼 행 다음에 추가되도록 할 수도 있다.

args.control.data.beginInsert(row, true);

편집 완료

begin-으로 시작된 행 편집은 행 단위로 완료되거나 취소할 수 있다. 편집 화면에 표시되는 'Commit', 'Cancel' 버튼을 클릭해서 각각 완료 및 취소할 수 있고, 데이터소스 메소드를 직접 호출할 수도 있다.

// 편집 완료
data.commit();
// 편집 취소
data.cancel();

편집 버튼들은 행 커맨드 버튼과 유사하게 옵션으로 설정할 수 있다.

const config = {
    props: {
        editCommands: {
            '@commit': { style: { backgroundColor: 'blue' } },
            ...
        }
    },
    options: {
        edit: {
            stockCommands: true,
            commands: [...]
        }
    }
}

편집 완료 및 취소를 위한 기본 '@commit', '@cancel' command를 제공한다. RtEditOptions 도움말 페이지를 참조한다.

섹션 편집

컨트롤 헤더Footer에도 편집기를 표시할 수 있다.


에디터의 onChange나 렌더러의 onClick 이벤트 콜백 내에서 다른 항목의 값을 가져오거나 설정할 수 있다.

const header_template = {
    template: {
        children: [{
            id: 'idText',
            editor: {
                onChange: args => {
                    args.ctx.setValue('idCopy', args.editValue);
                }
            }
        }, {
            renderer: {
                type: 'button',
                onClick: args => {
                    const v = args.ctx.getValue('idText');
                    alert(v);
                }
            }
        }, {
            id: 'idCopy'
        }]
    }
}

See Also

RtEditableDataView
RtEditOptions
데이터소스
리스트 컨트롤