웹 디자인/JavaScript

tui-grid header checkbox render 만들기

K.두부 2025. 1. 13. 23:02
반응형

최근 넥사플랫폼을 버리고, tui-grid로 개발을 진행하고 있어 참고용으로 기록합니다.

그리드 header에 checkbox를 만들기 위해서는 render를 사용해야합니다.

 

class checkboxRenderer를 만들어서 모든 행 check / uncheck 기능까지 구현했습니다.

방법은 아래와 같습니다.

 

 

<html>
<head>
    <link rel="stylesheet" href="https://uicdn.toast.com/tui-grid/latest/tui-grid.min.css"/>
	
    <script src="https://uicdn.toast.com/tui-code-snippet/latest/tui-code-snippet.min.js"></script>
    <script src="https://uicdn.toast.com/tui.dom/v3.0.0/tui-dom.min.js"></script>
    <script src="https://uicdn.toast.com/tui-component-popup/v1.5.0/tui-component-popup.min.js"></script>
    <script src="https://uicdn.toast.com/tui.time-picker/latest/tui-time-picker.min.js"></script>
    <script src="https://uicdn.toast.com/tui-date-picker/latest/tui-date-picker.min.js"></script>
    <script src="https://uicdn.toast.com/tui-color-picker/latest/tui-color-picker.min.js"></script>
    <script src="https://uicdn.toast.com/tui-chart/latest/tui-chart.min.js"></script>
    <script src="https://uicdn.toast.com/tui-grid/latest/tui-grid.min.js"></script>
</head>
<body>
    <div id="grid"></div>

<script type="text/javascript">
    class CheckboxRenderer {
        constructor(props) {
            const { grid, rowKey } = props;

            const label = document.createElement('label');
            label.className = 'checkbox tui-grid-row-header-checkbox';
            label.setAttribute('for', String(rowKey));

            const hiddenInput = document.createElement('input');
            hiddenInput.className = 'hidden-input';
            hiddenInput.id = String(rowKey);

            const customInput = document.createElement('span');
		    customInput.className = 'custom-input';

		    label.appendChild(hiddenInput);
		    label.appendChild(customInput);

		    hiddenInput.type = 'checkbox';
		    label.addEventListener('click', (ev) => {
		        ev.preventDefault();

                if (ev.shiftKey) {
                    grid[!hiddenInput.checked ? 'checkBetween' : 'uncheckBetween'](rowKey);
                    return;
                }

                grid[!hiddenInput.checked ? 'check' : 'uncheck'](rowKey);
            });

		    this.el = label;
		    this.render(props);
        }

        getElement() {
            return this.el;
        }

        render(props) {
            const hiddenInput = this.el.querySelector('.hidden-input');
            const checked = Boolean(props.value);

            hiddenInput.checked = checked;
        }
    }
	
    // Toast UI Grid 생성
    const grid = new tui.Grid({
        el: document.getElementById('grid'),
        rowHeaders: [
            {
                type: 'checkbox',
                header: `
                    <label for="all-checkbox" class="checkbox">
                    <input type="checkbox" id="all-checkbox" class="hidden-input" name="_checked" />
                    <span class="custom-input"></span>
                    </label>
                `,
                renderer: {
                    type: CheckboxRenderer
                }
            }
        ],
        columns: [
            {name: 'name',    header: 'Name'},
            {name: 'age',     header: 'Age'},
            {name: 'address', header: 'Address'}
        ],
        data: [
            {name: 'John Doe',  age: 30, address: 'New York'},
            {name: 'Jane Doe',  age: 25, address: 'San Francisco'},
            {name: 'Bob Smith', age: 50, address: 'Los Angeles'}
        ]
    });
</script>
</body>
</html>

 

반응형