Update jsGant lib to 2.7.3

This commit is contained in:
Laurent Destailleur 2020-12-15 03:55:46 +01:00
parent d3ba87b09a
commit 506659a9d2
16 changed files with 6115 additions and 4216 deletions

View File

@ -52,7 +52,7 @@ jQuery jqueryFileTree 1.0.1 GPL and MIT License Yes
jQuery jquerytreeview 1.4.1 MIT License Yes JS library for filetree
jQuery TableDnD 0.6 GPL and MIT License Yes JS library plugin TableDnD (to reorder table rows)
jQuery Timepicker 1.1.0 GPL and MIT License Yes JS library Timepicker addon for Datepicker
jsGanttImproved 1.7.5.4 BSD License Yes JS library (to build Gantt reports)
jsGanttImproved 2.7.3 BSD License Yes JS library (to build Gantt reports)
JsTimezoneDetect 1.0.6 MIT License Yes JS library to detect user timezone
SwaggerUI 2.0.24 GPL-2+ Yes JS library to offer the REST API explorer

View File

@ -177,4 +177,4 @@ You can find out more detailed information about contributing in the [Documentat
[github]: https://github.com/jsGanttImproved/jsgantt-improved
[js-style-guide]: https://google.github.io/styleguide/jsguide.html
[closing-issues]: https://help.github.com/articles/closing-issues-via-commit-messages/
[docs]: https://github.com/jsGanttImproved/jsgantt-improved/wiki/Documentation
[docs]: https://github.com/jsGanttImproved/jsgantt-improved/wiki/Documentation

View File

@ -1,5 +1,4 @@
* Copyright (c) 2013-2017, Paul Geldart, Eduardo Rodrigues and Ricardo Cardoso.
* All rights reserved.
* Copyright (c) 2013-2018, Paul Geldart, Eduardo Rodrigues and Ricardo Cardoso.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@ -26,7 +25,6 @@
This project is based on jsGantt 1.2, the original project license follows:
* Copyright (c) 2008, Shlomy Gantz/BlueBrick Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
@ -48,4 +46,4 @@ This project is based on jsGantt 1.2, the original project license follows:
* 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.
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,21 +1,151 @@
A fully featured gantt chart component built entirely in Javascript, CSS and AJAX. It is lightweight and there is no need of external libraries or additional images.
[![Build Status](https://travis-ci.com/jsGanttImproved/jsgantt-improved.svg?branch=master)](https://travis-ci.com/jsGanttImproved/jsgantt-improved)
You can view a live example at https://jsGanttImproved.github.io/jsgantt-improved
Features include:
A fully featured gantt chart component built entirely in Javascript, CSS and AJAX. It is lightweight and there is no need of external libraries or additional images.
![Demo Image](/docs/demo.gif)
Start using with including the files `jsgantt.js` and `jsgantt.css` that are inside `docs/` folder.
Or install and use in JS
`npm install jsgantt-improved`
Import in your JS `import {JSGantt} from 'jsgantt-improved';`
See the [FULL DOCUMENTATION](./Documentation.md) for more details in all features.
For **Angular** use the component [ng-gantt](https://github.com/jsGanttImproved/ng-gantt)
For **React** use the component [react-jsgantt](https://github.com/jsGanttImproved/react-jsgantt)
For **Vue** , see this example: https://stackblitz.com/edit/vue-jsgantt
For **.NET** , see this example: [.NET Documentation](./docs/DotNet.md)
## Example
You can view a Solo live example at:
* https://jsganttimproved.github.io/jsgantt-improved/docs/demo.html
Or use a live coding example at Codenpen:
* https://codepen.io/mariomol/pen/mQzBPV
## Easy to Use
```html
<link href="jsgantt.css" rel="stylesheet" type="text/css"/>
<script src="jsgantt.js" type="text/javascript"></script>
<div style="position:relative" class="gantt" id="GanttChartDIV"></div>
<script>
var g = new JSGantt.GanttChart(document.getElementById('GanttChartDIV'), 'day');
g.setOptions({
vCaptionType: 'Complete', // Set to Show Caption : None,Caption,Resource,Duration,Complete,
vQuarterColWidth: 36,
vDateTaskDisplayFormat: 'day dd month yyyy', // Shown in tool tip box
vDayMajorDateDisplayFormat: 'mon yyyy - Week ww',// Set format to dates in the "Major" header of the "Day" view
vWeekMinorDateDisplayFormat: 'dd mon', // Set format to display dates in the "Minor" header of the "Week" view
vLang: 'en',
vShowTaskInfoLink: 1, // Show link in tool tip (0/1)
vShowEndWeekDate: 0, // Show/Hide the date for the last day of the week in header for daily
vAdditionalHeaders: { // Add data columns to your table
category: {
title: 'Category'
},
sector: {
title: 'Sector'
}
},
vUseSingleCell: 10000, // Set the threshold cell per table row (Helps performance for large data.
vFormatArr: ['Day', 'Week', 'Month', 'Quarter'], // Even with setUseSingleCell using Hour format on such a large chart can cause issues in some browsers,
});
// Load from a Json url
JSGantt.parseJSON('./fixes/data.json', g);
// Or Adding Manually
g.AddTaskItemObject({
pID: 1,
pName: "Define Chart <strong>API</strong>",
pStart: "2017-02-25",
pEnd: "2017-03-17",
pPlanStart: "2017-04-01",
pPlanEnd: "2017-04-15 12:00",
pClass: "ggroupblack",
pLink: "",
pMile: 0,
pRes: "Brian",
pComp: 0,
pGroup: 0,
pParent: 0,
pOpen: 1,
pDepend: "",
pCaption: "",
pCost: 1000,
pNotes: "Some Notes text",
category: "My Category",
sector: "Finance"
});
g.Draw();
</script>
```
## Features
* Tasks & Collapsible Task Groups
* Dependencies
* Dependencies and Highlight when hover a task
* Edit data in gantt table with list of responsible
* Task Completion
* Task Styling
* Table with Additional Columns
* Task Styling or as HTML tags
* Milestones
* Resources
* Costs
* Plan Start and End Dates
* Gantt with Planned vs Executed
* Dynamic Loading of Tasks
* Dynamic change of format: Hour, Day, Week, Month, Quarter
* Load Gantt from XML
* Load Gantt from JSON and XML
* From external files (including experimental support for MS Project XML files)
* From JavaScript Strings
* Support for Internationalization (all hard coded strings can be overridden)
* Support for Internationalization
Project forked as I was unable to contact the original maintainers. This work was done to support a personal project that didn't warrant a more heavyweight system (e.g. the dojo toolkit gantt chart features).
## Documentation
See the [Documentation](./Documentation.md) wiki page or the included ``docs/index.html`` file for instructions on use.
Project based on https://code.google.com/p/jsgantt/.
## Want to Collaborate?
Its easy to get it set:
* Clone this repo
* Install lib dependencies: `npm i`
* Install global dependencies: `npm i -g browserify nodemon onchange`
* Run the demo, This will start a `localhost:8080` with a live example: `npm start`.
* Use `npm run watch` or do your change in `src` and restart this command refresh the changes.
For testing use `npm run test` with e2e tests.
Or help us donating...
[![](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=S7B43P63C5QEN)
See the [Documentation](https://github.com/jsGanttImproved/jsgantt-improved/wiki/Documentation) wiki page or the included ``index.html`` file for instructions on use.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,126 +0,0 @@
body {
position: relative;
}
.product-name {
font-family: Satisfy;
}
#my-navbar-nav {
font-size: 16px;
}
#my-nav-brand {
font-size: 24px;
margin: 2px 40px 0 10px;
color: #ffffff;
}
#home {
background: #323232 url(home-bg.jpg) center 0 no-repeat;
background-attachment: fixed;
background-size: cover;
min-height: 660px;
color: #ffffff;
}
#home-title {
font-size: 70px;
margin-top: 180px;
}
#home-subtitle {
font-size: 36px;
margin-top: 40px;
margin-bottom: 50px;
}
#learn-more {
padding: 0;
width: 50px;
height: 50px;
border-radius: 50%;
font-size: 38px;
margin-top: 60px;
}
@media screen and (max-width: 991px) {
#learn-more {
display: none;
}
}
.section {
margin: 0 15vw;
padding: 5px 0 0;
}
h1 {
font-family: Kelly Slab;
font-size: 56px;
margin: 50px 0 20px;
}
h2 {
font-family: Kelly Slab;
margin: 20px 0 10px;
}
h3 {
font-family: Kelly Slab;
}
#embedded-Gantt, #external-Gantt {
}
.code-block {
background-color: #222222;
}
.contact-card {
max-width: 200px;
margin: auto;
}
.contact-link {
font-size: 28px;
}
.footer {
margin-top: 10px;
padding-top: 10px;
border-top: solid #bbbbbb 1px;
}
#slide-card {
background: transparent;
border: none;
margin: 180px 50px 50px;
}
#slide-dots {
background: transparent;
border: none;
}
.dot {
cursor:pointer;
height: 13px;
width: 13px;
margin: 0 2px;
background-color: #ffffff;
opacity: 0.3;
border-radius: 50%;
display: inline-block;
-webkit-transition: all .5s; /* Safari */
transition: all .5s;
}
.dot:hover {
opacity: 1;
}
.dot.active {
opacity: 1;
}
.slide {
width: 100%;
height: 150px;
font-size: 20px;
display: none;
opacity: 0;
}
.slide-icon {
font-size: 60px;
}

View File

@ -1,85 +0,0 @@
$(document).ready(function() {
// Scrollspy changes navbar active links
$("body").scrollspy({target:"#my-navbar-nav", offset:50});
// Smooth scroll
$("a").click(function(event) {
if (this.hash !== "") {
event.preventDefault();
var linkOffset = 0;
if ($.inArray(this.hash,["#options","#xmlExport","#optionsLanguage","#setDayMajorDateDisplayFormat"]) != -1) {
linkOffset = -25;
}
$("html, body").animate({
scrollTop: $(this.hash).offset().top - $(".navbar").height() + linkOffset
}, 600);
}
});
// Demo buttons
$("#embedded-Gantt").hide(0);
$("#external-Gantt").hide(0);
$(".btn-demo").click(function() {
if ($(this).html().indexOf("Embedded Code") != -1) {
if ($("#external-Gantt").is(":visible")) {
$("#external-Gantt").animate({
height: "toggle",
opacity: "toggle"}, 300, function () {
$("#embedded-Gantt").animate({
height: "toggle",
opacity: "toggle"}, 600
);
}
);
$(".btn-demo:nth-child(2)").removeClass("active");
} else {
$("#embedded-Gantt").animate({
height: "toggle",
opacity: "toggle"}, 600
);
}
} else {
if ($("#embedded-Gantt").is(":visible")) {
$("#embedded-Gantt").animate({
height: "toggle",
opacity: "toggle"}, 300, function() {
$("#external-Gantt").animate({
height: "toggle",
opacity: "toggle"}, 600
);
}
);
$(".btn-demo:nth-child(1)").removeClass("active");
} else {
$("#external-Gantt").animate({
height: "toggle",
opacity: "toggle"}, 600
);
}
}
});
// Slideshow
var slideIndex = 0;
carousel();
function carousel() {
var i;
var x = document.getElementsByClassName("slide");
var d = document.getElementsByClassName("dot");
for (i = 0; i < x.length; i++) {
x[i].style.display = "none";
}
slideIndex++;
if (slideIndex > x.length) {slideIndex = 1}
x[slideIndex-1].style.display = "inline-block";
$(".slide:nth-child(" + (slideIndex).toString() + ")").animate({
opacity: 1
}, 500);
$(".dot").removeClass("active");
$(".dot:nth-child(" + (slideIndex).toString() + ")").addClass("active");
setTimeout(carousel, 2000); // Change image every 2 seconds
}
});

View File

@ -1,131 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<task>
<pID>10</pID>
<pName>WCF Changes</pName>
<pStart></pStart>
<pEnd></pEnd>
<pClass>ggroupblack</pClass>
<pLink></pLink>
<pMile>0</pMile>
<pRes></pRes>
<pComp>0</pComp>
<pGroup>1</pGroup>
<pParent>0</pParent>
<pOpen>1</pOpen>
<pDepend />
</task>
<task>
<pID>20</pID>
<pName>Move to WCF from remoting</pName>
<pStart>2017-05-11 09:00</pStart>
<pEnd>2017-05-15</pEnd>
<pClass>gtaskblue</pClass>
<pLink></pLink>
<pMile>0</pMile>
<pRes>Paul</pRes>
<pComp>10</pComp>
<pGroup>0</pGroup>
<pParent>10</pParent>
<pOpen>1</pOpen>
<pDepend></pDepend>
<pCaption>Paul</pCaption>
<pNotes>This text is only available in tool tips</pNotes>
</task>
<task>
<pID>30</pID>
<pName>add Auditing</pName>
<pStart>2017-05-18 10:30</pStart>
<pEnd>2017-05-20 12:00</pEnd>
<pClass>gtaskblue</pClass>
<pLink></pLink>
<pMile>0</pMile>
<pRes>Eduardo</pRes>
<pComp>50</pComp>
<pGroup>0</pGroup>
<pParent>10</pParent>
<pOpen>1</pOpen>
<pDepend>20</pDepend>
<pCaption>Eduardo</pCaption>
</task>
<task>
<pID>40</pID>
<pName>Yet another task</pName>
<pStart>2017-05-24</pStart>
<pEnd>2017-05-25</pEnd>
<pClass>gtaskblue</pClass>
<pLink></pLink>
<pMile>0</pMile>
<pRes>Ricardo</pRes>
<pComp>30</pComp>
<pGroup>0</pGroup>
<pParent>0</pParent>
<pOpen>1</pOpen>
<pDepend>20,30</pDepend>
<pCaption>Ricardo</pCaption>
</task>
<task>
<pID>50</pID>
<pName>Another Group</pName>
<pStart></pStart>
<pEnd></pEnd>
<pClass>ggroupblack</pClass>
<pLink></pLink>
<pMile>0</pMile>
<pRes></pRes>
<pComp>0</pComp>
<pGroup>1</pGroup>
<pParent>0</pParent>
<pOpen>1</pOpen>
<pDepend />
</task>
<task>
<pID>60</pID>
<pName>Move to GitHub</pName>
<pStart>2017-05-14 09:00</pStart>
<pEnd>2017-05-16</pEnd>
<pClass>gtaskblue</pClass>
<pLink></pLink>
<pMile>0</pMile>
<pRes>Ricardo</pRes>
<pComp>10</pComp>
<pGroup>0</pGroup>
<pParent>50</pParent>
<pOpen>1</pOpen>
<pDepend></pDepend>
<pCaption>Ricardo</pCaption>
<pNotes>This text is only available in tool tips</pNotes>
</task>
<task>
<pID>70</pID>
<pName>Updating files</pName>
<pStart>2017-05-18 10:30</pStart>
<pEnd>2017-05-21 12:00</pEnd>
<pClass>gtaskred</pClass>
<pLink></pLink>
<pMile>0</pMile>
<pRes>Paul</pRes>
<pComp>50</pComp>
<pGroup>0</pGroup>
<pParent>50</pParent>
<pOpen>1</pOpen>
<pDepend>60</pDepend>
<pCaption>Paul</pCaption>
</task>
<task>
<pID>80</pID>
<pName>Yet another task</pName>
<pStart>2017-05-23</pStart>
<pEnd>2017-05-25</pEnd>
<pClass>gtaskyellow</pClass>
<pLink></pLink>
<pMile>0</pMile>
<pRes>Eduardo</pRes>
<pComp>30</pComp>
<pGroup>0</pGroup>
<pParent>50</pParent>
<pOpen>1</pOpen>
<pDepend>60,70</pDepend>
<pCaption>Eduardo</pCaption>
</task>
</project>

View File

@ -126,9 +126,14 @@ if (g.getDivId() != null)
$projecttmp = new Project($db);
$projecttmp->fetch($t['task_project_id']);
$tmpt = array(
'task_id'=> '-'.$t['task_project_id'], 'task_alternate_id'=> '-'.$t['task_project_id'], 'task_name'=>$projecttmp->ref.' '.$projecttmp->title, 'task_resources'=>'',
'task_start_date'=>'', 'task_end_date'=>'',
'task_is_group'=>1, 'task_position'=>0, 'task_css'=>'ggroupblack', 'task_milestone'=> 0, 'task_parent'=>0, 'task_parent_alternate_id'=>0, 'task_notes'=>'',
'task_id'=> '-'.$t['task_project_id'],
'task_alternate_id'=> '-'.$t['task_project_id'],
'task_name'=>$projecttmp->ref.' '.$projecttmp->title,
'task_resources'=>'',
'task_start_date'=>'',
'task_end_date'=>'',
'task_is_group'=>1, 'task_position'=>0, 'task_css'=>'ggroupblack', 'task_milestone'=> 0, 'task_parent'=>0, 'task_parent_alternate_id'=>0,
'task_notes'=>'',
'task_planned_workload'=>0
);
constructGanttLine($tasks, $tmpt, array(), 0, $t['task_project_id']);
@ -180,6 +185,7 @@ function constructGanttLine($tarr, $task, $task_dependencies, $level = 0, $proje
$end_date = dol_print_date($end_date, $dateformatinput2);
// Resources
$resources = $task["task_resources"];
// Define depend (ex: "", "4,13", ...)
$depend = '';
$count = 0;

View File

@ -334,10 +334,11 @@ if (count($tasksarray) > 0)
}
}
}
//if ($s) $tasks[$taskcursor]['task_resources']='<a href="'.DOL_URL_ROOT.'/projet/tasks/contact.php?id='.$val->id.'&withproject=1" title="'.dol_escape_htmltag($s).'">'.$langs->trans("List").'</a>';
/* For JSGanttImproved */
//if ($s) $tasks[$taskcursor]['task_resources']=implode(',',$idofusers);
$tasks[$taskcursor]['task_resources'] = $s;
if ($s) $tasks[$taskcursor]['task_resources'] = '<a href="'.DOL_URL_ROOT.'/projet/tasks/contact.php?id='.$val->id.'&withproject=1" title="'.dol_escape_htmltag($s).'">'.$langs->trans("List").'</a>';
//print "xxx".$val->id.$tasks[$taskcursor]['task_resources'];
$tasks[$taskcursor]['note'] = $task->note_public;
$taskcursor++;

View File

@ -5095,10 +5095,15 @@ td.gminorheading {
.glistlbl, .glistgrid {
width: 582px !important;
}
.gtaskname div, .gtaskname {
/*.gtaskname div, .gtaskname {
min-width: 250px !important;
max-width: 250px !important;
width: 250px !important;
}*/
.gtaskname div, .gtaskname {
min-width: 250px !important;
max-width: unset !important;
width: unset !important;
}
.gpccomplete div, .gpccomplete {
min-width: 40px !important;
@ -5108,7 +5113,12 @@ td.gminorheading {
td.gtaskheading.gstartdate, td.gtaskheading.genddate {
white-space: break-spaces;
}
.gtasktableh tr:nth-child(2) td:nth-child(2), .gtasktableh tr:nth-child(2) td:nth-child(3), .gtasktableh tr:nth-child(2) td:nth-child(4), .gtasktableh tr:nth-child(2) td:nth-child(5), .gtasktableh tr:nth-child(2) td:nth-child(6), .gtasktableh tr:nth-child(2) td:nth-child(7) {
color: transparent !important;
border-left: none;
border-right: none;
border-top: none;
}
/* ============================================================================== */
/* jFileTree */

View File

@ -359,12 +359,41 @@ div.pagination .btnTitle:hover .btnTitle-label{
display: block;
}
/* rule to reduce top menu - 2nd reduction: Reduce width of top menu icons again */
@media only screen and (max-width: <?php echo empty($conf->global->THEME_ELDY_WITDHOFFSET_FOR_REDUC2) ? round($nbtopmenuentries * 69, 0) + 130 : $conf->global->THEME_ELDY_WITDHOFFSET_FOR_REDUC2; ?>px) /* reduction 2 */
{
.butAction, .butActionRefused, .butActionDelete {
font-size: 0.95em;
}
.btnTitle, a.btnTitle {
display: inline-block;
padding: 4px 4px 4px 4px;
min-width: unset;
}
}
<?php if (!empty($conf->global->MAIN_BUTTON_HIDE_UNAUTHORIZED) && (!$user->admin)) { ?>
.butActionRefused, .butActionNewRefused, .btnTitle.refused {
display: none !important;
}
<?php }
<?php } ?>
/*
* BTN LINK
*/
.btn-link{
margin-right: 5px;
border: 1px solid #ddd;
color: #333;
padding: 5px 10px;
border-radius:1em;
text-decoration: none !important;
}
.btn-link:hover{
background-color: #ddd;
border: 1px solid #ddd;
}

View File

@ -549,8 +549,8 @@ input.removedfile {
}
input[type=file ] { background-color: transparent; border-top: none; border-left: none; border-right: none; box-shadow: none; }
input[type=checkbox] { background-color: transparent; border: none; box-shadow: none; }
input[type=radio] { background-color: transparent; border: none; box-shadow: none; }
input[type=checkbox] { background-color: transparent; border: none; box-shadow: none; vertical-align: middle; }
input[type=radio] { background-color: transparent; border: none; box-shadow: none; vertical-align: middle; }
input[type=image] { background-color: transparent; border: none; box-shadow: none; }
input:-webkit-autofill {
background-color: #FBFFEA !important;
@ -1899,6 +1899,11 @@ img.photoref, div.photoref {
width: 80px;
object-fit: contain;
}
div.photoref .fa, div.photoref .fas, div.photoref .far {
font-size: 2.5em;
}
img.fitcontain {
object-fit: contain;
}
@ -4071,7 +4076,6 @@ div.titre {
padding-bottom: 5px;
text-transform: uppercase;
/* text-shadow: 1px 1px 2px #FFFFFF; */
<?php print (empty($conf->dol_optimize_smallscreen) ? '' : 'margin-top: 4px;'); ?>
}
div.titre {
color: var(--colortexttitlenotab);
@ -5000,6 +5004,12 @@ td.gminorheading {
td.gtaskheading.gstartdate, td.gtaskheading.genddate {
white-space: break-spaces;
}
.gtasktableh tr:nth-child(2) td:nth-child(2), .gtasktableh tr:nth-child(2) td:nth-child(3), .gtasktableh tr:nth-child(2) td:nth-child(4), .gtasktableh tr:nth-child(2) td:nth-child(5), .gtasktableh tr:nth-child(2) td:nth-child(6), .gtasktableh tr:nth-child(2) td:nth-child(7) {
color: transparent !important;
border-left: none;
border-right: none;
border-top: none;
}
/* ============================================================================== */
@ -6484,12 +6494,10 @@ div.phpdebugbar-widgets-templates a.phpdebugbar-widgets-editor-link:before
padding-right: 5px;
}
img.photoref, div.photoref {
border: none;
border: 1px solid rgba(0, 0, 0, 0.2);
-webkit-box-shadow: none;
box-shadow: none;
padding: 4px;
height: 20px;
width: 20px;
object-fit: contain;
}