tabulator-tables
Version:
Interactive table generation JavaScript library
194 lines (146 loc) • 5.71 kB
JavaScript
import Module from '../../core/Module.js';
class Popup extends Module{
constructor(table){
super(table);
this.columnSubscribers = {};
this.registerTableOption("rowContextPopup", false);
this.registerTableOption("rowClickPopup", false);
this.registerTableOption("groupContextPopup", false);
this.registerTableOption("groupClickPopup", false);
this.registerColumnOption("headerContextPopup");
this.registerColumnOption("headerClickPopup");
this.registerColumnOption("headerPopup");
this.registerColumnOption("headerPopupIcon");
this.registerColumnOption("contextPopup");
this.registerColumnOption("clickPopup");
}
initialize(){
this.initializeRowWatchers();
this.initializeGroupWatchers();
this.subscribe("column-init", this.initializeColumn.bind(this));
}
initializeRowWatchers(){
if(this.table.options.rowContextPopup){
this.subscribe("row-contextmenu", this.loadPopupEvent.bind(this, this.table.options.rowContextPopup));
this.table.on("rowTapHold", this.loadPopupEvent.bind(this, this.table.options.rowContextPopup));
}
if(this.table.options.rowClickPopup){
this.subscribe("row-click", this.loadPopupEvent.bind(this, this.table.options.rowClickPopup));
}
}
initializeGroupWatchers(){
if(this.table.options.groupContextPopup){
this.subscribe("group-contextmenu", this.loadPopupEvent.bind(this, this.table.options.groupContextPopup));
this.table.on("groupTapHold", this.loadPopupEvent.bind(this, this.table.options.groupContextPopup));
}
if(this.table.options.groupClickPopup){
this.subscribe("group-click", this.loadPopupEvent.bind(this, this.table.options.groupClickPopup));
}
}
initializeColumn(column){
var def = column.definition;
//handle column events
if(def.headerContextPopup && !this.columnSubscribers.headerContextPopup){
this.columnSubscribers.headerContextPopup = this.loadPopupTableColumnEvent.bind(this, "headerContextPopup");
this.subscribe("column-contextmenu", this.columnSubscribers.headerContextPopup);
this.table.on("headerTapHold", this.loadPopupTableColumnEvent.bind(this, "headerContextPopup"));
}
if(def.headerClickPopup && !this.columnSubscribers.headerClickPopup){
this.columnSubscribers.headerClickPopup = this.loadPopupTableColumnEvent.bind(this, "headerClickPopup");
this.subscribe("column-click", this.columnSubscribers.headerClickPopup);
}
if(def.headerPopup){
this.initializeColumnHeaderPopup(column);
}
//handle cell events
if(def.contextPopup && !this.columnSubscribers.contextPopup){
this.columnSubscribers.contextPopup = this.loadPopupTableCellEvent.bind(this, "contextPopup");
this.subscribe("cell-contextmenu", this.columnSubscribers.contextPopup);
this.table.on("cellTapHold", this.loadPopupTableCellEvent.bind(this, "contextPopup"));
}
if(def.clickPopup && !this.columnSubscribers.clickPopup){
this.columnSubscribers.clickPopup = this.loadPopupTableCellEvent.bind(this, "clickPopup");
this.subscribe("cell-click", this.columnSubscribers.clickPopup);
}
}
initializeColumnHeaderPopup(column){
var icon = column.definition.headerPopupIcon,
headerPopupEl;
headerPopupEl = document.createElement("span");
headerPopupEl.classList.add("tabulator-header-popup-button");
if(icon){
if(typeof icon === "function"){
icon = icon(column.getComponent());
}
if(icon instanceof HTMLElement){
headerPopupEl.appendChild(icon);
}else{
headerPopupEl.innerHTML = icon;
}
}else{
headerPopupEl.innerHTML = "⋮";
}
headerPopupEl.addEventListener("click", (e) => {
e.stopPropagation();
e.preventDefault();
this.loadPopupEvent(column.definition.headerPopup, e, column);
});
column.titleElement.insertBefore(headerPopupEl, column.titleElement.firstChild);
}
loadPopupTableCellEvent(option, e, cell){
if(cell._cell){
cell = cell._cell;
}
if(cell.column.definition[option]){
this.loadPopupEvent(cell.column.definition[option], e, cell);
}
}
loadPopupTableColumnEvent(option, e, column){
if(column._column){
column = column._column;
}
if(column.definition[option]){
this.loadPopupEvent(column.definition[option], e, column);
}
}
loadPopupEvent(contents, e, component){
var renderedCallback;
function onRendered(callback){
renderedCallback = callback;
}
if(component._group){
component = component._group;
}else if(component._row){
component = component._row;
}
contents = typeof contents == "function" ? contents.call(this.table, e, component.getComponent(), onRendered) : contents;
this.loadPopup(e, component, contents, renderedCallback);
}
loadPopup(e, component, contents, renderedCallback){
var touch = !(e instanceof MouseEvent),
contentsEl, popup;
if(contents instanceof HTMLElement){
contentsEl = contents;
}else{
contentsEl = document.createElement("div");
contentsEl.innerHTML = contents;
}
contentsEl.classList.add("tabulator-popup");
contentsEl.addEventListener("click", (e) =>{
e.stopPropagation();
});
if(!touch){
e.preventDefault();
}
popup = this.popup(contentsEl);
if(typeof renderedCallback === "function"){
popup.renderCallback(renderedCallback);
}
popup.show(e).hideOnBlur(() => {
this.dispatchExternal("popupClosed", component.getComponent());
});
this.dispatchExternal("popupOpened", component.getComponent());
}
}
Popup.moduleName = "popup";
export default Popup;