diff --git a/module/bug/control.php b/module/bug/control.php
index d337da3ca3..47a8720a61 100644
--- a/module/bug/control.php
+++ b/module/bug/control.php
@@ -141,7 +141,7 @@ class bug extends control
/* Set view. */
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->bug->common;
- $this->view->position[] = html::a($this->createLink('bug', 'browse', "productID=$productID"), $this->products[$productID]);
+ $this->view->position[] = html::a($this->createLink('bug', 'browse', "productID=$productID"), $this->products[$productID],'','title=' . $this->products[$productID]);
$this->view->position[] = $this->lang->bug->common;
$this->view->productID = $productID;
$this->view->product = $this->product->getById($productID);
@@ -1542,7 +1542,8 @@ class bug extends control
$bug->closedDate = substr($bug->closedDate, 0, 10);
$bug->resolvedDate = substr($bug->resolvedDate, 0, 10);
$bug->lastEditedDate = substr($bug->lastEditedDate, 0, 10);
-
+ $bug->title = htmlspecialchars_decode($bug->title,ENT_QUOTES);
+
if($bug->linkBug)
{
$tmpLinkBugs = array();
diff --git a/module/bug/js/common.js b/module/bug/js/common.js
index ae663bc6ee..89d2ec866c 100644
--- a/module/bug/js/common.js
+++ b/module/bug/js/common.js
@@ -426,12 +426,14 @@ function setStories(moduleID, productID)
function loadProductBranches(productID)
{
$('#branch').remove();
+ $('#branch_chosen').remove();
$.get(createLink('branch', 'ajaxGetBranches', "productID=" + productID), function(data)
{
if(data)
{
$('#product').closest('.input-group').append(data);
$('#branch').css('width', page == 'create' ? '120px' : '65px');
+ $('#branch').chosen();
}
})
}
diff --git a/module/bug/js/create.js b/module/bug/js/create.js
index d7819dfcbe..87fe6176a9 100644
--- a/module/bug/js/create.js
+++ b/module/bug/js/create.js
@@ -9,7 +9,7 @@ function loadAllUsers()
var link = createLink('bug', 'ajaxLoadAllUsers', 'selectedUser=' + $('#assignedTo').val());
$.get(link, function(data)
{
- if (data)
+ if(data)
{
var moduleID = $('#module').val();
var productID = $('#product').val();
diff --git a/module/project/css/kanban.css b/module/project/css/kanban.css
index 23e10bd67c..c9ccad2451 100644
--- a/module/project/css/kanban.css
+++ b/module/project/css/kanban.css
@@ -16,7 +16,7 @@
.board.drop-to .board-drag-holder {display: block;}
.board-item + .board-drag-holder {margin-top: 10px;}
.board-item.dragging {opacity: .35;}
-.board-item .btn {padding: 2px 10px 2px 23px; font-size: 12px; position: relative; left: -2px;}
+.board-item .btn {padding: 2px 10px 2px 23px; font-size: 12px; position: relative; left: -2px; height: 24px;}
.board-item .btn-icon-left > .icon {width: 22px; height: 22px; line-height: 20px; font-size: 14px; opacity: 1; top: 1px}
.board-item .btn-icon-left > span {max-width: 80px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; display: inline-block;}
#kanban {overflow-y: auto}
diff --git a/module/project/js/burn.js b/module/project/js/burn.js
index 856d8f544f..5fd1d27675 100644
--- a/module/project/js/burn.js
+++ b/module/project/js/burn.js
@@ -6,3 +6,25 @@ $(function()
location.href = createLink('project', 'burn', 'projectID=' + projectID + '&type=' + type + '&interval=' + $(this).val());
});
})
+
+/* Save burn as image.*/
+function downloadBurn()
+{
+ var canvas = $('#burnCanvas');
+ var type = 'png';
+ var imgSrc = canvas.get(0).toDataURL("image/png");
+ imgData = imgSrc.replace(type,'image/octet-stream');
+ var filename = 'burn.' + type;
+ saveFile(imgData,filename);
+}
+
+var saveFile = function(data, filename)
+{
+ var saveLink = document.createElement('a');
+ saveLink.href = data;
+ saveLink.download = filename;
+
+ var event = document.createEvent('MouseEvents');
+ event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+ saveLink.dispatchEvent(event);
+};
diff --git a/module/project/js/kanban.js b/module/project/js/kanban.js
index 308a5277ce..b2cd1624e0 100644
--- a/module/project/js/kanban.js
+++ b/module/project/js/kanban.js
@@ -116,7 +116,7 @@ $(function()
$.cookie('selfClose', 0, {expires:config.cookieLife, path:config.webRoot});
if(selfClose == 1 || force)
{
- $kanban.load(location.href + ' #kanban', updateUI);
+ $kanban.load(location.href + ' #kanban>*', updateUI);
}
};
window.refreshKanban = refresh;
diff --git a/module/project/view/burn.html.php b/module/project/view/burn.html.php
index 8ba096bdf4..84b3303dce 100644
--- a/module/project/view/burn.html.php
+++ b/module/project/view/burn.html.php
@@ -30,6 +30,9 @@
+
lang->project->burn;?>
diff --git a/module/project/view/kanban.html.php b/module/project/view/kanban.html.php
index ee5823dd31..8a530afb40 100644
--- a/module/project/view/kanban.html.php
+++ b/module/project/view/kanban.html.php
@@ -14,8 +14,8 @@
createLink('project', 'ajaxKanbanSetting', "projectID=$projectID"), "
" . $lang->project->kanbanSetting, '', "class='iframe btn btn-link'");?>
createLink('project', 'printKanban', "projectID=$projectID"), "
" . $lang->project->printKanban, '', "class='iframe btn btn-link' id='printKanban' title='{$lang->project->printKanban}' data-width='500'");?>
createLink('task', 'export', "project=$projectID&orderBy=$orderBy&type=$browseType");
- if(common::hasPriv('task', 'export')) echo html::a($link, "
" . $lang->task->export, '', "class='btn btn-link iframe' data-width='700'");
+ $link = $this->createLink('task', 'export', "project=$projectID&orderBy=$orderBy&type=kanban");
+ if(common::hasPriv('task', 'export')) echo html::a($link, "
" . $lang->task->export, '', "class='btn btn-link iframe export' data-width='700'");
?>
').append(a)),i.$menu.append(a),i.$menu.removeClass("loading"),i.isLoaded=!0,e&&e(!0)},error:function(){i.$menu.removeClass("loading").append('
'+(n.errorText||window.lang&&window.lang.timeout)+"
"),e&&e(!1)}},n.ajax))},n.prototype.scrollTo=function(t){t.length&&t[0].scrollIntoView({behavior:"smooth"})},n.prototype.getItems=function(){return this.$.find(this.options.selector).addClass("search-list-item")},n.prototype.getActiveItem=function(){return this.getItems().filter(".active:first")},n.prototype.search=function(e){var n=this,s=void 0===e||null===e||""===e,o=n.getItems().removeClass("active");if(s)o.removeClass("hidden");else{var a=t.trim(e).split(" ");o.each(function(){var e=t(this),n=e.text()+" "+(e.data("key")||e.data("filter"));e.toggleClass("hidden",!i(a,n))})}n.scrollTo(o.not(".hidden").first().addClass("active"))},n.DEFAULTS={selector:".list-group a",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var s=t(this),o=s.data(e),a="object"==typeof i&&i;o||s.data(e,o=new n(this,a)),"string"==typeof i&&o[i]()})},n.NAME=e,t.fn.searchList.Constructor=n,t(function(){t('[data-ride="searchList"]').searchList()})}(jQuery),function(t){"use strict";var e="zui.labelSelector",i=function(n,s){var o=this;o.name=e,o.$=t(n),s=o.options=t.extend({},i.DEFAULTS,this.$.data(),s),o.$.hide(),o.update()};i.prototype.select=function(t){t+="",this.$wrapper.find(".label.active").removeClass("active"),this.$wrapper.find('.label[data-value="'+t+'"]').addClass("active"),this.$.val(t).trigger("change")},i.prototype.update=function(){var e=this,i=e.options,n=e.$wrapper;if(!n){if(i.wrapper)n=t(i.wrapper);else{var s=e.$.next();n=s.hasClass(".label-selector")?s:t('
')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),s=t(this).data("value");e.hasEmptyValue!==!1&&s==n&&(s=e.hasEmptyValue),e.select(s),i.preventDefault()})}n.empty();var o=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),s={label:e.text(),value:e.val()},a=""===s.value||"0"===s.value,r=t(i.labelTemplate||'
');i.labelClass&&!a&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",s).attr("data-value",s.value),a&&!s.label?r.addClass("empty").append('
'):r.text(s.label).toggleClass("active",o===s.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=function(n){return this.each(function(){var s=t(this),o=s.data(e),a="object"==typeof n&&n;o||s.data(e,o=new i(this,a)),"string"==typeof n&&o[n]()})},i.NAME=e,t.fn.labelSelector.Constructor=i,t(function(){t('[data-provide="labelSelector"]').labelSelector()})}(jQuery),function(t){"use strict";var e="zui.fileInput",i=t.BYTE_UNITS={B:1,KB:1024,MB:1048576,GB:1073741824,TB:1099511627776},n=t.formatBytes=function(t,e,n){return void 0===e&&(e=2),n||(n=t
a.fileMaxSize&&(h.val(""),(window.bootbox||window).alert(a.fileSizeError.format(n(a.fileMaxSize)))),r.update()}),r.update()};o.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},o.prototype.update=function(t){var e=this,i=e.$,s=e.getFile(),o=!s;i.toggleClass("normal",!o).toggleClass("empty",o),s?(e.oldName=s.name,i.find(".file-title").text(s.name).attr("title",s.name),i.find(".file-size").text(n(s.size)),i.find(".file-editbox").val(s.name).attr("size",s.name.length),e.options.onSelect&&e.options.onSelect(s,e)):i.find(".file-editbox").val("")},o.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),s=n.data(e),a="object"==typeof i&&i;s||n.data(e,s=new o(this,a)),"string"==typeof i&&s[i]()})},o.NAME=e,t.fn.fileInput.Constructor=o,t(function(){t('[data-provide="fileInput"]').fileInput()});var a="zui.fileInputList",r=function(e,i){var n=this;n.name=a;var s=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=s.find(".file-input").detach(),n.add()};r.prototype.add=function(){var t=this,e=t.options,i=t.$template.clone();"before"===e.appendWay?t.$.prepend(i):t.$.append(i),i.fileInput({fileMaxSize:e.eachFileMaxSize,fileSizeError:e.fileSizeError,onDelete:function(e){e.$.remove(),t.options.onDelete&&t.options.onDelete(e,t)},onSelect:function(e,i){t.add(),t.options.onSelect&&t.options.onSelect(e,i,t)}})},r.DEFAULTS={fileMaxSize:0,eachFileMaxSize:0,appendWay:"after",fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInputList=function(e){return this.each(function(){var i=t(this),n=i.data(a),s="object"==typeof e&&e;n||i.data(a,n=new r(this,s)),"string"==typeof e&&n[e]()})},r.NAME=a,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(t,e,n,s,o){if(s||(s=config.defaultView),o||(o=!1),n)for(n=n.split("&"),i=0;i'+d+"")}}t.val()||(time=e(o.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var a=t(this),r=t.extend({},i,a.data()),l=a.find('[name="begin"],.control-time-begin'),h=a.find('[name="end"],.control-time-end'),c=function(){var t=l.val();if(a.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);h.find('option[value="'+i+'"]').length&&h.val(i),r.onChange&&r.onChange(h,i)}};if(a.data("timeSpanControlInit")){if(r.begin){var d=s(r.begin).format("hh:mm");l.find('option[value="'+d+'"]').length&&l.val(d),r.onChange&&r.onChange(l,d)}if(r.end){var u=s(r.end).format("hh:mm");h.find('option[value="'+u+'"]').length&&h.val(u),r.onChange&&r.onChange(h,u)}}else l.on("change",c),o(l,r.begin),o(h,r.end),a.data("timeSpanControlInit",!0);r.end||c()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:o,createTime:s};var a=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var s=t("#searchTypeMenu");s.find("li.selected").removeClass("selected");var o=s.find('a[data-value="'+e+'"]'),a=o.text();o.parent().addClass("selected"),t("#searchTypeName").text(a),i||t("#searchInput").focus()};t.gotoObject=function(e,i){e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e&&(window.location.href=t.createLink(e,"testsuite"===e?"library":"view","id="+i))},t(function(){a(null,!0),t(document).on("keydown",function(e){e.ctrlKey&&71===e.keyCode&&(t("#searchInput").val("").focus(),e.stopPropagation(),e.preventDefault())})}),t.removeAnchor=window.removeAnchor=function(t){var e=t.lastIndexOf("#");return e>-1?t.substr(0,e):t},t.refreshPage=function(){location.href=removeAnchor(location.href)},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage()},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage()},t.chosenDefaultOptions={disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,drop_direction:function(){var e=t(this.container).closest(".table-responsive:not(.scroll-none)");if(e.length){if(this.drop_directionFixed)return this.drop_directionFixed;var i="down",n=this.container.find(".chosen-drop"),s=this.container.position(),o=n.outerHeight();return s.top>=o&&s.top+o ',"next_icon","last_icon"],onPageChange:function(e,i){e.recPerPage!==i.recPerPage&&t.cookie(this.options.pageCookie,e.recPerPage,{expires:config.cookieLife,path:config.webRoot}),e.recPerPage!==i.recPerPage&&(window.location.href=this.createLink())}}),t.zui.Messager.DEFAULTS.cssClass="messagger-zt",t.fn.reverseOrder=function(){return this.each(function(){var e=t(this);e.prependTo(e.parent())})};var r=function(e,i){var n=t(e);i=t.extend({},n.data(),i);var s=n.find(".histories-list"),o=!0,a=!1;n.on("click",".btn-reverse",function(){s.children("li").reverseOrder(),o=!o,t(this).find(".icon").toggleClass("icon-arrow-up",o).toggleClass("icon-arrow-down",!o)}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");a=!a,e.toggleClass("icon-plus",!a).toggleClass("icon-minus",a),s.children("li").toggleClass("show-changes",a)}).on("click",".btn-expand",function(){t(this).closest("li").toggleClass("show-changes")}).on("click",".btn-strip",function(){var e=t(this),n=e.find(".icon"),s=n.hasClass("icon-code");n.toggleClass("icon-code",!s).toggleClass("icon-text",s),e.attr("title",s?i.original:i.textdiff),e.closest("li").toggleClass("show-original",s)}),s.find(".btn-strip").attr("title",i.original);var r=n.find(".modal-comment").modal({show:!1}).on("shown.zui.modal",function(){var t=r.find("#comment");t.length&&(t.focus(),window.editor&&window.editor.comment&&window.editor.comment.focus())}).on("show.zui.modal",function(){var e=r.find("#comment");e.length&&!e.data("keditor")&&t.fn.kindeditor&&e.kindeditor()});n.on("click",".btn-comment",function(t){r.modal("toggle"),t.preventDefault()}).on("click",".btn-edit-comment,.btn-hide-form",function(){t(this).closest("li").toggleClass("show-form")});var l=n.find(".comment-edit-form");l.ajaxForm({success:function(t,e,i,n){setTimeout(function(){l.closest("li").removeClass("show-form")},2e3)}})};t.fn.histories=function(t){return this.each(function(){r(this,t)})},t(function(){t(".histories").histories()});var l=0,h=0;t.toggleSidebar=function(e){var i=t("#sidebar");if(i.length){var n=t("main");if(void 0===e)e=n.hasClass("hide-sidebar");else if(e&&!n.hasClass("hide-sidebar"))return;n.toggleClass("hide-sidebar",!e),clearTimeout(l),t.zui.store.set(h,e);var s=i.children(".cell"),o={overflow:"visible",maxHeight:"initial"};e?(i.addClass("showing"),l=setTimeout(function(){i.removeClass("showing"),i.trigger("sidebar.toggle",e)},210)):(i.trigger("sidebar.toggle",e),t(window).width()<1900&&(o={overflow:"hidden",maxHeight:t(window).height()-45})),s.css(o)}};var c=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;h="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(h,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var s=function(){var i=e.find(".sidebar-toggle");if(i.length){var n=i[0].getBoundingClientRect(),s=t(window).height(),o=Math.max(0,Math.floor(Math.min(s-40,n.top+n.height)-Math.max(n.top,0))/2)+(n.top<0?0-n.top:0);i.find(".icon").css("top",o)}};return s(),e.on("sidebar.toggle",s),t(window).on("resize",s).on("scroll",s),e.data("init",1),!0}};c()||t(c),t.toggleQueryBox=function(e,i){var n=t(i||"#queryBox");n.length&&(void 0===e&&(e=!n.hasClass("show")),n.toggleClass("show",!!e),n.data("init")||(n.addClass("load-indicator loading").data("init",1),t.get(t.createLink("search","buildForm"),function(t){n.html(t).removeClass("loading")})),t(".querybox-toggle").toggleClass("querybox-opened",e))},t(function(){var e=t("#queryBox");e.length&&(t(document).on("click",".querybox-toggle",function(){t.toggleQueryBox()}),e.hasClass("show")&&t.toggleQueryBox(!0))}),t.extend(t.fn.colorPicker.Constructor.DEFAULTS,{colors:["#3DA7F5","#75C941","#2DBDB2","#797EC9","#FFAF38","#FF4E3E"]}),window.setCheckedCookie=function(){var e=[],i=t('#mainContent .main-table tbody>tr input[type="checkbox"]:checked');i.each(function(){var i=parseInt(t(this).val(),10);NaN!==i&&e.push(i)}),t.cookie("checkedItem",e.join(","),{expires:config.cookieLife,path:config.webRoot})},t.extend(t.fn.modal.bs.Constructor.DEFAULTS,{scrollInside:!0,backdrop:"static",headerHeight:100}),t.extend(t.zui.ModalTrigger.DEFAULTS,{scrollInside:!0,backdrop:"static",headerHeight:40}),t.fn.initIframeModal=function(){return this.each(function(){var e=t(this);if(!e.parents('[data-ride="table"],.skip-iframe-modal').length){var i={type:"iframe"};e.hasClass("export")&&t.extend(i,{width:800,shown:setCheckedCookie}),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()});var d=function(){var e,i,n=t(this),s=t.extend({limitSize:40,suffix:"…"},n.data()),o=n.text();if(o.length>s.limitSize){e=o,i=o.substr(0,s.limitSize)+s.suffix,n.text(i).addClass("limit-text-on");var a=s.toggleBtn?t(s.toggleBtn):n.next(".text-limit-toggle");a.text(a.data("textExpand")),a.on("click",function(){var t=n.toggleClass("limit-text-on").hasClass("limit-text-on");n.text(t?i:e),a.text(a.data(t?"textExpand":"textCollapse"))})}else(s.toggleBtn?t(s.toggleBtn):n.next(".text-limit-toggle")).hide()};t.fn.textLimit=function(){return this.each(d)},t(function(){t(".text-limit").textLimit()}),t.fixedTableHead=window.fixedTableHead=function(e,i){var n=t(e);if(n.is("table")||(n=n.find("table")),n.length){var s=t(i||window),o=null,a=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),s=n.next(".fixed-head-table");if(i.top<0){var a=e.width();if(s.length){if(o!==a){o=a;var r=s.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var s=t("