From c5caff7ef79f1440ff26c84eed2dbc8254122f36 Mon Sep 17 00:00:00 2001 From: Frederic Guillot Date: Sat, 11 Feb 2017 19:42:17 -0500 Subject: [PATCH] Fix CFD chart (stack wrongly ordered) --- ChangeLog | 1 + app/Controller/AnalyticController.php | 15 ++++++----- assets/js/app.min.js | 2 +- .../js/components/chart-project-burndown.js | 21 +++++++-------- .../chart-project-cumulative-flow.js | 25 ++++++++++-------- doc/en_US/analytics.markdown | 8 +++--- doc/fr_FR/analytics-tasks.markdown | 8 +++--- doc/fr_FR/analytics.markdown | 19 ++++++------- doc/screenshots/cfd.png | Bin 33143 -> 14463 bytes 9 files changed, 53 insertions(+), 46 deletions(-) diff --git a/ChangeLog b/ChangeLog index d267ea8ed..7cc3ce8d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22,6 +22,7 @@ Bug fixes: * Search with multiple expressions with double quotes was not working * Fix broken subtask restriction per user +* Fix CFD chart (stack wrongly ordered) Version 1.0.38 (Jan 28, 2017) ----------------------------- diff --git a/app/Controller/AnalyticController.php b/app/Controller/AnalyticController.php index 38169fd7e..a30041b2c 100644 --- a/app/Controller/AnalyticController.php +++ b/app/Controller/AnalyticController.php @@ -143,17 +143,18 @@ class AnalyticController extends BaseController $project = $this->getProject(); list($from, $to) = $this->getDates(); - $display_graph = $this->projectDailyColumnStatsModel->countDays($project['id'], $from, $to) >= 2; + $displayGraph = $this->projectDailyColumnStatsModel->countDays($project['id'], $from, $to) >= 2; + $metrics = $displayGraph ? $this->projectDailyColumnStatsModel->getAggregatedMetrics($project['id'], $from, $to, $column) : array(); $this->response->html($this->helper->layout->analytic($template, array( - 'values' => array( + 'values' => array( 'from' => $from, - 'to' => $to, + 'to' => $to, ), - 'display_graph' => $display_graph, - 'metrics' => $display_graph ? $this->projectDailyColumnStatsModel->getAggregatedMetrics($project['id'], $from, $to, $column) : array(), - 'project' => $project, - 'title' => $title, + 'display_graph' => $displayGraph, + 'metrics' => $metrics, + 'project' => $project, + 'title' => $title, ))); } diff --git a/assets/js/app.min.js b/assets/js/app.min.js index 0eb6189ee..9c65d7737 100644 --- a/assets/js/app.min.js +++ b/assets/js/app.min.js @@ -1,3 +1,3 @@ -!function(){function t(t,a,i){if(!n)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var r=i&&i.debug||!1;if(r){var d=document.querySelector("#input-textarea-caret-position-mirror-div");d&&d.parentNode.removeChild(d)}var s=document.createElement("div");s.id="input-textarea-caret-position-mirror-div",document.body.appendChild(s);var l=s.style,c=window.getComputedStyle?getComputedStyle(t):t.currentStyle;l.whiteSpace="pre-wrap","INPUT"!==t.nodeName&&(l.wordWrap="break-word"),l.position="absolute",r||(l.visibility="hidden"),e.forEach(function(t){l[t]=c[t]}),o?t.scrollHeight>parseInt(c.height)&&(l.overflowY="scroll"):l.overflow="hidden",s.textContent=t.value.substring(0,a),"INPUT"===t.nodeName&&(s.textContent=s.textContent.replace(/\s/g," "));var u=document.createElement("span");u.textContent=t.value.substring(a)||".",s.appendChild(u);var p={top:u.offsetTop+parseInt(c.borderTopWidth),left:u.offsetLeft+parseInt(c.borderLeftWidth)};return r?u.style.backgroundColor="#aaa":document.body.removeChild(s),p}var e=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],n="undefined"!=typeof window,o=n&&null!=window.mozInnerScreenX;"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=t:n&&(window.getCaretCoordinates=t)}(),function(){function t(){if(!("KeyboardEvent"in window)||"key"in KeyboardEvent.prototype)return!1;var t={get:function(t){var e=n.keys[this.which||this.keyCode];return Array.isArray(e)&&(e=e[+this.shiftKey]),e}};return Object.defineProperty(KeyboardEvent.prototype,"key",t),t}var e,n={polyfill:t,keys:{3:"Cancel",6:"Help",8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",28:"Convert",29:"NonConvert",30:"Accept",31:"ModeChange",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",41:"Select",42:"Print",43:"Execute",44:"PrintScreen",45:"Insert",46:"Delete",48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],91:"OS",93:"ContextMenu",144:"NumLock",145:"ScrollLock",181:"VolumeMute",182:"VolumeDown",183:"VolumeUp",186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"'],224:"Meta",225:"AltGraph",246:"Attn",247:"CrSel",248:"ExSel",249:"EraseEof",250:"Play",251:"ZoomOut"}};for(e=1;e<25;e++)n.keys[111+e]="F"+e;var o="";for(e=65;e<91;e++)o=String.fromCharCode(e),n.keys[e]=[o.toLowerCase(),o.toUpperCase()];n.polyfill()}(),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(t){for(var e=(this.document||this.ownerDocument).querySelectorAll(t),n=e.length;--n>=0&&e.item(n)!==this;);return n>-1});var KB={components:{},utils:{},html:{},http:{},listeners:{clicks:{},changes:{},keys:[],internals:{}}};KB.on=function(t,e){this.listeners.internals.hasOwnProperty(t)||(this.listeners.internals[t]=[]),this.listeners.internals[t].push(e)},KB.trigger=function(t,e){if(this.listeners.internals.hasOwnProperty(t))for(var n=0;n0){for(var i=!0,r=0;r-1)window.location=e.split("#")[0];else if(e)window.location=e;else if(n)window.location=n;else if("application/json"===t.getResponseHeader("Content-Type"))try{return JSON.parse(t.responseText)}catch(t){}return t.responseText}var i=function(){},r=function(){};this.execute=function(){var d=new XMLHttpRequest;d.open(t,e,!0),d.setRequestHeader("X-Requested-With","XMLHttpRequest");for(var s in n)n.hasOwnProperty(s)&&d.setRequestHeader(s,n[s]);return d.onerror=function(){r()},d.onreadystatechange=function(){if(d.readyState===XMLHttpRequest.DONE){var t=a(d);200===d.status?i(t):r(t)}},d.send(o),this},this.success=function(t){return i=t,this},this.error=function(t){return r=t,this}},KB.http.get=function(t){return new KB.http.request("GET",t).execute()},KB.http.postJson=function(t,e){var n={"Content-Type":"application/json",Accept:"application/json"};return new KB.http.request("POST",t,n,JSON.stringify(e)).execute()},KB.http.postForm=function(t,e){var n=new FormData(e);return new KB.http.request("POST",t,{},n).execute()},KB.http.uploadFile=function(t,e,n,o,a){var i=new FormData;i.append("files[]",e);var r=new XMLHttpRequest;r.upload.addEventListener("progress",n),r.upload.addEventListener("load",o),r.upload.addEventListener("error",a),r.open("POST",t,!0),r.send(i)},function(){function t(t){t.target.matches("#modal-overlay")&&(t.stopPropagation(),t.preventDefault(),s())}function e(){KB.trigger("modal.close")}function n(){KB.trigger("modal.loading"),a()}function o(){return document.querySelector("#modal-content form:not(.js-modal-ignore-form)")}function a(){var t=o();if(t){var e=t.getAttribute("action");e&&KB.http.postForm(e,t).success(function(t){KB.trigger("modal.stop"),t?r(t):s()})}}function i(){var t=KB.find("#modal-content form");t&&t.on("submit",n,!1);var e=document.querySelector("#modal-content input[autofocus]");e&&e.focus(),KB.render(),_KB.datePicker(),_KB.autoComplete(),_KB.tagAutoComplete(),_KB.get("Task").onPopoverOpened()}function r(t){var e=KB.find("#modal-content");e&&(e.replace(KB.dom("div").attr("id","modal-content").html(t).build()),i())}function d(n,o,a){var r=KB.dom("a").attr("href","#").attr("id","modal-close-button").html('').click(e).build(),d=KB.dom("div").attr("id","modal-header").add(r).build(),s=KB.dom("div").attr("id","modal-content").html(n).build(),l=KB.dom("div").attr("id","modal-box").style("width",o).add(d).add(s).build(),c=KB.dom("div").attr("id","modal-overlay").add(l).build();a&&c.addEventListener("click",t,!1),document.body.appendChild(c),i()}function s(){c=!1;var t=KB.find("#modal-overlay");t&&t.remove()}function l(t){var e=KB.utils.getViewportSize();if(e.width<700)return"99%";switch(t){case"large":return e.width<1350?"98%":"1350px";case"medium":return e.width<1024?"70%":"1024px"}return e.width<800?"75%":"800px"}var c=!1;KB.on("modal.close",function(){s()}),KB.on("modal.submit",function(){a()}),KB.modal={open:function(t,e,n){_KB.get("Dropdown").close(),s(),"undefined"==typeof n&&(n=!0),KB.http.get(t).success(function(t){c=!0,d(t,l(e),n)})},close:function(){s()},isOpen:function(){return c},replace:function(t){KB.http.get(t).success(function(t){r(t)})},getForm:o,submitForm:a}}(),KB.utils.formatDuration=function(t){return t>=86400?Math.round(t/86400)+"d":t>=3600?Math.round(t/3600)+"h":t>=60?Math.round(t/60)+"m":t+"s"},KB.utils.getSelectionPosition=function(t){var e,n;return e=t.value.length0&&(void 0===o[0][d]&&o[0].push(0),o[0][d]+=n[d][s]),0===s&&a.push(r(i.parse(n[d][s]))));KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:o},axis:{x:{type:"category",categories:a}}})}}),KB.component("chart-project-cumulative-flow",function(t,e){this.render=function(){for(var n=e.metrics,o=[],a=[],i=[],r=d3.time.format("%Y-%m-%d"),d=d3.time.format(e.dateFormat),s=0;s0&&a.push(n[s][l])):(o[l].push(n[s][l]),0===l&&i.push(d(r.parse(n[s][l]))));KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:o,type:"area-spline",groups:[a]},axis:{x:{type:"category",categories:i}}})}}),KB.component("chart-project-lead-cycle-time",function(t,e){this.render=function(){var n=e.metrics,o=[e.labelCycle],a=[e.labelLead],i=[],r={};r[e.labelCycle]="area",r[e.labelLead]="area-spline";var d={};d[e.labelLead]="#afb42b",d[e.labelCycle]="#4e342e";for(var s=0;s'+e+"")}})}}),KB.component("file-upload",function(t,e){function n(t){if(t.lengthComputable){var e=t.loaded/t.total,n=Math.floor(100*e);KB.find("#file-progress-"+y).attr("value",e),KB.find("#file-percentage-"+y).replaceText("("+n+"%)")}}function o(){var t=KB.dom("div").addClass("file-error").text(e.labelUploadError).build();KB.find("#file-item-"+y).add(t)}function a(){if(y++,y0&&KB.http.uploadFile(e.url,B[y],n,a,o)}function p(){B.length>0?(KB.trigger("modal.enable"),KB.dom(K).empty().add(v())):(KB.trigger("modal.disable"),KB.dom(K).empty().add(m()))}function f(){return KB.dom("input").attr("id","file-input-element").attr("type","file").attr("name","files[]").attr("multiple",!0).on("change",d).hide().build()}function m(){var t=KB.dom("a").attr("href","#").text(e.labelChooseFiles).click(s).build();return KB.dom("div").attr("id","file-dropzone-inner").text(e.labelDropzone+" "+e.labelOr+" ").add(t).build()}function h(){var t=KB.dom("div").attr("id","file-dropzone").add(m()).build();return t.ondragover=l,t.ondrop=c,t.ondragover=l,t}function g(t){var n=!1,o=KB.dom("progress").attr("id","file-progress-"+t).attr("value",0).build(),a=KB.dom("span").attr("id","file-percentage-"+t).text("(0%)").build(),i=KB.dom("li").attr("id","file-item-"+t).add(o).text(" "+B[t].name+" ").add(a);return B[t].size>e.maxSize&&(i.add(KB.dom("div").addClass("file-error").text(e.labelOversize).build()),n=!0),n&&KB.trigger("modal.disable"),i.build()}function v(){for(var t=KB.dom("ul").attr("id","file-list").build(),e=0;e=e.images.length&&(n=0),p=e.images[n];break}d()}function r(){s();for(var t=0;t1&&("INPUT"!==document.activeElement.tagName&&"TEXTAREA"!==document.activeElement.tagName||$(document.activeElement).parents("form").submit())}}KB.onKey("?",function(){KB.modal.isOpen()||KB.modal.open(KB.find("body").data("keyboardShortcutUrl"))}),KB.onKey("Escape",function(){KB.exists("#suggest-menu")||(KB.trigger("modal.close"),_KB.get("Dropdown").close())}),KB.onKey("Enter",e,!0,!0),KB.onKey("Enter",e,!0,!1,!0),KB.onKey("b",function(){KB.modal.isOpen()||KB.trigger("board.selector.open")}),KB.exists("#board")&&(KB.onKey("c",function(){KB.modal.isOpen()||_KB.get("BoardHorizontalScrolling").toggle()}),KB.onKey("s",function(){KB.modal.isOpen()||_KB.get("BoardCollapsedMode").toggle()}),KB.onKey("n",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#board").data("taskCreationUrl"),"large",!1)})),KB.exists("#task-view")&&(KB.onKey("e",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("editUrl"),"large",!1)}),KB.onKey("c",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("commentUrl"),"medium",!1)}),KB.onKey("s",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("subtaskUrl"),"medium",!1)}),KB.onKey("l",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("internalLinkUrl"),"medium",!1)})),KB.onKey("f",function(){KB.modal.isOpen()||KB.focus("#form-search")}),KB.onKey("r",function(){if(!KB.modal.isOpen()){var t=$(".filter-reset").data("filter"),e=$("#form-search");e.val(t),$("form.search").submit()}}),KB.onKey("v+o",function(){t("a.view-overview")}),KB.onKey("v+b",function(){t("a.view-board")}),KB.onKey("v+c",function(){t("a.view-calendar")}),KB.onKey("v+l",function(){t("a.view-listing")}),KB.onKey("v+g",function(){t("a.view-gantt")})},function(){function t(t){return"I"===t.target.tagName?t.target.parentNode.getAttribute("href"):t.target.getAttribute("href")}KB.onClick(".js-modal-large",function(e){KB.modal.open(t(e),"large",!1)}),KB.onClick(".js-modal-medium",function(e){KB.modal.open(t(e),"medium",!1)}),KB.onClick(".js-modal-small",function(e){KB.modal.open(t(e),"small",!1)}),KB.onClick(".js-modal-confirm",function(e){KB.modal.open(t(e),"small")}),KB.onClick(".js-modal-close",function(){KB.modal.close()}),KB.onClick(".js-modal-replace",function(e){var n=t(e);KB.modal.isOpen()?KB.modal.replace(n):window.location.href=n})}(),KB.onChange(".js-project-creation-select-options",function(t){var e=t.value;"0"===e?KB.find(".js-project-creation-options").hide():KB.find(".js-project-creation-options").show()}),KB.component("project-select-role",function(t,e){function n(t){d=!0,e.role=t.value,a(),o()}function o(){KB.http.postJson(e.url,{id:e.id,role:e.role}).success(function(){d=!1,s=!0,a()}).error(function(){d=!1,s=!1,l=!0,a()})}function a(){KB.dom(r).remove(),r=i(),t.appendChild(r)}function i(){var t=[],o=KB.dom("div");for(var a in e.roles)if(e.roles.hasOwnProperty(a)){var i={value:a,text:e.roles[a]};e.role===a&&(i.selected="selected"),t.push(i)}return o.add(KB.dom("select").change(n).for("option",t).build()),d?(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-spinner fa-pulse fa-fw").build())):s?(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-check fa-fw icon-fade-out icon-success").build())):l&&(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-check fa-fw icon-fade-out icon-error").build())),o.build()}var r,d=!1,s=!1,l=!1;this.render=function(){r=i(),t.appendChild(r)}}),KB.component("screenshot",function(t){function e(t){d(t.target.result)}function n(t){if(t.clipboardData&&t.clipboardData.items){var n=t.clipboardData.items;if(n)for(var o=0;o0&&(t.index=t.index-1),KB.dom(t.items[t.index]).addClass("active")}function m(){var t=p();t.indexo?1:0}):n.sort(function(t,e){var n=t["data-label"].toLowerCase(),o=e["data-label"].toLowerCase();return no?1:0}),n}function g(t,n){for(var o=[],a=!1,i=0;i0&&(o[0].class+=" active"),o}function v(){var t=g(w.value,h(e.items)),n=y.getBoundingClientRect();return 0===t.length?null:KB.dom("ul").attr("id","select-dropdown-menu").style("top",document.body.scrollTop+n.bottom+"px").style("left",n.left+"px").style("width",n.width+"px").style("maxHeight",window.innerHeight-n.bottom-20+"px").mouseover(d).click(s).for("li",t).build()}function b(){var t=KB.find("#select-dropdown-menu");null!==t&&t.remove(),document.removeEventListener("keydown",i,!1),document.removeEventListener("click",l,!1)}function K(){var t=v();null!==t&&document.body.appendChild(t),document.addEventListener("keydown",i,!1),document.addEventListener("click",l,!1)}function B(){return e.defaultValue&&e.defaultValue in e.items?e.items[e.defaultValue]:e.placeholder?e.placeholder:""}var y,w,k,C,x;this.render=function(){KB.on("select.dropdown.loading.start",n),KB.on("select.dropdown.loading.stop",o),KB.on("modal.close",function(){KB.removeListener("select.dropdown.loading.start",n),KB.removeListener("select.dropdown.loading.stop",o)}),C=KB.dom("i").attr("class","fa fa-chevron-down select-dropdown-chevron").click(c).build(),x=KB.dom("span").hide().addClass("select-loading-icon").add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).build(),k=KB.dom("input").attr("type","hidden").attr("name",e.name).attr("value",e.defaultValue||"").build(), +!function(){function t(t,a,i){if(!n)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var r=i&&i.debug||!1;if(r){var d=document.querySelector("#input-textarea-caret-position-mirror-div");d&&d.parentNode.removeChild(d)}var s=document.createElement("div");s.id="input-textarea-caret-position-mirror-div",document.body.appendChild(s);var l=s.style,c=window.getComputedStyle?getComputedStyle(t):t.currentStyle;l.whiteSpace="pre-wrap","INPUT"!==t.nodeName&&(l.wordWrap="break-word"),l.position="absolute",r||(l.visibility="hidden"),e.forEach(function(t){l[t]=c[t]}),o?t.scrollHeight>parseInt(c.height)&&(l.overflowY="scroll"):l.overflow="hidden",s.textContent=t.value.substring(0,a),"INPUT"===t.nodeName&&(s.textContent=s.textContent.replace(/\s/g," "));var u=document.createElement("span");u.textContent=t.value.substring(a)||".",s.appendChild(u);var p={top:u.offsetTop+parseInt(c.borderTopWidth),left:u.offsetLeft+parseInt(c.borderLeftWidth)};return r?u.style.backgroundColor="#aaa":document.body.removeChild(s),p}var e=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],n="undefined"!=typeof window,o=n&&null!=window.mozInnerScreenX;"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=t:n&&(window.getCaretCoordinates=t)}(),function(){function t(){if(!("KeyboardEvent"in window)||"key"in KeyboardEvent.prototype)return!1;var t={get:function(t){var e=n.keys[this.which||this.keyCode];return Array.isArray(e)&&(e=e[+this.shiftKey]),e}};return Object.defineProperty(KeyboardEvent.prototype,"key",t),t}var e,n={polyfill:t,keys:{3:"Cancel",6:"Help",8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",28:"Convert",29:"NonConvert",30:"Accept",31:"ModeChange",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",41:"Select",42:"Print",43:"Execute",44:"PrintScreen",45:"Insert",46:"Delete",48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],91:"OS",93:"ContextMenu",144:"NumLock",145:"ScrollLock",181:"VolumeMute",182:"VolumeDown",183:"VolumeUp",186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"'],224:"Meta",225:"AltGraph",246:"Attn",247:"CrSel",248:"ExSel",249:"EraseEof",250:"Play",251:"ZoomOut"}};for(e=1;e<25;e++)n.keys[111+e]="F"+e;var o="";for(e=65;e<91;e++)o=String.fromCharCode(e),n.keys[e]=[o.toLowerCase(),o.toUpperCase()];n.polyfill()}(),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(t){for(var e=(this.document||this.ownerDocument).querySelectorAll(t),n=e.length;--n>=0&&e.item(n)!==this;);return n>-1});var KB={components:{},utils:{},html:{},http:{},listeners:{clicks:{},changes:{},keys:[],internals:{}}};KB.on=function(t,e){this.listeners.internals.hasOwnProperty(t)||(this.listeners.internals[t]=[]),this.listeners.internals[t].push(e)},KB.trigger=function(t,e){if(this.listeners.internals.hasOwnProperty(t))for(var n=0;n0){for(var i=!0,r=0;r-1)window.location=e.split("#")[0];else if(e)window.location=e;else if(n)window.location=n;else if("application/json"===t.getResponseHeader("Content-Type"))try{return JSON.parse(t.responseText)}catch(t){}return t.responseText}var i=function(){},r=function(){};this.execute=function(){var d=new XMLHttpRequest;d.open(t,e,!0),d.setRequestHeader("X-Requested-With","XMLHttpRequest");for(var s in n)n.hasOwnProperty(s)&&d.setRequestHeader(s,n[s]);return d.onerror=function(){r()},d.onreadystatechange=function(){if(d.readyState===XMLHttpRequest.DONE){var t=a(d);200===d.status?i(t):r(t)}},d.send(o),this},this.success=function(t){return i=t,this},this.error=function(t){return r=t,this}},KB.http.get=function(t){return new KB.http.request("GET",t).execute()},KB.http.postJson=function(t,e){var n={"Content-Type":"application/json",Accept:"application/json"};return new KB.http.request("POST",t,n,JSON.stringify(e)).execute()},KB.http.postForm=function(t,e){var n=new FormData(e);return new KB.http.request("POST",t,{},n).execute()},KB.http.uploadFile=function(t,e,n,o,a){var i=new FormData;i.append("files[]",e);var r=new XMLHttpRequest;r.upload.addEventListener("progress",n),r.upload.addEventListener("load",o),r.upload.addEventListener("error",a),r.open("POST",t,!0),r.send(i)},function(){function t(t){t.target.matches("#modal-overlay")&&(t.stopPropagation(),t.preventDefault(),s())}function e(){KB.trigger("modal.close")}function n(){KB.trigger("modal.loading"),a()}function o(){return document.querySelector("#modal-content form:not(.js-modal-ignore-form)")}function a(){var t=o();if(t){var e=t.getAttribute("action");e&&KB.http.postForm(e,t).success(function(t){KB.trigger("modal.stop"),t?r(t):s()})}}function i(){var t=KB.find("#modal-content form");t&&t.on("submit",n,!1);var e=document.querySelector("#modal-content input[autofocus]");e&&e.focus(),KB.render(),_KB.datePicker(),_KB.autoComplete(),_KB.tagAutoComplete(),_KB.get("Task").onPopoverOpened()}function r(t){var e=KB.find("#modal-content");e&&(e.replace(KB.dom("div").attr("id","modal-content").html(t).build()),i())}function d(n,o,a){var r=KB.dom("a").attr("href","#").attr("id","modal-close-button").html('').click(e).build(),d=KB.dom("div").attr("id","modal-header").add(r).build(),s=KB.dom("div").attr("id","modal-content").html(n).build(),l=KB.dom("div").attr("id","modal-box").style("width",o).add(d).add(s).build(),c=KB.dom("div").attr("id","modal-overlay").add(l).build();a&&c.addEventListener("click",t,!1),document.body.appendChild(c),i()}function s(){c=!1;var t=KB.find("#modal-overlay");t&&t.remove()}function l(t){var e=KB.utils.getViewportSize();if(e.width<700)return"99%";switch(t){case"large":return e.width<1350?"98%":"1350px";case"medium":return e.width<1024?"70%":"1024px"}return e.width<800?"75%":"800px"}var c=!1;KB.on("modal.close",function(){s()}),KB.on("modal.submit",function(){a()}),KB.modal={open:function(t,e,n){_KB.get("Dropdown").close(),s(),"undefined"==typeof n&&(n=!0),KB.http.get(t).success(function(t){c=!0,d(t,l(e),n)})},close:function(){s()},isOpen:function(){return c},replace:function(t){KB.http.get(t).success(function(t){r(t)})},getForm:o,submitForm:a}}(),KB.utils.formatDuration=function(t){return t>=86400?Math.round(t/86400)+"d":t>=3600?Math.round(t/3600)+"h":t>=60?Math.round(t/60)+"m":t+"s"},KB.utils.getSelectionPosition=function(t){var e,n;return e=t.value.length0&&o.push([l]):s>0?(o[s].push(l),"undefined"==typeof o[0][d]&&o[0].push(0),o[0][d]+=l):a.push(r(i.parse(l)))}KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:o},axis:{x:{type:"category",categories:a}}})}}),KB.component("chart-project-cumulative-flow",function(t,e){this.render=function(){for(var n=e.metrics,o=[],a=[],i=[],r=d3.time.format("%Y-%m-%d"),d=d3.time.format(e.dateFormat),s=0;s0&&(a.push(c),o.push([c])):l>0?o[l-1].push(c):i.push(d(r.parse(c)))}KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:o.reverse(),type:"area-spline",groups:[a],order:null},axis:{x:{type:"category",categories:i}}})}}),KB.component("chart-project-lead-cycle-time",function(t,e){this.render=function(){var n=e.metrics,o=[e.labelCycle],a=[e.labelLead],i=[],r={};r[e.labelCycle]="area",r[e.labelLead]="area-spline";var d={};d[e.labelLead]="#afb42b",d[e.labelCycle]="#4e342e";for(var s=0;s'+e+"")}})}}),KB.component("file-upload",function(t,e){function n(t){if(t.lengthComputable){var e=t.loaded/t.total,n=Math.floor(100*e);KB.find("#file-progress-"+y).attr("value",e),KB.find("#file-percentage-"+y).replaceText("("+n+"%)")}}function o(){var t=KB.dom("div").addClass("file-error").text(e.labelUploadError).build();KB.find("#file-item-"+y).add(t)}function a(){if(y++,y0&&KB.http.uploadFile(e.url,B[y],n,a,o)}function p(){B.length>0?(KB.trigger("modal.enable"),KB.dom(K).empty().add(v())):(KB.trigger("modal.disable"),KB.dom(K).empty().add(m()))}function f(){return KB.dom("input").attr("id","file-input-element").attr("type","file").attr("name","files[]").attr("multiple",!0).on("change",d).hide().build()}function m(){var t=KB.dom("a").attr("href","#").text(e.labelChooseFiles).click(s).build();return KB.dom("div").attr("id","file-dropzone-inner").text(e.labelDropzone+" "+e.labelOr+" ").add(t).build()}function h(){var t=KB.dom("div").attr("id","file-dropzone").add(m()).build();return t.ondragover=l,t.ondrop=c,t.ondragover=l,t}function g(t){var n=!1,o=KB.dom("progress").attr("id","file-progress-"+t).attr("value",0).build(),a=KB.dom("span").attr("id","file-percentage-"+t).text("(0%)").build(),i=KB.dom("li").attr("id","file-item-"+t).add(o).text(" "+B[t].name+" ").add(a);return B[t].size>e.maxSize&&(i.add(KB.dom("div").addClass("file-error").text(e.labelOversize).build()),n=!0),n&&KB.trigger("modal.disable"),i.build()}function v(){for(var t=KB.dom("ul").attr("id","file-list").build(),e=0;e=e.images.length&&(n=0),p=e.images[n];break}d()}function r(){s();for(var t=0;t1&&("INPUT"!==document.activeElement.tagName&&"TEXTAREA"!==document.activeElement.tagName||$(document.activeElement).parents("form").submit())}}KB.onKey("?",function(){KB.modal.isOpen()||KB.modal.open(KB.find("body").data("keyboardShortcutUrl"))}),KB.onKey("Escape",function(){KB.exists("#suggest-menu")||(KB.trigger("modal.close"),_KB.get("Dropdown").close())}),KB.onKey("Enter",e,!0,!0),KB.onKey("Enter",e,!0,!1,!0),KB.onKey("b",function(){KB.modal.isOpen()||KB.trigger("board.selector.open")}),KB.exists("#board")&&(KB.onKey("c",function(){KB.modal.isOpen()||_KB.get("BoardHorizontalScrolling").toggle()}),KB.onKey("s",function(){KB.modal.isOpen()||_KB.get("BoardCollapsedMode").toggle()}),KB.onKey("n",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#board").data("taskCreationUrl"),"large",!1)})),KB.exists("#task-view")&&(KB.onKey("e",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("editUrl"),"large",!1)}),KB.onKey("c",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("commentUrl"),"medium",!1)}),KB.onKey("s",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("subtaskUrl"),"medium",!1)}),KB.onKey("l",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("internalLinkUrl"),"medium",!1)})),KB.onKey("f",function(){KB.modal.isOpen()||KB.focus("#form-search")}),KB.onKey("r",function(){if(!KB.modal.isOpen()){var t=$(".filter-reset").data("filter"),e=$("#form-search");e.val(t),$("form.search").submit()}}),KB.onKey("v+o",function(){t("a.view-overview")}),KB.onKey("v+b",function(){t("a.view-board")}),KB.onKey("v+c",function(){t("a.view-calendar")}),KB.onKey("v+l",function(){t("a.view-listing")}),KB.onKey("v+g",function(){t("a.view-gantt")})},function(){function t(t){return"I"===t.target.tagName?t.target.parentNode.getAttribute("href"):t.target.getAttribute("href")}KB.onClick(".js-modal-large",function(e){KB.modal.open(t(e),"large",!1)}),KB.onClick(".js-modal-medium",function(e){KB.modal.open(t(e),"medium",!1)}),KB.onClick(".js-modal-small",function(e){KB.modal.open(t(e),"small",!1)}),KB.onClick(".js-modal-confirm",function(e){KB.modal.open(t(e),"small")}),KB.onClick(".js-modal-close",function(){KB.modal.close()}),KB.onClick(".js-modal-replace",function(e){var n=t(e);KB.modal.isOpen()?KB.modal.replace(n):window.location.href=n})}(),KB.onChange(".js-project-creation-select-options",function(t){var e=t.value;"0"===e?KB.find(".js-project-creation-options").hide():KB.find(".js-project-creation-options").show()}),KB.component("project-select-role",function(t,e){function n(t){d=!0,e.role=t.value,a(),o()}function o(){KB.http.postJson(e.url,{id:e.id,role:e.role}).success(function(){d=!1,s=!0,a()}).error(function(){d=!1,s=!1,l=!0,a()})}function a(){KB.dom(r).remove(),r=i(),t.appendChild(r)}function i(){var t=[],o=KB.dom("div");for(var a in e.roles)if(e.roles.hasOwnProperty(a)){var i={value:a,text:e.roles[a]};e.role===a&&(i.selected="selected"),t.push(i)}return o.add(KB.dom("select").change(n).for("option",t).build()),d?(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-spinner fa-pulse fa-fw").build())):s?(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-check fa-fw icon-fade-out icon-success").build())):l&&(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-check fa-fw icon-fade-out icon-error").build())),o.build()}var r,d=!1,s=!1,l=!1;this.render=function(){r=i(),t.appendChild(r)}}),KB.component("screenshot",function(t){function e(t){d(t.target.result)}function n(t){if(t.clipboardData&&t.clipboardData.items){var n=t.clipboardData.items;if(n)for(var o=0;o0&&(t.index=t.index-1),KB.dom(t.items[t.index]).addClass("active")}function m(){var t=p();t.indexo?1:0}):n.sort(function(t,e){var n=t["data-label"].toLowerCase(),o=e["data-label"].toLowerCase();return no?1:0}),n}function g(t,n){for(var o=[],a=!1,i=0;i0&&(o[0].class+=" active"),o}function v(){var t=g(w.value,h(e.items)),n=y.getBoundingClientRect();return 0===t.length?null:KB.dom("ul").attr("id","select-dropdown-menu").style("top",document.body.scrollTop+n.bottom+"px").style("left",n.left+"px").style("width",n.width+"px").style("maxHeight",window.innerHeight-n.bottom-20+"px").mouseover(d).click(s).for("li",t).build()}function b(){var t=KB.find("#select-dropdown-menu");null!==t&&t.remove(),document.removeEventListener("keydown",i,!1),document.removeEventListener("click",l,!1)}function K(){var t=v();null!==t&&document.body.appendChild(t),document.addEventListener("keydown",i,!1),document.addEventListener("click",l,!1)}function B(){return e.defaultValue&&e.defaultValue in e.items?e.items[e.defaultValue]:e.placeholder?e.placeholder:""}var y,w,k,C,x;this.render=function(){KB.on("select.dropdown.loading.start",n),KB.on("select.dropdown.loading.stop",o),KB.on("modal.close",function(){KB.removeListener("select.dropdown.loading.start",n),KB.removeListener("select.dropdown.loading.stop",o)}),C=KB.dom("i").attr("class","fa fa-chevron-down select-dropdown-chevron").click(c).build(),x=KB.dom("span").hide().addClass("select-loading-icon").add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).build(),k=KB.dom("input").attr("type","hidden").attr("name",e.name).attr("value",e.defaultValue||"").build(), w=KB.dom("input").attr("type","text").attr("placeholder",B()).addClass("select-dropdown-input").style("width",t.offsetWidth-30+"px").on("focus",c).on("input",r,!0).build(),y=KB.dom("div").addClass("select-dropdown-input-container").add(k).add(w).add(C).add(x).build(),t.appendChild(y),e.onFocus&&e.onFocus.forEach(function(t){KB.on(t,function(){w.focus()})}),window.addEventListener("scroll",a,!1)}}),KB.interval(60,function(){var t=KB.find("body").data("statusUrl"),e=KB.find("body").data("loginUrl");null===KB.find(".form-login")&&KB.http.get(t).error(function(){window.location=e})}),KB.component("submit-buttons",function(t,e){function n(){c=!0,KB.find("#modal-submit-button").replace(l()),KB.trigger("modal.submit")}function o(){KB.trigger("modal.close")}function a(){c=!1,KB.find("#modal-submit-button").replace(l())}function i(){c=!1,u=!0,KB.find("#modal-submit-button").replace(l())}function r(){c=!1,u=!1,KB.find("#modal-submit-button").replace(l())}function d(){KB.dom(f).hide()}function s(t){p=t.submitLabel,KB.find("#modal-submit-button").replace(l())}function l(){var t=KB.dom("button").attr("id","modal-submit-button").attr("type","submit").attr("class","btn btn-"+(e.color||"blue"));return KB.modal.isOpen()&&t.click(n),e.tabindex&&t.attr("tabindex",e.tabindex),c&&t.disable().add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).text(" "),u&&t.disable(),t.text(p).build()}var c=!1,u=e.disabled||!1,p=e.submitLabel,f=null;this.render=function(){KB.on("modal.stop",a),KB.on("modal.disable",i),KB.on("modal.enable",r),KB.on("modal.hide",d),KB.on("modal.submit.label",s),KB.on("modal.close",function(){KB.removeListener("modal.stop",a),KB.removeListener("modal.disable",i),KB.removeListener("modal.enable",r),KB.removeListener("modal.hide",d),KB.removeListener("modal.submit.label",s)});var n=KB.dom("div").attr("class","form-actions").add(l());KB.modal.isOpen()&&n.text(" "+e.orLabel+" ").add(KB.dom("a").attr("href","#").click(o).text(e.cancelLabel).build()),f=n.build(),t.appendChild(f)}}),KB.component("suggest-menu",function(t,e){function n(t){switch(KB.utils.getKey(t)){case"Escape":u();break;case"ArrowUp":t.preventDefault(),t.stopImmediatePropagation(),l();break;case"ArrowDown":t.preventDefault(),t.stopImmediatePropagation(),c();break;case"Enter":t.preventDefault(),t.stopImmediatePropagation(),i()}}function o(){i()}function a(t){KB.dom(t).hasClass("suggest-menu-item")&&(KB.find(".suggest-menu-item.active").removeClass("active"),KB.dom(t).addClass("active"))}function i(){t.focus();var e=KB.find(".suggest-menu-item.active"),n=e.data("value"),o=e.data("trigger"),a=t.value,i=r(t),d=o+n+" ",s=KB.utils.getSelectionPosition(t),l=a.substring(0,s.selectionStart-i.length),c=a.substring(s.selectionEnd),p=l.length+d.length;t.value=l+d+c,t.setSelectionRange(p,p),u()}function r(t){var e=t.value.substring(0,t.selectionEnd).split("\n"),n=e[e.length-1],o=n.split(" ");return o[o.length-1]}function d(){for(var t=["#modal-content form","#modal-content","body"],e=0;e0&&(t.index=t.index-1),KB.dom(t.items[t.index]).addClass("active")}function c(){var t=s();t.index0&&b(v(t,n))}function g(t,e){var n=[];if(0===t.length)return e;for(var o=0;o0&&r.add(KB.html.label(e.positionLabel,"form-position")).add(KB.dom("select").attr("id","form-position").for("option",t).build()).add(KB.html.radio(e.beforeLabel,"positionChoice","before")).add(KB.html.radio(e.afterLabel,"positionChoice","after")),r.build()}this.render=function(){KB.on("modal.submit",c),KB.on("modal.close",function(){KB.removeListener("modal.submit",c)});var n=KB.dom("div").add(KB.dom("div").attr("id","message-container").build()).add(KB.html.label(e.swimlaneLabel,"form-swimlanes")).add(u()).add(KB.html.label(e.columnLabel,"form-columns")).add(p()).add(f()).build();t.appendChild(n)}}),KB.component("text-editor",function(t,e){function n(){var t=KB.dom("div").attr("class","text-editor-toolbar").for("a",[{href:"#",html:' '+e.labelWrite,click:function(){a()}}]).build();return h=KB.dom("div").attr("class","text-editor-preview-area markdown").build(),KB.dom("div").attr("class","text-editor-view-mode").add(t).add(h).hide().build()}function o(){var t=KB.dom("div").attr("class","text-editor-toolbar").for("a",[{href:"#",html:' '+e.labelPreview,click:function(){a()}},{href:"#",html:'',click:function(){d("**")}},{href:"#",html:'',click:function(){d("_")}},{href:"#",html:'',click:function(){d("~~")}},{href:"#",html:'',click:function(){l("> ")}},{href:"#",html:'',click:function(){l("* ")}},{href:"#",html:'',click:function(){s("```")}}]).build(),n=KB.dom("textarea");return n.attr("name",e.name),e.tabindex&&n.attr("tabindex",e.tabindex),e.required&&n.attr("required","required"),n.text(e.text),e.placeholder&&n.attr("placeholder",e.placeholder),p=n.build(),e.suggestOptions&&KB.getComponent("suggest-menu",p,e.suggestOptions).render(),KB.dom("div").attr("class","text-editor-write-mode").add(t).add(p).build()}function a(){KB.dom(h).html(marked(p.value,{sanitize:!0})),KB.dom(f).toggle(),KB.dom(m).toggle()}function i(){return p.value.substring(p.selectionStart,p.selectionEnd)}function r(t,e,n,o){return t.substring(0,e)+o+t.substring(n)}function d(t){var e=i();c(t+e+t),u(t)}function s(t){var e=i();c("\n"+t+"\n"+e+"\n"+t),u(t,2)}function l(t){var e=i();if(e.indexOf("\n")===-1)c("\n"+t+e);else{for(var n=e.split("\n"),o=0;o ')},Kanboard.App.prototype.hideLoadingIcon=function(){$("#app-loading-icon").remove()},Kanboard.App.prototype.isVisible=function(){var t="";return"undefined"!=typeof document.hidden?t="visibilityState":"undefined"!=typeof document.mozHidden?t="mozVisibilityState":"undefined"!=typeof document.msHidden?t="msVisibilityState":"undefined"!=typeof document.webkitHidden&&(t="webkitVisibilityState"),""===t||"visible"==document[t]},Kanboard.BoardCollapsedMode=function(t){this.app=t},Kanboard.BoardCollapsedMode.prototype.toggle=function(){var t=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:$('.filter-display-mode:not([style="display: none;"]) a').attr("href"),success:function(e){$(".filter-display-mode").toggle(),t.app.get("BoardDragAndDrop").refresh(e)}})},Kanboard.BoardColumnView=function(t){this.app=t},Kanboard.BoardColumnView.prototype.execute=function(){this.app.hasId("board")&&this.render()},Kanboard.BoardColumnView.prototype.listen=function(){var t=this;$(document).on("click",".board-toggle-column-view",function(){t.toggle($(this).data("column-id"))})},Kanboard.BoardColumnView.prototype.onBoardRendered=function(){this.render()},Kanboard.BoardColumnView.prototype.render=function(){var t=this;$(".board-column-header").each(function(){var e=$(this).data("column-id");localStorage.getItem("hidden_column_"+e)&&t.hideColumn(e)})},Kanboard.BoardColumnView.prototype.toggle=function(t){localStorage.getItem("hidden_column_"+t)?this.showColumn(t):this.hideColumn(t)},Kanboard.BoardColumnView.prototype.hideColumn=function(t){$(".board-column-"+t+" .board-column-expanded").hide(),$(".board-column-"+t+" .board-column-collapsed").show(),$(".board-column-header-"+t+" .board-column-expanded").hide(),$(".board-column-header-"+t+" .board-column-collapsed").show(),$(".board-column-header-"+t).each(function(){$(this).removeClass("board-column-compact"),$(this).addClass("board-column-header-collapsed")}),$(".board-column-"+t).each(function(){$(this).addClass("board-column-task-collapsed")}),$(".board-column-"+t+" .board-rotation").each(function(){$(this).css("width",$(".board-column-"+t).height())}),localStorage.setItem("hidden_column_"+t,1)},Kanboard.BoardColumnView.prototype.showColumn=function(t){$(".board-column-"+t+" .board-column-expanded").show(),$(".board-column-"+t+" .board-column-collapsed").hide(),$(".board-column-header-"+t+" .board-column-expanded").show(),$(".board-column-header-"+t+" .board-column-collapsed").hide(),$(".board-column-header-"+t).removeClass("board-column-header-collapsed"),$(".board-column-"+t).removeClass("board-column-task-collapsed"),0==localStorage.getItem("horizontal_scroll")&&$(".board-column-header-"+t).addClass("board-column-compact"),localStorage.removeItem("hidden_column_"+t)},Kanboard.BoardHorizontalScrolling=function(t){this.app=t},Kanboard.BoardHorizontalScrolling.prototype.execute=function(){this.app.hasId("board")&&this.render()},Kanboard.BoardHorizontalScrolling.prototype.listen=function(){var t=this;$(document).on("click",".filter-toggle-scrolling",function(e){e.preventDefault(),t.toggle()})},Kanboard.BoardHorizontalScrolling.prototype.onBoardRendered=function(){this.render()},Kanboard.BoardHorizontalScrolling.prototype.toggle=function(){var t=localStorage.getItem("horizontal_scroll")||1;localStorage.setItem("horizontal_scroll",0==t?1:0),this.render()},Kanboard.BoardHorizontalScrolling.prototype.render=function(){0==localStorage.getItem("horizontal_scroll")?($(".filter-wide").show(),$(".filter-compact").hide(),$("#board-container").addClass("board-container-compact"),$("#board th:not(.board-column-header-collapsed)").addClass("board-column-compact")):($(".filter-wide").hide(),$(".filter-compact").show(),$("#board-container").removeClass("board-container-compact"),$("#board th").removeClass("board-column-compact"))},Kanboard.BoardPolling=function(t){this.app=t},Kanboard.BoardPolling.prototype.execute=function(){if(this.app.hasId("board")){var t=parseInt($("#board").attr("data-check-interval"));t>0&&window.setInterval(this.check.bind(this),1e3*t)}},Kanboard.BoardPolling.prototype.check=function(){if(this.app.isVisible()&&!this.app.get("BoardDragAndDrop").savingInProgress){var t=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:$("#board").data("check-url"),statusCode:{200:function(e){t.app.get("BoardDragAndDrop").refresh(e)},304:function(){t.app.hideLoadingIcon()}}})}},Kanboard.Column=function(t){this.app=t},Kanboard.Column.prototype.listen=function(){this.dragAndDrop()},Kanboard.Column.prototype.dragAndDrop=function(){var t=this;$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".columns-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(t,e){return e.children().each(function(){$(this).width($(this).width())}),e},stop:function(e,n){var o=n.item;o.removeClass("draggable-item-selected"),t.savePosition(o.data("column-id"),o.index()+1)},start:function(t,e){e.item.addClass("draggable-item-selected")}}).disableSelection()},Kanboard.Column.prototype.savePosition=function(t,e){var n=$(".columns-table").data("save-position-url"),o=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({column_id:t,position:e}),complete:function(){o.app.hideLoadingIcon()}})},Kanboard.Dropdown=function(t){this.app=t},Kanboard.Dropdown.prototype.listen=function(){var t=this;$(document).on("click",function(){t.close()}),$(document).on("click",".dropdown-menu",function(e){e.preventDefault(),e.stopImmediatePropagation(),t.close();var n=$(this).next("ul"),o=$(this).offset();$("body").append(jQuery("
",{id:"dropdown"})),n.clone().appendTo("#dropdown");var a=$("#dropdown ul");a.addClass("dropdown-submenu-open");var i=a.outerHeight(),r=a.outerWidth();o.top+i-$(window).scrollTop()<$(window).height()||$(window).scrollTop()+o.top$(window).width()?a.css("left",o.left-r+$(this).outerWidth()):a.css("left",o.left)}),$(document).on("click",".dropdown-submenu-open li",function(t){$(t.target).is("li")&&$(this).find("a:visible")[0].click()})},Kanboard.Dropdown.prototype.close=function(){$("#dropdown").remove()},Kanboard.Gantt=function(t){this.app=t,this.data=[],this.options={container:"#gantt-chart",showWeekends:!0,allowMoves:!0,allowResizes:!0,cellWidth:21,cellHeight:31,slideWidth:1e3,vHeaderWidth:200}},Kanboard.Gantt.prototype.execute=function(){this.app.hasId("gantt-chart")&&this.show()},Kanboard.Gantt.prototype.saveRecord=function(t){this.app.showLoadingIcon(),$.ajax({cache:!1,url:$(this.options.container).data("save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify(t),complete:this.app.hideLoadingIcon.bind(this)})},Kanboard.Gantt.prototype.show=function(){this.data=this.prepareData($(this.options.container).data("records"));var t=Math.floor(this.options.slideWidth/this.options.cellWidth+5),e=this.getDateRange(t),n=e[0],o=e[1],a=$(this.options.container),i=jQuery("
",{class:"ganttview"});i.append(this.renderVerticalHeader()),i.append(this.renderSlider(n,o)),a.append(i),jQuery("div.ganttview-grid-row div.ganttview-grid-row-cell:last-child",a).addClass("last"),jQuery("div.ganttview-hzheader-days div.ganttview-hzheader-day:last-child",a).addClass("last"),jQuery("div.ganttview-hzheader-months div.ganttview-hzheader-month:last-child",a).addClass("last"),$(this.options.container).data("readonly")?(this.options.allowResizes=!1,this.options.allowMoves=!1):(this.listenForBlockResize(n),this.listenForBlockMove(n))},Kanboard.Gantt.prototype.renderVerticalHeader=function(){for(var t=jQuery("
",{class:"ganttview-vtheader"}),e=jQuery("
",{class:"ganttview-vtheader-item"}),n=jQuery("
",{class:"ganttview-vtheader-series"}),o=0;o").append(jQuery("",{class:"fa fa-info-circle tooltip",title:this.getVerticalHeaderTooltip(this.data[o])})).append(" ");"task"==this.data[o].type?a.append(jQuery("",{href:this.data[o].link,title:this.data[o].title}).append(this.data[o].title)):a.append(jQuery("",{href:this.data[o].board_link,title:$(this.options.container).data("label-board-link")}).append('')).append(" ").append(jQuery("",{href:this.data[o].gantt_link,title:$(this.options.container).data("label-gantt-link")}).append('')).append(" ").append(jQuery("",{href:this.data[o].link}).append(this.data[o].title)),n.append(jQuery("
",{class:"ganttview-vtheader-series-name"}).append(a))}return e.append(n),t.append(e),t},Kanboard.Gantt.prototype.renderSlider=function(t,e){var n=jQuery("
",{class:"ganttview-slide-container"}),o=this.getDates(t,e);return n.append(this.renderHorizontalHeader(o)),n.append(this.renderGrid(o)),n.append(this.addBlockContainers()),this.addBlocks(n,t),n},Kanboard.Gantt.prototype.renderHorizontalHeader=function(t){var e=jQuery("
",{class:"ganttview-hzheader"}),n=jQuery("
",{class:"ganttview-hzheader-months"}),o=jQuery("
",{class:"ganttview-hzheader-days"}),a=0;for(var i in t)for(var r in t[i]){var d=t[i][r].length*this.options.cellWidth;a+=d,n.append(jQuery("
",{class:"ganttview-hzheader-month",css:{width:d-1+"px"}}).append($.datepicker.regional[$("body").data("js-lang")].monthNames[r]+" "+i));for(var s in t[i][r])o.append(jQuery("
",{class:"ganttview-hzheader-day"}).append(t[i][r][s].getDate()))}return n.css("width",a+"px"),o.css("width",a+"px"),e.append(n).append(o),e},Kanboard.Gantt.prototype.renderGrid=function(t){var e=jQuery("
",{class:"ganttview-grid"}),n=jQuery("
",{class:"ganttview-grid-row"});for(var o in t)for(var a in t[o])for(var i in t[o][a]){var r=jQuery("
",{class:"ganttview-grid-row-cell"});this.options.showWeekends&&this.isWeekend(t[o][a][i])&&r.addClass("ganttview-weekend"),n.append(r)}var d=jQuery("div.ganttview-grid-row-cell",n).length*this.options.cellWidth;n.css("width",d+"px"),e.css("width",d+"px");for(var s=0;s",{class:"ganttview-blocks"}),e=0;e",{class:"ganttview-block-container"}));return t},Kanboard.Gantt.prototype.addBlocks=function(t,e){for(var n=jQuery("div.ganttview-blocks div.ganttview-block-container",t),o=0,a=0;a",{class:"ganttview-block-text"}),l=jQuery("
",{class:"ganttview-block tooltip"+(this.options.allowMoves?" ganttview-block-movable":""),title:this.getBarTooltip(i),css:{width:r*this.options.cellWidth-9+"px","margin-left":d*this.options.cellWidth+"px"}}).append(s);r>=2&&s.append(i.progress),l.data("record",i),this.setBarColor(l,i),jQuery(n[o]).append(l),o+=1}},Kanboard.Gantt.prototype.getVerticalHeaderTooltip=function(t){var e="";if("task"==t.type)e=""+t.column_title+" ("+t.progress+")
"+t.title;else{var n=["project-manager","project-member"];for(var o in n){var a=n[o];if(!jQuery.isEmptyObject(t.users[a])){var i=jQuery("
    ");for(var r in t.users[a])r&&i.append(jQuery("
  • ").append(t.users[a][r]));e+="

    "+$(this.options.container).data("label-"+a)+"

    "+i[0].outerHTML}}}return e},Kanboard.Gantt.prototype.getBarTooltip=function(t){var e="";return t.not_defined?e=$(this.options.container).data("label-not-defined"):("task"==t.type&&(e=""+t.progress+"
    "+$(this.options.container).data("label-assignee")+" "+(t.assignee?t.assignee:"")+"
    "),e+=$(this.options.container).data("label-start-date")+" "+$.datepicker.formatDate("yy-mm-dd",t.start)+"
    ",e+=$(this.options.container).data("label-end-date")+" "+$.datepicker.formatDate("yy-mm-dd",t.end)),e},Kanboard.Gantt.prototype.setBarColor=function(t,e){e.not_defined?t.addClass("ganttview-block-not-defined"):(t.css("background-color",e.color.background),t.css("border-color",e.color.border),"0%"!=e.progress&&t.append(jQuery("
    ",{css:{"z-index":0,position:"absolute",top:0,bottom:0,"background-color":e.color.border,width:e.progress,opacity:.4}})))},Kanboard.Gantt.prototype.listenForBlockResize=function(t){var e=this;jQuery("div.ganttview-block",this.options.container).resizable({grid:this.options.cellWidth,handles:"e,w",delay:300,stop:function(){var n=jQuery(this);e.updateDataAndPosition(n,t),e.saveRecord(n.data("record"))}})},Kanboard.Gantt.prototype.listenForBlockMove=function(t){var e=this;jQuery("div.ganttview-block",this.options.container).draggable({axis:"x",delay:300,grid:[this.options.cellWidth,this.options.cellWidth],stop:function(){var n=jQuery(this);e.updateDataAndPosition(n,t),e.saveRecord(n.data("record"))}})},Kanboard.Gantt.prototype.updateDataAndPosition=function(t,e){var n=jQuery("div.ganttview-slide-container",this.options.container),o=n.scrollLeft(),a=t.offset().left-n.offset().left-1+o,i=t.data("record");i.not_defined=!1,this.setBarColor(t,i);var r=Math.round(a/this.options.cellWidth),d=this.addDays(this.cloneDate(e),r);i.start=d;var s=t.outerWidth(),l=Math.round(s/this.options.cellWidth)-1;i.end=this.addDays(this.cloneDate(d),l),"task"===i.type&&l>0&&jQuery("div.ganttview-block-text",t).text(i.progress),t.attr("title",this.getBarTooltip(i)),t.data("record",i),t.css("top","").css("left","").css("position","relative").css("margin-left",a+"px")},Kanboard.Gantt.prototype.getDates=function(t,e){var n=[];n[t.getFullYear()]=[],n[t.getFullYear()][t.getMonth()]=[t];for(var o=t;this.compareDate(o,e)==-1;){var a=this.addDays(this.cloneDate(o),1);n[a.getFullYear()]||(n[a.getFullYear()]=[]),n[a.getFullYear()][a.getMonth()]||(n[a.getFullYear()][a.getMonth()]=[]),n[a.getFullYear()][a.getMonth()].push(a),o=a}return n},Kanboard.Gantt.prototype.prepareData=function(t){for(var e=0;ee?1:0;throw new TypeError(t+" - "+e)},Kanboard.Search=function(t){this.app=t},Kanboard.Search.prototype.focus=function(){$(document).on("focus","#form-search",function(){var t=$("#form-search");if(t[0].setSelectionRange){var e=2*t.val().length;t[0].setSelectionRange(e,e)}})},Kanboard.Search.prototype.listen=function(){$(document).on("click",".filter-helper",function(t){t.preventDefault();var e=$(this).data("filter"),n=$(this).data("append-filter"),o=$(this).data("unique-filter"),a=$("#form-search");if(o){var i=o.substr(0,o.indexOf(":"));e=a.val().replace(new RegExp("("+i+":[#a-z0-9]+)","g"),""),e=e.replace(new RegExp("("+i+':"(.+)")',"g"),""),e=e.trim(),e+=" "+o}else n&&(e=a.val()+" "+n);a.val(e),$("form.search").submit()})},Kanboard.Subtask=function(t){this.app=t},Kanboard.Subtask.prototype.listen=function(){var t=this;this.dragAndDrop(),$(document).on("click",".subtask-toggle-status",function(e){var n=$(this);e.preventDefault(),$.ajax({cache:!1,url:n.attr("href"),success:function(e){n.hasClass("subtask-refresh-table")?$(".subtasks-table").replaceWith(e):n.replaceWith(e),t.dragAndDrop()}})}),$(document).on("click",".subtask-toggle-timer",function(e){var n=$(this);e.preventDefault(),$.ajax({cache:!1,url:n.attr("href"),success:function(e){$(".subtasks-table").replaceWith(e),t.dragAndDrop()}})})},Kanboard.Subtask.prototype.dragAndDrop=function(){var t=this;$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".subtasks-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(t,e){return e.children().each(function(){$(this).width($(this).width())}),e},stop:function(e,n){var o=n.item;o.removeClass("draggable-item-selected"),t.savePosition(o.data("subtask-id"),o.index()+1)},start:function(t,e){e.item.addClass("draggable-item-selected")}}).disableSelection()},Kanboard.Subtask.prototype.savePosition=function(t,e){var n=$(".subtasks-table").data("save-position-url"),o=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({subtask_id:t,position:e}),complete:function(){o.app.hideLoadingIcon()}})},Kanboard.Swimlane=function(t){this.app=t},Kanboard.Swimlane.prototype.execute=function(){$(".swimlanes-table").length&&this.dragAndDrop()},Kanboard.Swimlane.prototype.listen=function(){var t=this;$(document).on("click",".board-swimlane-toggle",function(e){e.preventDefault();var n=$(this).data("swimlane-id");t.isCollapsed(n)?t.expand(n):t.collapse(n)})},Kanboard.Swimlane.prototype.onBoardRendered=function(){for(var t=this.getAllCollapsed(),e=0;e-1&&e.splice(n,1),localStorage.setItem(this.getStorageKey(),JSON.stringify(e)),$(".board-swimlane-columns-"+t).css("display","table-row"),$(".board-swimlane-tasks-"+t).css("display","table-row"),$(".hide-icon-swimlane-"+t).css("display","inline"),$(".show-icon-swimlane-"+t).css("display","none")},Kanboard.Swimlane.prototype.collapse=function(t){var e=this.getAllCollapsed();e.indexOf(t)<0&&(e.push(t),localStorage.setItem(this.getStorageKey(),JSON.stringify(e))),$(".board-swimlane-columns-"+t+":not(:first-child)").css("display","none"),$(".board-swimlane-tasks-"+t).css("display","none"),$(".hide-icon-swimlane-"+t).css("display","none"),$(".show-icon-swimlane-"+t).css("display","inline")},Kanboard.Swimlane.prototype.isCollapsed=function(t){return this.getAllCollapsed().indexOf(t)>-1},Kanboard.Swimlane.prototype.getAllCollapsed=function(){return JSON.parse(localStorage.getItem(this.getStorageKey()))||[]},Kanboard.Swimlane.prototype.dragAndDrop=function(){var t=this;$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".swimlanes-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(t,e){return e.children().each(function(){$(this).width($(this).width())}),e},stop:function(e,n){var o=n.item;o.removeClass("draggable-item-selected"),t.savePosition(o.data("swimlane-id"),o.index()+1)},start:function(t,e){e.item.addClass("draggable-item-selected")}}).disableSelection()},Kanboard.Swimlane.prototype.savePosition=function(t,e){var n=$(".swimlanes-table").data("save-position-url"),o=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({swimlane_id:t,position:e}),complete:function(){o.app.hideLoadingIcon()}})},Kanboard.Task=function(t){this.app=t},Kanboard.Task.prototype.onPopoverOpened=function(){var t=this;t.renderColorPicker(),$(document).on("click",".assign-me",function(t){var e=$(this).data("current-id"),n="#"+$(this).data("target-id");t.preventDefault(),$(n+" option[value="+e+"]").length&&$(n).val(e)})},Kanboard.Task.prototype.renderColorPicker=function(){function t(t){return $('
    '+t.text+"
    ")}$(".color-picker").select2({ minimumResultsForSearch:1/0,templateResult:t,templateSelection:t})},Kanboard.Tooltip=function(t){this.app=t},Kanboard.Tooltip.prototype.onBoardRendered=function(){this.execute()},Kanboard.Tooltip.prototype.execute=function(){$(".tooltip").tooltip({track:!1,show:!1,hide:!1,position:{my:"left-20 top",at:"center bottom+9",using:function(t,e){$(this).css(t);var n=e.target.left+e.target.width/2-e.element.left-20;$("
    ").addClass("tooltip-arrow").addClass(e.vertical).addClass(n<1?"align-left":"align-right").appendTo(this)}},content:function(){var t=this,e=$(this).attr("data-href");return e?($.get(e,function(e){var n=$(".ui-tooltip:visible");$(".ui-tooltip-content:visible").html(e),n.css({top:"",left:""}),n.children(".tooltip-arrow").remove();var o=$(t).tooltip("option","position");o.of=$(t),n.position(o)}),''):'
    '+$(this).attr("title")+"
    "}}).on("mouseenter",function(){var t=this;$(this).tooltip("open"),$(".ui-tooltip").on("mouseleave",function(){$(t).tooltip("close")})}).on("mouseleave focusout",function(t){t.stopImmediatePropagation();var e=this;setTimeout(function(){$(".ui-tooltip:hover").length||$(e).tooltip("close")},100)})},Kanboard.BoardDragAndDrop=function(t){this.app=t,this.savingInProgress=!1},Kanboard.BoardDragAndDrop.prototype.execute=function(){this.app.hasId("board")&&(this.dragAndDrop(),this.executeListeners())},Kanboard.BoardDragAndDrop.prototype.dragAndDrop=function(){var t=this,e=$(".board-task-list"),n={forcePlaceholderSize:!0,tolerance:"pointer",connectWith:".sortable-column",placeholder:"draggable-placeholder",items:".draggable-item",stop:function(e,n){var o=n.item,a=o.attr("data-task-id"),i=o.attr("data-position"),r=o.attr("data-column-id"),d=o.attr("data-swimlane-id"),s=o.parent().attr("data-column-id"),l=o.parent().attr("data-swimlane-id"),c=o.index()+1;o.removeClass("draggable-item-selected"),s==r&&l==d&&c==i||(t.changeTaskState(a),t.save(a,r,s,c,l))},start:function(t,e){e.item.addClass("draggable-item-selected"),e.placeholder.height(e.item.height())}};isMobile.any&&($(".task-board-sort-handle").css("display","inline"),n.handle=".task-board-sort-handle"),e.each(function(){$(this).css("min-height",$(this).parent().height())}),e.sortable(n)},Kanboard.BoardDragAndDrop.prototype.changeTaskState=function(t){var e=$("div[data-task-id="+t+"]");e.addClass("task-board-saving-state"),e.find(".task-board-saving-icon").show()},Kanboard.BoardDragAndDrop.prototype.save=function(t,e,n,o,a){var i=this;i.app.showLoadingIcon(),i.savingInProgress=!0,$.ajax({cache:!1,url:$("#board").data("save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:t,src_column_id:e,dst_column_id:n,swimlane_id:a,position:o}),success:function(t){i.refresh(t),i.savingInProgress=!1},error:function(){i.app.hideLoadingIcon(),i.savingInProgress=!1},statusCode:{403:function(t){window.alert(t.responseJSON.message),document.location.reload(!0)}}})},Kanboard.BoardDragAndDrop.prototype.refresh=function(t){$("#board-container").replaceWith(t),this.app.hideLoadingIcon(),this.dragAndDrop(),this.executeListeners()},Kanboard.BoardDragAndDrop.prototype.executeListeners=function(){for(var t in this.app.controllers){var e=this.app.get(t);"function"==typeof e.onBoardRendered&&e.onBoardRendered()}};var _KB=null;jQuery(document).ready(function(){_KB=new Kanboard.App,_KB.execute()}); \ No newline at end of file diff --git a/assets/js/components/chart-project-burndown.js b/assets/js/components/chart-project-burndown.js index abcab9251..d94b35508 100644 --- a/assets/js/components/chart-project-burndown.js +++ b/assets/js/components/chart-project-burndown.js @@ -8,25 +8,24 @@ KB.component('chart-project-burndown', function (containerElement, options) { var outputFormat = d3.time.format(options.dateFormat); for (var i = 0; i < metrics.length; i++) { - for (var j = 0; j < metrics[i].length; j++) { + var currentValue = metrics[i][j]; if (i === 0) { - columns.push([metrics[i][j]]); - } else { - columns[j + 1].push(metrics[i][j]); - if (j > 0) { + columns.push([currentValue]); + } + } else { + if (j > 0) { + columns[j].push(currentValue); - if (columns[0][i] === undefined) { + if (typeof columns[0][i] === 'undefined') { columns[0].push(0); } - columns[0][i] += metrics[i][j]; - } - - if (j === 0) { - categories.push(outputFormat(inputFormat.parse(metrics[i][j]))); + columns[0][i] += currentValue; + } else { + categories.push(outputFormat(inputFormat.parse(currentValue))); } } } diff --git a/assets/js/components/chart-project-cumulative-flow.js b/assets/js/components/chart-project-cumulative-flow.js index 7b258230b..9a8e66597 100644 --- a/assets/js/components/chart-project-cumulative-flow.js +++ b/assets/js/components/chart-project-cumulative-flow.js @@ -9,21 +9,19 @@ KB.component('chart-project-cumulative-flow', function (containerElement, option var outputFormat = d3.time.format(options.dateFormat); for (var i = 0; i < metrics.length; i++) { - for (var j = 0; j < metrics[i].length; j++) { + var currentValue = metrics[i][j]; if (i === 0) { - columns.push([metrics[i][j]]); - if (j > 0) { - groups.push(metrics[i][j]); + groups.push(currentValue); + columns.push([currentValue]); } } else { - - columns[j].push(metrics[i][j]); - - if (j === 0) { - categories.push(outputFormat(inputFormat.parse(metrics[i][j]))); + if (j > 0) { + columns[j - 1].push(currentValue); + } else { + categories.push(outputFormat(inputFormat.parse(currentValue))); } } } @@ -33,9 +31,14 @@ KB.component('chart-project-cumulative-flow', function (containerElement, option c3.generate({ data: { - columns: columns, + // Example: [["Column1", 1, 2, 3], ["Column2", 1, 2, 3]] + // Note: values are reversed to make sure the columns are stacked in the right order + columns: columns.reverse(), type: 'area-spline', - groups: [groups] + groups: [groups], + + // Note: Use specified order otherwise C3js reorder series + order: null }, axis: { x: { diff --git a/doc/en_US/analytics.markdown b/doc/en_US/analytics.markdown index 8b37762e7..ac26ad434 100644 --- a/doc/en_US/analytics.markdown +++ b/doc/en_US/analytics.markdown @@ -1,5 +1,5 @@ -Analytics -========= +Project Analytics +================= Each project have an analytics section. Depending on how you are using Kanboard, you can see those reports: @@ -23,7 +23,9 @@ Cumulative flow diagram ![Cumulative flow diagram](screenshots/cfd.png) - This chart shows the number of tasks cumulatively for each column over the time. -- Every day, the total number of tasks is recorded for each column. +- The legend order is the same as the stack in the chart. +- The color of each column is determined automatically. +- Every day, the number of tasks is recorded for each column. - If you would like to exclude closed tasks, change the [global project settings](project-configuration.markdown). Note: You need to have at least two days of data to see the graph. diff --git a/doc/fr_FR/analytics-tasks.markdown b/doc/fr_FR/analytics-tasks.markdown index 40b4e2f2f..a7ec9d9ed 100644 --- a/doc/fr_FR/analytics-tasks.markdown +++ b/doc/fr_FR/analytics-tasks.markdown @@ -1,10 +1,10 @@ -Analytique des tâches -=================== +Statistiques pour les tâches +============================ Chaque tâche possède une section analytique accessible à partir du menu à gauche dans la page des tâches Lead et cycle time -------------------- +------------------ ![Lead and cycle time](screenshots/task-lead-cycle-time.png) @@ -16,7 +16,7 @@ Lead et cycle time Remarque : vous pouvez configurer une action pour définir automatiquement que la date de départ sera le moment où vous déplacez une tâche vers une colonne de votre choix Temps passé dans chaque colonne ---------------------------- +-------------------------------- ![Temps passé dans chaque colonne](screenshots/time-into-each-column.png) diff --git a/doc/fr_FR/analytics.markdown b/doc/fr_FR/analytics.markdown index 40944414d..59ead1368 100644 --- a/doc/fr_FR/analytics.markdown +++ b/doc/fr_FR/analytics.markdown @@ -1,35 +1,36 @@ -Analytique -========= +Statistiques pour les projets +============================= Chaque projet dispose d'une section analytique. En fonction de la façon dont vous utilisez Kanboard, vous pourrez voir les rapports suivants : Répartition des utilisateurs ----------------- +---------------------------- ![Répartition des utilisateurs](screenshots/user-repartition.png) Ce graphique circulaire affiche le nombre de tâches assignées par utilisateur. Distribution des tâches ------------------ +----------------------- ![Distribution des tâches](screenshots/task-distribution.png) Ce graphique circulaire donne une vue d'ensemble du nombre de tâches ouvertes par colonne. Diagramme de flux cumulé ------------------------ +------------------------ ![Diagramme de flux cumulé](screenshots/cfd.png) - Ce graphique affiche le nombre de tâches de façon cumulée pour chaque colonne en fonction du temps passé. +- La légende montre l'ordre de la pile. - Chaque jour, le nombre total de tâches est enregistré pour chaque colonne. - Si vous souhaitez exclure les tâches terminées, modifiez les [paramètres du projet global](project-configuration.markdown). Remarque : il faut au moins deux jours de données pour que le graphique apparaisse. Graphique d'avancement --------------- +---------------------- ![Graphique d'avancement](screenshots/burndown-chart.png) @@ -40,7 +41,7 @@ Un [graphique d'avancement](http://en.wikipedia.org/wiki/Burn_down_chart) est di - Chaque jour, la somme des estimations pour chaque colonne est calculée. Temps moyen passé pour chaque colonne ------------------------------------ +------------------------------------- ![Temps moyen passé pour chaque colonne](screenshots/average-time-spent-into-each-column.png) @@ -50,7 +51,7 @@ Ce graphique affiche le temps moyen passé pour chaque colonne pour les 1000 der - Le temps passé est calculé jusqu'à la fin de la tâche. Temps moyen de Lead et Cycle ---------------------------- +---------------------------- ![Temps moyen passé pour chaque colonne](screenshots/average-lead-cycle-time.png) @@ -63,7 +64,7 @@ Ce graphique affiche le temps moyen de lead et cycle pour les 1000 dernières t Ces métriques sont calculées et enregistrées chaque jour pour l'ensemble du projet. N'oubliez pas de lancer chaque jour le calcul statistique -------------------------------------------------------- +--------------------------------------------------------- Pour générer des données analytique précises, vous devriez lancer chaque jour le cronjob **statistiques quotidiennes du projet**. diff --git a/doc/screenshots/cfd.png b/doc/screenshots/cfd.png index 19dd6522820ac3cce6bf63aa90437c95091d71aa..b30d065ec74cda4faf6baab7daa065b28a770557 100644 GIT binary patch literal 14463 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 Di8JPu literal 33143 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 jA)b|xg#kmCsHJ&|M`CbCt9}W