UNPKG

tui-grid

Version:

TOAST UI Grid : Powerful data grid control supported by TOAST UI

495 lines (409 loc) 15.5 kB
'use strict'; var _ = require('underscore'); var ColumnModelData = require('model/data/columnModel'); var RowListData = require('model/data/rowList'); var FocusModel = require('model/focus'); var DomEventBus = require('event/domEventBus'); var GridEvent = require('event/gridEvent'); var Model = require('base/model'); describe('model/focus', function() { function create(options) { var columnModel, dataModel; columnModel = new ColumnModelData({ columns: [ { name: 'c1', editOptions: { type: 'text' } }, { name: 'c2', editOptions: { type: 'text' } }, { name: 'c3', editOptions: { type: 'text' } } ] }); dataModel = new RowListData([], { columnModel: columnModel }); dataModel.set([{ c1: '0-1', c2: '0-2', c3: '0-3' }, { c1: '1-1', c2: '1-2', c3: '1-3' }, { c1: '2-1', c2: '2-2', c3: '2-3' }, { c1: '3-1', c2: '3-2', c3: '3-3' }], {parse: true}); return new FocusModel(null, _.extend({ columnModel: columnModel, dataModel: dataModel, coordRowModel: {} }, options)); } describe('when singleClickEdit is true', function() { it('and clickCell event occurs, call focusIn() with given address', function() { var domEventBus = DomEventBus.create(); var focusModel = create({ domEventBus: domEventBus, editingEvent: 'click' }); spyOn(focusModel, 'focusIn'); domEventBus.trigger('click:cell', new GridEvent(null, { rowKey: 0, columnName: 'c1' })); expect(focusModel.focusIn).toHaveBeenCalledWith(0, 'c1'); }); }); describe('when new data appended with focus:true option', function() { it('focus to first cell of new added row', function() { var focusModel = create(); var newRows = focusModel.dataModel.appendRow({}, { focus: true }); expect(focusModel.get('rowKey')).toBe(newRows[0].get('rowKey')); expect(focusModel.get('columnName')).toBe('c1'); }); }); describe('focus()', function() { var focusModel; beforeEach(function() { focusModel = create(); focusModel.blur(); }); it('set rowKey and columnName', function() { focusModel.focus('1', 'c1'); expect(focusModel.get('rowKey')).toEqual('1'); expect(focusModel.get('columnName')).toEqual('c1'); }); it('trigger focus event', function() { var callback = jasmine.createSpy(); focusModel.on('focus', callback); focusModel.focus('1', 'c1', true); expect(callback).toHaveBeenCalledWith('1', 'c1', true); }); it('trigger focusChange event', function() { var callback = jasmine.createSpy(); var argEvent; focusModel.focus('1', 'c1', true); focusModel.on('focusChange', callback); focusModel.focus('2', 'c2', true); argEvent = callback.calls.argsFor(0)[0]; expect(argEvent.prevRowKey).toBe('1'); expect(argEvent.prevColumnName).toBe('c1'); expect(argEvent.rowKey).toBe('2'); expect(argEvent.columnName).toBe('c2'); }); it('if callback of focusChange event invokes ev.stop(), do nothing', function() { focusModel.on('focusChange', function(ev) { ev.stop(); }); focusModel.focus('1', 'c1'); expect(focusModel.get('rowKey')).toBeNull(); expect(focusModel.get('columnName')).toBeNull(); }); it('if the target is the same as current cell and the focus is not active,' + 'trigger nothing', function() { var callback = jasmine.createSpy(); focusModel.focus('1', 'c1'); focusModel.on('focus', callback); focusModel.on('focusChange', callback); focusModel.focus('1', 'c1'); expect(callback).not.toHaveBeenCalled(); }); it('save previous rowKey and columnName', function() { focusModel.focus(0, 'c1'); focusModel.focus(1, 'c2'); expect(focusModel.get('rowKey')).toEqual(1); expect(focusModel.get('columnName')).toEqual('c2'); expect(focusModel.get('prevRowKey')).toEqual(0); expect(focusModel.get('prevColumnName')).toEqual('c1'); }); }); describe('blur()', function() { var focusModel; beforeEach(function() { focusModel = create(); }); it('clear rowKey and columnName', function() { focusModel.blur(); expect(focusModel.get('rowKey')).toBeNull(); expect(focusModel.get('columnName')).toBeNull(); }); it('trigger blur event', function() { var callback = jasmine.createSpy(); var listenModel = new Model(); focusModel.focus(1, 'c1'); listenModel.listenToOnce(focusModel, 'blur', callback); focusModel.blur(); expect(callback).toHaveBeenCalledWith(1, 'c1'); }); }); describe('which()', function() { var focusModel; beforeEach(function() { focusModel = create(); }); it('현재 focus 정보를 반환하는지 확인한다.', function() { focusModel.focus(1, 'c1'); expect(focusModel.which()).toEqual({ rowKey: 1, columnName: 'c1' }); focusModel.blur(); expect(focusModel.which()).toEqual({ rowKey: null, columnName: null }); }); }); describe('indexOf()', function() { var focusModel; beforeEach(function() { focusModel = create(); }); it('현재 focus 정보를 화면에 노출되는 Index 기준으로 반환하는지 확인한다.', function() { focusModel.focus(1, 'c1'); expect(focusModel.indexOf()).toEqual({ row: 1, column: 0 }); }); it('메타컬럼은 포커스가 되지 않으므로, "_number"컬럼에 포커스하여도 변경사항이 없다', function() { focusModel.focus(1, 'c1'); expect(focusModel.indexOf()).toEqual({ row: 1, column: 0 }); focusModel.focus(1, '_number'); expect(focusModel.indexOf()).toEqual({ row: 1, column: 0 }); }); it('isPrevious 옵션이 설정되어 있다면 이전 정보를 반환한다.', function() { focusModel.focus('1', 'c1'); focusModel.focus('1', 'c2'); expect(focusModel.indexOf(true)).toEqual({ row: 1, column: 0 }); focusModel.focus('0', 'c1'); expect(focusModel.indexOf(true)).toEqual({ row: 1, column: 1 }); }); }); describe('has()', function() { var focusModel; beforeEach(function() { focusModel = create(); }); it('현재 focus 를 가지고 있는지 확인한다.', function() { focusModel.focus(0, 'c1'); expect(focusModel.has()).toBe(true); focusModel.blur(); expect(focusModel.has()).toBe(false); }); it('If called with true and focused cell is not valid, return false', function() { focusModel.focus(0, 'c5'); expect(focusModel.has(true)).toBe(false); }); }); describe('_findRowKey()', function() { var focusModel; beforeEach(function() { focusModel = create(); }); it('offset 만큼 이동한 rowKey 를 반환한다.', function() { focusModel.focus(1, 'c1'); expect(focusModel._findRowKey(2)).toBe(3); expect(focusModel._findRowKey(-1)).toBe(0); expect(focusModel._findRowKey(-10)).toBe(0); expect(focusModel._findRowKey(10)).toBe(3); }); }); describe('_findColumnName()', function() { it('offset 만큼 이동한 columnName 을 반환한다.', function() { var focusModel = create(); focusModel.focus(1, 'c1'); expect(focusModel._findColumnName(2)).toBe('c3'); expect(focusModel._findColumnName(-1)).toBe('c1'); expect(focusModel._findColumnName(10)).toBe('c3'); expect(focusModel._findColumnName(-100)).toBe('c1'); }); }); describe('nextColumnIndex()', function() { it('다음 columnIndex를 반환한다.', function() { var focusModel = create(); focusModel.focus(0, 'c1'); expect(focusModel.nextColumnIndex()).toBe(1); focusModel.focus(0, 'c2'); expect(focusModel.nextColumnIndex()).toBe(2); }); }); describe('prevColumnIndex()', function() { it('이전 columnIndex를 반환한다.', function() { var focusModel = create(); focusModel.focus(0, 'c3'); expect(focusModel.prevColumnIndex()).toBe(1); focusModel.focus(0, 'c2'); expect(focusModel.prevColumnIndex()).toBe(0); focusModel.focus(0, 'c1'); expect(focusModel.prevColumnIndex()).toBe(0); }); }); describe('firstRowKey()', function() { it('첫번째 rowKey 를 반환한다.', function() { var focusModel = create(); focusModel.focus(2, 'c2'); expect(focusModel.firstRowKey()).toBe(0); }); }); describe('lastRowKey()', function() { it('마지막 rowKey 를 반환한다.', function() { var focusModel = create(); focusModel.focus(2, 'c2'); expect(focusModel.lastRowKey()).toBe(3); }); }); describe('firstColumnName()', function() { it('첫번째 columnName 을 반환한다.', function() { var focusModel = create(); focusModel.focus(2, 'c2'); expect(focusModel.firstColumnName()).toBe('c1'); }); }); describe('lastColumnName()', function() { it('마지막 columnName 을 반환한다.', function() { var focusModel = create(); focusModel.focus(2, 'c2'); expect(focusModel.lastColumnName()).toBe('c3'); }); }); describe('_isValidCell', function() { it('Returns where specified cell is valid', function() { var focusModel = create(); expect(focusModel._isValidCell(1, 'c1')).toBe(true); expect(focusModel._isValidCell(2, 'c3')).toBe(true); expect(focusModel._isValidCell(1, 'c4')).toBe(false); expect(focusModel._isValidCell(5, 'c1')).toBe(false); }); }); describe('restore', function() { it('If previous data exist, restore it and return true', function() { var focusModel = create(); var result; focusModel.focus(0, 'c1'); focusModel.blur(); result = focusModel.restore(); expect(result).toBe(true); expect(focusModel.which()).toEqual({ rowKey: 0, columnName: 'c1' }); }); it('If previous data does not exist, return false', function() { var focusModel = create(); var result = focusModel.restore(); expect(result).toBe(false); expect(focusModel.has(true)).toBe(false); }); }); describe('with rowSpan Data', function() { var focusModel; beforeEach(function() { focusModel = create(); focusModel.dataModel.lastRowKey = -1; focusModel.dataModel.reset( [ { c1: '0-1', c2: '0-2', c3: '0-3' }, { _extraData: { rowSpan: { c1: 3 } }, c1: '1-1', c2: '1-2', c3: '1-3' }, { c2: '2-2', c3: '2-3' }, { c2: '3-2', c3: '3-3' }, { c1: '4-1', c2: '4-2', c3: '4-3' } ], { parse: true } ); }); describe('nextRowKey()', function() { it('offset만큼 이동한 row의 rowKey를 반환한다.', function() { focusModel.coordRowModel.getNextOffset = function() { return 1; }; focusModel.focus(0, 'c2'); expect(focusModel.nextRowKey()).toBe(1); expect(focusModel.nextRowKey(3)).toBe(3); }); it('현재 focus된 row가 rowSpan된 경우, rowSpan값을 고려하여 반환한다.', function() { focusModel.focus(1, 'c1'); expect(focusModel.nextRowKey()).toBe(4); focusModel.focus(2, 'c1'); expect(focusModel.nextRowKey()).toBe(4); focusModel.focus(0, 'c1'); expect(focusModel.nextRowKey(2)).toBe(1); expect(focusModel.nextRowKey(3)).toBe(1); }); }); describe('prevRowKey()', function() { it('offset 만큼 이동한 row 의 rowKey를 반환한다.', function() { focusModel.coordRowModel.getPreviousOffset = function() { return -1; }; focusModel.focus(4, 'c2'); expect(focusModel.prevRowKey()).toBe(3); expect(focusModel.prevRowKey(3)).toBe(1); }); it('현재 focus된 row가 rowSpan된 경우, rowSpan값을 고려하여 반환한다.', function() { focusModel.focus(3, 'c1'); expect(focusModel.prevRowKey()).toBe(0); focusModel.focus(2, 'c1'); expect(focusModel.prevRowKey()).toBe(0); focusModel.focus(4, 'c1'); expect(focusModel.prevRowKey(2)).toBe(1); expect(focusModel.prevRowKey(3)).toBe(1); }); }); }); });