Changes for v22.0.0.OS

This commit is contained in:
Thilina Hasantha
2018-04-28 03:04:36 +02:00
parent d105ee3512
commit 8ebf28fbcb
471 changed files with 160244 additions and 293 deletions

View File

@@ -48,6 +48,16 @@ CompanyStructureAdapter.method('getFormFields', function() {
]; ];
}); });
CompanyStructureAdapter.method('postRenderForm', function(object, $tempDomObj) {
if (object === undefined
|| object === null
|| object.id === null
|| object.id === undefined || object.id === ''
) {
$tempDomObj.find('#field_heads').hide();
}
});
/* /*
* Company Graph * Company Graph
@@ -68,16 +78,16 @@ CompanyGraphAdapter.method('convertToTree', function(data) {
ice['title'] = ''; ice['title'] = '';
ice['name'] = ''; ice['name'] = '';
ice['children'] = []; ice['children'] = [];
var parent = null; var parent = null;
var added = {}; var added = {};
for(var i=0;i<data.length;i++){ for(var i=0;i<data.length;i++){
data[i].name = data[i].title; data[i].name = data[i].title;
if(data[i].parent != null && data[i].parent != undefined){ if(data[i].parent != null && data[i].parent != undefined){
parent = this.findParent(data,data[i].parent); parent = this.findParent(data,data[i].parent);
if(parent != null){ if(parent != null){
@@ -87,17 +97,17 @@ CompanyGraphAdapter.method('convertToTree', function(data) {
parent.children.push(data[i]); parent.children.push(data[i]);
} }
} }
} }
for(var i=0;i<data.length;i++){ for(var i=0;i<data.length;i++){
if(data[i].parent == null || data[i].parent == undefined){ if(data[i].parent == null || data[i].parent == undefined){
ice['children'].push(data[i]); ice['children'].push(data[i]);
} }
} }
return ice; return ice;
}); });
@@ -115,10 +125,10 @@ CompanyGraphAdapter.method('createTable', function(elementId) {
$("#tabPageCompanyGraph").html(""); $("#tabPageCompanyGraph").html("");
var that = this; var that = this;
var sourceData = this.sourceData; var sourceData = this.sourceData;
//this.fixCyclicParent(sourceData); //this.fixCyclicParent(sourceData);
var treeData = this.convertToTree(sourceData); var treeData = this.convertToTree(sourceData);
var m = [20, 120, 20, 120], var m = [20, 120, 20, 120],
w = 5000 - m[1] - m[3], w = 5000 - m[1] - m[3],
h = 1000 - m[0] - m[2], h = 1000 - m[0] - m[2],
@@ -126,20 +136,20 @@ CompanyGraphAdapter.method('createTable', function(elementId) {
var tree = d3.layout.tree() var tree = d3.layout.tree()
.size([h, w]); .size([h, w]);
this.diagonal = d3.svg.diagonal() this.diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.y, d.x]; }); .projection(function(d) { return [d.y, d.x]; });
this.vis = d3.select("#tabPageCompanyGraph").append("svg:svg") this.vis = d3.select("#tabPageCompanyGraph").append("svg:svg")
.attr("width", w + m[1] + m[3]) .attr("width", w + m[1] + m[3])
.attr("height", h + m[0] + m[2]) .attr("height", h + m[0] + m[2])
.append("svg:g") .append("svg:g")
.attr("transform", "translate(" + m[3] + "," + m[0] + ")"); .attr("transform", "translate(" + m[3] + "," + m[0] + ")");
root = treeData; root = treeData;
root.x0 = h / 2; root.x0 = h / 2;
root.y0 = 0; root.y0 = 0;
function toggleAll(d) { function toggleAll(d) {
if (d.children) { if (d.children) {
console.log(d.name); console.log(d.name);
@@ -148,9 +158,9 @@ CompanyGraphAdapter.method('createTable', function(elementId) {
} }
} }
this.update(root, tree, root); this.update(root, tree, root);
}); });
CompanyGraphAdapter.method('update', function(source, tree, root) { CompanyGraphAdapter.method('update', function(source, tree, root) {
@@ -263,21 +273,21 @@ CompanyGraphAdapter.method('getSourceDataById', function(id) {
return this.sourceData[i]; return this.sourceData[i];
} }
} }
return null; return null;
}); });
CompanyGraphAdapter.method('fixCyclicParent', function(sourceData) { CompanyGraphAdapter.method('fixCyclicParent', function(sourceData) {
var errorMsg = ""; var errorMsg = "";
for(var i=0; i< sourceData.length; i++){ for(var i=0; i< sourceData.length; i++){
var obj = sourceData[i]; var obj = sourceData[i];
var curObj = obj; var curObj = obj;
var parentIdArr = {}; var parentIdArr = {};
parentIdArr[curObj.id] = 1; parentIdArr[curObj.id] = 1;
while(curObj.parent != null && curObj.parent != undefined){ while(curObj.parent != null && curObj.parent != undefined){
var parent = this.getSourceDataById(curObj.parent); var parent = this.getSourceDataById(curObj.parent);
if(parent == null){ if(parent == null){
@@ -291,14 +301,14 @@ CompanyGraphAdapter.method('fixCyclicParent', function(sourceData) {
curObj = parent; curObj = parent;
} }
} }
if(errorMsg != ""){ if(errorMsg != ""){
this.showMessage("Company Structure is having a cyclic dependency","We found a cyclic dependency due to following reasons:<br/>"+errorMsg); this.showMessage("Company Structure is having a cyclic dependency","We found a cyclic dependency due to following reasons:<br/>"+errorMsg);
return false; return false;
} }
return true; return true;
}); });
CompanyGraphAdapter.method('getHelpLink', function () { CompanyGraphAdapter.method('getHelpLink', function () {

View File

@@ -45,81 +45,81 @@ if (class_exists('\\Billing\\Admin\\Api\\BillingActionManager')) {
?><div class="span9"> ?><div class="span9">
<div class="row"> <div class="row">
<?php if($numOfUnpaidInvoices == 1){?> <?php if($numOfUnpaidInvoices == 1){?>
<div class="callout callout-warning lead" style="font-size: 14px;"> <div class="callout callout-warning lead" style="font-size: 14px;">
<h4>You have a pending invoice</h4> <h4>You have a pending invoice</h4>
<p style="font-weight: bold;"> <p style="font-weight: bold;">
You have a pending invoice. Please make you complete the payment so we can provide a better service. You have a pending invoice. Please make you complete the payment so we can provide a better service.
<br/> <br/>
<br/> <br/>
<a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System#tabInvoice" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Make a Payment</a> <a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System#tabInvoice" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Make a Payment</a>
</p> </p>
</div>
<?php }else if($numOfUnpaidInvoices > 1){?>
<div class="callout callout-danger lead" style="font-size: 14px;">
<h4>You have <?=$numOfUnpaidInvoices?> pending invoices</h4>
<p style="font-weight: bold;">
You have <?=$numOfUnpaidInvoices?> pending invoice. None of your employees are currently allowed to login. Please make sure you complete payments to all the invoices to restore your service.
Please logout and login after completing the payment to get your service restored.
<br/>
<br/>
<a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System#tabInvoice" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Make a Payment</a>
</p>
</div>
<?php }?>
<?php if(\Utils\SessionUtils::getSessionObject('account_locked') == "1"){?>
<div class="callout callout-danger lead" style="font-size: 14px;">
<h4>Your Trial Has Expired</h4>
<p style="font-weight: bold;">
Your Icehrm Trial has expired. Please upgrade subscription to continue. If not upgraded your account will be deleted with in few days.
<br/>
<br/>
<a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Upgrade Subscription</a>
</p>
</div>
<?php }?>
<?php
$moduleManagers = \Classes\BaseService::getInstance()->getModuleManagers();
$dashBoardList = array();
foreach($moduleManagers as $moduleManagerObj){
//Check if this is not an admin module
if($moduleManagerObj->getModuleType() != 'admin'){
continue;
}
$allowed = \Classes\BaseService::getInstance()->isModuleAllowedForUser($moduleManagerObj);
if(!$allowed){
continue;
}
$item = $moduleManagerObj->getDashboardItem();
if(!empty($item)) {
$index = $moduleManagerObj->getDashboardItemIndex();
$dashBoardList[$index] = $item;
}
}
ksort($dashBoardList);
foreach($dashBoardList as $k=>$v){
echo \Classes\LanguageManager::translateTnrText($v);
}
?>
</div> </div>
<?php }else if($numOfUnpaidInvoices > 1){?>
<div class="callout callout-danger lead" style="font-size: 14px;">
<h4>You have <?=$numOfUnpaidInvoices?> pending invoices</h4>
<p style="font-weight: bold;">
You have <?=$numOfUnpaidInvoices?> pending invoice. None of your employees are currently allowed to login. Please make sure you complete payments to all the invoices to restore your service.
Please logout and login after completing the payment to get your service restored.
<br/>
<br/>
<a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System#tabInvoice" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Make a Payment</a>
</p>
</div>
<?php }?>
<?php if(\Utils\SessionUtils::getSessionObject('account_locked') == "1"){?>
<div class="callout callout-danger lead" style="font-size: 14px;">
<h4>Your Trial Has Expired</h4>
<p style="font-weight: bold;">
Your Icehrm Trial has expired. Please upgrade subscription to continue. If not upgraded your account will be deleted with in few days.
<br/>
<br/>
<a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Upgrade Subscription</a>
</p>
</div>
<?php }?>
<?php
$moduleManagers = \Classes\BaseService::getInstance()->getModuleManagers();
$dashBoardList = array();
foreach($moduleManagers as $moduleManagerObj){
//Check if this is not an admin module
if($moduleManagerObj->getModuleType() != 'admin'){
continue;
}
$allowed = \Classes\BaseService::getInstance()->isModuleAllowedForUser($moduleManagerObj);
if(!$allowed){
continue;
}
$item = $moduleManagerObj->getDashboardItem();
if(!empty($item)) {
$index = $moduleManagerObj->getDashboardItemIndex();
$dashBoardList[$index] = $item;
}
}
ksort($dashBoardList);
foreach($dashBoardList as $k=>$v){
echo \Classes\LanguageManager::translateTnrText($v);
}
?>
</div>
</div> </div>
<script> <script>
var modJsList = new Array(); var modJsList = new Array();
modJsList['tabDashboard'] = new DashboardAdapter('Dashboard','Dashboard'); modJsList['tabDashboard'] = new DashboardAdapter('Dashboard','Dashboard');
var modJs = modJsList['tabDashboard']; var modJs = modJsList['tabDashboard'];
</script> </script>
<?php include APP_BASE_PATH.'footer.php';?> <?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -259,7 +259,7 @@ EmployeeAdapter.method('getActionButtonsHtml', function(id) {
}); });
EmployeeAdapter.method('getHelpLink', function () { EmployeeAdapter.method('getHelpLink', function () {
return 'http://blog.icehrm.com/docs/employees/'; return 'https://thilinah.gitbooks.io/icehrm-guide/content/employee-information-setup.html';
}); });
EmployeeAdapter.method('saveSuccessItemCallback', function(data) { EmployeeAdapter.method('saveSuccessItemCallback', function(data) {

View File

@@ -8,7 +8,7 @@
*/ */
function FieldNameAdapter(endPoint,tab,filter,orderBy) { function FieldNameAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy); this.initAdapter(endPoint,tab,filter,orderBy);
} }
FieldNameAdapter.inherits(AdapterBase); FieldNameAdapter.inherits(AdapterBase);
@@ -17,32 +17,32 @@ FieldNameAdapter.inherits(AdapterBase);
FieldNameAdapter.method('getDataMapping', function() { FieldNameAdapter.method('getDataMapping', function() {
return [ return [
"id", "id",
"name", "name",
"textOrig", "textOrig",
"textMapped", "textMapped",
"display" "display"
]; ];
}); });
FieldNameAdapter.method('getHeaders', function() { FieldNameAdapter.method('getHeaders', function() {
return [ return [
{ "sTitle": "ID" ,"bVisible":false}, { "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" }, { "sTitle": "Name" },
{ "sTitle": "Original Text"}, { "sTitle": "Original Text"},
{ "sTitle": "Mapped Text"}, { "sTitle": "Mapped Text"},
{ "sTitle": "Display Status"} { "sTitle": "Display Status"}
]; ];
}); });
FieldNameAdapter.method('getFormFields', function() { FieldNameAdapter.method('getFormFields', function() {
return [ return [
[ "id", {"label":"ID","type":"hidden"}], [ "id", {"label":"ID","type":"hidden"}],
[ "type", {"label":"Type","type":"placeholder","validation":""}], [ "type", {"label":"Type","type":"placeholder","validation":""}],
[ "name", {"label":"Name","type":"placeholder","validation":""}], [ "name", {"label":"Name","type":"placeholder","validation":""}],
[ "textOrig", {"label":"Original Text","type":"placeholder","validation":""}], [ "textOrig", {"label":"Original Text","type":"placeholder","validation":""}],
[ "textMapped", {"label":"Mapped Text","type":"text","validation":""}], [ "textMapped", {"label":"Mapped Text","type":"text","validation":""}],
[ "display", {"label":"Display Status","type":"select","source":[["Form","Show"],["Hidden","Hidden"]]}] [ "display", {"label":"Display Status","type":"select","source":[["Form","Show"],["Hidden","Hidden"]]}]
]; ];
}); });
@@ -51,7 +51,7 @@ FieldNameAdapter.method('getFormFields', function() {
*/ */
function CustomFieldAdapter(endPoint,tab,filter,orderBy) { function CustomFieldAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy); this.initAdapter(endPoint,tab,filter,orderBy);
this.tableType = ""; this.tableType = "";
} }
@@ -61,41 +61,41 @@ CustomFieldAdapter.inherits(AdapterBase);
CustomFieldAdapter.method('getDataMapping', function() { CustomFieldAdapter.method('getDataMapping', function() {
return [ return [
"id", "id",
"name", "name",
"display", "display",
"display_order" "display_order"
]; ];
}); });
CustomFieldAdapter.method('getHeaders', function() { CustomFieldAdapter.method('getHeaders', function() {
return [ return [
{ "sTitle": "ID" ,"bVisible":false}, { "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" }, { "sTitle": "Name" },
{ "sTitle": "Display Status"}, { "sTitle": "Display Status"},
{ "sTitle": "Priority"} { "sTitle": "Priority"}
]; ];
}); });
CustomFieldAdapter.method('getFormFields', function() { CustomFieldAdapter.method('getFormFields', function() {
return [ return [
[ "id", {"label":"ID","type":"hidden"}], [ "id", {"label":"ID","type":"hidden"}],
//[ "type", {"label":"Type","type":"placeholder","validation":""}], //[ "type", {"label":"Type","type":"placeholder","validation":""}],
[ "name", {"label":"Name","type":"text","validation":""}], [ "name", {"label":"Name","type":"text","validation":""}],
[ "display", {"label":"Display Status","type":"select","source":[["Form","Show"],["Hidden","Hidden"]]}], [ "display", {"label":"Display Status","type":"select","source":[["Form","Show"],["Hidden","Hidden"]]}],
[ "field_type", {"label":"Field Type","type":"select","source":[["text","Text Field"],["textarea","Text Area"],["select","Select"],["select2","Select2"],["select2multi","Multi Select"],["fileupload","File Upload"],["date","Date"],["datetime","Date Time"],["time","Time"]]}], [ "field_type", {"label":"Field Type","type":"select","source":[["text","Text Field"],["textarea","Text Area"],["select","Select"],["select2","Select2"],["select2multi","Multi Select"],["fileupload","File Upload"],["date","Date"],["datetime","Date Time"],["time","Time"]]}],
[ "field_label", {"label":"Field Label","type":"text","validation":""}], [ "field_label", {"label":"Field Label","type":"text","validation":""}],
[ "field_validation", {"label":"Validation","type":"select","validation":"none","sort":"none","source":[["","Required"],["none","None"],["number","Number"],["numberOrEmpty","Number or Empty"],["float","Decimal"],["email","Email"],["emailOrEmpty","Email or Empty"]]}], [ "field_validation", {"label":"Validation","type":"select","validation":"none","sort":"none","source":[["","Required"],["none","None"],["number","Number"],["numberOrEmpty","Number or Empty"],["float","Decimal"],["email","Email"],["emailOrEmpty","Email or Empty"]]}],
[ "field_options", {"label":"Field Options","type":"datagroup", [ "field_options", {"label":"Field Options","type":"datagroup",
"form":[ "form":[
[ "label", {"label":"Label","type":"text","validation":""}], [ "label", {"label":"Label","type":"text","validation":""}],
[ "value", {"label":"Value","type":"text","validation":"none"}] [ "value", {"label":"Value","type":"text","validation":"none"}]
], ],
"html":'<div id="#_id_#" class="panel panel-default"><div class="panel-body">#_delete_##_edit_#<span style="color:#999;font-size:13px;font-weight:bold">#_label_#</span>:#_value_#</div></div>', "html":'<div id="#_id_#" class="panel panel-default"><div class="panel-body">#_delete_##_edit_#<span style="color:#999;font-size:13px;font-weight:bold">#_label_#</span>:#_value_#</div></div>',
"validation":"none" "validation":"none"
}], }],
[ "display_order", {"label":"Priority","type":"text","validation":"number"}], [ "display_order", {"label":"Priority","type":"text","validation":"number"}],
[ "display_section", {"label":"Display Section","type":"text","validation":""}] [ "display_section", {"label":"Display Section","type":"text","validation":""}]
]; ];
}); });

View File

@@ -1,7 +1,7 @@
{ {
"label": "Company Loans", "label": "Company Loans",
"menu": "Admin", "menu": "Admin",
"order": "81", "order": "89",
"icon": "fa-shield", "icon": "fa-shield",
"user_levels": [ "user_levels": [
"Admin" "Admin"
@@ -9,4 +9,4 @@
"permissions": [], "permissions": [],
"model_namespace": "\\Loans\\Common\\Model", "model_namespace": "\\Loans\\Common\\Model",
"manager": "\\Loans\\Admin\\Api\\LoansAdminManager" "manager": "\\Loans\\Admin\\Api\\LoansAdminManager"
} }

View File

@@ -1,7 +1,7 @@
{ {
"label": "Overtime Administration", "label": "Overtime Administration",
"menu": "Employees", "menu": "Admin",
"order": "94", "order": "82",
"icon": "fa-align-center", "icon": "fa-align-center",
"user_levels": [ "user_levels": [
"Admin", "Admin",
@@ -11,4 +11,4 @@
"permissions": [], "permissions": [],
"model_namespace": "\\Overtime\\Common\\Model", "model_namespace": "\\Overtime\\Common\\Model",
"manager": "\\Overtime\\Admin\\Api\\OvertimeAdminManager" "manager": "\\Overtime\\Admin\\Api\\OvertimeAdminManager"
} }

View File

@@ -1,5 +1,5 @@
{ {
"label": "Travel Administration", "label": "Travel Requests",
"menu": "Employees", "menu": "Employees",
"order": "6", "order": "6",
"icon": "fa-plane", "icon": "fa-plane",
@@ -11,4 +11,4 @@
"permissions": [], "permissions": [],
"model_namespace": "\\Travel\\Common\\Model", "model_namespace": "\\Travel\\Common\\Model",
"manager": "\\Travel\\Admin\\Api\\TravelAdminManager" "manager": "\\Travel\\Admin\\Api\\TravelAdminManager"
} }

View File

@@ -1,23 +1,23 @@
/* /*
This file is part of Ice Framework. This file is part of Ice Framework.
Ice Framework is free software: you can redistribute it and/or modify Ice Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Ice Framework is distributed in the hope that it will be useful, Ice Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>. along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------ ------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd] Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah) Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/ */
@@ -624,12 +624,12 @@ IceHRMBase.method('createTable', function(elementId) {
var html = ""; var html = "";
html = this.getTableTopButtonHtml() + this.getTableHTMLTemplate(); html = this.getTableTopButtonHtml() + this.getTableHTMLTemplate();
/* /*
if(this.getShowAddNew()){ if(this.getShowAddNew()){
html = this.getTableTopButtonHtml()+'<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>'; html = this.getTableTopButtonHtml()+'<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>';
}else{ }else{
html = '<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>'; html = '<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>';
} }
*/ */
//Find current page //Find current page
var activePage = $('#'+elementId +" .dataTables_paginate .active a").html(); var activePage = $('#'+elementId +" .dataTables_paginate .active a").html();
var start = 0; var start = 0;
@@ -686,13 +686,13 @@ IceHRMBase.method('createTableServer', function(elementId) {
var html = ""; var html = "";
html = this.getTableTopButtonHtml() + this.getTableHTMLTemplate(); html = this.getTableTopButtonHtml() + this.getTableHTMLTemplate();
/* /*
if(this.getShowAddNew()){ if(this.getShowAddNew()){
html = this.getTableTopButtonHtml()+'<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>'; html = this.getTableTopButtonHtml()+'<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>';
}else{ }else{
html = '<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>'; html = '<div class="box-body table-responsive"><table cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped" id="grid"></table></div>';
} }
*/ */
//Find current page //Find current page
var activePage = $('#'+elementId +" .dataTables_paginate .active a").html(); var activePage = $('#'+elementId +" .dataTables_paginate .active a").html();
@@ -914,45 +914,60 @@ IceHRMBase.method('showMessage', function(title,message,closeCallback,closeCallb
var modelId = ""; var modelId = "";
if(isPlain){ if(isPlain){
modelId = "#plainMessageModel"; modelId = "#plainMessageModel";
this.renderModel('plainMessage',title,message);
}else{ }else{
modelId = "#messageModel"; modelId = "#messageModel";
}
$(modelId).off();
if(isPlain){
this.renderModel('plainMessage',title,message);
}else{
this.renderModel('message',title,message); this.renderModel('message',title,message);
} }
$(modelId).unbind('hide'); if(closeCallback !== null && closeCallback !== undefined){
if(closeCallback != null && closeCallback != undefined){ $(modelId).modal({show:true});
$(modelId).on('hidden.bs.modal',function(){ $(modelId).on('hidden.bs.modal',function(){
closeCallback.apply(that,closeCallbackData); closeCallback.apply(that,closeCallbackData);
$(modelId).unbind('hidden.bs.modal'); $('.modal-backdrop').remove();
});
} else {
$(modelId).modal({
backdrop: 'static'
}); });
} }
$(modelId).modal({
backdrop: 'static'
});
}); });
IceHRMBase.method('showDomElement', function(title,element,closeCallback,closeCallbackData, isPlain) { IceHRMBase.method('showDomElement', function(title,element,closeCallback,closeCallbackData, isPlain) {
var that = this; var that = this;
var modelId = ""; var modelId = "";
if(isPlain){ if (isPlain) {
modelId = "#dataMessageModel"; modelId = "#dataMessageModel";
this.renderModelFromDom('dataMessage',title,element); } else{
}else{
modelId = "#messageModel"; modelId = "#messageModel";
this.renderModelFromDom('message',title,element);
} }
$(modelId).unbind('hide'); $(modelId).unbind('hide');
if(closeCallback != null && closeCallback != undefined){
if(isPlain){
this.renderModelFromDom('dataMessage',title,element);
}else{
this.renderModelFromDom('message',title,element);
}
if(closeCallback !== null && closeCallback !== undefined){
$(modelId).modal({show:true});
$(modelId).on('hidden.bs.modal',function(){ $(modelId).on('hidden.bs.modal',function(){
closeCallback.apply(that,closeCallbackData); closeCallback.apply(that,closeCallbackData);
$(modelId).unbind('hidden.bs.modal'); $('.modal-backdrop').remove();
});
} else {
$(modelId).modal({
backdrop: 'static'
}); });
} }
$(modelId).modal({
backdrop: 'static'
});
}); });
IceHRMBase.method('confirmDelete', function() { IceHRMBase.method('confirmDelete', function() {
@@ -1270,11 +1285,11 @@ IceHRMBase.method('showFilters', function(object) {
}); });
}); });
/* /*
$tempDomObj.find('.signatureField').each(function() { $tempDomObj.find('.signatureField').each(function() {
$(this).data('signaturePad',new SignaturePad($(this))); $(this).data('signaturePad',new SignaturePad($(this)));
}); });
*/ */
//var tHtml = $tempDomObj.wrap('<div>').parent().html(); //var tHtml = $tempDomObj.wrap('<div>').parent().html();
this.showDomElement("Edit",$tempDomObj,null,null,true); this.showDomElement("Edit",$tempDomObj,null,null,true);
@@ -1290,7 +1305,7 @@ IceHRMBase.method('showFilters', function(object) {
return false; return false;
}); });
if(this.filter != undefined && this.filter != null){ if (this.filter != undefined && this.filter != null && this.filter != '') {
this.fillForm(this.filter,"#"+this.getTableName()+"_filter", this.getFilters()); this.fillForm(this.filter,"#"+this.getTableName()+"_filter", this.getFilters());
} }
@@ -1447,8 +1462,10 @@ IceHRMBase.method('renderForm', function(object) {
} }
if(object != undefined && object != null){ if (object != undefined && object != null) {
this.fillForm(object); this.fillForm(object);
} else {
this.setDefaultValues();
} }
this.scrollToTop(); this.scrollToTop();
@@ -1474,16 +1491,35 @@ IceHRMBase.method('renderForm', function(object) {
if(object != undefined && object != null){ if(object != undefined && object != null){
this.fillForm(object,"#"+randomFormId); this.fillForm(object,"#"+randomFormId);
} else {
this.setDefaultValues("#"+randomFormId);
} }
} }
this.postRenderForm(object,$tempDomObj); this.postRenderForm(object,$tempDomObj);
}); });
IceHRMBase.method('setDefaultValues', function(formId, fields) {
if(fields == null || fields == undefined){
fields = this.getFormFields();
}
if(formId == null || formId == undefined || formId == ""){
formId = "#"+this.getTableName()+'Form';
}
for(var i=0;i<fields.length;i++) {
if(fields[i][1].type !== 'text' && fields[i][1].type !== 'textarea') {
continue;
}
if (fields[i][1].default !== undefined && fields[i][1].default !== null) {
$(formId + ' #' + fields[i][0]).val(fields[i][1].default);
}
}
});
IceHRMBase.method('retriveItemsAfterSave', function() { IceHRMBase.method('retriveItemsAfterSave', function() {
return true; return true;
@@ -1636,17 +1672,19 @@ IceHRMBase.method('showDataGroup', function(field, object) {
}); });
}); });
/* /*
$tempDomObj.find('.signatureField').each(function() { $tempDomObj.find('.signatureField').each(function() {
$(this).data('signaturePad',new SignaturePad($(this))); $(this).data('signaturePad',new SignaturePad($(this)));
}); });
*/ */
this.currentDataGroupField = field; this.currentDataGroupField = field;
this.showDomElement("Add "+field[1]['label'],$tempDomObj,null,null,true); this.showDomElement("Add "+field[1]['label'],$tempDomObj,null,null,true);
if(object != undefined && object != null){ if (object != undefined && object != null) {
this.fillForm(object,"#"+this.getTableName()+"_field_"+field[0], field[1]['form']); this.fillForm(object,"#"+this.getTableName()+"_field_"+field[0], field[1]['form']);
} else {
this.setDefaultValues("#"+this.getTableName()+"_field_"+field[0], field[1]['form']);
} }

View File

@@ -9,6 +9,10 @@
"homepage": "", "homepage": "",
"dependencies": { "dependencies": {
"simplemde": "^1.11.2", "simplemde": "^1.11.2",
"tinymce": "^4.5.5" "tinymce": "^4.5.5",
"d3-timeline": "^0.0.5",
"vis": "^4.21.0",
"handlebars": "^4.0.11",
"material-design-icons": "^3.0.1"
} }
} }

View File

@@ -13,10 +13,10 @@ if(!defined('HOME_LINK_OTHERS')){
} }
//Version //Version
define('VERSION', '21.0.0.PRO'); define('VERSION', '22.0.0.OS');
define('CACHE_VALUE', '21.0.0.OS'); define('CACHE_VALUE', '22.0.0.OS');
define('VERSION_NUMBER', '2100'); define('VERSION_NUMBER', '2200');
define('VERSION_DATE', '02/02/2018'); define('VERSION_DATE', '28/04/2018');
if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','icehrm@gamonoid.com');} if(!defined('CONTACT_EMAIL')){define('CONTACT_EMAIL','icehrm@gamonoid.com');}
if(!defined('KEY_PREFIX')){define('KEY_PREFIX','IceHrm');} if(!defined('KEY_PREFIX')){define('KEY_PREFIX','IceHrm');}

View File

@@ -734,3 +734,22 @@ table.dataTable{
.ice-form-error-control { .ice-form-error-control {
padding-bottom: 1rem; padding-bottom: 1rem;
} }
.ice-warning {
color: #856404;
background-color: #fff3cd;
margin-left: -2px;
font-size: 1.4rem;
}
.vis-time-axis.vis-foreground {
height: 46px;
font-weight: bold;
background-color: #F0F0EE;
}
.vis-item {
box-shadow: 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.24);
border: none;
background-color: transparent !important;
}

View File

@@ -4,7 +4,7 @@
<script type="text/javascript"> <script type="text/javascript">
for (var prop in modJsList) { for (var prop in modJsList) {
if(modJsList.hasOwnProperty(prop)){ if(modJsList.hasOwnProperty(prop)){
modJsList[prop].setTranslations(<?=\Classes\LanguageManager::getTranslations()?>); modJsList[prop].setTranslations(<?=\Classes\LanguageManager::getTranslations()?>);
@@ -35,30 +35,30 @@
modJsList[prop].setInstanceId('<?=\Classes\BaseService::getInstance()->getInstanceId()?>'); modJsList[prop].setInstanceId('<?=\Classes\BaseService::getInstance()->getInstanceId()?>');
modJsList[prop].setGoogleAnalytics(ga); modJsList[prop].setGoogleAnalytics(ga);
modJsList[prop].setNoJSONRequests('<?=\Classes\SettingsManager::getInstance()->getSetting("System: Do not pass JSON in request")?>'); modJsList[prop].setNoJSONRequests('<?=\Classes\SettingsManager::getInstance()->getSetting("System: Do not pass JSON in request")?>');
} }
} }
//Other static js objects //Other static js objects
var timeUtils = new TimeUtils(); var timeUtils = new TimeUtils();
timeUtils.setServerGMToffset('<?=$diffHoursBetweenServerTimezoneWithGMT?>'); timeUtils.setServerGMToffset('<?=$diffHoursBetweenServerTimezoneWithGMT?>');
var notificationManager = new NotificationManager(); var notificationManager = new NotificationManager();
notificationManager.setBaseUrl('<?=CLIENT_BASE_URL?>service.php'); notificationManager.setBaseUrl('<?=CLIENT_BASE_URL?>service.php');
notificationManager.setTimeUtils(timeUtils); notificationManager.setTimeUtils(timeUtils);
<?php <?php
$notificationTemplates = array(); $notificationTemplates = array();
$notificationTemplates['notification'] = file_get_contents(BASE_URL."/templates/notifications/notification.html"); $notificationTemplates['notification'] = file_get_contents(APP_BASE_PATH."/templates/notifications/notification.html");
$notificationTemplates['notifications'] = file_get_contents(BASE_URL."/templates/notifications/notifications.html"); $notificationTemplates['notifications'] = file_get_contents(APP_BASE_PATH."/templates/notifications/notifications.html");
?> ?>
notificationManager.setTemplates(<?=json_encode($notificationTemplates)?>); notificationManager.setTemplates(<?=json_encode($notificationTemplates)?>);
//----------------------- //-----------------------
$(document).ready(function() { $(document).ready(function() {
$('#modTab a').click(function (e) { $('#modTab a').click(function (e) {
@@ -83,20 +83,20 @@
var tabName = window.location.hash.substr(1); var tabName = window.location.hash.substr(1);
if(tabName!= undefined && tabName != "" && modJsList[tabName] != undefined && modJsList[tabName] != null){ if(tabName!= undefined && tabName != "" && modJsList[tabName] != undefined && modJsList[tabName] != null){
$("#"+tabName).click(); $("#"+tabName).click();
}else{ }else{
<?php if(!isset($_REQUEST['action']) && $_REQUEST['action'] != "new"){?> <?php if(!isset($_REQUEST['action']) && $_REQUEST['action'] != "new"){?>
modJs.get([]); modJs.get([]);
<?php } ?> <?php } ?>
} }
notificationManager.getNotifications(); notificationManager.getNotifications();
$("#delegationDiv").on('click', "#notifications", function(e) { $("#delegationDiv").on('click', "#notifications", function(e) {
$(this).find('.label-danger').remove(); $(this).find('.label-danger').remove();
notificationManager.clearPendingNotifications(); notificationManager.clearPendingNotifications();
}); });
$("#switch_emp").select2(); $("#switch_emp").select2();
@@ -108,7 +108,7 @@
}else{ }else{
$('.helpLink').hide(); $('.helpLink').hide();
} }
}); });
var clientUrl = '<?=CLIENT_BASE_URL?>'; var clientUrl = '<?=CLIENT_BASE_URL?>';
@@ -117,7 +117,7 @@
$(document).ready(function() { $(document).ready(function() {
$(".dataTables_paginate ul").addClass("pagination"); $(".dataTables_paginate ul").addClass("pagination");
var refId = ""; var refId = "";
<?php if(empty($_REQUEST['m'])){?> <?php if(empty($_REQUEST['m'])){?>
<?php if($user->user_level == 'Admin'){?> <?php if($user->user_level == 'Admin'){?>

View File

@@ -91,6 +91,15 @@ include('configureUIManager.php');
?><!DOCTYPE html> ?><!DOCTYPE html>
<html> <html>
<head> <head>
<!-- Google Analytics -->
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', '<?=\Classes\BaseService::getInstance()->getGAKey()?>', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<!-- End Google Analytics -->
<meta charset="utf-8"> <meta charset="utf-8">
<title><?=$companyName?></title> <title><?=$companyName?></title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -101,6 +110,7 @@ include('configureUIManager.php');
<link href="<?=BASE_URL?>themecss/bootstrap.min.css" rel="stylesheet"> <link href="<?=BASE_URL?>themecss/bootstrap.min.css" rel="stylesheet">
<link href="<?=BASE_URL?>themecss/font-awesome.min.css" rel="stylesheet"> <link href="<?=BASE_URL?>themecss/font-awesome.min.css" rel="stylesheet">
<link href="<?=BASE_URL?>themecss/ionicons.min.css" rel="stylesheet"> <link href="<?=BASE_URL?>themecss/ionicons.min.css" rel="stylesheet">
<link href="<?=BASE_URL?>web/bower_components/material-design-icons/iconfont/material-icons.css" rel="stylesheet">
@@ -177,17 +187,6 @@ include('configureUIManager.php');
</head> </head>
<body class="skin-blue" data-turbolinks="false"> <body class="skin-blue" data-turbolinks="false">
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', '<?=\Classes\BaseService::getInstance()->getGAKey()?>', 'auto');
ga('send','pageview');
</script>
<header id="delegationDiv" class="header"> <header id="delegationDiv" class="header">
<a href="<?=$homeLink?>" class="logo" style="overflow: hidden;font-family: 'Source Sans Pro', sans-serif;"> <a href="<?=$homeLink?>" class="logo" style="overflow: hidden;font-family: 'Source Sans Pro', sans-serif;">
<?=\Classes\LanguageManager::tran('Home')?> <?=\Classes\LanguageManager::tran('Home')?>
@@ -329,10 +328,12 @@ include('configureUIManager.php');
<h1> <h1>
<?=\Classes\LanguageManager::tran($meta['label'])?> <?=\Classes\LanguageManager::tran($meta['label'])?>
<small> <small>
<?=\Classes\LanguageManager::tran($meta['menu'])?>&nbsp;&nbsp; <?=\Classes\LanguageManager::tran($meta['menu'])?>&nbsp;&nbsp
<a href="#" class="helpLink" target="_blank" style="display:none;color:#fff;"><i class="glyphicon glyphicon-question-sign"></i></a>
</small> </small>
</h1> </h1>
<a href="#" class="helpLink" target="_blank"
style="display:none;color:#f4f4f4;font-size: 2.3rem;float: right;margin-top: -30px;text-shadow: 1px 1px 2px black, 0 0 25px #367fa9, 0 0 5px #367fa9;">
<i class="fa fa-question-circle"></i></a>
</section> </section>
<!-- Main content --> <!-- Main content -->

View File

@@ -18,9 +18,9 @@ $jsVersion = defined('CACHE_VALUE')?CACHE_VALUE:"v".VERSION;
$cssVersion = defined('CACHE_VALUE')?CACHE_VALUE:"v".VERSION; $cssVersion = defined('CACHE_VALUE')?CACHE_VALUE:"v".VERSION;
if(!isset($_REQUEST['content']) || $_REQUEST['content'] != 'HTML'){ if(!isset($_REQUEST['content']) || $_REQUEST['content'] != 'HTML'){
$_REQUEST = \Utils\InputCleaner::cleanParameters($_REQUEST); $_REQUEST = \Utils\InputCleaner::cleanParameters($_REQUEST);
$_GET = \Utils\InputCleaner::cleanParameters($_GET); $_GET = \Utils\InputCleaner::cleanParameters($_GET);
$_POST = \Utils\InputCleaner::cleanParameters($_POST); $_POST = \Utils\InputCleaner::cleanParameters($_POST);
} }
date_default_timezone_set('Asia/Colombo'); date_default_timezone_set('Asia/Colombo');

View File

@@ -1,5 +1,8 @@
<?php <?php
$migrationList = []; $migrationList = [];
$migrationList[] = 'v20180417_210501_update_menu_names';
$migrationList[] = 'v20180325_210101_delete_leave_group_employee';
$migrationList[] = 'v20180317_210200_leave_rule_experience';
$migrationList[] = 'v20180305_210100_drop_si_hi_languages'; $migrationList[] = 'v20180305_210100_drop_si_hi_languages';
$migrationList[] = 'v20171126_200303_swift_mail'; $migrationList[] = 'v20171126_200303_swift_mail';
$migrationList[] = 'v20171003_200302_payroll_meta_export'; $migrationList[] = 'v20171003_200302_payroll_meta_export';

View File

@@ -0,0 +1,26 @@
<?php
namespace Classes\Migration;
class v20180317_210200_leave_rule_experience extends AbstractMigration {
public function up(){
$sql = <<<'SQL'
alter table LeaveRules add column `exp_days` int(11) NULL;
SQL;
return $this->executeQuery($sql);
}
public function down(){
$sql = <<<'SQL'
alter table LeaveRules drop column `exp_days`;
SQL;
return $this->executeQuery($sql);
}
}
{
}

View File

@@ -0,0 +1,31 @@
<?php
namespace Classes\Migration;
class v20180325_210101_delete_leave_group_employee extends AbstractMigration{
public function up(){
$sql = <<<'SQL'
alter table LeaveGroupEmployees drop FOREIGN KEY `Fk_LeaveGroupEmployees_Employee`;
SQL;
$this->executeQuery($sql);
$sql = <<<'SQL'
alter table LeaveGroupEmployees drop index `LeaveGroupEmployees_employee`;
SQL;
$this->executeQuery($sql);
$sql = <<<'SQL'
alter table LeaveGroupEmployees add CONSTRAINT `Fk_LeaveGroupEmployees_Employee` FOREIGN KEY (`employee`) REFERENCES `Employees` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
SQL;
return $this->executeQuery($sql);
}
public function down(){
$sql = <<<'SQL'
alter table LeaveGroupEmployees add UNIQUE KEY `LeaveGroupEmployees_employee` (`employee`);
SQL;
return $this->executeQuery($sql);
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace Classes\Migration;
class v20180417_210501_update_menu_names extends AbstractMigration{
public function up(){
$sql = <<<'SQL'
Update Settings set value = '1' where name = 'System: Reset Module Names';
SQL;
return $this->executeQuery($sql);
}
public function down(){
return true;
}
}

View File

@@ -34,9 +34,9 @@ abstract class ApproveAdminActionManager extends ApproveCommonActionManager
} }
/* /*
if($this->user->user_level != 'Admin' && $this->user->user_level != 'Manager'){ if($this->user->user_level != 'Admin' && $this->user->user_level != 'Manager'){
return new IceResponse(IceResponse::ERROR,"Only an admin or manager can do this"); return new IceResponse(IceResponse::ERROR,"Only an admin or manager can do this");
}*/ }*/
//Check if this needs to be multi-approved //Check if this needs to be multi-approved
$apStatus = 0; $apStatus = 0;

View File

@@ -799,6 +799,7 @@ class BaseService
$ele = new $nsTable(); $ele = new $nsTable();
$ele->Load('id = ?', array($id)); $ele->Load('id = ?', array($id));
if (empty($ele->id) || $ele->id !== $id) { if (empty($ele->id) || $ele->id !== $id) {
return new IceResponse( return new IceResponse(
IceResponse::ERROR, IceResponse::ERROR,
@@ -806,6 +807,10 @@ class BaseService
); );
} }
$preDeleteResponse = $ele->executePreDeleteActions($ele);
if ($preDeleteResponse->getStatus() !== IceResponse::SUCCESS) {
return $preDeleteResponse;
}
$this->checkSecureAccess("delete", $ele); $this->checkSecureAccess("delete", $ele);
@@ -1029,7 +1034,6 @@ class BaseService
public function setCurrentAdminProfile($profileId) public function setCurrentAdminProfile($profileId)
{ {
if ($profileId == "-1") { if ($profileId == "-1") {
SessionUtils::saveSessionObject('admin_current_profile', null); SessionUtils::saveSessionObject('admin_current_profile', null);
return; return;
@@ -1037,25 +1041,12 @@ class BaseService
if ($this->currentUser->user_level == 'Admin') { if ($this->currentUser->user_level == 'Admin') {
SessionUtils::saveSessionObject('admin_current_profile', $profileId); SessionUtils::saveSessionObject('admin_current_profile', $profileId);
} elseif ($this->currentUser->user_level == 'Manager') { } elseif ($this->currentUser->user_level == 'Manager'
$signInMappingField = SIGN_IN_ELEMENT_MAPPING_FIELD_NAME; && $this->canManageEmployee($profileId)
$signInMappingFieldTable = ucfirst($signInMappingField); ) {
$subordinate = new $signInMappingFieldTable();
$signInMappingField = SIGN_IN_ELEMENT_MAPPING_FIELD_NAME;
$subordinates = $subordinate->Find("supervisor = ?", array($this->currentUser->$signInMappingField));
$subFound = false;
foreach ($subordinates as $sub) {
if ($sub->id == $profileId) {
$subFound = true;
break;
}
}
if (!$subFound) {
return;
}
SessionUtils::saveSessionObject('admin_current_profile', $profileId); SessionUtils::saveSessionObject('admin_current_profile', $profileId);
} else {
SessionUtils::saveSessionObject('admin_current_profile', null);
} }
} }
@@ -1595,4 +1586,63 @@ END;
} }
return '\\Model\\'.$class; return '\\Model\\'.$class;
} }
/**
* @param $profileId
* @return bool
*/
protected function canManageEmployee($profileId)
{
$signInMappingField = SIGN_IN_ELEMENT_MAPPING_FIELD_NAME;
$signInMappingFieldTable = $this->getFullQualifiedModelClassName(ucfirst($signInMappingField));
$subordinate = new $signInMappingFieldTable();
$subordinates = $subordinate->Find("supervisor = ?", array($this->currentUser->$signInMappingField));
$subFound = false;
foreach ($subordinates as $sub) {
if ($sub->id == $profileId) {
$subFound = true;
break;
}
}
$departmentHeadFound = false;
$subordinate = new $signInMappingFieldTable();
$subordinate->Load('id = ?', array($profileId));
if (SettingsManager::getInstance()->getSetting('System: Company Structure Managers Enabled') == 1
&& CompanyStructure::isHeadOfCompanyStructure(
$subordinate->department,
$this->currentUser->$signInMappingField
)
) {
$departmentHeadFound = true;
} elseif (SettingsManager::getInstance()->getSetting(
'System: Child Company Structure Managers Enabled'
) == '1'
) {
$companyStructure = new CompanyStructure();
$companyStructure->Load('id = ?', array($subordinate->department));
do {
if (CompanyStructure::isHeadOfCompanyStructure(
$companyStructure->id,
$this->currentUser->$signInMappingField
)
) {
$departmentHeadFound = true;
break;
}
$parentCompanyStructure = $companyStructure->parent;
if (!empty($parentCompanyStructure)) {
$companyStructure = new CompanyStructure();
$companyStructure->Load('id = ?', array($parentCompanyStructure));
}
} while (!empty($companyStructure->id)
&& !empty($parentCompanyStructure)
);
}
return $subFound || $departmentHeadFound;
}
} }

View File

@@ -2,6 +2,7 @@
namespace Company\Common\Model; namespace Company\Common\Model;
use Classes\IceResponse; use Classes\IceResponse;
use Employees\Common\Model\Employee;
use Model\BaseModel; use Model\BaseModel;
class CompanyStructure extends BaseModel class CompanyStructure extends BaseModel
@@ -32,6 +33,25 @@ class CompanyStructure extends BaseModel
); );
} }
$heads = json_decode($obj->heads);
foreach ($heads as $head) {
$employee = new Employee();
$employee->Load('id = ?', array($head));
if (!empty($obj->id) && $employee->department != $obj->id) {
$companyStructure = new CompanyStructure();
$companyStructure->Load("id = ?", array($employee->department));
return new IceResponse(
IceResponse::ERROR,
"An employee who is not attached to a company structure can not be the
head of the company structure. ".
"Please remove ".$employee->first_name.' '.$employee->last_name
." from list of heads as this person is attached to ".
$companyStructure->title
);
}
}
return new IceResponse(IceResponse::SUCCESS, ""); return new IceResponse(IceResponse::SUCCESS, "");
} }

View File

@@ -79,6 +79,11 @@ class BaseModel extends \ADOdb_Active_Record
return new IceResponse(IceResponse::SUCCESS, $obj); return new IceResponse(IceResponse::SUCCESS, $obj);
} }
public function executePreDeleteActions($obj)
{
return new IceResponse(IceResponse::SUCCESS, null);
}
public function executePostSaveActions($obj) public function executePostSaveActions($obj)
{ {
} }

View File

@@ -12,7 +12,7 @@ class ActiveEmployeeReport extends CSVReportBuilder implements CSVReportBuilderI
public function getMainQuery() public function getMainQuery()
{ {
$query = "Select id, employee_id as 'Employee ID', $query = "Select id, employee_id as 'Employee ID',
concat(`first_name`,' ',`middle_name`,' ', `last_name`) as 'Name', concat(`first_name`, ' ', `last_name`) as 'Name',
(SELECT name from Nationality where id = nationality) as 'Nationality', (SELECT name from Nationality where id = nationality) as 'Nationality',
birthday as 'Birthday', birthday as 'Birthday',
gender as 'Gender', gender as 'Gender',

View File

@@ -11,8 +11,8 @@ class EmployeeAttendanceReport extends CSVReportBuilder implements CSVReportBuil
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT `employee_id` from Employees where id = at.employee) as 'Employee', (SELECT `employee_id` from Employees where id = at.employee) as 'Employee ID',
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = at.employee) as 'Employee', (SELECT concat(`first_name`, ' ', `last_name`) from Employees where id = at.employee) as 'Employee',
in_time as 'Time In', in_time as 'Time In',
out_time as 'Time Out', out_time as 'Time Out',
note as 'Note' note as 'Note'

View File

@@ -12,7 +12,7 @@ class EmployeeLeavesReport extends CSVReportBuilder implements CSVReportBuilderI
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) (SELECT concat(`first_name`, ' ', `last_name`) from Employees where id = employee)
as 'Employee', as 'Employee',
(SELECT name from LeaveTypes where id = leave_type) as 'Leave Type', (SELECT name from LeaveTypes where id = leave_type) as 'Leave Type',
(SELECT name from LeavePeriods where id = leave_period) as 'Leave Period', (SELECT name from LeavePeriods where id = leave_period) as 'Leave Period',

View File

@@ -12,7 +12,7 @@ class EmployeeTimesheetReport extends CSVReportBuilder implements CSVReportBuild
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) (SELECT concat(`first_name`, ' ', `last_name`)
from Employees where id = te.employee) as 'Employee', from Employees where id = te.employee) as 'Employee',
(SELECT name from Projects where id = te.project) as 'Project', (SELECT name from Projects where id = te.project) as 'Project',
details as 'Details', details as 'Details',

View File

@@ -10,7 +10,7 @@ class ExpenseReport extends CSVReportBuilder implements CSVReportBuilderInterfac
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) (SELECT concat(`first_name`, ' ', `last_name`)
from Employees where id = employee) as 'Employee', from Employees where id = employee) as 'Employee',
expense_date as 'Date', expense_date as 'Date',
(SELECT name from ExpensesPaymentMethods where id = payment_method) as 'Payment Method', (SELECT name from ExpensesPaymentMethods where id = payment_method) as 'Payment Method',

View File

@@ -11,8 +11,8 @@ class OvertimeRequestReport extends CSVReportBuilder implements CSVReportBuilder
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT `employee_id` from Employees where id = at.employee) as 'Employee', (SELECT `employee_id` from Employees where id = at.employee) as 'Employee ID',
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = at.employee) as 'Employee', (SELECT concat(`first_name`, ' ', `last_name`) from Employees where id = at.employee) as 'Employee',
(SELECT `name` from OvertimeCategories where id = at.category) as 'Category', (SELECT `name` from OvertimeCategories where id = at.category) as 'Category',
(SELECT `name` from Projects where id = at.project) as 'Project', (SELECT `name` from Projects where id = at.project) as 'Project',
start_time as 'Start Time', start_time as 'Start Time',

View File

@@ -10,7 +10,7 @@ class TravelRequestReport extends CSVReportBuilder implements CSVReportBuilderIn
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) (SELECT concat(`first_name`, ' ', `last_name`)
from Employees where id = employee) as 'Employee', from Employees where id = employee) as 'Employee',
type as 'Type', type as 'Type',
purpose as 'Purpose', purpose as 'Purpose',

View File

@@ -12,8 +12,8 @@ class EmployeeAttendanceReport extends CSVReportBuilder implements CSVReportBuil
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT `employee_id` from Employees where id = at.employee) as 'Employee', (SELECT `employee_id` from Employees where id = at.employee) as 'Employee ID',
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = at.employee) as 'Employee', (SELECT concat(`first_name`, ' ', `last_name`) from Employees where id = at.employee) as 'Employee',
in_time as 'Time In', in_time as 'Time In',
out_time as 'Time Out', out_time as 'Time Out',
note as 'Note' note as 'Note'

View File

@@ -12,7 +12,7 @@ class EmployeeLeavesReport extends CSVReportBuilder implements CSVReportBuilderI
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) (SELECT concat(`first_name`, ' ', `last_name`)
from Employees where id = employee) as 'Employee', from Employees where id = employee) as 'Employee',
(SELECT name from LeaveTypes where id = leave_type) as 'Leave Type', (SELECT name from LeaveTypes where id = leave_type) as 'Leave Type',
(SELECT name from LeavePeriods where id = leave_period) as 'Leave Period', (SELECT name from LeavePeriods where id = leave_period) as 'Leave Period',

View File

@@ -13,7 +13,7 @@ class EmployeeTimesheetReport extends CSVReportBuilder implements CSVReportBuild
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) (SELECT concat(`first_name`, ' ', `last_name`)
from Employees where id = te.employee) as 'Employee', from Employees where id = te.employee) as 'Employee',
(SELECT name from Projects where id = te.project) as 'Project', (SELECT name from Projects where id = te.project) as 'Project',
details as 'Details', details as 'Details',

View File

@@ -11,7 +11,7 @@ class ExpenseReport extends CSVReportBuilder implements CSVReportBuilderInterfac
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee', (SELECT concat(`first_name`, ' ', `last_name`) from Employees where id = employee) as 'Employee',
expense_date as 'Date', expense_date as 'Date',
(SELECT name from ExpensesPaymentMethods where id = payment_method) as 'Payment Method', (SELECT name from ExpensesPaymentMethods where id = payment_method) as 'Payment Method',
transaction_no as 'Transaction Ref', transaction_no as 'Transaction Ref',

View File

@@ -11,7 +11,7 @@ class TravelRequestReport extends CSVReportBuilder implements CSVReportBuilderIn
public function getMainQuery() public function getMainQuery()
{ {
$query = "SELECT $query = "SELECT
(SELECT concat(`first_name`,' ',`middle_name`,' ', `last_name`) from Employees where id = employee) as 'Employee', (SELECT concat(`first_name`, ' ', `last_name`) from Employees where id = employee) as 'Employee',
type as 'Type', type as 'Type',
purpose as 'Purpose', purpose as 'Purpose',
travel_from as 'Travel From', travel_from as 'Travel From',

View File

@@ -64,4 +64,12 @@ class CalendarTools
return $time->format($format); return $time->format($format);
} }
public static function getNumberOfDaysBetweenDates($first, $second)
{
$timeFirst = new \DateTime($first);
$timeSecond = new \DateTime($second);
$interval = $timeSecond->diff($timeFirst);
return intval($interval->format('%a'));
}
} }

View File

@@ -16,17 +16,17 @@ class InputCleaner
{ {
$val = strip_tags($val, TAGS_TO_PRESERVE); $val = strip_tags($val, TAGS_TO_PRESERVE);
/* /*
/ # Start Pattern / # Start Pattern
< # Match '<' at beginning of tags < # Match '<' at beginning of tags
( # Start Capture Group $1 - Tag Name ( # Start Capture Group $1 - Tag Name
[a-z] # Match 'a' through 'z' [a-z] # Match 'a' through 'z'
[a-z0-9]* # Match 'a' through 'z' or '0' through '9' zero or more times [a-z0-9]* # Match 'a' through 'z' or '0' through '9' zero or more times
) # End Capture Group ) # End Capture Group
[^>]*? # Match anything other than '>', Zero or More times, not-greedy (wont eat the /) [^>]*? # Match anything other than '>', Zero or More times, not-greedy (wont eat the /)
(\/?) # Capture Group $2 - '/' if it is there (\/?) # Capture Group $2 - '/' if it is there
> # Match '>' > # Match '>'
/i # End Pattern - Case Insensitive /i # End Pattern - Case Insensitive
*/ */
$val = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i", '<$1$2>', $val); $val = preg_replace("/<([a-z][a-z0-9]*)[^>]*?(\/?)>/i", '<$1$2>', $val);
return $val; return $val;
} }

View File

@@ -1,11 +1,11 @@
<li class="dropdown messages-menu"> <li class="dropdown messages-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="glyphicon glyphicon-question-sign"></i> <i class="fa fa-chevron-down"></i>
<span><t>Help</t></span> <span></span>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li> <li>
<a href="#" onclick="modJs.showMessage('<t>About</t>','<p>#_APP_NAME_#<br/><t>Version</t>: #_VERSION_#<br/><t>Release Date</t>: #_VERSION_DATE_#</p>')"><h5><t>About</t></h5></a> <a href="#" onclick="modJs.showMessage('<t>About</t>','<p>#_APP_NAME_#<br/><t>Version</t>: #_VERSION_#<br/><t>Release Date</t>: #_VERSION_DATE_#</p>')"><h5><t>About</t></h5></a>
</li> </li>
</ul> </ul>
</li> </li>

View File

@@ -0,0 +1,30 @@
{
"name": "d3-timeline",
"version": "0.0.5",
"main": "src/d3-timeline.js",
"ignore": [
"examples",
"lib",
".bowerrc",
".gitignore",
".git",
".jshintrc",
"gruntfile.js",
"package.json",
"README.md"
],
"dependencies": {
"d3": ">=3.4.3"
},
"homepage": "https://github.com/jiahuang/d3-timeline",
"_release": "0.0.5",
"_resolution": {
"type": "version",
"tag": "v0.0.5",
"commit": "743021e35e07c45664386049847455eb5a9669f0"
},
"_source": "https://github.com/jiahuang/d3-timeline.git",
"_target": "^0.0.5",
"_originalSource": "d3-timeline",
"_direct": true
}

View File

@@ -0,0 +1,19 @@
{
"name": "d3-timeline",
"version": "0.0.5",
"main": "src/d3-timeline.js",
"ignore": [
"examples",
"lib",
".bowerrc",
".gitignore",
".git",
".jshintrc",
"gruntfile.js",
"package.json",
"README.md"
],
"dependencies": {
"d3": ">=3.4.3"
}
}

View File

@@ -0,0 +1,556 @@
// vim: ts=2 sw=2
(function () {
d3.timeline = function() {
var DISPLAY_TYPES = ["circle", "rect"];
var hover = function () {},
mouseover = function () {},
mouseout = function () {},
click = function () {},
scroll = function () {},
labelFunction = function() {},
orient = "bottom",
width = null,
height = null,
rowSeperatorsColor = null,
backgroundColor = null,
tickFormat = { format: d3.time.format("%I %p"),
tickTime: d3.time.hours,
tickInterval: 1,
tickSize: 6 },
colorCycle = d3.scale.category20(),
colorPropertyName = null,
display = "rect",
beginning = 0,
ending = 0,
margin = {left: 30, right:30, top: 30, bottom:30},
stacked = false,
rotateTicks = false,
timeIsRelative = false,
itemHeight = 20,
itemMargin = 5,
showTimeAxis = true,
showTodayLine = false,
timeAxisTick = false,
timeAxisTickFormat = {stroke: "stroke-dasharray", spacing: "4 10"},
showTodayFormat = {marginTop: 25, marginBottom: 0, width: 1, color: colorCycle},
showBorderLine = false,
showBorderFormat = {marginTop: 25, marginBottom: 0, width: 1, color: colorCycle}
;
function timeline (gParent) {
var g = gParent.append("g");
var gParentSize = gParent[0][0].getBoundingClientRect();
var gParentItem = d3.select(gParent[0][0]);
var yAxisMapping = {},
maxStack = 1,
minTime = 0,
maxTime = 0;
setWidth();
// check if the user wants relative time
// if so, substract the first timestamp from each subsequent timestamps
if(timeIsRelative){
g.each(function (d, i) {
d.forEach(function (datum, index) {
datum.times.forEach(function (time, j) {
if(index === 0 && j === 0){
originTime = time.starting_time; //Store the timestamp that will serve as origin
time.starting_time = 0; //Set the origin
time.ending_time = time.ending_time - originTime; //Store the relative time (millis)
}else{
time.starting_time = time.starting_time - originTime;
time.ending_time = time.ending_time - originTime;
}
});
});
});
}
// check how many stacks we're gonna need
// do this here so that we can draw the axis before the graph
if (stacked || ending === 0 || beginning === 0) {
g.each(function (d, i) {
d.forEach(function (datum, index) {
// create y mapping for stacked graph
if (stacked && Object.keys(yAxisMapping).indexOf(index) == -1) {
yAxisMapping[index] = maxStack;
maxStack++;
}
// figure out beginning and ending times if they are unspecified
datum.times.forEach(function (time, i) {
if(beginning === 0)
if (time.starting_time < minTime || (minTime === 0 && timeIsRelative === false))
minTime = time.starting_time;
if(ending === 0)
if (time.ending_time > maxTime)
maxTime = time.ending_time;
});
});
});
if (ending === 0) {
ending = maxTime;
}
if (beginning === 0) {
beginning = minTime;
}
}
var scaleFactor = (1/(ending - beginning)) * (width - margin.left - margin.right);
// draw the axis
var xScale = d3.time.scale()
.domain([beginning, ending])
.range([margin.left, width - margin.right]);
var xAxis = d3.svg.axis()
.scale(xScale)
.orient(orient)
.tickFormat(tickFormat.format)
.ticks(tickFormat.numTicks || tickFormat.tickTime, tickFormat.tickInterval)
.tickSize(tickFormat.tickSize);
if (showTimeAxis) {
g.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + 0 +","+(margin.top + (itemHeight + itemMargin) * maxStack)+")")
.call(xAxis);
}
if (timeAxisTick) {
g.append("g")
.attr("class", "axis")
.attr("transform", "translate(" + 0 +","+
(margin.top + (itemHeight + itemMargin) * maxStack)+")")
.attr(timeAxisTickFormat.stroke, timeAxisTickFormat.spacing)
.call(xAxis.tickFormat("").tickSize(-(margin.top + (itemHeight + itemMargin) * (maxStack - 1) + 3),0,0));
}
// draw the chart
g.each(function(d, i) {
d.forEach( function(datum, index){
var data = datum.times;
var hasLabel = (typeof(datum.label) != "undefined");
var getLabel = function(label){
if(labelFunction == null){
return label;
} else {
return labelFunction(label);
}
};
// issue warning about using id per data set. Ids should be individual to data elements
if (typeof(datum.id) != "undefined") {
console.warn("d3Timeline Warning: Ids per dataset is deprecated in favor of a 'class' key. Ids are now per data element.");
}
if (backgroundColor) {
var greenbarYAxis = ((itemHeight + itemMargin) * yAxisMapping[index]);
g.selectAll("svg").data(data).enter()
.insert("rect")
.attr("class", "row-green-bar")
.attr("x", 0 + margin.left)
.attr("width", width - margin.right - margin.left)
.attr("y", greenbarYAxis)
.attr("height", itemHeight)
.attr("fill", backgroundColor)
;
}
g.selectAll("svg").data(data).enter()
.append(function(d, i) {
return document.createElementNS(d3.ns.prefix.svg, "display" in d? d.display:display);
})
.attr("x", getXPos)
.attr("y", getStackPosition)
.attr("width", function (d, i) {
return (d.ending_time - d.starting_time) * scaleFactor;
})
.attr("cy", function(d, i) {
return getStackPosition(d, i) + itemHeight/2;
})
.attr("cx", getXPos)
.attr("r", itemHeight / 2)
.attr("height", itemHeight)
.style("fill", function(d, i){
var dColorPropName;
if (d.color) return d.color;
if( colorPropertyName ){
dColorPropName = d[colorPropertyName];
if ( dColorPropName ) {
return colorCycle( dColorPropName );
} else {
return colorCycle( datum[colorPropertyName] );
}
}
return colorCycle(index);
})
.on("mousemove", function (d, i) {
hover(d, index, datum);
})
.on("mouseover", function (d, i) {
mouseover(d, i, datum);
})
.on("mouseout", function (d, i) {
mouseout(d, i, datum);
})
.on("click", function (d, i) {
click(d, index, datum);
})
.attr("class", function (d, i) {
return datum.class ? "timelineSeries_"+datum.class : "timelineSeries_"+index;
})
.attr("id", function(d, i) {
// use deprecated id field
if (datum.id && !d.id) {
return 'timelineItem_'+datum.id;
}
return d.id ? d.id : "timelineItem_"+index+"_"+i;
})
;
g.selectAll("svg").data(data).enter()
.append("text")
.attr("x", getXTextPos)
.attr("y", getStackTextPosition)
.text(function(d) {
return d.label;
})
;
if (rowSeperatorsColor) {
var lineYAxis = ( itemHeight + itemMargin / 2 + margin.top + (itemHeight + itemMargin) * yAxisMapping[index]);
gParent.append("svg:line")
.attr("class", "row-seperator")
.attr("x1", 0 + margin.left)
.attr("x2", width - margin.right)
.attr("y1", lineYAxis)
.attr("y2", lineYAxis)
.attr("stroke-width", 1)
.attr("stroke", rowSeperatorsColor);
;
}
// add the label
if (hasLabel) {
gParent.append("text")
.attr("class", "timeline-label")
.attr("transform", "translate("+ 0 +","+ (itemHeight * 0.75 + margin.top + (itemHeight + itemMargin) * yAxisMapping[index])+")")
.text(hasLabel ? getLabel(datum.label) : datum.id)
.on("click", function (d, i) {
click(d, index, datum);
});
}
if (typeof(datum.icon) !== "undefined") {
gParent.append("image")
.attr("class", "timeline-label")
.attr("transform", "translate("+ 0 +","+ (margin.top + (itemHeight + itemMargin) * yAxisMapping[index])+")")
.attr("xlink:href", datum.icon)
.attr("width", margin.left)
.attr("height", itemHeight);
}
function getStackPosition(d, i) {
if (stacked) {
return margin.top + (itemHeight + itemMargin) * yAxisMapping[index];
}
return margin.top;
}
function getStackTextPosition(d, i) {
if (stacked) {
return margin.top + (itemHeight + itemMargin) * yAxisMapping[index] + itemHeight * 0.75;
}
return margin.top + itemHeight * 0.75;
}
});
});
if (width > gParentSize.width) {
var move = function() {
var x = Math.min(0, Math.max(gParentSize.width - width, d3.event.translate[0]));
zoom.translate([x, 0]);
g.attr("transform", "translate(" + x + ",0)");
scroll(x*scaleFactor, xScale);
};
var zoom = d3.behavior.zoom().x(xScale).on("zoom", move);
gParent
.attr("class", "scrollable")
.call(zoom);
}
if (rotateTicks) {
g.selectAll(".tick text")
.attr("transform", function(d) {
return "rotate(" + rotateTicks + ")translate("
+ (this.getBBox().width / 2 + 10) + "," // TODO: change this 10
+ this.getBBox().height / 2 + ")";
});
}
var gSize = g[0][0].getBoundingClientRect();
setHeight();
if (showBorderLine) {
g.each(function (d, i) {
d.forEach(function (datum) {
var times = datum.times;
times.forEach(function (time) {
appendLine(xScale(time.starting_time), showBorderFormat);
appendLine(xScale(time.ending_time), showBorderFormat);
});
});
});
}
if (showTodayLine) {
var todayLine = xScale(new Date());
appendLine(todayLine, showTodayFormat);
}
function getXPos(d, i) {
return margin.left + (d.starting_time - beginning) * scaleFactor;
}
function getXTextPos(d, i) {
return margin.left + (d.starting_time - beginning) * scaleFactor + 5;
}
function setHeight() {
if (!height && !gParentItem.attr("height")) {
if (itemHeight) {
// set height based off of item height
height = gSize.height + gSize.top - gParentSize.top;
// set bounding rectangle height
d3.select(gParent[0][0]).attr("height", height);
} else {
throw "height of the timeline is not set";
}
} else {
if (!height) {
height = gParentItem.attr("height");
} else {
gParentItem.attr("height", height);
}
}
}
function setWidth() {
if (!width && !gParentSize.width) {
try {
width = gParentItem.attr("width");
if (!width) {
throw "width of the timeline is not set. As of Firefox 27, timeline().with(x) needs to be explicitly set in order to render";
}
} catch (err) {
console.log( err );
}
} else if (!(width && gParentSize.width)) {
try {
width = gParentItem.attr("width");
} catch (err) {
console.log( err );
}
}
// if both are set, do nothing
}
function appendLine(lineScale, lineFormat) {
gParent.append("svg:line")
.attr("x1", lineScale)
.attr("y1", lineFormat.marginTop)
.attr("x2", lineScale)
.attr("y2", height - lineFormat.marginBottom)
.style("stroke", lineFormat.color)//"rgb(6,120,155)")
.style("stroke-width", lineFormat.width);
}
}
// SETTINGS
timeline.margin = function (p) {
if (!arguments.length) return margin;
margin = p;
return timeline;
};
timeline.orient = function (orientation) {
if (!arguments.length) return orient;
orient = orientation;
return timeline;
};
timeline.itemHeight = function (h) {
if (!arguments.length) return itemHeight;
itemHeight = h;
return timeline;
};
timeline.itemMargin = function (h) {
if (!arguments.length) return itemMargin;
itemMargin = h;
return timeline;
};
timeline.height = function (h) {
if (!arguments.length) return height;
height = h;
return timeline;
};
timeline.width = function (w) {
if (!arguments.length) return width;
width = w;
return timeline;
};
timeline.display = function (displayType) {
if (!arguments.length || (DISPLAY_TYPES.indexOf(displayType) == -1)) return display;
display = displayType;
return timeline;
};
timeline.labelFormat = function(f) {
if (!arguments.length) return null;
labelFunction = f;
return timeline;
};
timeline.tickFormat = function (format) {
if (!arguments.length) return tickFormat;
tickFormat = format;
return timeline;
};
timeline.hover = function (hoverFunc) {
if (!arguments.length) return hover;
hover = hoverFunc;
return timeline;
};
timeline.mouseover = function (mouseoverFunc) {
if (!arguments.length) return mouseoverFunc;
mouseover = mouseoverFunc;
return timeline;
};
timeline.mouseout = function (mouseoverFunc) {
if (!arguments.length) return mouseoverFunc;
mouseout = mouseoverFunc;
return timeline;
};
timeline.click = function (clickFunc) {
if (!arguments.length) return click;
click = clickFunc;
return timeline;
};
timeline.scroll = function (scrollFunc) {
if (!arguments.length) return scroll;
scroll = scrollFunc;
return timeline;
};
timeline.colors = function (colorFormat) {
if (!arguments.length) return colorCycle;
colorCycle = colorFormat;
return timeline;
};
timeline.beginning = function (b) {
if (!arguments.length) return beginning;
beginning = b;
return timeline;
};
timeline.ending = function (e) {
if (!arguments.length) return ending;
ending = e;
return timeline;
};
timeline.rotateTicks = function (degrees) {
rotateTicks = degrees;
return timeline;
};
timeline.stack = function () {
stacked = !stacked;
return timeline;
};
timeline.relativeTime = function() {
timeIsRelative = !timeIsRelative;
return timeline;
};
timeline.showBorderLine = function () {
showBorderLine = !showBorderLine;
return timeline;
};
timeline.showBorderFormat = function(borderFormat) {
if (!arguments.length) return showBorderFormat;
showBorderFormat = borderFormat;
return timeline;
};
timeline.showToday = function () {
showTodayLine = !showTodayLine;
return timeline;
};
timeline.showTodayFormat = function(todayFormat) {
if (!arguments.length) return showTodayFormat;
showTodayFormat = todayFormat;
return timeline;
};
timeline.colorProperty = function(colorProp) {
if (!arguments.length) return colorPropertyName;
colorPropertyName = colorProp;
return timeline;
};
timeline.rowSeperators = function (color) {
if (!arguments.length) return rowSeperatorsColor;
rowSeperatorsColor = color;
return timeline;
};
timeline.background = function (color) {
if (!arguments.length) return backgroundColor;
backgroundColor = color;
return timeline;
};
timeline.showTimeAxis = function () {
showTimeAxis = !showTimeAxis;
return timeline;
};
timeline.showTimeAxisTick = function () {
timeAxisTick = !timeAxisTick;
return timeline;
};
timeline.showTimeAxisTickFormat = function(format) {
if (!arguments.length) return timeAxisTickFormat;
timeAxisTickFormat = format;
return timeline;
}
return timeline;
};
})();

18
web/bower_components/d3/.bower.json vendored Normal file
View File

@@ -0,0 +1,18 @@
{
"name": "d3",
"description": "A JavaScript visualization library for HTML and SVG.",
"main": "d3.js",
"license": "BSD-3-Clause",
"ignore": [],
"homepage": "https://github.com/mbostock-bower/d3-bower",
"version": "5.0.0",
"_release": "5.0.0",
"_resolution": {
"type": "version",
"tag": "v5.0.0",
"commit": "d39a7a48e01f0a97966dd86e3e4d71df52cf7d25"
},
"_source": "https://github.com/mbostock-bower/d3-bower.git",
"_target": ">=3.4.3",
"_originalSource": "d3"
}

27
web/bower_components/d3/LICENSE vendored Normal file
View File

@@ -0,0 +1,27 @@
Copyright 2010-2017 Mike Bostock
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the author nor the names of contributors may be used to
endorse or promote products derived from this software without specific prior
written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

57
web/bower_components/d3/README.md vendored Normal file
View File

@@ -0,0 +1,57 @@
# D3: Data-Driven Documents
<a href="https://d3js.org"><img src="https://d3js.org/logo.svg" align="left" hspace="10" vspace="6"></a>
**D3** (or **D3.js**) is a JavaScript library for visualizing data using web standards. D3 helps you bring data to life using SVG, Canvas and HTML. D3 combines powerful visualization and interaction techniques with a data-driven approach to DOM manipulation, giving you the full capabilities of modern browsers and the freedom to design the right visual interface for your data.
## Resources
* [API Reference](https://github.com/d3/d3/blob/master/API.md)
* [Release Notes](https://github.com/d3/d3/releases)
* [Gallery](https://github.com/d3/d3/wiki/Gallery)
* [Examples](https://bl.ocks.org/mbostock)
* [Wiki](https://github.com/d3/d3/wiki)
## Installing
If you use npm, `npm install d3`. Otherwise, download the [latest release](https://github.com/d3/d3/releases/latest). The released bundle supports anonymous AMD, CommonJS, and vanilla environments. You can load directly from [d3js.org](https://d3js.org), [CDNJS](https://cdnjs.com/libraries/d3), or [unpkg](https://unpkg.com/d3/). For example:
```html
<script src="https://d3js.org/d3.v5.js"></script>
```
For the minified version:
```html
<script src="https://d3js.org/d3.v5.min.js"></script>
```
You can also use the standalone D3 microlibraries. For example, [d3-selection](https://github.com/d3/d3-selection):
```html
<script src="https://d3js.org/d3-selection.v1.js"></script>
```
D3 is written using [ES2015 modules](http://www.2ality.com/2014/09/es6-modules-final.html). Create a [custom bundle using Rollup](https://bl.ocks.org/mbostock/bb09af4c39c79cffcde4), Webpack, or your preferred bundler. To import D3 into an ES2015 application, either import specific symbols from specific D3 modules:
```js
import {scaleLinear} from "d3-scale";
```
Or import everything into a namespace (here, `d3`):
```js
import * as d3 from "d3";
```
In Node:
```js
var d3 = require("d3");
```
You can also require individual modules and combine them into a `d3` object using [Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign):
```js
var d3 = Object.assign({}, require("d3-format"), require("d3-geo"), require("d3-geo-projection"));
```

7
web/bower_components/d3/bower.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"name": "d3",
"description": "A JavaScript visualization library for HTML and SVG.",
"main": "d3.js",
"license": "BSD-3-Clause",
"ignore": []
}

17769
web/bower_components/d3/d3.js vendored Normal file

File diff suppressed because it is too large Load Diff

2
web/bower_components/d3/d3.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,18 @@
{
"name": "handlebars",
"version": "4.0.11",
"main": "handlebars.js",
"license": "MIT",
"dependencies": {},
"homepage": "https://github.com/components/handlebars.js",
"_release": "4.0.11",
"_resolution": {
"type": "version",
"tag": "v4.0.11",
"commit": "bf01d452b49f62f9ebf559cefde66563aace6b22"
},
"_source": "https://github.com/components/handlebars.js.git",
"_target": "^4.0.11",
"_originalSource": "handlebars",
"_direct": true
}

View File

@@ -0,0 +1,2 @@
vendor
composer.lock

View File

@@ -0,0 +1,12 @@
Handlebars.js
=============
Shim repository for [Handlebars.js](http://handlebarsjs.com).
Package Managers
----------------
* [Bower](http://twitter.github.com/bower/): `handlebars`
* [Component](http://github.com/component/component): `components/handlebars.js`
* [Composer](http://packagist.org/packages/components/handlebars.js): `components/handlebars.js`
* [jspm](http://jspm.io): `github:components/handlebars.js`

View File

@@ -0,0 +1,7 @@
{
"name": "handlebars",
"version": "4.0.11",
"main": "handlebars.js",
"license": "MIT",
"dependencies": {}
}

View File

@@ -0,0 +1,9 @@
{
"name": "handlebars",
"repo": "components/handlebars.js",
"version": "1.0.0",
"main": "handlebars.js",
"scripts": [
"handlebars.js"
]
}

View File

@@ -0,0 +1,35 @@
{
"name": "components/handlebars.js",
"description": "Handlebars.js and Mustache are both logicless templating languages that keep the view and the code separated like we all know they should be.",
"homepage": "http://handlebarsjs.com",
"license": "MIT",
"type": "component",
"keywords": [
"handlebars",
"mustache",
"html"
],
"authors": [
{
"name": "Chris Wanstrath",
"homepage": "http://chriswanstrath.com"
}
],
"suggest": {
"robloach/component-installer": "Allows installation of Components via Composer"
},
"extra": {
"component": {
"name": "handlebars",
"scripts": [
"handlebars.js"
],
"files": [
"handlebars.runtime.js"
],
"shim": {
"exports": "Handlebars"
}
}
}
}

View File

@@ -0,0 +1,22 @@
# -*- encoding: utf-8 -*-
require 'json'
package = JSON.parse(File.read('bower.json'))
Gem::Specification.new do |gem|
gem.name = "handlebars-source"
gem.authors = ["Yehuda Katz"]
gem.email = ["wycats@gmail.com"]
gem.date = Time.now.strftime("%Y-%m-%d")
gem.description = %q{Handlebars.js source code wrapper for (pre)compilation gems.}
gem.summary = %q{Handlebars.js source code wrapper}
gem.homepage = "https://github.com/wycats/handlebars.js/"
gem.version = package["version"].sub "-", "."
gem.license = "MIT"
gem.files = [
'handlebars.js',
'handlebars.runtime.js',
'lib/handlebars/source.rb'
]
end

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,17 @@
<?xml version="1.0"?>
<package>
<metadata>
<id>handlebars.js</id>
<version>4.0.11</version>
<authors>handlebars.js Authors</authors>
<licenseUrl>https://github.com/wycats/handlebars.js/blob/master/LICENSE</licenseUrl>
<projectUrl>https://github.com/wycats/handlebars.js/</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Extension of the Mustache logicless template language</description>
<releaseNotes></releaseNotes>
<tags>handlebars mustache template html</tags>
</metadata>
<files>
<file src="handlebars.js" target="Content\Scripts" />
</files>
</package>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
module Handlebars
module Source
def self.bundled_path
File.expand_path("../../../handlebars.js", __FILE__)
end
def self.runtime_bundled_path
File.expand_path("../../../handlebars.runtime.js", __FILE__)
end
end
end

View File

@@ -0,0 +1,11 @@
{
"version": "4.0.11",
"name": "handlebars",
"license": "MIT",
"jspm": {
"main": "handlebars",
"shim": { "handlebars": { "exports": "Handlebars" } },
"files": ["handlebars.js", "handlebars.runtime.js"],
"buildConfig": { "minify": true }
}
}

View File

@@ -0,0 +1,3 @@
{
"presets": ["es2015"]
}

View File

@@ -0,0 +1,24 @@
{
"name": "material-design-icons",
"author": "Material Design Authors",
"description": "Material Design icons by Google",
"keywords": [
"icons",
"material",
"material-design",
"google"
],
"license": "Apache-2.0",
"homepage": "http://google.com/design/spec",
"version": "3.0.1",
"_release": "3.0.1",
"_resolution": {
"type": "version",
"tag": "3.0.1",
"commit": "40ef0f297970f0e78bf87569f43ea90ec53d571c"
},
"_source": "https://github.com/google/material-design-icons.git",
"_target": "^3.0.1",
"_originalSource": "material-design-icons",
"_direct": true
}

View File

@@ -0,0 +1 @@
node_modules

View File

@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -0,0 +1,35 @@
# Material design icons
Material design icons are the official [icon set](http://www.google.com/design/spec/style/icons.html#icons-system-icons) from Google that are designed under the [material design guidelines](http://www.google.com/design/spec).
### 3.0 Update
License change to Apache 2.0!
## Getting Started
Read the [developer guide](http://google.github.io/material-design-icons/) on how to use the material design icons in your project.
### Using a font collection
The `iconfont` folder contains pre-generated font files that can be included in a project. This is especially convenient for the web; however, it is generally better to link to the web font hosted on Google Fonts:
```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet">
```
Read more in the [font portion](http://google.github.io/material-design-icons/#icon-font-for-the-web) of our full developer guide.
### Using symbols and sprites
The `css-sprite` and `svg-sprite` folders contain pre-generated sprite sheets, as well as svg symbols that can be `<use>`d more directly and with fewer constraints. Instructions for using them are in the [sprites documentation](https://github.com/google/material-design-icons/tree/master/sprites).
## Polymer icons
If you wish to use the icon set with Polymer, we recommend consuming them via the [`<iron-icons>`](https://github.com/polymerelements/iron-icons) element ([`<core-icons>`](https://github.com/Polymer/core-icons) in v0.5).
## License
We have made these icons available for you to incorporate them into your products under the [Apache License Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt). Feel free to remix and re-share these icons and documentation in your products.
We'd love attribution in your app's *about* screen, but it's not required. The only thing we ask is that you not re-sell these icons.

View File

@@ -0,0 +1,13 @@
{
"name": "material-design-icons",
"author": "Material Design Authors",
"description": "Material Design icons by Google",
"keywords": [
"icons",
"material",
"material-design",
"google"
],
"license": "Apache-2.0",
"homepage": "http://google.com/design/spec"
}

View File

@@ -0,0 +1,166 @@
'use strict';
import _ from 'lodash';
import File from 'vinyl';
import gulp from 'gulp';
import merge from 'merge-stream';
import sprity from 'sprity';
import svgSprite from 'gulp-svg-sprite';
import through2 from 'through2';
import { humanize, titleize } from 'underscore.string';
/** Names of directories containing icons. */
const ICON_CATEGORIES = [
'action',
'alert',
'av',
'communication',
'content',
'device',
'editor',
'file',
'hardware',
'image',
'maps',
'navigation',
'notification',
'places',
'social',
'toggle',
];
/** Standard PNG colors. */
const PNG_COLORS = [
'black',
'white',
];
/**
* Generates PNG sprites and their corresponding CSS files for each category of
* icon, and places them in `sprites/css-sprite`.
*
* TODO(shyndman): Add support for double density sprites.
*/
gulp.task('png-sprites', () =>
_(getCategoryColorPairs())
.map(([ category, color ]) =>
sprity.src({
src: `./${ category }/1x_web/*_${ color }_24dp.png`,
style: `sprite-${ category }-${ color }.css`,
name: `sprite-${ category }-${ color }`,
engine: 'sprity-gm',
orientation: 'left-right'
}))
.thru(merge)
.value()
.pipe(gulp.dest('./sprites/css-sprite/')));
/**
* Generates CSS and Symbol-based SVG sprites for each category, and places
* them in `sprites/svg-sprite`.
*/
gulp.task('svg-sprites', () =>
_(ICON_CATEGORIES)
.map((category) =>
gulp.src(`./${ category }/svg/production/*_24px.svg`)
.pipe(svgSprite(getSvgSpriteConfig(category))))
.thru(merge)
.value()
.pipe(gulp.dest('./sprites/svg-sprite')));
/**
* Generates a file to allow the consumption of the icon font by Iconjar
* (http://geticonjar.com/).
*/
gulp.task('iconjar', () =>
gulp.src('./iconfont/codepoints')
.pipe(generateIjmap('MaterialIcons-Regular.ijmap'))
.pipe(gulp.dest('./iconfont/')));
/** Runs all tasks. */
gulp.task('default', ['png-sprites', 'svg-sprites', 'iconjar']);
/**
* Returns a stream that transforms between our icon font's codepoint file
* and an Iconjar ijmap.
*/
function generateIjmap(ijmapPath) {
return through2.obj((codepointsFile, encoding, callback) => {
const ijmap = {
icons: codepointsToIjmap(codepointsFile.contents.toString())
};
callback(null, new File({
path: ijmapPath,
contents: new Buffer(JSON.stringify(ijmap), 'utf8')
}));
function codepointsToIjmap(codepoints) {
return _(codepoints)
.split('\n') // split into lines
.reject(_.isEmpty) // remove empty lines
.reduce((codepointMap, line) => { // build up the codepoint map
let [ name, codepoint ] = line.split(' ');
codepointMap[codepoint] = { name: titleize(humanize(name)) };
return codepointMap;
}, {});
}
});
}
/**
* Returns the SVG sprite configuration for the specified category.
*/
function getSvgSpriteConfig(category) {
return {
shape: {
dimension: {
maxWidth: 24,
maxHeight: 24
},
},
mode: {
css : {
bust: false,
dest: './',
sprite: `./svg-sprite-${ category }.svg`,
example: {
dest: `./svg-sprite-${ category }.html`
},
render: {
css: {
dest: `./svg-sprite-${ category }.css`
}
}
},
symbol : {
bust: false,
dest: './',
sprite: `./svg-sprite-${ category }-symbol.svg`,
example: {
dest: `./svg-sprite-${ category }-symbol.html`
}
}
}
};
}
/**
* Returns the catesian product of categories and colors.
*/
function getCategoryColorPairs() {
return _(ICON_CATEGORIES)
.map((category) =>
_.zip(_.times(PNG_COLORS.length, () => category), PNG_COLORS))
.flatten() // flattens 1 level
.value();
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 275 KiB

View File

@@ -0,0 +1,9 @@
The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts:
```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet">
```
Read more in our full usage guide:
http://google.github.io/material-design-icons/#icon-font-for-the-web

View File

@@ -0,0 +1,932 @@
3d_rotation e84d
ac_unit eb3b
access_alarm e190
access_alarms e191
access_time e192
accessibility e84e
accessible e914
account_balance e84f
account_balance_wallet e850
account_box e851
account_circle e853
adb e60e
add e145
add_a_photo e439
add_alarm e193
add_alert e003
add_box e146
add_circle e147
add_circle_outline e148
add_location e567
add_shopping_cart e854
add_to_photos e39d
add_to_queue e05c
adjust e39e
airline_seat_flat e630
airline_seat_flat_angled e631
airline_seat_individual_suite e632
airline_seat_legroom_extra e633
airline_seat_legroom_normal e634
airline_seat_legroom_reduced e635
airline_seat_recline_extra e636
airline_seat_recline_normal e637
airplanemode_active e195
airplanemode_inactive e194
airplay e055
airport_shuttle eb3c
alarm e855
alarm_add e856
alarm_off e857
alarm_on e858
album e019
all_inclusive eb3d
all_out e90b
android e859
announcement e85a
apps e5c3
archive e149
arrow_back e5c4
arrow_downward e5db
arrow_drop_down e5c5
arrow_drop_down_circle e5c6
arrow_drop_up e5c7
arrow_forward e5c8
arrow_upward e5d8
art_track e060
aspect_ratio e85b
assessment e85c
assignment e85d
assignment_ind e85e
assignment_late e85f
assignment_return e860
assignment_returned e861
assignment_turned_in e862
assistant e39f
assistant_photo e3a0
attach_file e226
attach_money e227
attachment e2bc
audiotrack e3a1
autorenew e863
av_timer e01b
backspace e14a
backup e864
battery_alert e19c
battery_charging_full e1a3
battery_full e1a4
battery_std e1a5
battery_unknown e1a6
beach_access eb3e
beenhere e52d
block e14b
bluetooth e1a7
bluetooth_audio e60f
bluetooth_connected e1a8
bluetooth_disabled e1a9
bluetooth_searching e1aa
blur_circular e3a2
blur_linear e3a3
blur_off e3a4
blur_on e3a5
book e865
bookmark e866
bookmark_border e867
border_all e228
border_bottom e229
border_clear e22a
border_color e22b
border_horizontal e22c
border_inner e22d
border_left e22e
border_outer e22f
border_right e230
border_style e231
border_top e232
border_vertical e233
branding_watermark e06b
brightness_1 e3a6
brightness_2 e3a7
brightness_3 e3a8
brightness_4 e3a9
brightness_5 e3aa
brightness_6 e3ab
brightness_7 e3ac
brightness_auto e1ab
brightness_high e1ac
brightness_low e1ad
brightness_medium e1ae
broken_image e3ad
brush e3ae
bubble_chart e6dd
bug_report e868
build e869
burst_mode e43c
business e0af
business_center eb3f
cached e86a
cake e7e9
call e0b0
call_end e0b1
call_made e0b2
call_merge e0b3
call_missed e0b4
call_missed_outgoing e0e4
call_received e0b5
call_split e0b6
call_to_action e06c
camera e3af
camera_alt e3b0
camera_enhance e8fc
camera_front e3b1
camera_rear e3b2
camera_roll e3b3
cancel e5c9
card_giftcard e8f6
card_membership e8f7
card_travel e8f8
casino eb40
cast e307
cast_connected e308
center_focus_strong e3b4
center_focus_weak e3b5
change_history e86b
chat e0b7
chat_bubble e0ca
chat_bubble_outline e0cb
check e5ca
check_box e834
check_box_outline_blank e835
check_circle e86c
chevron_left e5cb
chevron_right e5cc
child_care eb41
child_friendly eb42
chrome_reader_mode e86d
class e86e
clear e14c
clear_all e0b8
close e5cd
closed_caption e01c
cloud e2bd
cloud_circle e2be
cloud_done e2bf
cloud_download e2c0
cloud_off e2c1
cloud_queue e2c2
cloud_upload e2c3
code e86f
collections e3b6
collections_bookmark e431
color_lens e3b7
colorize e3b8
comment e0b9
compare e3b9
compare_arrows e915
computer e30a
confirmation_number e638
contact_mail e0d0
contact_phone e0cf
contacts e0ba
content_copy e14d
content_cut e14e
content_paste e14f
control_point e3ba
control_point_duplicate e3bb
copyright e90c
create e150
create_new_folder e2cc
credit_card e870
crop e3be
crop_16_9 e3bc
crop_3_2 e3bd
crop_5_4 e3bf
crop_7_5 e3c0
crop_din e3c1
crop_free e3c2
crop_landscape e3c3
crop_original e3c4
crop_portrait e3c5
crop_rotate e437
crop_square e3c6
dashboard e871
data_usage e1af
date_range e916
dehaze e3c7
delete e872
delete_forever e92b
delete_sweep e16c
description e873
desktop_mac e30b
desktop_windows e30c
details e3c8
developer_board e30d
developer_mode e1b0
device_hub e335
devices e1b1
devices_other e337
dialer_sip e0bb
dialpad e0bc
directions e52e
directions_bike e52f
directions_boat e532
directions_bus e530
directions_car e531
directions_railway e534
directions_run e566
directions_subway e533
directions_transit e535
directions_walk e536
disc_full e610
dns e875
do_not_disturb e612
do_not_disturb_alt e611
do_not_disturb_off e643
do_not_disturb_on e644
dock e30e
domain e7ee
done e876
done_all e877
donut_large e917
donut_small e918
drafts e151
drag_handle e25d
drive_eta e613
dvr e1b2
edit e3c9
edit_location e568
eject e8fb
email e0be
enhanced_encryption e63f
equalizer e01d
error e000
error_outline e001
euro_symbol e926
ev_station e56d
event e878
event_available e614
event_busy e615
event_note e616
event_seat e903
exit_to_app e879
expand_less e5ce
expand_more e5cf
explicit e01e
explore e87a
exposure e3ca
exposure_neg_1 e3cb
exposure_neg_2 e3cc
exposure_plus_1 e3cd
exposure_plus_2 e3ce
exposure_zero e3cf
extension e87b
face e87c
fast_forward e01f
fast_rewind e020
favorite e87d
favorite_border e87e
featured_play_list e06d
featured_video e06e
feedback e87f
fiber_dvr e05d
fiber_manual_record e061
fiber_new e05e
fiber_pin e06a
fiber_smart_record e062
file_download e2c4
file_upload e2c6
filter e3d3
filter_1 e3d0
filter_2 e3d1
filter_3 e3d2
filter_4 e3d4
filter_5 e3d5
filter_6 e3d6
filter_7 e3d7
filter_8 e3d8
filter_9 e3d9
filter_9_plus e3da
filter_b_and_w e3db
filter_center_focus e3dc
filter_drama e3dd
filter_frames e3de
filter_hdr e3df
filter_list e152
filter_none e3e0
filter_tilt_shift e3e2
filter_vintage e3e3
find_in_page e880
find_replace e881
fingerprint e90d
first_page e5dc
fitness_center eb43
flag e153
flare e3e4
flash_auto e3e5
flash_off e3e6
flash_on e3e7
flight e539
flight_land e904
flight_takeoff e905
flip e3e8
flip_to_back e882
flip_to_front e883
folder e2c7
folder_open e2c8
folder_shared e2c9
folder_special e617
font_download e167
format_align_center e234
format_align_justify e235
format_align_left e236
format_align_right e237
format_bold e238
format_clear e239
format_color_fill e23a
format_color_reset e23b
format_color_text e23c
format_indent_decrease e23d
format_indent_increase e23e
format_italic e23f
format_line_spacing e240
format_list_bulleted e241
format_list_numbered e242
format_paint e243
format_quote e244
format_shapes e25e
format_size e245
format_strikethrough e246
format_textdirection_l_to_r e247
format_textdirection_r_to_l e248
format_underlined e249
forum e0bf
forward e154
forward_10 e056
forward_30 e057
forward_5 e058
free_breakfast eb44
fullscreen e5d0
fullscreen_exit e5d1
functions e24a
g_translate e927
gamepad e30f
games e021
gavel e90e
gesture e155
get_app e884
gif e908
golf_course eb45
gps_fixed e1b3
gps_not_fixed e1b4
gps_off e1b5
grade e885
gradient e3e9
grain e3ea
graphic_eq e1b8
grid_off e3eb
grid_on e3ec
group e7ef
group_add e7f0
group_work e886
hd e052
hdr_off e3ed
hdr_on e3ee
hdr_strong e3f1
hdr_weak e3f2
headset e310
headset_mic e311
healing e3f3
hearing e023
help e887
help_outline e8fd
high_quality e024
highlight e25f
highlight_off e888
history e889
home e88a
hot_tub eb46
hotel e53a
hourglass_empty e88b
hourglass_full e88c
http e902
https e88d
image e3f4
image_aspect_ratio e3f5
import_contacts e0e0
import_export e0c3
important_devices e912
inbox e156
indeterminate_check_box e909
info e88e
info_outline e88f
input e890
insert_chart e24b
insert_comment e24c
insert_drive_file e24d
insert_emoticon e24e
insert_invitation e24f
insert_link e250
insert_photo e251
invert_colors e891
invert_colors_off e0c4
iso e3f6
keyboard e312
keyboard_arrow_down e313
keyboard_arrow_left e314
keyboard_arrow_right e315
keyboard_arrow_up e316
keyboard_backspace e317
keyboard_capslock e318
keyboard_hide e31a
keyboard_return e31b
keyboard_tab e31c
keyboard_voice e31d
kitchen eb47
label e892
label_outline e893
landscape e3f7
language e894
laptop e31e
laptop_chromebook e31f
laptop_mac e320
laptop_windows e321
last_page e5dd
launch e895
layers e53b
layers_clear e53c
leak_add e3f8
leak_remove e3f9
lens e3fa
library_add e02e
library_books e02f
library_music e030
lightbulb_outline e90f
line_style e919
line_weight e91a
linear_scale e260
link e157
linked_camera e438
list e896
live_help e0c6
live_tv e639
local_activity e53f
local_airport e53d
local_atm e53e
local_bar e540
local_cafe e541
local_car_wash e542
local_convenience_store e543
local_dining e556
local_drink e544
local_florist e545
local_gas_station e546
local_grocery_store e547
local_hospital e548
local_hotel e549
local_laundry_service e54a
local_library e54b
local_mall e54c
local_movies e54d
local_offer e54e
local_parking e54f
local_pharmacy e550
local_phone e551
local_pizza e552
local_play e553
local_post_office e554
local_printshop e555
local_see e557
local_shipping e558
local_taxi e559
location_city e7f1
location_disabled e1b6
location_off e0c7
location_on e0c8
location_searching e1b7
lock e897
lock_open e898
lock_outline e899
looks e3fc
looks_3 e3fb
looks_4 e3fd
looks_5 e3fe
looks_6 e3ff
looks_one e400
looks_two e401
loop e028
loupe e402
low_priority e16d
loyalty e89a
mail e158
mail_outline e0e1
map e55b
markunread e159
markunread_mailbox e89b
memory e322
menu e5d2
merge_type e252
message e0c9
mic e029
mic_none e02a
mic_off e02b
mms e618
mode_comment e253
mode_edit e254
monetization_on e263
money_off e25c
monochrome_photos e403
mood e7f2
mood_bad e7f3
more e619
more_horiz e5d3
more_vert e5d4
motorcycle e91b
mouse e323
move_to_inbox e168
movie e02c
movie_creation e404
movie_filter e43a
multiline_chart e6df
music_note e405
music_video e063
my_location e55c
nature e406
nature_people e407
navigate_before e408
navigate_next e409
navigation e55d
near_me e569
network_cell e1b9
network_check e640
network_locked e61a
network_wifi e1ba
new_releases e031
next_week e16a
nfc e1bb
no_encryption e641
no_sim e0cc
not_interested e033
note e06f
note_add e89c
notifications e7f4
notifications_active e7f7
notifications_none e7f5
notifications_off e7f6
notifications_paused e7f8
offline_pin e90a
ondemand_video e63a
opacity e91c
open_in_browser e89d
open_in_new e89e
open_with e89f
pages e7f9
pageview e8a0
palette e40a
pan_tool e925
panorama e40b
panorama_fish_eye e40c
panorama_horizontal e40d
panorama_vertical e40e
panorama_wide_angle e40f
party_mode e7fa
pause e034
pause_circle_filled e035
pause_circle_outline e036
payment e8a1
people e7fb
people_outline e7fc
perm_camera_mic e8a2
perm_contact_calendar e8a3
perm_data_setting e8a4
perm_device_information e8a5
perm_identity e8a6
perm_media e8a7
perm_phone_msg e8a8
perm_scan_wifi e8a9
person e7fd
person_add e7fe
person_outline e7ff
person_pin e55a
person_pin_circle e56a
personal_video e63b
pets e91d
phone e0cd
phone_android e324
phone_bluetooth_speaker e61b
phone_forwarded e61c
phone_in_talk e61d
phone_iphone e325
phone_locked e61e
phone_missed e61f
phone_paused e620
phonelink e326
phonelink_erase e0db
phonelink_lock e0dc
phonelink_off e327
phonelink_ring e0dd
phonelink_setup e0de
photo e410
photo_album e411
photo_camera e412
photo_filter e43b
photo_library e413
photo_size_select_actual e432
photo_size_select_large e433
photo_size_select_small e434
picture_as_pdf e415
picture_in_picture e8aa
picture_in_picture_alt e911
pie_chart e6c4
pie_chart_outlined e6c5
pin_drop e55e
place e55f
play_arrow e037
play_circle_filled e038
play_circle_outline e039
play_for_work e906
playlist_add e03b
playlist_add_check e065
playlist_play e05f
plus_one e800
poll e801
polymer e8ab
pool eb48
portable_wifi_off e0ce
portrait e416
power e63c
power_input e336
power_settings_new e8ac
pregnant_woman e91e
present_to_all e0df
print e8ad
priority_high e645
public e80b
publish e255
query_builder e8ae
question_answer e8af
queue e03c
queue_music e03d
queue_play_next e066
radio e03e
radio_button_checked e837
radio_button_unchecked e836
rate_review e560
receipt e8b0
recent_actors e03f
record_voice_over e91f
redeem e8b1
redo e15a
refresh e5d5
remove e15b
remove_circle e15c
remove_circle_outline e15d
remove_from_queue e067
remove_red_eye e417
remove_shopping_cart e928
reorder e8fe
repeat e040
repeat_one e041
replay e042
replay_10 e059
replay_30 e05a
replay_5 e05b
reply e15e
reply_all e15f
report e160
report_problem e8b2
restaurant e56c
restaurant_menu e561
restore e8b3
restore_page e929
ring_volume e0d1
room e8b4
room_service eb49
rotate_90_degrees_ccw e418
rotate_left e419
rotate_right e41a
rounded_corner e920
router e328
rowing e921
rss_feed e0e5
rv_hookup e642
satellite e562
save e161
scanner e329
schedule e8b5
school e80c
screen_lock_landscape e1be
screen_lock_portrait e1bf
screen_lock_rotation e1c0
screen_rotation e1c1
screen_share e0e2
sd_card e623
sd_storage e1c2
search e8b6
security e32a
select_all e162
send e163
sentiment_dissatisfied e811
sentiment_neutral e812
sentiment_satisfied e813
sentiment_very_dissatisfied e814
sentiment_very_satisfied e815
settings e8b8
settings_applications e8b9
settings_backup_restore e8ba
settings_bluetooth e8bb
settings_brightness e8bd
settings_cell e8bc
settings_ethernet e8be
settings_input_antenna e8bf
settings_input_component e8c0
settings_input_composite e8c1
settings_input_hdmi e8c2
settings_input_svideo e8c3
settings_overscan e8c4
settings_phone e8c5
settings_power e8c6
settings_remote e8c7
settings_system_daydream e1c3
settings_voice e8c8
share e80d
shop e8c9
shop_two e8ca
shopping_basket e8cb
shopping_cart e8cc
short_text e261
show_chart e6e1
shuffle e043
signal_cellular_4_bar e1c8
signal_cellular_connected_no_internet_4_bar e1cd
signal_cellular_no_sim e1ce
signal_cellular_null e1cf
signal_cellular_off e1d0
signal_wifi_4_bar e1d8
signal_wifi_4_bar_lock e1d9
signal_wifi_off e1da
sim_card e32b
sim_card_alert e624
skip_next e044
skip_previous e045
slideshow e41b
slow_motion_video e068
smartphone e32c
smoke_free eb4a
smoking_rooms eb4b
sms e625
sms_failed e626
snooze e046
sort e164
sort_by_alpha e053
spa eb4c
space_bar e256
speaker e32d
speaker_group e32e
speaker_notes e8cd
speaker_notes_off e92a
speaker_phone e0d2
spellcheck e8ce
star e838
star_border e83a
star_half e839
stars e8d0
stay_current_landscape e0d3
stay_current_portrait e0d4
stay_primary_landscape e0d5
stay_primary_portrait e0d6
stop e047
stop_screen_share e0e3
storage e1db
store e8d1
store_mall_directory e563
straighten e41c
streetview e56e
strikethrough_s e257
style e41d
subdirectory_arrow_left e5d9
subdirectory_arrow_right e5da
subject e8d2
subscriptions e064
subtitles e048
subway e56f
supervisor_account e8d3
surround_sound e049
swap_calls e0d7
swap_horiz e8d4
swap_vert e8d5
swap_vertical_circle e8d6
switch_camera e41e
switch_video e41f
sync e627
sync_disabled e628
sync_problem e629
system_update e62a
system_update_alt e8d7
tab e8d8
tab_unselected e8d9
tablet e32f
tablet_android e330
tablet_mac e331
tag_faces e420
tap_and_play e62b
terrain e564
text_fields e262
text_format e165
textsms e0d8
texture e421
theaters e8da
thumb_down e8db
thumb_up e8dc
thumbs_up_down e8dd
time_to_leave e62c
timelapse e422
timeline e922
timer e425
timer_10 e423
timer_3 e424
timer_off e426
title e264
toc e8de
today e8df
toll e8e0
tonality e427
touch_app e913
toys e332
track_changes e8e1
traffic e565
train e570
tram e571
transfer_within_a_station e572
transform e428
translate e8e2
trending_down e8e3
trending_flat e8e4
trending_up e8e5
tune e429
turned_in e8e6
turned_in_not e8e7
tv e333
unarchive e169
undo e166
unfold_less e5d6
unfold_more e5d7
update e923
usb e1e0
verified_user e8e8
vertical_align_bottom e258
vertical_align_center e259
vertical_align_top e25a
vibration e62d
video_call e070
video_label e071
video_library e04a
videocam e04b
videocam_off e04c
videogame_asset e338
view_agenda e8e9
view_array e8ea
view_carousel e8eb
view_column e8ec
view_comfy e42a
view_compact e42b
view_day e8ed
view_headline e8ee
view_list e8ef
view_module e8f0
view_quilt e8f1
view_stream e8f2
view_week e8f3
vignette e435
visibility e8f4
visibility_off e8f5
voice_chat e62e
voicemail e0d9
volume_down e04d
volume_mute e04e
volume_off e04f
volume_up e050
vpn_key e0da
vpn_lock e62f
wallpaper e1bc
warning e002
watch e334
watch_later e924
wb_auto e42c
wb_cloudy e42d
wb_incandescent e42e
wb_iridescent e436
wb_sunny e430
wc e63d
web e051
web_asset e069
weekend e16b
whatshot e80e
widgets e1bd
wifi e63e
wifi_lock e1e1
wifi_tethering e1e2
work e8f9
wrap_text e25b
youtube_searched_for e8fa
zoom_in e8ff
zoom_out e900
zoom_out_map e56b

View File

@@ -0,0 +1,36 @@
@font-face {
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
src: url(MaterialIcons-Regular.eot); /* For IE6-8 */
src: local('Material Icons'),
local('MaterialIcons-Regular'),
url(MaterialIcons-Regular.woff2) format('woff2'),
url(MaterialIcons-Regular.woff) format('woff'),
url(MaterialIcons-Regular.ttf) format('truetype');
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}

View File

@@ -0,0 +1,3 @@
module.exports = {
STATIC_PATH: __dirname,
};

View File

@@ -0,0 +1,35 @@
{
"name": "material-design-icons",
"version": "3.0.0",
"description": "Material Design icons by Google",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://github.com/google/material-design-icons"
},
"keywords": [
"icons",
"material",
"material-design",
"google"
],
"author": "Material Design Authors",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/google/material-design-icons/issues"
},
"homepage": "https://github.com/google/material-design-icons",
"devDependencies": {
"babel-core": "^6.1.2",
"babel-preset-es2015": "^6.1.2",
"gulp": "^3.9.0",
"gulp-if": "^2.0.0",
"gulp-svg-sprite": "^1.2.14",
"lodash": "^3.10.1",
"sprity": "^1.0.8",
"sprity-gm": "^1.0.2",
"through2": "^2.0.0",
"underscore.string": "^3.2.2",
"vinyl": "^1.1.0"
}
}

8
web/bower_components/vis/.babelrc vendored Normal file
View File

@@ -0,0 +1,8 @@
{
"presets": ["es2015"],
"plugins": [
"transform-es3-property-literals",
"transform-es3-member-expression-literals",
"transform-runtime"
]
}

56
web/bower_components/vis/.bower.json vendored Normal file
View File

@@ -0,0 +1,56 @@
{
"name": "vis",
"main": [
"dist/vis.js",
"dist/vis.css"
],
"description": "A dynamic, browser-based visualization library.",
"homepage": "http://visjs.org/",
"license": [
"Apache-2.0",
"MIT"
],
"repository": {
"type": "git",
"url": "git://github.com/almende/vis.git"
},
"keywords": [
"vis",
"visualization",
"web based",
"browser based",
"javascript",
"chart",
"linechart",
"timeline",
"graph",
"network",
"browser"
],
"ignore": [
"gulpfile.js",
"index*.js",
"misc",
"node_modules",
"package.json",
"test",
"tools",
"lib",
".idea",
".npmignore",
".gitignore"
],
"dependencies": {},
"devDependencies": {},
"version": "4.21.0",
"_release": "4.21.0",
"_resolution": {
"type": "version",
"tag": "v4.21.0",
"commit": "001716727826e2ba6cc0df7070733013936dda9a"
},
"_source": "https://github.com/almende/vis.git",
"_target": "^4.21.0",
"_originalSource": "vis",
"_direct": true
}

View File

@@ -0,0 +1,26 @@
languages:
JavaScript: true
engines:
eslint:
enabled: true
csslint:
enabled: true
markdownlint:
enabled: true
duplication:
enabled: true
config:
languages:
javascript:
mass_threshold: 300
fixme :
enabled: true
ratings:
paths:
- "**/*.js"
- "**/*.css"
- "**/*.md"
exclude_paths:
- "dist/**/*"
- "docs/**/*"
- "examples/**/*"

6
web/bower_components/vis/.csslintrc vendored Normal file
View File

@@ -0,0 +1,6 @@
{
"adjoining-classes": false,
"box-model": false,
"box-sizing": false,
"order-alphabetical": false
}

42
web/bower_components/vis/.eslintrc vendored Normal file
View File

@@ -0,0 +1,42 @@
{
"env": {
"browser": true,
"es6": true,
"node": true,
"mocha": true
},
"parserOptions": {
"sourceType": "module",
},
"extends": "eslint:recommended",
// For the full list of rules, see: http://eslint.org/docs/rules/
"rules": {
"complexity": [2, 55],
"max-statements": [2, 115],
"no-unreachable": 1,
"no-useless-escape": 0,
"no-console": 0,
// To flag presence of console.log without breaking linting:
//"no-console": ["warn", { allow: ["warn", "error"] }],
"require-jsdoc": ["error", {
"require": {
"FunctionDeclaration": true,
"MethodDefinition": true,
"ClassDeclaration": true,
"ArrowFunctionExpression": false
}
}],
"valid-jsdoc": [2, {
"requireReturnDescription": false,
"requireReturn": false,
"requireParamDescription": false,
"requireReturnType": true
}],
"guard-for-in": 1,
},
}

View File

@@ -0,0 +1,10 @@
Please make sure to **read the following list** before creating a new issue:
* This issue tracker is not supposed to be used for questions on how to use visjs. It is intended to be used for bug reports and feature requests! In case you face yourself with a usage question, then post your question e.g. on [stackoverflow](https://stackoverflow.com/questions/tagged/vis.js) tagged with "vis.js".
* Have you already used the [github search](https://github.com/almende/vis/issues), read the [documentation](http://visjs.org/) and looked at the [examples](https://github.com/almende/vis/tree/develop/examples)?
* Make sure to mention which vis-component (network, timeline, graph2D, graph3d) you are referring to.
* Make sure to use the [latest version of vis.js](https://cdnjs.com/libraries/vis) for bug reports.
* Make sure to mention which browser and OS you are using when creating a bug report.
* Please provide a minimal code example that demonstrates your issue. We recommend using [jsbin](jsbin.com) for that.
* Delete this list from the actual issue.

View File

@@ -0,0 +1,11 @@
**Thank you for contributing to vis.js!!**
Please make sure to check the following requirements before creating a pull request:
* [ ] All pull requests must be to the [develop branch](https://github.com/almende/vis/tree/develop). Pull requests to the `master` branch will be closed!
* [ ] Make sure your changes are based on the latest version of the [develop branch](https://github.com/almende/vis/tree/develop). (Use e.g. `git fetch && git rebase origin develop` to update your feature branch).
* [ ] Provide an additional or update an example to demonstrate your changes or new features.
* [ ] Update the documentation if you introduced new behavior or changed existing behavior.
* [ ] Reference issue numbers of issues that your pull request addresses. (If you write something like `fixes #1781` in your git commit message this issue gets closed automatically by merging your pull request).
* [ ] Expect review comments and change requests by reviewer.
* [ ] Delete this checklist from your pull request.

7
web/bower_components/vis/.mdlrc vendored Normal file
View File

@@ -0,0 +1,7 @@
// Markdown Lint Rules
// https://github.com/mivok/markdownlint/blob/master/docs/RULES.md
rules
"~MD012", // alert on multiple consecutive blank lines
"~MD013", // line length should be no more than 80 characters
"~MD014", // Dollar signs used before commands without showing output

18
web/bower_components/vis/.travis.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
language: node_js
node_js:
- "6"
env:
- CXX=g++-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- libgif-dev
- g++-4.8
before_script:
- npm run lint
- npm install gulp
script:
- gulp
- npm test

View File

@@ -0,0 +1,15 @@
## Contributing
[Contributions](//github.com/almende/vis/blob/master/misc/how_to_help.md) to the vis.js library are very welcome! [We can't do this alone](//github.com/almende/vis/blob/master/misc/we_need_help.md).
### Questions
If you have any *general question* on how to use the vis.js library in your own project please check out [stackoverflow](http://stackoverflow.com/questions/tagged/vis.js) for thinks like that. **This is NOT a JavaScript help forum!**
### Bugs, Problems and Feature-Requests
If you really want to open a new issue:
* Please use the [search functionality](//github.com/almende/vis/issues) to make sure that there is not already an issue concerning the same topic.
* Please make sure to **mention which module** of vis.js (network, timeline, graph3d, ...) your are referring to.
* Note that development happens on the `develop` git branch. Be sure to submit PRs against this branch.
* If you think you found a bug please **provide a simple example** (e.g. on [jsbin](jsbin.com)) that demonstrates the problem.
* If you want to propose a feature-request please **describe what you are looking for in detail**, ideally providing a screenshot, drawing or something similar.
* **Close the issue later**, when the issue is no longer needed.

1961
web/bower_components/vis/HISTORY.md vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,176 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

21
web/bower_components/vis/LICENSE-MIT vendored Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014-2017 Almende B.V.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

368
web/bower_components/vis/README.md vendored Normal file
View File

@@ -0,0 +1,368 @@
# vis.js
[![Join the chat at https://gitter.im/vis-js/Lobby](https://badges.gitter.im/vis-js/Lobby.svg)](https://gitter.im/vis-js/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
<a href="https://github.com/almende/vis/blob/develop/misc/we_need_help.md">
<img align="right" src="https://raw.githubusercontent.com/almende/vis/master/misc/we_need_help.png">
</a>
Vis.js is a dynamic, browser based visualization library.
The library is designed to be easy to use, handle large amounts
of dynamic data, and enable manipulation of the data.
The library consists of the following components:
- DataSet and DataView. A flexible key/value based data set. Add, update, and
remove items. Subscribe on changes in the data set. A DataSet can filter and
order items, and convert fields of items.
- DataView. A filtered and/or formatted view on a DataSet.
- Graph2d. Plot data on a timeline with lines or barcharts.
- Graph3d. Display data in a three dimensional graph.
- Network. Display a network (force directed graph) with nodes and edges.
- Timeline. Display different types of data on a timeline.
The vis.js library was initially developed by [Almende B.V](http://almende.com).
## Badges
[![NPM](https://nodei.co/npm/vis.png?downloads=true&downloadRank=true)](https://nodei.co/npm/vis/)
[![Dependency Status](https://david-dm.org/almende/vis/status.svg)](https://david-dm.org/almende/vis)
[![devDependency Status](https://david-dm.org/almende/vis/dev-status.svg)](https://david-dm.org/almende/vis?type=dev)
[![last version on CDNJS](https://img.shields.io/cdnjs/v/vis.svg)](https://cdnjs.com/libraries/vis)
[![GitHub contributors](https://img.shields.io/github/contributors/almende/vis.svg)](https://github.com/almende/vis/graphs/contributors)
[![GitHub stars](https://img.shields.io/github/stars/almende/vis.svg)](https://github.com/almende/vis/stargazers)
[![GitHub issues](https://img.shields.io/github/issues/almende/vis.svg)](https://github.com/almende/vis/issues)
[![Percentage of issues still open](http://isitmaintained.com/badge/open/almende/vis.svg)](http://isitmaintained.com/project/almende/vis "Percentage of issues still open")
[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/almende/vis.svg)](http://isitmaintained.com/project/almende/vis "Average time to resolve an issue")
[![Pending Pull-Requests](http://githubbadges.herokuapp.com/almende/vis/pulls.svg)](https://github.com/almende/vis/pulls)
[![Code Climate](https://codeclimate.com/github/almende/vis/badges/gpa.svg)](https://codeclimate.com/github/almende/vis)
## Install
Install via npm:
$ npm install vis
Install via bower:
$ bower install vis
Link via cdnjs: http://cdnjs.com
Or download the library from the github project:
[https://github.com/almende/vis.git](https://github.com/almende/vis.git).
## Load
To use a component, include the javascript and css files of vis in your web page:
```html
<!DOCTYPE HTML>
<html>
<head>
<script src="webroot/vis/dist/vis.js"></script>
<link href="webroot/vis/dist/vis.css" rel="stylesheet" type="text/css" />
</head>
<body>
<script type="text/javascript">
// ... load a visualization
</script>
</body>
</html>
```
or load vis.js using require.js. Note that vis.css must be loaded too.
```js
require.config({
paths: {
vis: 'path/to/vis/dist',
}
});
require(['vis'], function (math) {
// ... load a visualization
});
```
A timeline can be instantiated as:
```js
var timeline = new vis.Timeline(container, data, options);
```
Where `container` is an HTML element, `data` is an Array with data or a DataSet,
and `options` is an optional object with configuration options for the
component.
## Example
A basic example on loading a Timeline is shown below. More examples can be
found in the [examples directory](https://github.com/almende/vis/tree/master/examples)
of the project.
```html
<!DOCTYPE HTML>
<html>
<head>
<title>Timeline basic demo</title>
<script src="vis/dist/vis.js"></script>
<link href="vis/dist/vis.css" rel="stylesheet" type="text/css" />
<style type="text/css">
body, html {
font-family: sans-serif;
}
</style>
</head>
<body>
<div id="visualization"></div>
<script type="text/javascript">
var container = document.getElementById('visualization');
var data = [
{id: 1, content: 'item 1', start: '2013-04-20'},
{id: 2, content: 'item 2', start: '2013-04-14'},
{id: 3, content: 'item 3', start: '2013-04-18'},
{id: 4, content: 'item 4', start: '2013-04-16', end: '2013-04-19'},
{id: 5, content: 'item 5', start: '2013-04-25'},
{id: 6, content: 'item 6', start: '2013-04-27'}
];
var options = {};
var timeline = new vis.Timeline(container, data, options);
</script>
</body>
</html>
```
## Build
To build the library from source, clone the project from github
$ git clone git://github.com/almende/vis.git
The source code uses the module style of node (require and module.exports) to
organize dependencies. To install all dependencies and build the library,
run `npm install` in the root of the project.
$ cd vis
$ npm install
Then, the project can be build running:
$ npm run build
To automatically rebuild on changes in the source files, once can use
$ npm run watch
This will both build and minify the library on changes. Minifying is relatively
slow, so when only the non-minified library is needed, one can use the
`watch-dev` script instead:
$ npm run watch-dev
## Custom builds
The folder `dist` contains bundled versions of vis.js for direct use in the browser. These bundles contain all the visualizations and include external dependencies such as *hammer.js* and *moment.js*.
The source code of vis.js consists of commonjs modules, which makes it possible to create custom bundles using tools like [Browserify](http://browserify.org/) or [Webpack](http://webpack.github.io/). This can be bundling just one visualization like the Timeline, or bundling vis.js as part of your own browserified web application.
*Note that hammer.js version 2 is required as of v4.*
### Prerequisites
Before you can do a build:
- Install *node.js* and *npm* on your system: https://nodejs.org/
- Install the following modules using npm: `browserify`, `babelify`, and `uglify-js`:
```
$ [sudo] npm install -g browserify babelify uglify-js
```
- Download or clone the vis.js project:
```
$ git clone https://github.com/almende/vis.git
```
- Install the dependencies of vis.js by running `npm install` in the root of the project:
```
$ cd vis
$ npm install
```
### Examples of custom builds
#### Example 1: Bundle only a single visualization type
For example, to create a bundle with just the Timeline and DataSet, create an index file named **custom.js** in the root of the project, containing:
```js
exports.DataSet = require('./lib/DataSet');
exports.Timeline = require('./lib/timeline/Timeline');
```
Then create a custom bundle using browserify, like:
$ browserify custom.js -t [ babelify --presets [es2015] ] -o dist/vis-custom.js -s vis
This will generate a custom bundle *vis-custom.js*, which exposes the namespace `vis` containing only `DataSet` and `Timeline`. The generated bundle can be minified using uglifyjs:
$ uglifyjs dist/vis-custom.js -o dist/vis-custom.min.js
The custom bundle can now be loaded like:
```html
<!DOCTYPE HTML>
<html>
<head>
<script src="dist/vis-custom.min.js"></script>
<link href="dist/vis.min.css" rel="stylesheet" type="text/css" />
</head>
<body>
...
</body>
</html>
```
#### Example 2: Exclude external libraries
The default bundle `vis.js` is standalone and includes external dependencies such as *hammer.js* and *moment.js*. When these libraries are already loaded by the application, vis.js does not need to include these dependencies itself too. To build a custom bundle of vis.js excluding *moment.js* and *hammer.js*, run browserify in the root of the project:
$ browserify index.js -t [ babelify --presets [es2015] ] -o dist/vis-custom.js -s vis -x moment -x hammerjs
This will generate a custom bundle *vis-custom.js*, which exposes the namespace `vis`, and has *moment.js* and *hammer.js* excluded. The generated bundle can be minified with uglifyjs:
$ uglifyjs dist/vis-custom.js -o dist/vis-custom.min.js
The custom bundle can now be loaded as:
```html
<!DOCTYPE HTML>
<html>
<head>
<!-- load external dependencies -->
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js"></script>
<!-- load vis.js -->
<script src="dist/vis-custom.min.js"></script>
<link href="dist/vis.min.css" rel="stylesheet" type="text/css" />
</head>
<body>
...
</body>
</html>
```
#### Example 3: Bundle vis.js as part of your (commonjs) application
When writing a web application with commonjs modules, vis.js can be packaged automatically into the application. Create a file **app.js** containing:
```js
var moment = require('moment');
var DataSet = require('vis/lib/DataSet');
var Timeline = require('vis/lib/timeline/Timeline');
var container = document.getElementById('visualization');
var data = new DataSet([
{id: 1, content: 'item 1', start: moment('2013-04-20')},
{id: 2, content: 'item 2', start: moment('2013-04-14')},
{id: 3, content: 'item 3', start: moment('2013-04-18')},
{id: 4, content: 'item 4', start: moment('2013-04-16'), end: moment('2013-04-19')},
{id: 5, content: 'item 5', start: moment('2013-04-25')},
{id: 6, content: 'item 6', start: moment('2013-04-27')}
]);
var options = {};
var timeline = new Timeline(container, data, options);
```
The application can be bundled and minified:
$ browserify app.js -o dist/app-bundle.js -t babelify
$ uglifyjs dist/app-bundle.js -o dist/app-bundle.min.js
And loaded into a webpage:
```html
<!DOCTYPE HTML>
<html>
<head>
<link href="node_modules/vis/dist/vis.min.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="visualization"></div>
<script src="dist/app-bundle.min.js"></script>
</body>
</html>
```
#### Example 4: Integrate vis.js components directly in your webpack build
You can integrate e.g. the timeline component directly in you webpack build.
Therefor you can e.g. import the component-files from root direcory (starting with "index-").
```js
import { DataSet, Timeline } from 'vis/index-timeline-graph2d';
var container = document.getElementById('visualization');
var data = new DataSet();
var timeline = new Timeline(container, data, {});
```
To get this to work you'll need to add some babel-loader-setting to your webpack-config:
```js
module: {
module: {
rules: [{
test: /node_modules[\\\/]vis[\\\/].*\.js$/,
loader: 'babel-loader',
query: {
cacheDirectory: true,
presets: [ "babel-preset-es2015" ].map(require.resolve),
plugins: [
"transform-es3-property-literals", // #2452
"transform-es3-member-expression-literals", // #2566
"transform-runtime" // #2566
]
}
}]
}
}
```
There is also an [demo-project](https://github.com/mojoaxel/vis-webpack-demo) showing the integration of vis.js using webpack.
## Test
To test the library, install the project dependencies once:
$ npm install
Then run the tests:
$ npm run test
## License
Copyright (C) 2010-2017 Almende B.V. and Contributors
Vis.js is dual licensed under both
* The Apache 2.0 License
http://www.apache.org/licenses/LICENSE-2.0
and
* The MIT License
http://opensource.org/licenses/MIT
Vis.js may be distributed under either license.

39
web/bower_components/vis/bower.json vendored Normal file
View File

@@ -0,0 +1,39 @@
{
"name": "vis",
"main": ["dist/vis.js", "dist/vis.css"],
"description": "A dynamic, browser-based visualization library.",
"homepage": "http://visjs.org/",
"license": ["Apache-2.0", "MIT"],
"repository": {
"type": "git",
"url": "git://github.com/almende/vis.git"
},
"keywords": [
"vis",
"visualization",
"web based",
"browser based",
"javascript",
"chart",
"linechart",
"timeline",
"graph",
"network",
"browser"
],
"ignore": [
"gulpfile.js",
"index*.js",
"misc",
"node_modules",
"package.json",
"test",
"tools",
"lib",
".idea",
".npmignore",
".gitignore"
],
"dependencies": {},
"devDependencies": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Some files were not shown because too many files have changed in this diff Show More