Merge pull request #365 from GursheenK/expected-progress-bars
feat: expected progress bars
This commit is contained in:
commit
4ba1566ceb
11
dist/frappe-gantt.css
vendored
11
dist/frappe-gantt.css
vendored
@ -39,7 +39,10 @@
|
||||
user-select: none;
|
||||
}
|
||||
.gantt .bar-progress {
|
||||
fill: #a3a3ff;
|
||||
fill: #acacfa;
|
||||
}
|
||||
.gantt .bar-expected-progress {
|
||||
fill: #c4c4e9;
|
||||
}
|
||||
.gantt .bar-invalid {
|
||||
fill: transparent;
|
||||
@ -76,7 +79,7 @@
|
||||
fill: #a9b5c1;
|
||||
}
|
||||
.gantt .bar-wrapper:hover .bar-progress {
|
||||
fill: #8a8aff;
|
||||
fill: #9494f9;
|
||||
}
|
||||
.gantt .bar-wrapper:hover .handle {
|
||||
visibility: visible;
|
||||
@ -86,7 +89,7 @@
|
||||
fill: #a9b5c1;
|
||||
}
|
||||
.gantt .bar-wrapper.active .bar-progress {
|
||||
fill: #8a8aff;
|
||||
fill: #9494f9;
|
||||
}
|
||||
.gantt .lower-text, .gantt .upper-text {
|
||||
font-size: 12px;
|
||||
@ -117,7 +120,7 @@
|
||||
border-radius: 3px;
|
||||
}
|
||||
.gantt-container .popup-wrapper .title {
|
||||
border-bottom: 3px solid #a3a3ff;
|
||||
border-bottom: 3px solid #acacfa;
|
||||
padding: 10px;
|
||||
}
|
||||
.gantt-container .popup-wrapper .subtitle {
|
||||
|
||||
65
dist/frappe-gantt.js
vendored
65
dist/frappe-gantt.js
vendored
@ -389,12 +389,10 @@ var Gantt = (function () {
|
||||
prepare_values() {
|
||||
this.invalid = this.task.invalid;
|
||||
this.height = this.gantt.options.bar_height;
|
||||
this.x = this.compute_x();
|
||||
this.y = this.compute_y();
|
||||
this.compute_x();
|
||||
this.compute_y();
|
||||
this.compute_duration();
|
||||
this.corner_radius = this.gantt.options.bar_corner_radius;
|
||||
this.duration =
|
||||
date_utils.diff(this.task._end, this.task._start, 'hour') /
|
||||
this.gantt.options.step;
|
||||
this.width = this.gantt.options.column_width * this.duration;
|
||||
this.progress_width =
|
||||
this.gantt.options.column_width *
|
||||
@ -432,8 +430,20 @@ var Gantt = (function () {
|
||||
};
|
||||
}
|
||||
|
||||
prepare_expected_progress_values() {
|
||||
this.compute_expected_progress();
|
||||
this.expected_progress_width =
|
||||
this.gantt.options.column_width *
|
||||
this.duration *
|
||||
(this.expected_progress / 100) || 0;
|
||||
}
|
||||
|
||||
draw() {
|
||||
this.draw_bar();
|
||||
if (this.gantt.options.show_expected_progress) {
|
||||
this.prepare_expected_progress_values();
|
||||
this.draw_expected_progress_bar();
|
||||
}
|
||||
this.draw_progress_bar();
|
||||
this.draw_label();
|
||||
this.draw_resize_handles();
|
||||
@ -458,6 +468,22 @@ var Gantt = (function () {
|
||||
}
|
||||
}
|
||||
|
||||
draw_expected_progress_bar() {
|
||||
if (this.invalid) return;
|
||||
this.$expected_bar_progress = createSVG('rect', {
|
||||
x: this.x,
|
||||
y: this.y,
|
||||
width: this.expected_progress_width,
|
||||
height: this.height,
|
||||
rx: this.corner_radius,
|
||||
ry: this.corner_radius,
|
||||
class: 'bar-expected-progress',
|
||||
append_to: this.bar_group,
|
||||
});
|
||||
|
||||
animateSVG(this.$expected_bar_progress, 'width', 0, this.expected_progress_width);
|
||||
}
|
||||
|
||||
draw_progress_bar() {
|
||||
if (this.invalid) return;
|
||||
this.$bar_progress = createSVG('rect', {
|
||||
@ -607,6 +633,11 @@ var Gantt = (function () {
|
||||
}
|
||||
this.update_label_position();
|
||||
this.update_handle_position();
|
||||
if (this.gantt.options.show_expected_progress){
|
||||
this.date_changed();
|
||||
this.compute_duration();
|
||||
this.update_expected_progressbar_position();
|
||||
}
|
||||
this.update_progressbar_position();
|
||||
this.update_arrow_position();
|
||||
}
|
||||
@ -669,6 +700,11 @@ var Gantt = (function () {
|
||||
return parseInt(progress, 10);
|
||||
}
|
||||
|
||||
compute_expected_progress() {
|
||||
this.expected_progress = date_utils.diff(date_utils.today(), this.task._start, 'hour') / this.gantt.options.step;
|
||||
this.expected_progress = ((this.expected_progress < this.duration) ? this.expected_progress : this.duration) * 100 / this.duration;
|
||||
}
|
||||
|
||||
compute_x() {
|
||||
const { step, column_width } = this.gantt.options;
|
||||
const task_start = this.task._start;
|
||||
@ -681,17 +717,22 @@ var Gantt = (function () {
|
||||
const diff = date_utils.diff(task_start, gantt_start, 'day');
|
||||
x = (diff * column_width) / 30;
|
||||
}
|
||||
return x;
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
compute_y() {
|
||||
return (
|
||||
this.y = (
|
||||
this.gantt.options.header_height +
|
||||
this.gantt.options.padding +
|
||||
this.task._index * (this.height + this.gantt.options.padding)
|
||||
);
|
||||
}
|
||||
|
||||
compute_duration() {
|
||||
this.duration = date_utils.diff(this.task._end, this.task._start, 'hour') /
|
||||
this.gantt.options.step;
|
||||
}
|
||||
|
||||
get_snap_position(dx) {
|
||||
let odx = dx,
|
||||
rem,
|
||||
@ -733,6 +774,16 @@ var Gantt = (function () {
|
||||
return element;
|
||||
}
|
||||
|
||||
update_expected_progressbar_position() {
|
||||
if (this.invalid) return;
|
||||
this.$expected_bar_progress.setAttribute('x', this.$bar.getX());
|
||||
this.compute_expected_progress();
|
||||
this.$expected_bar_progress.setAttribute(
|
||||
'width',
|
||||
this.gantt.options.column_width * this.duration * (this.expected_progress / 100) || 0
|
||||
);
|
||||
}
|
||||
|
||||
update_progressbar_position() {
|
||||
if (this.invalid) return;
|
||||
this.$bar_progress.setAttribute('x', this.$bar.getX());
|
||||
|
||||
2
dist/frappe-gantt.js.map
vendored
2
dist/frappe-gantt.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/frappe-gantt.min.css
vendored
2
dist/frappe-gantt.min.css
vendored
@ -1 +1 @@
|
||||
.gantt .grid-background{fill:none}.gantt .grid-header{fill:#fff;stroke:#e0e0e0;stroke-width:1.4}.gantt .grid-row{fill:#fff}.gantt .grid-row:nth-child(even){fill:#f5f5f5}.gantt .row-line{stroke:#ebeff2}.gantt .tick{stroke:#e0e0e0;stroke-width:.2}.gantt .tick.thick{stroke-width:.4}.gantt .today-highlight{fill:#fcf8e3;opacity:.5}.gantt .arrow{fill:none;stroke:#666;stroke-width:1.4}.gantt .bar{fill:#b8c2cc;stroke:#8d99a6;stroke-width:0;transition:stroke-width .3s ease;user-select:none}.gantt .bar-progress{fill:#a3a3ff}.gantt .bar-invalid{fill:rgba(0,0,0,0);stroke:#8d99a6;stroke-width:1;stroke-dasharray:5}.gantt .bar-invalid~.bar-label{fill:#555}.gantt .bar-label{fill:#fff;dominant-baseline:central;text-anchor:middle;font-size:12px;font-weight:lighter}.gantt .bar-label.big{fill:#555;text-anchor:start}.gantt .handle{fill:#ddd;cursor:ew-resize;opacity:0;visibility:hidden;transition:opacity .3s ease}.gantt .bar-wrapper{cursor:pointer;outline:none}.gantt .bar-wrapper:hover .bar{fill:#a9b5c1}.gantt .bar-wrapper:hover .bar-progress{fill:#8a8aff}.gantt .bar-wrapper:hover .handle{visibility:visible;opacity:1}.gantt .bar-wrapper.active .bar{fill:#a9b5c1}.gantt .bar-wrapper.active .bar-progress{fill:#8a8aff}.gantt .lower-text,.gantt .upper-text{font-size:12px;text-anchor:middle}.gantt .upper-text{fill:#555}.gantt .lower-text{fill:#333}.gantt .hide{display:none}.gantt-container{position:relative;overflow:auto;font-size:12px}.gantt-container .popup-wrapper{position:absolute;top:0;left:0;background:rgba(0,0,0,.8);padding:0;color:#959da5;border-radius:3px}.gantt-container .popup-wrapper .title{border-bottom:3px solid #a3a3ff;padding:10px}.gantt-container .popup-wrapper .subtitle{padding:10px;color:#dfe2e5}.gantt-container .popup-wrapper .pointer{position:absolute;height:5px;margin:0 0 0 -5px;border:5px solid rgba(0,0,0,0);border-top-color:rgba(0,0,0,.8)}
|
||||
.gantt .grid-background{fill:none}.gantt .grid-header{fill:#fff;stroke:#e0e0e0;stroke-width:1.4}.gantt .grid-row{fill:#fff}.gantt .grid-row:nth-child(even){fill:#f5f5f5}.gantt .row-line{stroke:#ebeff2}.gantt .tick{stroke:#e0e0e0;stroke-width:.2}.gantt .tick.thick{stroke-width:.4}.gantt .today-highlight{fill:#fcf8e3;opacity:.5}.gantt .arrow{fill:none;stroke:#666;stroke-width:1.4}.gantt .bar{fill:#b8c2cc;stroke:#8d99a6;stroke-width:0;transition:stroke-width .3s ease;user-select:none}.gantt .bar-progress{fill:#acacfa}.gantt .bar-expected-progress{fill:#c4c4e9}.gantt .bar-invalid{fill:rgba(0,0,0,0);stroke:#8d99a6;stroke-width:1;stroke-dasharray:5}.gantt .bar-invalid~.bar-label{fill:#555}.gantt .bar-label{fill:#fff;dominant-baseline:central;text-anchor:middle;font-size:12px;font-weight:lighter}.gantt .bar-label.big{fill:#555;text-anchor:start}.gantt .handle{fill:#ddd;cursor:ew-resize;opacity:0;visibility:hidden;transition:opacity .3s ease}.gantt .bar-wrapper{cursor:pointer;outline:none}.gantt .bar-wrapper:hover .bar{fill:#a9b5c1}.gantt .bar-wrapper:hover .bar-progress{fill:#9494f9}.gantt .bar-wrapper:hover .handle{visibility:visible;opacity:1}.gantt .bar-wrapper.active .bar{fill:#a9b5c1}.gantt .bar-wrapper.active .bar-progress{fill:#9494f9}.gantt .lower-text,.gantt .upper-text{font-size:12px;text-anchor:middle}.gantt .upper-text{fill:#555}.gantt .lower-text{fill:#333}.gantt .hide{display:none}.gantt-container{position:relative;overflow:auto;font-size:12px}.gantt-container .popup-wrapper{position:absolute;top:0;left:0;background:rgba(0,0,0,.8);padding:0;color:#959da5;border-radius:3px}.gantt-container .popup-wrapper .title{border-bottom:3px solid #acacfa;padding:10px}.gantt-container .popup-wrapper .subtitle{padding:10px;color:#dfe2e5}.gantt-container .popup-wrapper .pointer{position:absolute;height:5px;margin:0 0 0 -5px;border:5px solid rgba(0,0,0,0);border-top-color:rgba(0,0,0,.8)}
|
||||
2
dist/frappe-gantt.min.js
vendored
2
dist/frappe-gantt.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/frappe-gantt.min.js.map
vendored
2
dist/frappe-gantt.min.js.map
vendored
File diff suppressed because one or more lines are too long
65
src/bar.js
65
src/bar.js
@ -23,12 +23,10 @@ export default class Bar {
|
||||
prepare_values() {
|
||||
this.invalid = this.task.invalid;
|
||||
this.height = this.gantt.options.bar_height;
|
||||
this.x = this.compute_x();
|
||||
this.y = this.compute_y();
|
||||
this.compute_x();
|
||||
this.compute_y();
|
||||
this.compute_duration();
|
||||
this.corner_radius = this.gantt.options.bar_corner_radius;
|
||||
this.duration =
|
||||
date_utils.diff(this.task._end, this.task._start, 'hour') /
|
||||
this.gantt.options.step;
|
||||
this.width = this.gantt.options.column_width * this.duration;
|
||||
this.progress_width =
|
||||
this.gantt.options.column_width *
|
||||
@ -66,8 +64,20 @@ export default class Bar {
|
||||
};
|
||||
}
|
||||
|
||||
prepare_expected_progress_values() {
|
||||
this.compute_expected_progress();
|
||||
this.expected_progress_width =
|
||||
this.gantt.options.column_width *
|
||||
this.duration *
|
||||
(this.expected_progress / 100) || 0;
|
||||
}
|
||||
|
||||
draw() {
|
||||
this.draw_bar();
|
||||
if (this.gantt.options.show_expected_progress) {
|
||||
this.prepare_expected_progress_values();
|
||||
this.draw_expected_progress_bar();
|
||||
}
|
||||
this.draw_progress_bar();
|
||||
this.draw_label();
|
||||
this.draw_resize_handles();
|
||||
@ -92,6 +102,22 @@ export default class Bar {
|
||||
}
|
||||
}
|
||||
|
||||
draw_expected_progress_bar() {
|
||||
if (this.invalid) return;
|
||||
this.$expected_bar_progress = createSVG('rect', {
|
||||
x: this.x,
|
||||
y: this.y,
|
||||
width: this.expected_progress_width,
|
||||
height: this.height,
|
||||
rx: this.corner_radius,
|
||||
ry: this.corner_radius,
|
||||
class: 'bar-expected-progress',
|
||||
append_to: this.bar_group,
|
||||
});
|
||||
|
||||
animateSVG(this.$expected_bar_progress, 'width', 0, this.expected_progress_width);
|
||||
}
|
||||
|
||||
draw_progress_bar() {
|
||||
if (this.invalid) return;
|
||||
this.$bar_progress = createSVG('rect', {
|
||||
@ -241,6 +267,11 @@ export default class Bar {
|
||||
}
|
||||
this.update_label_position();
|
||||
this.update_handle_position();
|
||||
if (this.gantt.options.show_expected_progress){
|
||||
this.date_changed();
|
||||
this.compute_duration();
|
||||
this.update_expected_progressbar_position();
|
||||
}
|
||||
this.update_progressbar_position();
|
||||
this.update_arrow_position();
|
||||
}
|
||||
@ -303,6 +334,11 @@ export default class Bar {
|
||||
return parseInt(progress, 10);
|
||||
}
|
||||
|
||||
compute_expected_progress() {
|
||||
this.expected_progress = date_utils.diff(date_utils.today(), this.task._start, 'hour') / this.gantt.options.step;
|
||||
this.expected_progress = ((this.expected_progress < this.duration) ? this.expected_progress : this.duration) * 100 / this.duration;
|
||||
}
|
||||
|
||||
compute_x() {
|
||||
const { step, column_width } = this.gantt.options;
|
||||
const task_start = this.task._start;
|
||||
@ -315,17 +351,22 @@ export default class Bar {
|
||||
const diff = date_utils.diff(task_start, gantt_start, 'day');
|
||||
x = (diff * column_width) / 30;
|
||||
}
|
||||
return x;
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
compute_y() {
|
||||
return (
|
||||
this.y = (
|
||||
this.gantt.options.header_height +
|
||||
this.gantt.options.padding +
|
||||
this.task._index * (this.height + this.gantt.options.padding)
|
||||
);
|
||||
}
|
||||
|
||||
compute_duration() {
|
||||
this.duration = date_utils.diff(this.task._end, this.task._start, 'hour') /
|
||||
this.gantt.options.step;
|
||||
}
|
||||
|
||||
get_snap_position(dx) {
|
||||
let odx = dx,
|
||||
rem,
|
||||
@ -367,6 +408,16 @@ export default class Bar {
|
||||
return element;
|
||||
}
|
||||
|
||||
update_expected_progressbar_position() {
|
||||
if (this.invalid) return;
|
||||
this.$expected_bar_progress.setAttribute('x', this.$bar.getX());
|
||||
this.compute_expected_progress();
|
||||
this.$expected_bar_progress.setAttribute(
|
||||
'width',
|
||||
this.gantt.options.column_width * this.duration * (this.expected_progress / 100) || 0
|
||||
);
|
||||
}
|
||||
|
||||
update_progressbar_position() {
|
||||
if (this.invalid) return;
|
||||
this.$bar_progress.setAttribute('x', this.$bar.getX());
|
||||
|
||||
@ -7,8 +7,9 @@ $light-yellow: #fcf8e3 !default;
|
||||
$text-muted: #666 !default;
|
||||
$text-light: #555 !default;
|
||||
$text-color: #333 !default;
|
||||
$blue: #a3a3ff !default;
|
||||
$blue: #acacfa !default;
|
||||
$handle-color: #ddd !default;
|
||||
$light-blue: #c4c4e9 !default;
|
||||
|
||||
.gantt {
|
||||
.grid-background {
|
||||
@ -71,6 +72,9 @@ $handle-color: #ddd !default;
|
||||
.bar-progress {
|
||||
fill: $blue;
|
||||
}
|
||||
.bar-expected-progress {
|
||||
fill: $light-blue;
|
||||
}
|
||||
.bar-invalid {
|
||||
fill: transparent;
|
||||
stroke: $bar-stroke;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user