Initial commit: Kimai TMS
Kimai time management system (PHP 5.6 / MySQL) with custom extensions: - Budget tracking (ki_budget) - Change request form (ki_changerequest) - Invoice generation (ki_invoice) - Expense tracking (ki_expenses) - Flexi time (ki_flexitime) - Export, admin panel, timesheets, tasks, summary Database: ~900K time entries, 2,000+ users, 439 projects. Config: includes/autoconf.php — localhost/kimai/kimai
This commit is contained in:
@@ -0,0 +1,614 @@
|
||||
// if xajax has not yet been initialized, wait a second and try again
|
||||
// once xajax has been initialized, install the table command handlers.
|
||||
installtabManager = function()
|
||||
{
|
||||
var xjxReady = false;
|
||||
|
||||
try
|
||||
{
|
||||
if (xajax)
|
||||
xjxReady = true;
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
}
|
||||
|
||||
if (false == xjxReady)
|
||||
{
|
||||
setTimeout('installtabManager();', 1000);
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (undefined == xajax.ext.tabManager)
|
||||
xajax.ext.tabManager = {
|
||||
};
|
||||
|
||||
xajax.ext.tabManager.instances = {
|
||||
};
|
||||
}
|
||||
catch (e)
|
||||
{
|
||||
xajax.ext = {
|
||||
};
|
||||
|
||||
xajax.ext.tabManager = {
|
||||
};
|
||||
|
||||
xajax.ext.tabManager.instances = {
|
||||
};
|
||||
}
|
||||
|
||||
xajax.ext.tabPanel = function(config)
|
||||
{
|
||||
this.config = config;
|
||||
this._parent = config._parent;
|
||||
this.id = config.id;
|
||||
var element = this;
|
||||
this.events = {
|
||||
};
|
||||
|
||||
this.tabWidth = 0;
|
||||
|
||||
if ('undefined' != typeof config.closeable)
|
||||
{
|
||||
this.closeable = config.closeable;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.closeable = true;
|
||||
}
|
||||
|
||||
var parPanel = this._parent.tabPanel;
|
||||
this.tab_item = document.createElement('div');
|
||||
this.tab_item.id = "tabPanel_" + this.id;
|
||||
this.tab_item.className = "tabPanelItem";
|
||||
this.tab_item.onclick = function()
|
||||
{
|
||||
element._parent.show(element.id);
|
||||
return false;
|
||||
};
|
||||
|
||||
var tab_item_left = document.createElement('div');
|
||||
tab_item_left.className = 'tabLeft';
|
||||
tab_item_left.innerHTML = ' ';
|
||||
this.tab_item.appendChild(tab_item_left);
|
||||
|
||||
var tab_title = document.createElement('div');
|
||||
tab_title.id = "tabPanelTitel_" + this.id;
|
||||
tab_title.innerHTML = config.title;
|
||||
tab_title.className = 'title';
|
||||
this.tab_title = tab_title;
|
||||
this.tab_item.appendChild(tab_title);
|
||||
|
||||
if (this.closeable)
|
||||
{
|
||||
var foo = this;
|
||||
var tab_close = document.createElement('div');
|
||||
tab_close.id = "tabPanelClose_" + this.id;
|
||||
tab_close.innerHTML = " ";
|
||||
tab_close.className = 'close';
|
||||
tab_close.onclick = function()
|
||||
{
|
||||
foo.fire("close");
|
||||
element._parent.closePanel(element.id);
|
||||
return false;
|
||||
}
|
||||
this.tab_item.appendChild(tab_close);
|
||||
}
|
||||
|
||||
var tab_item_right = document.createElement('div');
|
||||
tab_item_right.className = 'tabRight';
|
||||
tab_item_right.innerHTML = ' ';
|
||||
this.tab_item.appendChild(tab_item_right);
|
||||
|
||||
var tab_clear = document.createElement('div');
|
||||
tab_clear.style.clear = 'both';
|
||||
this.tab_item.appendChild(tab_clear);
|
||||
|
||||
var tmp_width = $(parPanel).outerWidth();
|
||||
//parPanel.style.width=(tmp_width+300)+"px";
|
||||
parPanel.appendChild(this.tab_item);
|
||||
|
||||
var parContent = this._parent.tabContent;
|
||||
|
||||
this.tab_content = document.createElement('div');
|
||||
this.tab_content.id = "tabContent_" + this.id;
|
||||
this.tab_content.className = "tabPanelContent";
|
||||
this.tab_content.innerHTML = config.content;
|
||||
this.tab_content.style.display = 'none';
|
||||
|
||||
parContent.appendChild(this.tab_content);
|
||||
//this.getWidth();
|
||||
this.tabWidth = $(this.tab_item).outerWidth() + 2;
|
||||
|
||||
this.getWidth = function()
|
||||
{
|
||||
this.tabWidth = $(this.tab_item).outerWidth() + 2;
|
||||
return this.tabWidth;
|
||||
};
|
||||
|
||||
this.show = function()
|
||||
{
|
||||
this.tab_item.className = 'tabPanelItemActive';
|
||||
this.tab_content.style.display = 'block';
|
||||
this.fire("show");
|
||||
};
|
||||
|
||||
this.hide = function()
|
||||
{
|
||||
this.tab_item.className = 'tabPanelItem';
|
||||
this.tab_content.style.display = 'none';
|
||||
|
||||
this.fire("hide");
|
||||
};
|
||||
|
||||
this.setTitle = function(title)
|
||||
{
|
||||
this.tab_title.innerHTML = title;
|
||||
};
|
||||
|
||||
this.setContent = function(content)
|
||||
{
|
||||
this.tab_content.innerHTML = content;
|
||||
};
|
||||
|
||||
this.destroy = function()
|
||||
{
|
||||
this.fire("destroy");
|
||||
parPanel.removeChild(this.tab_item);
|
||||
parContent.removeChild(this.tab_content);
|
||||
};
|
||||
|
||||
this.fire = function(EventName)
|
||||
{
|
||||
if ('object' == typeof this.events[EventName])
|
||||
{
|
||||
for (a in this.events[EventName])
|
||||
this.events[EventName][a]();
|
||||
}
|
||||
}
|
||||
|
||||
this.on = function(EventName, EventFunction, EventFunctionId)
|
||||
{
|
||||
if ('object' != typeof this.events[EventName])
|
||||
this.events[EventName] = new Object();
|
||||
|
||||
if ('undefined' == typeof this.events[EventName][EventFunctionId])
|
||||
this.events[EventName][EventFunctionId] = EventFunction;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/* ---------------------------------------------------------------------------------------------------------------------------- */
|
||||
|
||||
xajax.ext.tabManager.tabBar = function(config)
|
||||
{
|
||||
this.config = config;
|
||||
this.tabBar = xajax.$(config.tabPanel);
|
||||
this.tabContent = xajax.$(config.tabContent);
|
||||
this.tabs = {
|
||||
};
|
||||
|
||||
this.activeTab = null;
|
||||
this.lastActiveTab = null;
|
||||
this.interval = null;
|
||||
|
||||
this.maxWidth = $(this.tabBar).innerWidth();
|
||||
|
||||
this.tabWidth = 0;
|
||||
this.tabHeight = $(this.tabBar).innerHeight();
|
||||
|
||||
var leftHandle = document.createElement('div');
|
||||
leftHandle.className = "leftHandle";
|
||||
|
||||
var rightHandle = document.createElement('div');
|
||||
rightHandle.className = "rightHandle";
|
||||
|
||||
var foo = this;
|
||||
|
||||
leftHandle.onmouseover = function()
|
||||
{
|
||||
foo.scroll(4);
|
||||
}
|
||||
rightHandle.onmouseover = function()
|
||||
{
|
||||
foo.scroll(-4);
|
||||
}
|
||||
|
||||
leftHandle.onmouseout = function()
|
||||
{
|
||||
foo.scrollStop();
|
||||
}
|
||||
|
||||
rightHandle.onmouseout = function()
|
||||
{
|
||||
foo.scrollStop();
|
||||
}
|
||||
|
||||
leftHandle.style.display = 'none';
|
||||
rightHandle.style.display = 'none';
|
||||
|
||||
this.leftHandle = leftHandle;
|
||||
this.rightHandle = rightHandle;
|
||||
|
||||
var tabContainer = document.createElement('div');
|
||||
tabContainer.id = "tabManager_Container_" + config.tabPanel;
|
||||
tabContainer.style.position = "absolute";
|
||||
tabContainer.style.top = "0px";
|
||||
tabContainer.style.left = "0px";
|
||||
tabContainer.style.right = "0px";
|
||||
|
||||
// possible IE abs pos fix
|
||||
//tabContainer.style.width = this.maxWidth + "px";
|
||||
|
||||
tabContainer.style.height = this.tabHeight + "px";
|
||||
tabContainer.style.overflow = "hidden";
|
||||
|
||||
var tabPanel = document.createElement('div');
|
||||
tabPanel.style.position = "absolute";
|
||||
tabPanel.style.height = this.tabHeight + "px";
|
||||
|
||||
this.tabBar.appendChild(leftHandle);
|
||||
this.tabBar.appendChild(tabContainer);
|
||||
this.tabBar.appendChild(rightHandle);
|
||||
|
||||
tabContainer.appendChild(tabPanel);
|
||||
|
||||
this.tabPanel = tabPanel;
|
||||
this.tabContainer = tabContainer;
|
||||
|
||||
if ('undefined' != typeof config.cssClass)
|
||||
{
|
||||
this.tabPanel.className = this.tabBar.className + " " + config.cssClass;
|
||||
}
|
||||
|
||||
this.addPanel = function(config)
|
||||
{
|
||||
if ('undefined' != typeof this.tabs[config.id])
|
||||
{
|
||||
if (config.hide)
|
||||
return;
|
||||
|
||||
this.tabs[config.id].fire("destroy");
|
||||
this.show(config.id);
|
||||
return;
|
||||
};
|
||||
config._parent = this;
|
||||
this.tabs[config.id] = new xajax.ext.tabPanel(config);
|
||||
|
||||
if (true != config.hide)
|
||||
this.show(config.id);
|
||||
|
||||
this.tabWidth += this.tabs[config.id].getWidth();
|
||||
|
||||
// possible IE abs pos fix
|
||||
//this.tabPanel.style.width=this.tabWidth+"px";
|
||||
|
||||
if (this.tabWidth > this.maxWidth)
|
||||
{
|
||||
|
||||
this.leftHandle.style.display = 'block';
|
||||
this.rightHandle.style.display = 'block';
|
||||
|
||||
var lspace = $(this.leftHandle).outerWidth() + 1;
|
||||
var rspace = $(this.rightHandle).outerWidth() + 1;
|
||||
this.tabContainer.style.left = lspace + "px";
|
||||
this.tabContainer.style.right = rspace + "px";
|
||||
}
|
||||
};
|
||||
this.show = function(id)
|
||||
{
|
||||
if ('undefined' == typeof this.tabs[id])
|
||||
return;
|
||||
|
||||
if (null != this.activeTab)
|
||||
this.activeTab.hide();
|
||||
this.tabs[id].show();
|
||||
this.lastActiveTab = this.activeTab;
|
||||
this.activeTab = this.tabs[id];
|
||||
|
||||
var pos = $('#tabPanel_' + id).position();
|
||||
var elm_left = pos.left;
|
||||
var elm_max = pos.left + parseInt(this.tabs[id].tabWidth);
|
||||
|
||||
var container_width = $(this.tabContainer).innerWidth();
|
||||
|
||||
var panel_pos = $(this.tabPanel).position();
|
||||
|
||||
var scroll_left = panel_pos.left;
|
||||
var visible_left = 0 - scroll_left;
|
||||
var visible_right = visible_left + container_width;
|
||||
|
||||
if (elm_left < visible_left)
|
||||
{
|
||||
$(this.tabPanel).animate(
|
||||
{
|
||||
left: (0 - elm_left) + "px"
|
||||
});
|
||||
}
|
||||
else if (elm_max > visible_right)
|
||||
{
|
||||
$(this.tabPanel).animate(
|
||||
{
|
||||
left: (container_width - elm_max - 22) + "px"
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
this.setContent = function(id, content)
|
||||
{
|
||||
if ('undefined' != typeof this.tabs[id])
|
||||
return;
|
||||
|
||||
this.tabs[id].setContent(content);
|
||||
};
|
||||
|
||||
this.setTitle = function(id, title)
|
||||
{
|
||||
if ('undefined' == typeof this.tabs[id])
|
||||
return;
|
||||
|
||||
this.tabs[id].setTitle(title);
|
||||
};
|
||||
|
||||
this.updateInnerWidth = function()
|
||||
{
|
||||
var tmpwidth = 0;
|
||||
|
||||
for (a in this.tabs)
|
||||
{
|
||||
tmpwidth += this.tabs[a].getWidth();
|
||||
}
|
||||
this.tabWidth = tmpwidth + 22;
|
||||
};
|
||||
|
||||
this.closePanel = function(id)
|
||||
{
|
||||
if ('undefined' == typeof this.tabs[id])
|
||||
return;
|
||||
|
||||
if (null != this.lastActiveTab)
|
||||
{
|
||||
if (this.activeTab.id == id)
|
||||
this.show(this.lastActiveTab.id);
|
||||
}
|
||||
|
||||
this.tabs[id].destroy();
|
||||
delete (this.tabs[id]);
|
||||
|
||||
this.updateInnerWidth();
|
||||
|
||||
if (this.tabWidth < this.maxWidth)
|
||||
{
|
||||
this.leftHandle.style.display = 'none';
|
||||
this.rightHandle.style.display = 'none';
|
||||
|
||||
this.tabContainer.style.left = "0px";
|
||||
this.tabContainer.style.right = "0px";
|
||||
// possible IE fix
|
||||
//this.tabContainer.style.width = this.maxWidth + "px";
|
||||
this.tabPanel.style.left = "0px";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
this.on = function(EventName, id, EventFunction, EventFunctionId)
|
||||
{
|
||||
this.tabs[id].on(EventName, EventFunction, EventFunctionId);
|
||||
}
|
||||
|
||||
this.scroll = function(value)
|
||||
{
|
||||
if (null != this.interval)
|
||||
return;
|
||||
|
||||
var tab = this;
|
||||
var i = value;
|
||||
this.interval = setInterval(function()
|
||||
{
|
||||
var lspace = $(tab.leftHandle).innerWidth() + 1;
|
||||
var rspace = $(tab.rightHandle).innerWidth() + 1;
|
||||
|
||||
var sLeft = tab.tabPanel.style.left;
|
||||
var iLeft = sLeft.replace("px", "");
|
||||
|
||||
if ("" == iLeft)
|
||||
iLeft = 0;
|
||||
iLeft = parseInt(iLeft);
|
||||
iLeft += i;
|
||||
var iMin = tab.maxWidth - tab.tabWidth - rspace - lspace;
|
||||
|
||||
if ((iLeft > 0) || ((iLeft < iMin) && (i < 0)))
|
||||
{
|
||||
tab.scrollStop();
|
||||
return;
|
||||
}
|
||||
tab.tabPanel.style.left = iLeft + "px";
|
||||
}, 25);
|
||||
}
|
||||
this.scrollStop = function()
|
||||
{
|
||||
if (null == this.interval)
|
||||
return;
|
||||
|
||||
clearInterval(this.interval);
|
||||
this.interval = null;
|
||||
}
|
||||
|
||||
this.destroy = function()
|
||||
{
|
||||
for (a in this.tabs)
|
||||
{
|
||||
this.tabs[a].destroy();
|
||||
delete (this.tabs[a]);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
xajax.ext.tabManager.create = function(id, config)
|
||||
{
|
||||
if ("undefined" == typeof xajax.ext.tabManager.instances[id])
|
||||
{
|
||||
try
|
||||
{
|
||||
xajax.ext.tabManager.instances[id] = new xajax.ext.tabManager.tabBar(config);
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
xajax.ext.tabManager.addPanel = function(id, config)
|
||||
{
|
||||
try
|
||||
{
|
||||
xajax.ext.tabManager.instances[id].addPanel(config);
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
xajax.ext.tabManager.showPanel = function(id, sPanel)
|
||||
{
|
||||
try
|
||||
{
|
||||
xajax.ext.tabManager.instances[id].show(sPanel);
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
xajax.ext.tabManager.setTitle = function(id, sPanel, title)
|
||||
{
|
||||
try
|
||||
{
|
||||
xajax.ext.tabManager.instances[id].setTitle(sPanel, title);
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
xajax.ext.tabManager.on = function(id, sEventName, sTarget, sEventFunc, sEventId)
|
||||
{
|
||||
xajax.ext.tabManager.instances[id].on(sEventName, sTarget, sEventFunc, sEventId);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
xajax.ext.tabManager.closePanel = function(id, sPanel)
|
||||
{
|
||||
xajax.ext.tabManager.instances[id].closePanel(sPanel);
|
||||
}
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
xajax.ext.tabManager.destroy = function(id)
|
||||
{
|
||||
xajax.ext.tabManager.instances[id].destroy();
|
||||
delete (xajax.ext.tabManager.instances[id]);
|
||||
}
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
xajax.command.handler.register('tm_create', function(args)
|
||||
{
|
||||
args.cmdFullName = 'ext.tabManager.create';
|
||||
xajax.ext.tabManager.create(args.id, args.data);
|
||||
return true;
|
||||
});
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
xajax.command.handler.register('tm_at', function(args)
|
||||
{
|
||||
args.cmdFullName = 'ext.tabManager.addPanel';
|
||||
xajax.ext.tabManager.addPanel(args.id, args.data);
|
||||
return true;
|
||||
});
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
xajax.command.handler.register('tm_on', function(args)
|
||||
{
|
||||
try
|
||||
{
|
||||
args.cmdFullName = 'ext.tabManager.on';
|
||||
|
||||
eval("var sEvent = " + args.data.e + ";");
|
||||
|
||||
xajax.ext.tabManager.on(args.id, args.data.n, args.data.p, sEvent, args.data.key);
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
//console.log(ex);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
xajax.command.handler.register('tm_cl', function(args)
|
||||
{
|
||||
try
|
||||
{
|
||||
args.cmdFullName = 'ext.tabManager.closePanel';
|
||||
xajax.ext.tabManager.closePanel(args.id, args.data);
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
debugObj(ex);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
xajax.command.handler.register('tm_sp', function(args)
|
||||
{
|
||||
args.cmdFullName = 'ext.tabManager.showPanel';
|
||||
xajax.ext.tabManager.showPanel(args.id, args.data);
|
||||
return true;
|
||||
});
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
xajax.command.handler.register('tm_st', function(args)
|
||||
{
|
||||
try
|
||||
{
|
||||
args.cmdFullName = 'ext.tabManager.setTitle';
|
||||
xajax.ext.tabManager.setTitle(args.id, args.data.panel, args.data.title);
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
//console.log(ex);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
xajax.command.handler.register('tm_de', function(args)
|
||||
{
|
||||
try
|
||||
{
|
||||
args.cmdFullName = 'ext.tabManager.destroy';
|
||||
xajax.ext.tabManager.destroy(args.id);
|
||||
}
|
||||
catch (ex)
|
||||
{
|
||||
debugObj(ex);
|
||||
}
|
||||
return true;
|
||||
});
|
||||
/* ------------------------------------------------------------------------------------------------------------------------------ */
|
||||
|
||||
}
|
||||
|
||||
installtabManager();
|
||||
Reference in New Issue
Block a user