(function ($) { "use strict"; var Table = function (element, options) { this.options = options; this.$element = element; this.table; this.$element.on( "click", function (event) { if (options.isAddCheckbox) { var $td = $(event.target).closest("td"); var $checkbox = $td.find("input[type='checkbox']"); this.onToggleCheckbox($td, $checkbox); } else { var $row = $(event.target).closest("tr"); this.onRowClick(event, $row); } }.bind(this) ); if (options.isEditable) { options.rowsGroup = null; } if (options.isAddCheckbox) { options.columnDefs = [ { targets: 0, orderable: false, searchable: false, data: null, defaultContent: "", className: "select-checkbox" }, { targets: 1, aDataSort: [1] } ].concat(options.columnDefs); options.columns = [ { data: null, title: $('')[0].outerHTML, render: function () { return $('')[0].outerHTML; }, orderable: false, className: "dt-body-center" } ].concat(options.columns); options.select = { style: "multi", selector: "td:first-child" }; } }; Table.prototype = { constructor: Table, onToggleCheckAll: function (element) { if (!element) { return false; } console.log("onToggleCheckAll => ", element); var tr = this.table.rows({ filter: "applied" }).nodes(); var isChecked = $(element).prop("checked"); if (isChecked) { this.table.rows({ filter: "applied" }).select(); } else { this.table.rows({ filter: "applied" }).deselect(); } $.each(tr, function () { $(this).find('input[type="checkbox"]').prop("checked", isChecked); }); // 사용자 정의 이벤트 발생 this.$element.trigger("checkbox.toggle.checkAll", [ element, !isChecked]); }, onToggleCheckbox: function ($td, $checkbox) { var $row = $td.closest("tr"); var isChecked = $row.hasClass("selected"); if (!$checkbox.length) return; $checkbox.prop("checked", !isChecked); $row.toggleClass("selected"); // 사용자 정의 이벤트 발생 this.$element.trigger("checkbox.toggle.table", [this.getData($row), $row, !isChecked]); }, onRowClick: function (event, $row) { if (!this.options.select) return; console.log("onRowClick => ", $row); this.selectedData = this.table.row($row).data(); if ($row.hasClass("selected")) { var event = $.Event("deselect.table", { target: event.target }); console.log("deselect.table => ", event); this.$element.trigger(event, [this.selectedData, $row]); } else { var event = $.Event("select.table", { target: event.target }); console.log("selected"); this.table.$("tr.selected").removeClass("selected"); this.$element.trigger(event, [this.selectedData, $row]); } $row.toggleClass("selected"); }, dataTableBuild: function () { var self = this; this.table = this.$element.DataTable(this.options); var tableWrapper = this.$element.closest(".dataTables_wrapper"); $.fn.dataTable.ext.errMode = function () { jError("Notification : Ajax Error, retry plz !"); }; if (this.options.isAddCheckbox) { tableWrapper.on("change", 'input[name="checkall"]', function () { self.onToggleCheckAll(this); }); } if (this.options.isEditable) { tableWrapper.find(".dataTables_filter").append( $("