From 0e9ad27f8e14289d4068dda8c20132b2ab4d9226 Mon Sep 17 00:00:00 2001 From: liyang <“liyang@easycorp.ltd”> Date: Sun, 17 Apr 2022 20:39:23 +0800 Subject: [PATCH 01/42] update projectproduct data --- test/data/projectproduct.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/data/projectproduct.yaml b/test/data/projectproduct.yaml index 9d047617a5..7d5dd08a45 100644 --- a/test/data/projectproduct.yaml +++ b/test/data/projectproduct.yaml @@ -7,6 +7,6 @@ fields: - field: product range: 1-100 - field: branch - range: 0 + range: 0{30},1-10:2,0{165} - field: plan range: 1-360:3 From 80ac96b791840411f538d00fee5f435e1793bec9 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 18 Apr 2022 09:19:34 +0800 Subject: [PATCH 02/42] * Fix bug #21770. --- module/api/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/api/model.php b/module/api/model.php index 4454e040a2..ff64cbdfbd 100644 --- a/module/api/model.php +++ b/module/api/model.php @@ -850,6 +850,6 @@ class apiModel extends model private function getDemoData($table, $version) { $file = $this->app->getAppRoot() . 'db' . DS . 'api' . DS . $version . DS . $table; - return unserialize(file_get_contents($file)); + return unserialize(preg_replace_callback('#s:(\d+):"(.*?)";#s', function($match){return 's:'.strlen($match[2]).':"'.$match[2].'";';}, file_get_contents($file))); } } From 0d78040d2a84272d1facc6172c9896f3f022bdd8 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 18 Apr 2022 10:02:51 +0800 Subject: [PATCH 03/42] * bug #13445, optimize severity label with value "0". --- www/js/zui/min.js | 4 ++-- www/theme/zui/css/min.css | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/www/js/zui/min.js b/www/js/zui/min.js index 7ef505846e..65d8a5839c 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-13 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-18 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT @@ -76,5 +76,5 @@ function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"= */ function(t){function e(e){if("string"==typeof e.data){var i=e.handler,n=e.data.toLowerCase().split(" ");e.handler=function(e){if(this===e.target||!/textarea|select/i.test(e.target.nodeName)&&"text"!==e.target.type){var o="keypress"!==e.type&&t.hotkeys.specialKeys[e.which],a=String.fromCharCode(e.which).toLowerCase(),s="",r={};e.altKey&&"alt"!==o&&(s+="alt+"),e.ctrlKey&&"ctrl"!==o&&(s+="ctrl+"),e.metaKey&&!e.ctrlKey&&"meta"!==o&&(s+="meta+"),e.shiftKey&&"shift"!==o&&(s+="shift+"),o?r[s+o]=!0:(r[s+a]=!0,r[s+t.hotkeys.shiftNums[a]]=!0,"shift+"===s&&(r[t.hotkeys.shiftNums[a]]=!0));for(var l=0,c=n.length;l","/":"?","\\":"|"}},t.each(["keydown","keyup","keypress"],function(){t.event.special[this]={add:e}})}(jQuery),function(t,e,i){"use strict";var n="zui.picker",o={},a={lang:null,remote:null,remoteConverter:null,remoteOnly:!1,onRemoteError:null,disableEmptySearch:!1,textKey:"text",valueKey:"value",keysKey:"keys",multi:"auto",formItem:"auto",list:null,allowSingleDeselect:null,autoSelectFirst:!1,maxSelectedCount:0,maxListCount:50,hideEmptyTextOption:!0,searchValueKey:!0,emptyResultHint:null,hideOnScroll:!0,inheritFormItemClasses:!1,emptySearchResultHint:null,accurateSearchHint:null,remoteErrorHint:null,deleteByBackspace:!0,disableScrollOnShow:!0,maxDropHeight:250,dropDirection:"auto",dropWidth:"100%",maxAutoDropWidth:450,multiValueSplitter:",",multiSelectActions:5,searchDelay:200,autoClearDrop:6e4,fixLabelFor:!0,hotkey:!0,onSelect:null,onDeselect:null,onBeforeChange:null,onChange:null,onReady:null,onNoResults:null,onShowingDrop:null,onHidingDrop:null,onShowedDrop:null,onHiddenDrop:null,valueMustInList:!0},s={zh_cn:{emptyResultHint:"没有可选项",emptySearchResultHint:"没有找到 “{0}”",accurateSearchHint:"请提供更多关键词缩小匹配范围",remoteErrorHint:"无法从服务器获取结果 - {0}",selectAll:"全选",deselectAll:"取消选择"},zh_tw:{emptyResultHint:"沒有可選項",emptySearchResultHint:"沒有找到 “{0}”",accurateSearchHint:"請提供更多關鍵詞縮小匹配範圍",remoteErrorHint:"無法從服務器獲取結果 - {0}",selectAll:"全選",deselectAll:"取消選擇"},en:{emptyResultHint:"No options",emptySearchResultHint:'Cannot found "{0}"',accurateSearchHint:"Suggest to provide more keywords",remoteErrorHint:"Unable to get result from server: {0}",selectAll:"Select all",deselectAll:"Deselect all"}},r=function(o,a){var l=this;l.name=n,l.$=t(o),l.id="pk_"+(l.$.attr("id")||t.zui.uuid()),a=l.options=t.extend({},r.DEFAULTS,this.$.data(),a),void 0!==a.hideOnWindowScroll&&(a.hideOnScroll=a.hideOnWindowScroll);var c=t.zui.clientLang?t.zui.clientLang():"en",h=a.lang||c;l.lang=t.zui.getLangData?t.zui.getLangData(n,h,s):s[h]||s[c];var d,u,p=a.formItem,f='.form-item,input[type="hidden"],select,input[type="text"]';if(d="self"===p?l.$:"auto"!==p&&p?l.$.find(p):l.$.is(f)?l.$:l.$.find(f).first(),!d.length)return console.error&&console.error("Cannot found form item for picker.");if(d.is('input[type="hidden"]'))u="hidden";else if(d.is("select"))u="select";else{if(!d.is('input[type="text"]'))return console.error&&console.error("Unknown form type for picker.");u="text"}a.inheritFormItemClasses&&v.addClass(d.attr("class")),l.formType=u,l.$formItem=d.removeClass("picker").hide(),l.selfFormItem=d.is(l.$);var g=a.multi;g&&"auto"!==g||(g="select"===u&&"multiple"===d.attr("multiple")),g=!!g,l.multi=g;var m=a.list;m?l.setList("function"==typeof m?m({search:l.search,limit:a.maxListCount}):m,!0):"select"===u?l.updateFromSelect():l.setList([],!0);var v;v=!l.selfFormItem&&l.$.hasClass("picker")?l.$:t('
').insertAfter(l.$),v.addClass("picker").toggleClass("picker-multi",g).toggleClass("picker-single",!g);var y=v.children(".picker-selections");y.length?y.empty():y=t('
');var b=l.id+"-search",w=t('').appendTo(y);if(!g){var x=t('
');a.allowSingleDeselect&&x.append(''),x.appendTo(y),l.$singleSelection=x}v.toggleClass("picker-input-empty",!w.val().length).append(y),l.$container=v,l.$selections=y,l.$search=w,l.search="";var C=a.placeholder;if(void 0===C&&(C=d.attr("placeholder")),"string"==typeof C&&C.length&&y.append(t('
').text(C)),a.placeholder=C,a.fixLabelFor){var _=d.attr("id");_&&t('label[for="'+_+'"]').attr("for",b)}var k=void 0!==a.defaultValue?a.defaultValue:d.val();if(l.setValue(k,!0),w.on("focus",function(){l._blurTimer&&(clearTimeout(l._blurTimer),l._blurTimer=0),v.addClass("picker-focus"),l.showDropList()}).on("blur",function(){l._blurTimer&&clearTimeout(l._blurTimer),l._blurTimer=setTimeout(function(){l._blurTimer=0,w.is(":focus")||v.removeClass("picker-focus")},100)}).on("input change",function(){var t=w.val();g&&w.width(14*t.length),v.toggleClass("picker-input-empty",!t.length),l.tryUpdateList(t)}),a.hotkey&&w.on("keydown",function(t){var e=t.key||t.which;if(l.dropListShowed){var i=l.activeValue,n="string"==typeof i;if("Enter"===e||13===e)n&&(l.select(i,g),g?(l.$search.val(""),l.tryUpdateList("")):w.blur(),t.preventDefault());else if("ArrowDown"===e||40===e){var o,s=l.$activeOption;if(s&&(o=s.next(".picker-option"),g))for(;o.length&&o.hasClass("picker-option-selected");)o=o.next(".picker-option");o&&o.length||(o=l.$optionsList.children(g?".picker-option:not(.picker-option-selected)":".picker-option").first()),o.length&&l.activeOption(o),t.preventDefault()}else if("ArrowUp"===e||30===e){var r,s=l.$activeOption;if(s&&(r=s.prev(".picker-option"),g))for(;r.length&&r.hasClass("picker-option-selected");)r=r.prev(".picker-option");r&&r.length||(r=l.$optionsList.children(g?".picker-option:not(.picker-option-selected)":".picker-option").last()),r.length&&l.activeOption(r),t.preventDefault()}else"Escape"===e||27===e?l.hideDropList(!0):a.deleteByBackspace&&g&&("Backspace"===e||8===e)&&l.value&&l.value.length&&!w.val().length&&l.deselect(l.value[l.value.length-1])}}),g){y.on("mousedown",function(t){if(l.dropListShowed)return t.preventDefault(),void t.stopPropagation()}).on("mouseup",function(e){y.hasClass("sortable-sorting")||t(e.target).closest(".picker-selection-remove").length||l.dropListShowed||l.focus()});var T=a.sortValuesByDnd;if(T&&t.fn.sortable){v.addClass("picker-sortable");var S={selector:".picker-selection",stopPropagation:!0,start:function(){l.hideDropList(!0)},finish:function(e){var i=[];t.each(e.list,function(t,e){i.push(e.item.data("value"))}),l.setValue(i.slice(),!1,!0)}};"object"==typeof T&&t.extend(S,T),y.sortable(S)}}if(y.on("click",".picker-selection-remove",function(e){if(l.multi){var i=t(this).closest(".picker-selection");l.deselect(i.data("value"))}else l.deselect();e.stopPropagation()}),d.on("chosen:updated",function(){l.updateFromSelect(),l.setValue(d.val(),!0),l.updateList()}).on("chosen:activate",l.focus).on("chosen:open",l.showDropList).on("chosen:close",l.hideDropList),v.addClass("picker-ready"),t.zui.asap(function(){l.triggerEvent("ready",{picker:l},"","chosen:ready")}),!a.disableScrollOnShow){var D=a.hideOnScroll;D&&![e,i,!0].includes(D)&&t(D).on("scroll",this.handleParentScroll.bind(this))}};r.prototype.destroy=function(){var e=this,i=e.options;e.hideDropList(!0);var o=e.$search;o.off("focus blur input change"),i.hotkey&&o.off("keydown"),o.remove();var a=e.$selections;a.off("click"),e.multi&&a.off("mousedown mouseup"),a.remove();var s=e.$formItem;e.selectOptionsBackup&&(s.empty(),t.each(e.selectOptionsBackup,function(e,n){var o={value:n[i.valueKey]},a=n[i.keysKey];void 0!==a&&(o["data-"+i.keysKey]=a),s.append(t("
");i.$.addClass("load-indicator loading"),s.load(window.location.href+" #"+o,function(r){if(a===o)i.$.empty().html(s.children().html()),i.$.find('[data-ride="pager"]').pager();else{i.$.find("#"+o).empty().html(s.children().html());try{var l=t(r),c=l.find("#"+o).closest('[data-ride="table"],#'+a);if(c.length){var h=c.find(".table-statistic");h.length&&(i.defaultStatistic=h.html());var d=i.$.find('[data-ride="pager"]').data("zui.pager"),u=c.find('[data-ride="pager"]');d&&u.length&&d.set(u.data())}}catch(p){console.error(p)}}i.$.removeClass("load-indicator loading").trigger("beforeTableReload"),delete i.defaultStatistic,i.updateStatistic(),i.initModals(),i.$.datepickerAll();var f=i.$.find("tbody>tr"),g=!1;t.each(i.checkItems,function(t,e){e&&(i.checkRow(f.filter('[data-id="'+t+'"]'),!0,!0),g=!0)}),g&&i.updateCheckUI(),n.nested&&i.initNestedList(),i.$.trigger("tableReload");var m=t("#mainMenu>.btn-toolbar>.btn-active-text>.label");if(m.length){var u=i.$.find(".pager[data-rec-total]"),v=u.length?u.attr("data-rec-total"):i.getTable().find("tbody:first>tr:not(.table-children)").length;m.text(v)}e&&e(),n.afterReload&&n.afterReload()})},r.prototype.initModals=function(){var e=this,i=e.options,n=e.$.find(i.iframeModalTrigger);if(n.length){var o={type:"iframe",onHide:i.replaceId?function(){var n=t.cookie("selfClose");(1==n||i.hot)&&(t("#triggerModal").data("cancel-reload",1),e.reload(function(){t.cookie("selfClose",0)}))}:null};n.modalTrigger(o)}},r.prototype.getTable=function(){var t=this.$;if(this.isDataTable)return t.find("div.datatable");var e=t.is("table")?t:t.find("table:not(.fixed-header-copy)").first();return e.is(".datatable")&&(this.isDataTable=!0,e.data("zui.datatable")||window.initDatatable(e),e=t.find("div.datatable")),e},r.prototype.toggleGroups=function(e){var i=this,n={};i.$.find("tbody>tr").each(function(){var o=t(this).closest("tr").data("id");n[o]||i.toggleRowGroup(o,e)})},r.prototype.toggleRowGroup=function(i,n){var o=this.$.find('tbody>tr[data-id="'+i+'"]'),a=o.filter(".group-summary"),s=n===e?!a.hasClass("hidden"):!!n;o.not(".group-summary").toggleClass("hidden",!s),a.toggleClass("hidden",s),t("body").toggleClass("table-group-collapsed",!this.$.find("tbody>tr.group-summary.hidden").length)},r.prototype.updateStatistic=function(){var i=this,n=i.$.find(".table-statistic");if(n.length){if(i.defaultStatistic===e&&(i.defaultStatistic=n.html()),i.options.statisticCreator)return void n.html(i.options.statisticCreator(i)||i.defaultStatistic);var o=i.statisticCols;if(!o&&o!==!1){o={};var a=!1;i.getTable().find("thead th").each(function(e){var i=t(this),n=i.data("statistic");n&&(a=!0,o[e]={format:n,name:i.text()})}),i.statisticCols=!!a&&o}var s=0;o&&t.each(o,function(t){o[t].total=0,o[t].checkedTotal=0}),i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr").each(function(){var e=t(this),i=e.hasClass("checked"),n=e.children("td");i&&s++,o&&t.each(o,function(t){var e=parseFloat(n.eq(t).text());isNaN(e)&&(e=0),o[t].total+=e,i&&(o[t].checkedTotal+=e)})});var r=[];if(s)r.push(i.lang.selectedItems.format(s));else if(i.defaultStatistic)return void n.html(i.defaultStatistic);o&&t.each(o,function(t){var e=o[t],n=e[s?"checkedTotal":"total"];e.format&&(n=e.format.format(n)),r.push(i.lang.attrTotal.format(e.name,n))}),n.html(r.join(", "))}},r.prototype.updateFixUI=function(e){var i=this,n=(new Date).getTime();if(!e&&(i.lastUpdateCall&&clearTimeout(i.lastUpdateCall),!i.lastUpdateTime||n-i.lastUpdateTime
').append(t('
').addClass(i.attr("class")).append(n.clone())).insertAfter(i)),h){var d=c[0].getBoundingClientRect();l.css({left:d.left,width:c.width(),overflow:"hidden"}),l.find(".fixed-header-copy").css({left:o.left-d.left,position:"relative",minWidth:i.width()}),a||c.data("fixHeaderScroll")||(c.data("fixHeaderScroll",1),i.width()>c.width()&&c.on("scroll",function(){e.fixHeader()}))}else l.css({left:o.left,width:o.width});var u=l.find("th");n.find("th").each(function(e){u.eq(e).css("width",t(this).outerWidth())})}else l.remove()},r.prototype.fixFooter=function(){var e,i=this,n=i.getTable(),o=i.$.find(".table-footer");if(i.isDataTable)e=n[0].getBoundingClientRect();else{var a=n.find("tbody");if(!a.length)return;e=a[0].getBoundingClientRect()}var s=i.options.fixFooter;o.toggleClass("fixed-footer",!!r);var r="function"==typeof s?s(e,o):e.bottom>window.innerHeight-50-("number"==typeof s?s:i.pageFooterHeight||5);o.toggleClass("fixed-footer",!!r),n.toggleClass("with-footer-fixed",!!r),n.trigger("fixFooter",r);var l=t("body"),c=l.hasClass("body-modal");if(r){var h=n.parent(),d=h.is(".table-responsive");o.css({bottom:i.pageFooterHeight||0,left:d?h[0].getBoundingClientRect().left:e.left,width:d?h.width():e.width}),c&&l.css("padding-bottom",40)}else o.css({width:"",left:0,bottom:0}),c&&l.css("padding-bottom",0)},r.prototype.checkAll=function(e){var i=this,n=i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr");n.each(function(){i.checkRow(t(this),e,!0)}),i.updateCheckUI()},r.prototype.checkRow=function(i,n,o){var a=this,s=a.getTable();a.isDataTable&&!i.is(".datatable-row-left")&&(i=s.find('.datatable-row-left[data-index="'+i.data("index")+'"]'));var r=i.find('input[type="checkbox"]');if(r.length&&!r.is(":disabled")){n===e&&(n=!r.is(":checked")),a.isDataTable?s.find('.datatable-row[data-index="'+i.data("index")+'"]').toggleClass("checked",n):i.toggleClass("checked",n);var l=i.data("id");this.checkItems[l]=n,r.prop("checked",n).trigger("change"),o||(i.hasClass("table-parent")&&s.find((a.isDataTable?".fixed-left ":"")+"tbody>tr.parent-"+l).each(function(){a.checkRow(t(this),n,!0)}),a.updateCheckUI())}},r.prototype.updateCheckUI=function(){var e=this,i=e.getTable(),n=i.find(e.isDataTable?".fixed-left tbody>tr":"tbody>tr").not(".group-summary"),o=!1,a=null,s=0,r=!1,l=n.length;n.each(function(n){var c=t(this),h=c.find('input[type="checkbox"]');if(!h.length)return void l--;r=h.is(":checked");var d=e.isDataTable?i.find('.datatable-row[data-index="'+c.data("index")+'"]'):c;d.toggleClass("checked",r),d.toggleClass("row-check-begin",r&&!o),a&&a.toggleClass("row-check-end",!r&&o),r&&(s+=1),a=d,o=r,l===n+1&&d.toggleClass("row-check-end",r)}),e.$.toggleClass("has-row-checked",s>0).find(".check-all").toggleClass("checked",!(!l||s!==l)),e.updateStatistic(),e.options.onCheckChange&&e.options.onCheckChange(),i.trigger("checkChange")},r.DEFAULTS={checkable:!0,checkOnClickRow:!0,ajaxForm:!1,selectable:!0,fixHeader:!a,fixFooter:!a,iframeWidth:900,replaceId:"self",nestLevelIndent:18,nested:!1,preserveNested:!0,hot:!1,iframeModalTrigger:".iframe"},t.fn.table=function(e){return this.each(function(){var n=t(this),o=n.data(i),a="object"==typeof e&&e;o||n.data(i,o=new r(this,a)),"string"==typeof e&&o[e]()})},r.NAME=i,t.fn.table.Constructor=r,t(function(){t('[data-ride="table"]').table()})}(jQuery,void 0),function(t,e,i){t.fn._ajaxForm=t.fn.ajaxForm;var n={timeout:e.config?e.config.timeout:0,dataType:"json",method:"post"},o="";t.fn.enableForm=function(e,n,o){return e===i&&(e=!0),this.each(function(){var i=t(this);n||i.find('[type="submit"]').attr("disabled",e?null:"disabled"),!o&&i.hasClass("load-indicator")&&i.toggleClass("loading",!e),i.toggleClass("form-disabled",!e)})},t.enableForm=function(e,i,n,o){"string"==typeof e||e instanceof t?e=t(e):(o=n,n=i,i=e,e=t("form")),e.enableForm(i!==!1,n,o)},t.disableForm=function(e,i,n){t.enableForm(e,!1,i,n)};var a=function(e,i,n){"string"==typeof i&&(n=i,i=null),n=n||"show",t.zui.messager?t.zui.messager[n](e,i):alert(e)};t.ajaxForm=function(s,r){var l=t(s);if(l.length>1)return l.each(function(){t.ajaxForm(this,r)});"function"==typeof r&&(r={complete:r}),r=t.extend({},n,l.data(),r);var c=r.beforeSubmit,h=r.error,d=r.success,u=r.finish;delete r.finish,delete r.success,delete r.onError,delete r.beforeSubmit,r=t.extend({beforeSubmit:function(n,a,s){if(l.removeClass("form-watched").enableForm(!1),(c&&c(n,a,s))!==!1){var r={},h=a.find('[type="file"]');r.fileapi=h.length&&h[0].files!==i,r.formdata=e.FormData!==i;var d=r.fileapi&&a.find('input[type="file"]:enabled').filter(function(){return""!==t(this).val()}),u=d.length,p="multipart/form-data",f=a.attr("enctype")==p||a.attr("encoding")==p,g=r.fileapi&&r.formdata,m=u&&!g||f&&!r.formdata;m&&(""==o&&(o=s.url),s.url!=o&&(s.url=o),s.url=s.url.indexOf("&")>=0?s.url+"&HTTP_X_REQUESTED_WITH=XMLHttpRequest":s.url+"?HTTP_X_REQUESTED_WITH=XMLHttpRequest")}},success:function(i,n,o){if((d&&d(i,n,o,l))!==!1){try{"string"==typeof i&&(i=JSON.parse(i))}catch(s){}if(null===i||"object"!=typeof i)return i?alert(i):a("No response.","danger");var c=r.responser?t(r.responser):l.find(".form-responser");c.length||(c=t("#responser"));var h=i.message,p=function(){var n=i.callback;if(n){var o=n.indexOf("("),a=(o>0?n.substr(0,o):n).split("."),s=e,r=a[0]; -a.length>1&&(r=a[1],"top"===a[0]?s=e.top:"parent"===a[0]&&(s=e.parent));var c=s[r];if("function"==typeof c){var h=[];return o>0&&")"==n[n.length-1]&&(h=t.parseJSON("["+n.substring(o+1,n.length-1)+"]")),h.push(i),c.apply(l,h)}}};if("success"===i.result){var f=r.locate||i.locate,g=r.closeModal||i.closeModal,m=r.ajaxReload||i.ajaxReload;if(l.enableForm(!0,!!(f||g||m)),h){var v=l.find('[type="submit"]').first(),y=!1;v.length&&(v.popover({container:"body",trigger:"manual",content:h,tipClass:"popover-in-modal popover-success popover-form-result",placement:i.placement||v.data("placement")||r.popoverPlacement||"right"}).popover("show"),setTimeout(function(){v.popover("destroy")},r.popoverTime||2e3),y=!0),c.length&&(c.html(''+h+"").show().delay(3e3).fadeOut(100),y=!0),y||a(h,"success")}if(u)return u(i,!0,l);if(g&&setTimeout(t.zui.closeModal,r.closeModalTime||2e3),p()===!1)return;if(f)if("loadInModal"==f){var b=t(".modal");setTimeout(function(){b.load(b.attr("ref"),function(){t(this).find(".modal-dialog").css("width",t(this).data("width")),t.zui.ajustModalPosition()})},1e3)}else"parent"===f||"top"===f?e[f]&&setTimeout(function(){e[f].location.reload()},1200):"reload"===f?setTimeout(function(){e.location.href=e.location.href},1200):setTimeout(function(){t.tabs?t.tabs.open(f):e.location.href=f},1200);if(m){var w=t(m);w.length&&w.load(e.location.href+" "+m,function(){w.find('[data-toggle="modal"]').modalTrigger()})}}else{if(l.enableForm(),"string"==typeof h)c.length?c.html(''+h+"").show().delay(3e3).fadeOut(100):a(h,"danger");else if("object"==typeof h){var x=!1,C=[];t.each(h,function(e,i){var n=t.isArray(i)?i.join(""):i,o=t("#"+e);if(!o.length)return void C.push(n);var a=e+"Label",s=t("#"+a);if(!s.length){var r=o.closest(".input-group").length,l=o.closest("td").length;s=t('
').appendTo(l?o.closest("td"):r?o.closest(".input-group").parent():o.parent())}s.empty().append(n),o.addClass("has-error");var c=function(){var e=t("#"+a);if(e.length)return e.remove(),o.removeClass("has-error"),!0};o.on("change input mousedown",c);var h=t("#"+e+"_chosen");if(h.length&&h.find(".chosen-single,.chosen-choices").addClass("has-error").on("mousedown",function(){c()===!0&&t(this).removeClass("has-error")}),!x){var d=o[0];if(o.hasClass("chosen"))o.trigger("chosen:activate").trigger("chosen:open"),d=o.parent().find(".chosen-container")[0];else if(o.is("textarea")&&o.data("keditor")){var u=o.data("keditor");u.focus(),u.edit.doc.body.focus(),d=o.parent().find(".ke-container")[0]}else o.focus();d.scrollIntoView&&d.scrollIntoView(),console.log("focus first",o),x=!0}}),C.length&&a(C.join(";"),"danger")}if(u)return u(i,!1,l);if(p()===!1)return}}},error:function(t,i,n){if((h&&h(t,i,n,l))!==!1){l.enableForm();var o="timeout"==i||"error"==i?e.lang?e.lang.timeout:i:t.responseText+i+n;a(o,"danger")}}},r),l._ajaxForm(r).data("zui.ajaxform",!0),l.on("click","[data-form-action]",function(){l.attr("action",t(this).data("formAction")).submit()})},t.setAjaxForm=function(e,i,n){t.ajaxForm(e,t.isPlainObject(i)?i:{finish:i,beforeSubmit:n})},t.fn.ajaxForm=function(e){return this.each(function(){t.ajaxForm(this,e)})},t.fn.setInputRequired=function(){return this.each(function(){var e=t(this),i=e.parent();i.is(".input-control,td")?i.addClass("required"):e.is(".chosen")?e.attr("required",null).next(".chosen-container").addClass("required"):i.addClass("required"),e.attr("required",null);var n=i.closest(".input-group");n.length&&1===n.find(".required,input[required],select[required]").length&&n.addClass("required")})},t(function(){t('.form-ajax,form[data-type="ajax"]').ajaxForm(),setTimeout(function(){var i=e.config.requiredFields,n=t("form");i&&(i=i.split(",")),i&&i.length&&t.each(i,function(t,e){n.find("#"+e).attr("required","required")}),n.find("input[required],select[required],textarea[required]").setInputRequired()},400),t('form[target="hiddenwin"]').on("submit",function(){var e=t(this);e.data("zui.ajaxform")||e.enableForm(!1).data("disabledTime",(new Date).getTime())}).on("click",function(){var e=t(this),i=e.data("disabledTime");i&&(new Date).getTime()-i>1e4&&e.enableForm(!0).data("disabledTime",null)})})}(jQuery,window,void 0),function(t){"use strict";var e="zui.searchList",i=function(t,e){if(t&&t.length)for(var i=0;i
').append(s)),i.$menu.append(s),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].scrollIntoViewIfNeeded&&t[0].scrollIntoViewIfNeeded({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,o=void 0===e||null===e||""===e;n.$.toggleClass("has-search-text",!o);var a=n.getItems().removeClass("active");if(o)a.removeClass("hidden");else{var s=e.trim().split(" ");a.each(function(){var e=t(this),n=(e.text()+" "+(e.data("key")||e.data("filter")||"")).trim();e.toggleClass("hidden",!i(s,n))})}n.scrollTo(a.not(".hidden").first().addClass("active")),n.$.trigger("onSearchComplete",e)},n.DEFAULTS={selector:".list-group a:not(.not-list-item)",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof i&&i;a||o.data(e,a=new n(this,s)),"string"==typeof i&&a[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,o){var a=this;a.name=e,a.$=t(n),o=a.options=t.extend({},i.DEFAULTS,this.$.data(),o),a.$.hide(),a.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 o=e.$.next();n=o.hasClass(".label-selector")?o:t('
')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),o=t(this).data("value");e.hasEmptyValue!==!1&&o==n&&(o=e.hasEmptyValue),e.select(o),i.preventDefault()})}n.empty();var a=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),o={label:e.text(),value:e.val()},s=""===o.value||"0"===o.value,r=t(i.labelTemplate||'');i.labelClass&&!s&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",o).attr("data-value",o.value),s&&!o.label?r.addClass("empty").append(''):r.text(o.label).toggleClass("active",a===o.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[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=ts.fileMaxSize&&(c.val(""),(window.bootbox||window).alert(s.fileSizeError.format(n(s.fileMaxSize)))),r.update()}),r.update()};a.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},a.prototype.update=function(){var t=this,e=t.$,i=t.getFile(),o=!i;e.toggleClass("normal",!o).toggleClass("empty",o),i?(t.oldName=i.name,e.find(".file-title").text(i.name).attr("title",i.name),e.find(".file-size").text(n(i.size)),e.find(".file-editbox").val(i.name).attr("size",i.name.length),t.options.onSelect&&t.options.onSelect(i,t)):e.find(".file-editbox").val("")},a.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),o=n.data(e),s="object"==typeof i&&i;o||n.data(e,o=new a(this,s)),"string"==typeof i&&o[i]()})},a.NAME=e,t.fn.fileInput.Constructor=a,t(function(){t('[data-provide="fileInput"]').fileInput()});var s="zui.fileInputList",r=function(e,i){var n=this;n.name=s;var o=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=o.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(s),o="object"==typeof e&&e;n||i.data(s,n=new r(this,o)),"string"==typeof e&&n[e]()})},r.NAME=s,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(e,n,o,a,s,r,l){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid);if(t.tabSession&&!l&&(l=t.tabSession.getTid()),a||(a=config.defaultView),s||(s=!1),o)for("string"==typeof o&&(o=o.split("&")),i=0;i'+d+"")}}t.val()||(time=e(a.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var s=t(this),r=t.extend({},i,s.data()),l=s.find('[name="begin"],.control-time-begin'),c=s.find('[name="end"],.control-time-end'),h=function(){var t=l.val();if(s.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);c.find('option[value="'+i+'"]').length&&c.val(i),r.onChange&&r.onChange(c,i)}};if(s.data("timeSpanControlInit")){if(r.begin){var d=o(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=o(r.end).format("hh:mm");c.find('option[value="'+u+'"]').length&&c.val(u),r.onChange&&r.onChange(c,u)}}else l.on("change",h),a(l,r.begin),a(c,r.end),s.data("timeSpanControlInit",!0);r.end||h()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:a,createTime:o};var s=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var o=t("#searchTypeMenu");o.find("li.selected").removeClass("selected");var a=o.find('a[data-value="'+e+'"]'),s=a.text();a.parent().addClass("selected"),t("#searchTypeName").text(s),i||t("#searchInput").focus()};t.gotoObject=function(e,i){if(e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e)if(i=i.replace(/[^\d]/g,"")){var n=e.split("-");e=n[0];var o=n.length>1?n[1]:"testsuite"===e?"library":"view",a=t.createLink(e,o,"id="+i);t.apps?t.apps.open(a):window.location.href=a}else{var s={zh_cn:"请输入数字ID进行搜索",zh_tw:"請輸入數值ID行搜索"};alert(lang.searchTip||s[t.zui.clientLang()]||"Please enter a numberic id to search")}t("#searchInput").val(i).focus()},t(function(){s(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(t){t?window.top.location.reload():window.location.reload()},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage(1)},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage(1)},t.zui.Picker&&(t.zui.Picker.DEFAULTS.optionRender=function(e,i,n){if("user"===n.options.type){var o=n.options.users;if(!o)return;var a=o[i.value];if(!a)return;if(e.find(".picker-option-text").text(a.realname||a.account),e.hasClass("picker-user-option"))return;return e.prepend(t('
').avatar({user:a})),a.deptName&&e.append(t('').text(a.deptName)),a.roleName&&e.append(t('').text(a.roleName)),e.addClass("picker-user-option")}},t.zui.setUserPickerInfos=function(e){t.zui.Picker.DEFAULTS.users=t.extend({},t.zui.Picker.DEFAULTS.users,e)},t(function(){t(".picker-select[data-pickertype!='remote']").picker({chosenMode:!0}),t("[data-pickertype='remote']").each(function(){var e=t(this).attr("data-pickerremote");t(this).picker({chosenMode:!0,remote:e})}),window.pickerUsers&&t.zui.setUserPickerInfos(window.pickerUsers),t(".user-picker").picker({type:"user"})})),t.chosenDefaultOptions={middle_highlight:!0,disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,max_drop_width:500,max_drop_height:245,no_wrap:!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;e.css("position","relative");var i="down",n=this.container.find(".chosen-drop"),o=this.container.position(),a=n.outerHeight();return o.top>=a&&o.top+31+a>e.outerHeight()&&(i="up"),this.drop_directionFixed=i,i}return"auto"}},t.chosenSimpleOptions=t.extend({},t.chosenDefaultOptions,{disable_search_threshold:6}),t.fn._chosen=t.fn.chosen,t.fn.chosen=function(e){return"string"==typeof e?this._chosen(e):this.each(function(){var i=t(this).addClass("chosen-controled");return i._chosen(t.extend({},i.hasClass("chosen-simple")?t.chosenSimpleOptions:t.chosenDefaultOptions,i.data(),e))})},t.fn.chosen.Constructor=t.fn._chosen.Constructor,t(function(){t(".chosen,.chosen-simple").each(function(){var e=t(this);e.closest(".template").length||e.chosen()})}),t.extend(t.fn.pager.Constructor.DEFAULTS,{maxNavCount:8,prevIcon:"icon-angle-left",nextIcon:"icon-angle-right",firstIcon:"icon-first-page",lastIcon:"icon-last-page",navEllipsisItem:"…",menuDirection:"dropup",pageSizeOptions:[5,10,15,20,25,30,35,40,45,50,100,200,500,1e3,2e3],elements:["total_text","size_menu","first_icon","prev_icon",'
{page}/{totalPage}
',"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.extend(!0,t.zui.Messager.DEFAULTS,{cssClass:"messagger-zt",icons:{success:"check-circle",info:"chat-line",warning:"exclamation-sign",danger:"exclamation-sign"}}),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);if(!n.data("historiesInited")){n.data("historiesInited",1),i=t.extend({},n.data(),i);var o=n.find(".histories-list"),a=!0,s=!1;n.on("click",".btn-reverse",function(){o.children("li").reverseOrder(),a=!a,t(this).find(".icon").toggleClass("icon-arrow-up",a).toggleClass("icon-arrow-down",!a);var e="#lastComment",i=t(e);i.length&&window.KindEditor&&(window.KindEditor.remove(e),i.kindeditor())}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");s=!s,e.toggleClass("icon-plus",!s).toggleClass("icon-minus",s),o.children("li").toggleClass("show-changes",s)}).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"),o=n.hasClass("icon-code");n.toggleClass("icon-code",!o).toggleClass("icon-text",o),e.attr("title",o?i.original:i.textdiff),e.closest("li").toggleClass("show-original",o)}),o.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,c=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(c,e);var o=i.children(".cell"),a={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&&(a={overflow:"hidden",maxHeight:t(window).height()-45})),o.css(a)}};var h=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;c="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");if(i.length){i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(c,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var o=e.find(".sidebar-toggle");if(o.length){var a=function(){var e=o[0].getBoundingClientRect(),i=t(window).height(),n=Math.max(0,Math.floor(Math.min(i-40,e.top+e.height)-Math.max(e.top,0))/2)+(e.top<0?0-e.top:0);o.removeClass("fade").find(".icon").css("top",n+(t.zui.browser.isIE()?(i-80)/2:0))};a(),e.data("init",1).on("sidebar.toggle",a);var s=t.zui.browser.isIE()?1500:0,r=0,l=null,h=function(){var t=Date.now();return l&&(clearTimeout(l),l=null),t-rtr 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"}),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.data()),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()});var d=function(){var e,i,n=t(this),o=t.extend({limitSize:40,suffix:"…"},n.data()),a=n.text();if(a.length>o.limitSize){e=a,i=a.substr(0,o.limitSize)+o.suffix,n.text(i).addClass("limit-text-on");var s=o.toggleBtn?t(o.toggleBtn):n.next(".text-limit-toggle");s.text(s.data("textExpand")),s.on("click",function(){var t=n.toggleClass("limit-text-on").hasClass("limit-text-on");n.text(t?i:e),s.text(s.data(t?"textExpand":"textCollapse"))})}else(o.toggleBtn?t(o.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 o=t(i||window),a=null,s=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),o=n.next(".fixed-head-table");if(i.top<0){var s=e.width();if(o.length){if(a!==s){a=s;var r=o.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var o=t("
").addClass(n.attr("class")),l=e.clone(),r=l.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())}),o.append(l).insertAfter(n)}o.css({left:i.left,width:i.width}).show()}else o.hide()};o.on("scroll",s).on("resize",s),s()}},t(document).on("click","tr[data-url]",function(){var e=t(this),i=e.data("href")||e.data("url");i&&(window.location.href=i)}),"yes"===config.onlybody&&self===parent&&(window.location.href=window.location.href.replace("?onlybody=yes","").replace("&onlybody=yes","")),t(function(){t("body").addClass("m-{currentModule}-{currentMethod}".format(config))});var u,p,f,g,m,v=function(){u||(u=t("#subNavbar"),p=t("#pageNav"),f=t("#pageActions"),g=u.children(".nav"),m=g.outerWidth());var e=u.outerWidth(),i=p.outerWidth()||0,n=f.outerWidth()||0;if(i=i?i+15:0,n=n?n+15:0,!i&&!n)return void g.css({maxWidth:null,left:null,position:"static"});var o=Math.max(300,e-i-n),a=Math.min(o,m),s=(e-a)/2,r=i&&s.btn-toolbar");if(e.length){var i,n,o=e.children(),a=o.length,s=!1,r=null;if(a)for(o.each(function(e){i=t(this),n=i.is(".divider"),n&&!r&&i.hide(),s||n||(s=!0),r=n?null:i,!n||e!==a-1&&0!==e||i.hide()});i.length&&i.is(".divider");)i=i.hide().prev();s||e.hide()}};t(function(){t(".input-group,.btn-group").fixInputGroup(),C()}),window.holders&&t.each(window.holders,function(e){var i=t("#"+e);i.length&&i.is("input")&&i.attr("placeholder",window.holders[e])}),t(function(){var e=t(".table-responsive"),i=t.fixTableResponsive=function(){e.each(function(){this.scrollHeight-3<=this.clientHeight&&this.scrollWidth-3<=this.clientWidth?t(this).addClass("scroll-none").css("overflow","visible"):t(this).removeClass("scroll-none").css("overflow","auto")})};e.length&&(t(window).on("resize",i),setTimeout(i,100))});var _=function(){var e=this,i=t(e),n=i.closest("tr").find("textarea");if(n.length){var o=32;n.each(function(){var e=t(this).closest("td"),i=e.css("height");e.css("height",this.style.height),this.style.height="auto";var n=this.value?this.scrollHeight+2:32;o=Math.max(o,n),e.css("height",i)}),n.css("height",o)}else{e.style.height="auto";var a=e.value?e.scrollHeight+2:32;e.style.height=a+"px"}};t.autoResizeTextarea=function(e){t(e).each(_)},t(function(){t("textarea.autosize").each(_),t(document).on("input paste change","textarea.autosize",_)}),t(function(){var e=t("#dropMenu,.drop-menu");e.length&&e.on("click",".toggle-right-col",function(e){t(this).closest("#dropMenu,.drop-menu").toggleClass("show-right-col"),e.stopPropagation(),e.preventDefault()})});var k="undefined"!=typeof InstallTrigger;t.zui.browser.firefox=k,t("html").toggleClass("is-firefox",k).toggleClass("not-firefox",!k),t(function(){var e=t("#mainContent>.main-col"),i=e.children(".main-actions");if(i.length){var n=i.prev();if(i.length&&n.length){t('
').css("height",i.outerHeight()).insertAfter(i);var o=0,a=function(){var e=n[0].getBoundingClientRect(),s=e.top+e.height+120>t(window).height();if(t("body").toggleClass("main-actions-fixed",s),s){var r=n.width();r?i.width(r):o<10&&setTimeout(a,1e3)}o++};t.resetToolbarPosition=a,a(),t(window).on("resize scroll",a)}}}),t(document).on("show.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&t(e.target).is(".modal")&&window.parent.$("body").addClass("hide-modal-close")}).on("hidden.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&window.parent.$("body").removeClass("hide-modal-close")}).on("loaded.zui.modal",function(e){ +a.length>1&&(r=a[1],"top"===a[0]?s=e.top:"parent"===a[0]&&(s=e.parent));var c=s[r];if("function"==typeof c){var h=[];return o>0&&")"==n[n.length-1]&&(h=t.parseJSON("["+n.substring(o+1,n.length-1)+"]")),h.push(i),c.apply(l,h)}}};if("success"===i.result){var f=r.locate||i.locate,g=r.closeModal||i.closeModal,m=r.ajaxReload||i.ajaxReload;if(l.enableForm(!0,!!(f||g||m)),h){var v=l.find('[type="submit"]').first(),y=!1;v.length&&(v.popover({container:"body",trigger:"manual",content:h,tipClass:"popover-in-modal popover-success popover-form-result",placement:i.placement||v.data("placement")||r.popoverPlacement||"right"}).popover("show"),setTimeout(function(){v.popover("destroy")},r.popoverTime||2e3),y=!0),c.length&&(c.html(''+h+"").show().delay(3e3).fadeOut(100),y=!0),y||a(h,"success")}if(u)return u(i,!0,l);if(g&&setTimeout(t.zui.closeModal,r.closeModalTime||2e3),p()===!1)return;if(f)if("loadInModal"==f){var b=t(".modal");setTimeout(function(){b.load(b.attr("ref"),function(){t(this).find(".modal-dialog").css("width",t(this).data("width")),t.zui.ajustModalPosition()})},1e3)}else"parent"===f||"top"===f?e[f]&&setTimeout(function(){e[f].location.reload()},1200):"reload"===f?setTimeout(function(){e.location.href=e.location.href},1200):setTimeout(function(){t.tabs?t.tabs.open(f):e.location.href=f},1200);if(m){var w=t(m);w.length&&w.load(e.location.href+" "+m,function(){w.find('[data-toggle="modal"]').modalTrigger()})}}else{if(l.enableForm(),"string"==typeof h)c.length?c.html(''+h+"").show().delay(3e3).fadeOut(100):a(h,"danger");else if("object"==typeof h){var x=!1,C=[];t.each(h,function(e,i){var n=t.isArray(i)?i.join(""):i,o=t("#"+e);if(!o.length)return void C.push(n);var a=e+"Label",s=t("#"+a);if(!s.length){var r=o.closest(".input-group").length,l=o.closest("td").length;s=t('
').appendTo(l?o.closest("td"):r?o.closest(".input-group").parent():o.parent())}s.empty().append(n),o.addClass("has-error");var c=function(){var e=t("#"+a);if(e.length)return e.remove(),o.removeClass("has-error"),!0};o.on("change input mousedown",c);var h=t("#"+e+"_chosen");if(h.length&&h.find(".chosen-single,.chosen-choices").addClass("has-error").on("mousedown",function(){c()===!0&&t(this).removeClass("has-error")}),!x){var d=o[0];if(o.hasClass("chosen"))o.trigger("chosen:activate").trigger("chosen:open"),d=o.parent().find(".chosen-container")[0];else if(o.is("textarea")&&o.data("keditor")){var u=o.data("keditor");u.focus(),u.edit.doc.body.focus(),d=o.parent().find(".ke-container")[0]}else o.focus();d.scrollIntoView&&d.scrollIntoView(),console.log("focus first",o),x=!0}}),C.length&&a(C.join(";"),"danger")}if(u)return u(i,!1,l);if(p()===!1)return}}},error:function(t,i,n){if((h&&h(t,i,n,l))!==!1){l.enableForm();var o="timeout"==i||"error"==i?e.lang?e.lang.timeout:i:t.responseText+i+n;a(o,"danger")}}},r),l._ajaxForm(r).data("zui.ajaxform",!0),l.on("click","[data-form-action]",function(){l.attr("action",t(this).data("formAction")).submit()})},t.setAjaxForm=function(e,i,n){t.ajaxForm(e,t.isPlainObject(i)?i:{finish:i,beforeSubmit:n})},t.fn.ajaxForm=function(e){return this.each(function(){t.ajaxForm(this,e)})},t.fn.setInputRequired=function(){return this.each(function(){var e=t(this),i=e.parent();i.is(".input-control,td")?i.addClass("required"):e.is(".chosen")?e.attr("required",null).next(".chosen-container").addClass("required"):i.addClass("required"),e.attr("required",null);var n=i.closest(".input-group");n.length&&1===n.find(".required,input[required],select[required]").length&&n.addClass("required")})},t(function(){t('.form-ajax,form[data-type="ajax"]').ajaxForm(),setTimeout(function(){var i=e.config.requiredFields,n=t("form");i&&(i=i.split(",")),i&&i.length&&t.each(i,function(t,e){n.find("#"+e).attr("required","required")}),n.find("input[required],select[required],textarea[required]").setInputRequired()},400),t('form[target="hiddenwin"]').on("submit",function(){var e=t(this);e.data("zui.ajaxform")||e.enableForm(!1).data("disabledTime",(new Date).getTime())}).on("click",function(){var e=t(this),i=e.data("disabledTime");i&&(new Date).getTime()-i>1e4&&e.enableForm(!0).data("disabledTime",null)})})}(jQuery,window,void 0),function(t){"use strict";var e="zui.searchList",i=function(t,e){if(t&&t.length)for(var i=0;i
').append(s)),i.$menu.append(s),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].scrollIntoViewIfNeeded&&t[0].scrollIntoViewIfNeeded({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,o=void 0===e||null===e||""===e;n.$.toggleClass("has-search-text",!o);var a=n.getItems().removeClass("active");if(o)a.removeClass("hidden");else{var s=e.trim().split(" ");a.each(function(){var e=t(this),n=(e.text()+" "+(e.data("key")||e.data("filter")||"")).trim();e.toggleClass("hidden",!i(s,n))})}n.scrollTo(a.not(".hidden").first().addClass("active")),n.$.trigger("onSearchComplete",e)},n.DEFAULTS={selector:".list-group a:not(.not-list-item)",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof i&&i;a||o.data(e,a=new n(this,s)),"string"==typeof i&&a[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,o){var a=this;a.name=e,a.$=t(n),o=a.options=t.extend({},i.DEFAULTS,this.$.data(),o),a.$.hide(),a.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 o=e.$.next();n=o.hasClass(".label-selector")?o:t('
')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),o=t(this).data("value");e.hasEmptyValue!==!1&&o==n&&(o=e.hasEmptyValue),e.select(o),i.preventDefault()})}n.empty();var a=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),o={label:e.text(),value:e.val()},s=(""===o.value||"0"===o.value)&&!o.label,r=t(i.labelTemplate||'');i.labelClass&&!s&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",o).attr("data-value",o.value),s?r.addClass("empty").append(''):r.text(o.label).toggleClass("active",a===o.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[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=ts.fileMaxSize&&(c.val(""),(window.bootbox||window).alert(s.fileSizeError.format(n(s.fileMaxSize)))),r.update()}),r.update()};a.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},a.prototype.update=function(){var t=this,e=t.$,i=t.getFile(),o=!i;e.toggleClass("normal",!o).toggleClass("empty",o),i?(t.oldName=i.name,e.find(".file-title").text(i.name).attr("title",i.name),e.find(".file-size").text(n(i.size)),e.find(".file-editbox").val(i.name).attr("size",i.name.length),t.options.onSelect&&t.options.onSelect(i,t)):e.find(".file-editbox").val("")},a.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),o=n.data(e),s="object"==typeof i&&i;o||n.data(e,o=new a(this,s)),"string"==typeof i&&o[i]()})},a.NAME=e,t.fn.fileInput.Constructor=a,t(function(){t('[data-provide="fileInput"]').fileInput()});var s="zui.fileInputList",r=function(e,i){var n=this;n.name=s;var o=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=o.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(s),o="object"==typeof e&&e;n||i.data(s,n=new r(this,o)),"string"==typeof e&&n[e]()})},r.NAME=s,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(e,n,o,a,s,r,l){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid);if(t.tabSession&&!l&&(l=t.tabSession.getTid()),a||(a=config.defaultView),s||(s=!1),o)for("string"==typeof o&&(o=o.split("&")),i=0;i'+d+"")}}t.val()||(time=e(a.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var s=t(this),r=t.extend({},i,s.data()),l=s.find('[name="begin"],.control-time-begin'),c=s.find('[name="end"],.control-time-end'),h=function(){var t=l.val();if(s.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);c.find('option[value="'+i+'"]').length&&c.val(i),r.onChange&&r.onChange(c,i)}};if(s.data("timeSpanControlInit")){if(r.begin){var d=o(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=o(r.end).format("hh:mm");c.find('option[value="'+u+'"]').length&&c.val(u),r.onChange&&r.onChange(c,u)}}else l.on("change",h),a(l,r.begin),a(c,r.end),s.data("timeSpanControlInit",!0);r.end||h()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:a,createTime:o};var s=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var o=t("#searchTypeMenu");o.find("li.selected").removeClass("selected");var a=o.find('a[data-value="'+e+'"]'),s=a.text();a.parent().addClass("selected"),t("#searchTypeName").text(s),i||t("#searchInput").focus()};t.gotoObject=function(e,i){if(e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e)if(i=i.replace(/[^\d]/g,"")){var n=e.split("-");e=n[0];var o=n.length>1?n[1]:"testsuite"===e?"library":"view",a=t.createLink(e,o,"id="+i);t.apps?t.apps.open(a):window.location.href=a}else{var s={zh_cn:"请输入数字ID进行搜索",zh_tw:"請輸入數值ID行搜索"};alert(lang.searchTip||s[t.zui.clientLang()]||"Please enter a numberic id to search")}t("#searchInput").val(i).focus()},t(function(){s(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(t){t?window.top.location.reload():window.location.reload()},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage(1)},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage(1)},t.zui.Picker&&(t.zui.Picker.DEFAULTS.optionRender=function(e,i,n){if("user"===n.options.type){var o=n.options.users;if(!o)return;var a=o[i.value];if(!a)return;if(e.find(".picker-option-text").text(a.realname||a.account),e.hasClass("picker-user-option"))return;return e.prepend(t('
').avatar({user:a})),a.deptName&&e.append(t('').text(a.deptName)),a.roleName&&e.append(t('').text(a.roleName)),e.addClass("picker-user-option")}},t.zui.setUserPickerInfos=function(e){t.zui.Picker.DEFAULTS.users=t.extend({},t.zui.Picker.DEFAULTS.users,e)},t(function(){t(".picker-select[data-pickertype!='remote']").picker({chosenMode:!0}),t("[data-pickertype='remote']").each(function(){var e=t(this).attr("data-pickerremote");t(this).picker({chosenMode:!0,remote:e})}),window.pickerUsers&&t.zui.setUserPickerInfos(window.pickerUsers),t(".user-picker").picker({type:"user"})})),t.chosenDefaultOptions={middle_highlight:!0,disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,max_drop_width:500,max_drop_height:245,no_wrap:!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;e.css("position","relative");var i="down",n=this.container.find(".chosen-drop"),o=this.container.position(),a=n.outerHeight();return o.top>=a&&o.top+31+a>e.outerHeight()&&(i="up"),this.drop_directionFixed=i,i}return"auto"}},t.chosenSimpleOptions=t.extend({},t.chosenDefaultOptions,{disable_search_threshold:6}),t.fn._chosen=t.fn.chosen,t.fn.chosen=function(e){return"string"==typeof e?this._chosen(e):this.each(function(){var i=t(this).addClass("chosen-controled");return i._chosen(t.extend({},i.hasClass("chosen-simple")?t.chosenSimpleOptions:t.chosenDefaultOptions,i.data(),e))})},t.fn.chosen.Constructor=t.fn._chosen.Constructor,t(function(){t(".chosen,.chosen-simple").each(function(){var e=t(this);e.closest(".template").length||e.chosen()})}),t.extend(t.fn.pager.Constructor.DEFAULTS,{maxNavCount:8,prevIcon:"icon-angle-left",nextIcon:"icon-angle-right",firstIcon:"icon-first-page",lastIcon:"icon-last-page",navEllipsisItem:"…",menuDirection:"dropup",pageSizeOptions:[5,10,15,20,25,30,35,40,45,50,100,200,500,1e3,2e3],elements:["total_text","size_menu","first_icon","prev_icon",'
{page}/{totalPage}
',"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.extend(!0,t.zui.Messager.DEFAULTS,{cssClass:"messagger-zt",icons:{success:"check-circle",info:"chat-line",warning:"exclamation-sign",danger:"exclamation-sign"}}),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);if(!n.data("historiesInited")){n.data("historiesInited",1),i=t.extend({},n.data(),i);var o=n.find(".histories-list"),a=!0,s=!1;n.on("click",".btn-reverse",function(){o.children("li").reverseOrder(),a=!a,t(this).find(".icon").toggleClass("icon-arrow-up",a).toggleClass("icon-arrow-down",!a);var e="#lastComment",i=t(e);i.length&&window.KindEditor&&(window.KindEditor.remove(e),i.kindeditor())}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");s=!s,e.toggleClass("icon-plus",!s).toggleClass("icon-minus",s),o.children("li").toggleClass("show-changes",s)}).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"),o=n.hasClass("icon-code");n.toggleClass("icon-code",!o).toggleClass("icon-text",o),e.attr("title",o?i.original:i.textdiff),e.closest("li").toggleClass("show-original",o)}),o.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,c=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(c,e);var o=i.children(".cell"),a={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&&(a={overflow:"hidden",maxHeight:t(window).height()-45})),o.css(a)}};var h=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;c="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");if(i.length){i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(c,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var o=e.find(".sidebar-toggle");if(o.length){var a=function(){var e=o[0].getBoundingClientRect(),i=t(window).height(),n=Math.max(0,Math.floor(Math.min(i-40,e.top+e.height)-Math.max(e.top,0))/2)+(e.top<0?0-e.top:0);o.removeClass("fade").find(".icon").css("top",n+(t.zui.browser.isIE()?(i-80)/2:0))};a(),e.data("init",1).on("sidebar.toggle",a);var s=t.zui.browser.isIE()?1500:0,r=0,l=null,h=function(){var t=Date.now();return l&&(clearTimeout(l),l=null),t-rtr 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"}),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.data()),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()});var d=function(){var e,i,n=t(this),o=t.extend({limitSize:40,suffix:"…"},n.data()),a=n.text();if(a.length>o.limitSize){e=a,i=a.substr(0,o.limitSize)+o.suffix,n.text(i).addClass("limit-text-on");var s=o.toggleBtn?t(o.toggleBtn):n.next(".text-limit-toggle");s.text(s.data("textExpand")),s.on("click",function(){var t=n.toggleClass("limit-text-on").hasClass("limit-text-on");n.text(t?i:e),s.text(s.data(t?"textExpand":"textCollapse"))})}else(o.toggleBtn?t(o.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 o=t(i||window),a=null,s=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),o=n.next(".fixed-head-table");if(i.top<0){var s=e.width();if(o.length){if(a!==s){a=s;var r=o.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var o=t("
").addClass(n.attr("class")),l=e.clone(),r=l.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())}),o.append(l).insertAfter(n)}o.css({left:i.left,width:i.width}).show()}else o.hide()};o.on("scroll",s).on("resize",s),s()}},t(document).on("click","tr[data-url]",function(){var e=t(this),i=e.data("href")||e.data("url");i&&(window.location.href=i)}),"yes"===config.onlybody&&self===parent&&(window.location.href=window.location.href.replace("?onlybody=yes","").replace("&onlybody=yes","")),t(function(){t("body").addClass("m-{currentModule}-{currentMethod}".format(config))});var u,p,f,g,m,v=function(){u||(u=t("#subNavbar"),p=t("#pageNav"),f=t("#pageActions"),g=u.children(".nav"),m=g.outerWidth());var e=u.outerWidth(),i=p.outerWidth()||0,n=f.outerWidth()||0;if(i=i?i+15:0,n=n?n+15:0,!i&&!n)return void g.css({maxWidth:null,left:null,position:"static"});var o=Math.max(300,e-i-n),a=Math.min(o,m),s=(e-a)/2,r=i&&s.btn-toolbar");if(e.length){var i,n,o=e.children(),a=o.length,s=!1,r=null;if(a)for(o.each(function(e){i=t(this),n=i.is(".divider"),n&&!r&&i.hide(),s||n||(s=!0),r=n?null:i,!n||e!==a-1&&0!==e||i.hide()});i.length&&i.is(".divider");)i=i.hide().prev();s||e.hide()}};t(function(){t(".input-group,.btn-group").fixInputGroup(),C()}),window.holders&&t.each(window.holders,function(e){var i=t("#"+e);i.length&&i.is("input")&&i.attr("placeholder",window.holders[e])}),t(function(){var e=t(".table-responsive"),i=t.fixTableResponsive=function(){e.each(function(){this.scrollHeight-3<=this.clientHeight&&this.scrollWidth-3<=this.clientWidth?t(this).addClass("scroll-none").css("overflow","visible"):t(this).removeClass("scroll-none").css("overflow","auto")})};e.length&&(t(window).on("resize",i),setTimeout(i,100))});var _=function(){var e=this,i=t(e),n=i.closest("tr").find("textarea");if(n.length){var o=32;n.each(function(){var e=t(this).closest("td"),i=e.css("height");e.css("height",this.style.height),this.style.height="auto";var n=this.value?this.scrollHeight+2:32;o=Math.max(o,n),e.css("height",i)}),n.css("height",o)}else{e.style.height="auto";var a=e.value?e.scrollHeight+2:32;e.style.height=a+"px"}};t.autoResizeTextarea=function(e){t(e).each(_)},t(function(){t("textarea.autosize").each(_),t(document).on("input paste change","textarea.autosize",_)}),t(function(){var e=t("#dropMenu,.drop-menu");e.length&&e.on("click",".toggle-right-col",function(e){t(this).closest("#dropMenu,.drop-menu").toggleClass("show-right-col"),e.stopPropagation(),e.preventDefault()})});var k="undefined"!=typeof InstallTrigger;t.zui.browser.firefox=k,t("html").toggleClass("is-firefox",k).toggleClass("not-firefox",!k),t(function(){var e=t("#mainContent>.main-col"),i=e.children(".main-actions");if(i.length){var n=i.prev();if(i.length&&n.length){t('
').css("height",i.outerHeight()).insertAfter(i);var o=0,a=function(){var e=n[0].getBoundingClientRect(),s=e.top+e.height+120>t(window).height();if(t("body").toggleClass("main-actions-fixed",s),s){var r=n.width();r?i.width(r):o<10&&setTimeout(a,1e3)}o++};t.resetToolbarPosition=a,a(),t(window).on("resize scroll",a)}}}),t(document).on("show.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&t(e.target).is(".modal")&&window.parent.$("body").addClass("hide-modal-close")}).on("hidden.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&window.parent.$("body").removeClass("hide-modal-close")}).on("loaded.zui.modal",function(e){ t("body").removeClass("hide-modal-close")}),t(function(){var e=t(".dropdown-menu.with-search");e.length&&(e.find(".menu-search").on("click",function(t){return t.stopPropagation(),!1}),e.on("keyup change paste","input",function(){var e=t(this),i=e.closest(".dropdown-menu.with-search"),n=e.val().toLowerCase(),o=i.find(".option");""==n?o.removeClass("hide"):o.each(function(){var e=t(this);e.toggleClass("hide",e.text().toString().toLowerCase().indexOf(n)<0&&e.data("key").toString().toLowerCase().indexOf(n)<0)})}),e.parents(".dropdown-submenu").one("mouseenter",function(){var e=t(this).find(".dropdown-list")[0];e&&e.getBoundingClientRect&&setTimeout(function(){var t=270,i=e.getBoundingClientRect();i.top<0&&(t=Math.min(270,i.height)+i.top),e.style.maxHeight=Math.min(270,t)+"px"},50)})),t(".dropdown-menu.with-search .menu-search").on("click",function(t){return t.stopPropagation(),!1})})}(jQuery),function(t){function e(){if(!config.skipRedirect&&!window.skipRedirect){var e=window.parent,i=config.currentModule,n=config.currentMethod,o="index"===i&&"index"===n,a="#_single"===location.hash||/(\?|\&)_single/.test(location.search)||o||!t("#mainHeader,#editorNav").length||"tutorial"===i||"install"===i||"upgrade"===i||"user"===i&&("login"===n||"deny"===n)||"my"===i&&"changepassword"===n||t("body").hasClass("allow-self-open"),s=location.href;if(e===window&&!a){var r=location.pathname+location.search+location.hash;return void(location.href=t.createLink("index","index","")+"#app="+encodeURIComponent(r))}if(e!==window&&e.$.apps){o&&e.location.reload();var l=window.name;if(0===l.indexOf("app-")){t.apps=window.apps=e.$.apps;var c=l.substring(4);t.appCode=c,t(document).on("click",function(t){var i=e.document.getElementById(window.name);if(i){var n=e.document.getElementById(i.name)||i;n&&n.dispatchEvent(new Event(t.type,{bubbles:!0}))}}).on("click","a,.open-in-app,.show-in-app",function(e){var i=t(this);if(!i.is("[data-modal],[data-toggle],[data-ride],[data-tab],.iframe,.not-in-app,[target]")&&!i.data("zui.modaltrigger")){var n=i.hasClass("show-in-app")?"":i.attr("href")||(i.is("a")?"":i.data("url")),o=i.data("app")||i.data("group");if(n){if(0===n.indexOf("javascript:")||"#"===n[0])return;var a=t.parseLink(n);if(a.external)return;if("index"===a.moduleName&&"index"===a.methodName)return window.location.reload(),void e.preventDefault()}else if(!o)return;o||(o=t.apps.getAppCode(n)),o&&("help"===o&&(t.apps.appsMap.help.text=i.text(),t.apps.appsMap.help.url||(t.apps.appsMap.help.url=n)),t.apps.open(n,o)&&e.preventDefault())}}),t.apps.updateUrl(c,s,document.title)}}}}function i(){var e=t("#navbar>.nav");if(e.length){var i=t("#heading"),n=+i.css("left").replace("px",""),o=i.outerWidth(),a=e.width(),s=t("#mainHeader>.container").width()-2*n,r=Math.floor((s-a)/2);e.css("marginLeft",r>>0;if(0===o)return!1;for(var a=0|e,s=Math.max(a>=0?a:o-Math.abs(a),0);s1&&("?"===e[0]&&(e=e.substr(1)),e.split("&").forEach(function(t){var e=t.split("=",2);if(e.length>1)try{i[e[0]]=decodeURIComponent(e[1])}catch(n){i[e[0]]=""}else i[e[0]]=""})),t?i[t]:i},t.parseLink=function(e){if(!e)return{};var i=0===e.indexOf("http:")||0===e.indexOf("https:");if(i){var n=window.location.origin;if(e.indexOf(n)<0)return{external:!0,url:e};e=e.substr((n+config.webRoot).length)}var o=e.split("#"),a=o[0].split("?"),s=a[1],r=s?t.getSearchParam("",s):{},l=a[0],c={url:e,isOnlyBody:"yes"===r.onlybody,vars:[],hash:o[1]||"",params:r,tid:r.tid||""};if("GET"===config.requestType){c.moduleName=r[config.moduleVar]||"index",c.methodName=r[config.methodVar]||"index",c.viewType=r[config.viewVar]||config.defaultView;for(var h in r)h!==config.moduleVar&&h!==config.methodVar&&h!==config.viewVar&&"onlybody"!==h&&"tid"!==h&&c.vars.push([h,r[h]])}else{var d=l.lastIndexOf("/");d===l.length-1&&(l=l.substr(0,d),d=l.lastIndexOf("/")),d>=0&&(l=l.substr(d+1));var u=l.lastIndexOf(".");u>=0?(c.viewType=l.substr(u+1),l=l.substr(0,u)):c.viewType=config.defaultView;var p=l.split(config.requestFix);if(c.moduleName=p[0]||"index",c.methodName=p[1]||"index",p.length>2)for(var f=2;f.nav>li").length>10&&(i(),t(window).on("resize",i)),setTimeout(n,1e3)})}(jQuery),function(t){"use strict";function e(e,i){"object"!=typeof i&&(i={user:i});var n=t(e);i=t.extend({},n.data(),i);var o=i.user;"string"==typeof o&&(o={account:o});var a={},s=i.size;s&&(a.width=s,a.height=s,a.lineHeight=s,Number.isNaN(+s)||n.addClass("size-"+s));var r=!!o.avatar;if(n.toggleClass("has-image",r).toggleClass("has-text",!r),n.empty(),r)n.append(t("").attr("src",o.avatar));else{var l=t.zui.strCode(o.account)*(i.hueDistance||43)%360;a.background="hsl("+l+","+(i.saturation||"40%")+","+(i.lightness||"60%")+")",Number.isNaN(+s)||(a.fontSize=Math.round(s/2)+"px");var c=o.name||o.realname||o.account;c=/^[\u4e00-\u9fa5\s]+$/.test(c)?c.length<=2?c:c.substring(c.length-2):/^[A-Za-z\d\s]+$/.test(c)?c[0].toUpperCase():c.length<=2?c:c.substring(0,2),n.append(t('').text(c))}return n.css(a)}t.fn.avatar=function(t){return this.each(function(){e(this,t)})}}(jQuery),$.zui.lang("de",{"zui.pager":{pageOfText:"Seite {0}",prev:"Zurück",next:"Nächste Seite",first:"Erste Seite",last:"Letzte Seite","goto":"Goto",pageOf:"Seite {page}",totalPage:"{totalPage} Seiten",totalCount:"Total: {recTotal} Artikel",pageSize:"{recPerPage} Artikel pro Seite",itemsRange:"Seiten {start} bis {end}",pageOfTotal:"Seite {page}/{totalPage}"},"zui.boards":{append2end:"Gehen Sie zum Ende"},"zui.browser":{tip:"Online. Sorgenfrei. Aktualisiere deinen Browser noch heute!"},"zui.calendar":{weekNames:["Son","Mon","Die","Mit","Don","Fri","Sam"],monthNames:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",year:"{0}Jahr",month:"{0}Monat",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Kein Icon]",commonIcons:"Gemeinsame Symbole",webIcons:"Web-Symbol",editorIcons:"Editor-Symbol",directionalIcons:"Pfeil Zusammenfluss",otherIcons:"Andere Symbole"},"zui.colorPicker":{errorTip:"Kein gültiger Farbwert"},"zui.datagrid":{errorCannotGetDataFromRemote:"Daten vom Remote-Server ({0}) können nicht abgerufen werden.",errorCannotHandleRemoteData:"Die vom Remote-Server zurückgegebenen Daten können nicht verarbeitet werden."},"zui.guideViewer":{prevStep:"Vorheriger Schritt",nextStep:"Nächster Schritt"},"zui.tabs":{reload:"Neu laden",close:"Schliessen",closeOthers:"Schließen Sie andere Registerkarten",closeRight:"Schließen Sie die rechte Registerkarte",reopenLast:"Letzten geschlossenen Tab wiederherstellen",errorCannotFetchFromRemote:"Inhalt kann nicht vom Remote-Server abgerufen werden ({0})."},"zui.uploader":{},datetimepicker:{days:["Sonntag","Montag","Diensteg","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["Son","Mon","Die","Mit","Don","Fri","Sam"],daysMin:["Son","Mon","Die","Mit","Don","Fri","Sam"],months:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",suffix:[],meridiem:[]},chosen:{no_results_text:"Nicht gefunden"},bootbox:{OK:"OK",CANCEL:"Stornieren",CONFIRM:"Bestätigen"}}),$.zui.lang("fr",{"zui.pager":{pageOfText:"Page {0}",prev:"Prev",next:"Suivant",first:"First",last:"Last","goto":"Goto",pageOf:"Page {page}",totalPage:"{totalPage} pages",totalCount:"Total: {recTotal} items",pageSize:"{recPerPage} per page",itemsRange:"De {start} à {end}",pageOfTotal:"Page {page} de {totalPage}"},"zui.boards":{append2end:"Aller jusqu'au bout"},"zui.browser":{tip:"Naviguez sans crainte sur Internet. Mettez votre navigateur à jour dès aujourd'hui!"},"zui.calendar":{weekNames:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],monthNames:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",year:"{0} Année",month:"{0} Mois",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Aucune icône]",commonIcons:"Icônes communes",webIcons:"Icône Web",editorIcons:"Icône de l'éditeur",directionalIcons:"Flèche confluence",otherIcons:"Autres icônes"},"zui.colorPicker":{errorTip:"Pas une valeur de couleur valide"},"zui.datagrid":{errorCannotGetDataFromRemote:"Impossible d'obtenir les données du serveur distant ({0}).",errorCannotHandleRemoteData:"Impossible de traiter les données renvoyées par le serveur distant."},"zui.guideViewer":{prevStep:"Étape précédente",nextStep:"Prochaine étape"},"zui.tabs":{reload:"Recharger",close:"Fermer",closeOthers:"Fermez les autres onglets",closeRight:"Fermer l'onglet de droite",reopenLast:"Restaurer le dernier onglet fermé",errorCannotFetchFromRemote:"Impossible d'obtenir le contenu du serveur distant ({0})."},"zui.uploader":{},datetimepicker:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",suffix:[],meridiem:[]},chosen:{no_results_text:"Pas trouvé"},bootbox:{OK:"D'accord",CANCEL:"Annuler",CONFIRM:"Confirmer"}}); \ No newline at end of file diff --git a/www/theme/zui/css/min.css b/www/theme/zui/css/min.css index 89c9b9cc9a..2f2f6b0fb0 100644 --- a/www/theme/zui/css/min.css +++ b/www/theme/zui/css/min.css @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-07 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-18 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT @@ -13,4 +13,4 @@ * * Copyright (c) 2011-2016 Harvest http://getharvest.com * MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md -*/.chosen-container{position:relative;display:block;font-size:13px;vertical-align:middle;zoom:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;display:none;width:100%;background:#fff;border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-top:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container .chosen-drop.chosen-drop-size-limited{border-top:1px solid rgba(0,0,0,.15)}.chosen-container .chosen-drop.chosen-auto-max-width{min-width:100%;border-top:1px solid rgba(0,0,0,.15);opacity:0}.chosen-container .chosen-drop.chosen-auto-max-width>.chosen-results>li{display:inline-block;white-space:nowrap}.chosen-container .chosen-drop.chosen-auto-max-width.in{opacity:1}.chosen-container .chosen-drop.chosen-auto-max-width.in>.chosen-results>li{display:block;white-space:normal}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap!important}.chosen-container.chosen-with-drop .chosen-drop{display:block}.chosen-container a{cursor:pointer}.chosen-container.chosen-up .chosen-drop{top:inherit;bottom:100%;margin-top:auto;margin-bottom:-1px;border-radius:2px 2px 0 0;-webkit-box-shadow:0 -3px 5px rgba(0,0,0,.175);box-shadow:0 -3px 5px rgba(0,0,0,.175)}.chosen-container.chosen-highlight-selected .result-selected{color:#0c64eb;background:#e9f2fb}.chosen-container-single .chosen-single{display:block;width:100%;height:32px;padding:5px 8px;overflow:hidden;line-height:1.42857143;color:#222;text-decoration:none;white-space:nowrap;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-single .chosen-default{color:#838a9d}.chosen-container-single .chosen-single>span{display:block;margin-right:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:5px;right:24px;display:block;width:20px;height:20px;font-family:sans-serif;font-size:18px;font-weight:700;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-single .chosen-single abbr:before{display:block;content:'×'}.chosen-container-single .chosen-single abbr:focus,.chosen-container-single .chosen-single abbr:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;height:100%;padding:5px 8px}.chosen-container-single .chosen-single div b{display:inline-block;width:0;height:0;margin-bottom:2px;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent;opacity:.5}.chosen-container-single .chosen-search{position:relative;z-index:1010;padding:3px 4px;margin:0;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{width:100%;height:27px;padding:2px 26px 2px 8px;margin:1px 0;font-size:12px;line-height:1.5;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;outline:0}.chosen-container-single .chosen-search input[type=text]:focus{border-color:#0c64eb}.chosen-container-single .chosen-search:before{position:absolute;top:10px;right:10px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-single .chosen-drop{margin-top:-1px;-webkit-background-clip:padding-box;background-clip:padding-box;border-radius:0 0 4px 4px}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;max-height:240px;padding:0;margin:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;padding:5px 10px;margin:0;line-height:15px;list-style:none;-webkit-transition:background-color .2s cubic-bezier(.175,.885,.32,1);-o-transition:background-color .2s cubic-bezier(.175,.885,.32,1);transition:background-color .2s cubic-bezier(.175,.885,.32,1);-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{color:#fff;background-color:#0c64eb}.chosen-container .chosen-results li.no-results{display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;width:100%;min-height:32px;min-height:30px\9;padding:0;margin:0;overflow:hidden;cursor:text;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-multi .chosen-choices:after,.chosen-container-multi .chosen-choices:before{display:table;content:" "}.chosen-container-multi .chosen-choices:after{clear:both}.chosen-container-multi .chosen-choices li{display:block;float:left;padding:0 6px;margin:5px 4px;list-style:none}.chosen-container-multi .chosen-choices li.search-field{padding:0;line-height:12px;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{height:20px;font-size:100%;color:#838a9d;background:0 0!important;border:0!important;border-radius:0;outline:0;-webkit-box-shadow:none;box-shadow:none}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-field:before{position:absolute;right:8px;bottom:8px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";opacity:0;-webkit-transition:opacity .2s cubic-bezier(.175,.885,.32,1);-o-transition:opacity .2s cubic-bezier(.175,.885,.32,1);transition:opacity .2s cubic-bezier(.175,.885,.32,1);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice{position:relative;padding:3px 20px 3px 5px;line-height:12px;cursor:default;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}.chosen-container-multi .chosen-choices li.search-choice:hover{background-color:#fff;border-color:#adb5c6;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 0 rgba(0,0,0,.1)}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:1px;right:0;display:block;width:20px;height:18px;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:focus,.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;color:#666;background-color:#e4e4e4;border:1px solid #ccc}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{padding:5px 0;margin:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-bottom-right-radius:0!important;border-bottom-left-radius:0!important;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active.chosen-with-drop .chosen-single div{background:0 0;border-left:none}.chosen-container-active.chosen-with-drop .chosen-single div b{content:"";border-top:0 dotted;border-bottom:4px solid}.chosen-container-active.chosen-with-drop.chosen-up .chosen-single{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active .chosen-choices{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#111!important}.chosen-container-active .chosen-choices li.search-field:before{opacity:1}.chosen-disabled{cursor:default;opacity:.5!important}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{left:0;display:none;padding:3px 4px;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:25px;padding:2px 26px 2px 4px;font-size:inherit}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{top:9px}.chosen-compact.chosen-with-search.chosen-with-drop .chosen-single>.chosen-search{display:block;opacity:1}select.chosen[multiple]{height:32px;overflow:hidden}select.chosen[multiple] option{visibility:hidden}.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.picker-focus .picker-selections{border-color:#0c64eb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6)}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\e928";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\f0d7";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:"\e928"}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:18px;height:18px;text-align:center;cursor:pointer;opacity:.2;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.picker-selection-remove:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px;z-index:1}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-multi.picker-sortable .picker-selection-text{cursor:move}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.picker-no-value.picker-focus .picker-placeholder{display:none}.picker-input-empty.picker-focus.picker-no-value .picker-placeholder,.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.42857143;color:#3c4353;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#0c64eb;background:#e9f2fb}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#0c64eb}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option-text-matched{position:relative;color:#0c64eb}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:2px;content:' ';background-color:#0c64eb;border-radius:2px;opacity:.5}.picker-option-active .picker-option-text-matched,.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option-active .picker-option-text-matched:before,.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ff5d5d}.picker-actions{padding:5px;border-top:1px solid #eee}.picker-no-actions .picker-actions{display:none}.picker-actions .btn{padding:2px 4px}.picker-actions .btn[disabled]{background-color:transparent;filter:grayscale(1);-webkit-filter:grayscale(1)}.picker-actions .btn+.btn{margin-left:4px}.container,.container-fixed,.container-fluid{position:relative}.container{max-width:1800px!important}body{background-color:#efefef}body.article-content,body.body-modal{background:0 0}body.body-modal{padding:0}@media screen and (min-width:1920px){body{font-size:14px}}a:active,a:focus,button:active,button:focus{outline:0!important}.strong{font-weight:700}.font-normal{font-weight:400!important}.text-middle{vertical-align:middle!important}.text-bottom{vertical-align:bottom!important}.text-top{vertical-align:top!important}.inline-block{display:inline-block!important}.layer{border-radius:4px;-webkit-box-shadow:0 0 20px 0 #bdc9d8;box-shadow:0 0 20px 0 #bdc9d8}.space{margin-bottom:20px}.space-lg{margin-bottom:30px}.space-sm{margin-bottom:10px}.muted{opacity:.5}.text-muted em{color:#3c4353}.no-animate{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.template{display:none!important}.text-left{text-align:left!important}.text-yellow.icon-folder{color:#ffe066}.table-row{display:table;width:100%;table-layout:fixed}.table-col,.table-row>.col,.table-row>[class*=col-],.table-row>[class*="-col"]{display:table-cell;float:none;vertical-align:top}.side-col{width:200px;padding-right:20px}.side-col.col-4{width:33.3333333%}.col-lg{width:260px}.col-xl{width:320px}.col-sm{width:150px}.col-xs{width:100px}.main-col+.side-col{padding-right:0;padding-left:20px}.row-grid>[class*=col-],.row-grid>[class*="-col"]{padding-top:6px;padding-bottom:6px}hr.space{margin:10px 0;border:none}hr.space-sm{margin:5px 0;border:none}.text-secondary{color:#16a8f8}a.text-primary{color:#0c64eb}.nav-primary>li>a{min-width:100px;padding:5px 8px;color:#838a9d;border-color:#e7f1fc}.nav-primary>li.active>a{color:#0c64eb;background-color:#e7f1fc;border-color:#e7f1fc}.nav-primary>li.active>a:hover{color:#0c64eb;background-color:#c3dcf7;border-color:#c3dcf7}.end-marker{margin-bottom:20px;color:#cbd0db;text-align:center}@-webkit-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@-o-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}.highlight{-webkit-animation:highlight .5s linear 0s 2 alternate;-o-animation:highlight .5s linear 0s 2 alternate;animation:highlight .5s linear 0s 2 alternate}.progress.inline-block{width:100px;margin:0}.w-p5{width:5%!important}.w-p10{width:10%!important}.w-p15{width:15%!important}.w-p20{width:20%!important}.w-p25{width:25%!important}.w-p30{width:30%!important}.w-p35{width:35%!important}.w-p40{width:40%!important}.w-p45{width:45%!important}.w-p50{width:50%!important}.w-p55{width:55%!important}.w-p60{width:60%!important}.w-p65{width:65%!important}.w-p70{width:70%!important}.w-p75{width:75%!important}.w-p80{width:80%!important}.w-p85{width:85%!important}.w-p90{width:90%!important}.w-p94{width:94%!important}.w-p95{width:95%!important}.w-p98{width:98%!important}.w-p99{width:99%!important}.w-p100{width:100%!important}.w-auto{width:auto!important}.w-10px{width:10px!important}.w-20px{width:20px!important}.w-30px{width:30px!important}.w-35px{width:35px!important}.w-40px{width:40px!important}.w-45px{width:45px!important}.w-50px{width:50px!important}.w-60px{width:60px!important}.w-70px{width:70px!important}.w-80px{width:80px!important}.w-90px{width:90px!important}.w-100px{width:100px!important}.w-110px{width:110px!important}.w-120px{width:120px!important}.w-130px{width:130px!important}.w-140px{width:140px!important}.w-150px{width:150px!important}.w-160px{width:160px!important}.w-180px{width:180px!important}.w-200px{width:200px!important}.w-230px{width:230px!important}.w-250px{width:250px!important}.w-300px{width:300px!important}.w-400px{width:400px!important}.w-500px{width:500px!important}.w-600px{width:600px!important}.w-700px{width:700px!important}.w-800px{width:800px!important}.w-900px{width:900px!important}.mw-200px{max-width:200px!important}.mw-300px{max-width:300px!important}.mw-400px{max-width:400px!important}.mw-500px{max-width:500px!important}.mw-600px{max-width:600px!important}.mw-700px{max-width:700px!important}.mw-800px{max-width:800px!important}.mw-900px{max-width:900px!important}.mw-1400px{max-width:1400px!important}.w-id{width:70px!important}.w-pri{width:40px!important}.w-severity{width:50px!important}.w-hour{width:57px!important}.w-date{width:90px!important}.w-status{width:60px!important}.w-resolution,.w-type,.w-user{width:80px!important}.w-p15-f{width:15%!important;min-width:120px!important}.w-p25-f{width:25%!important;min-width:200px!important}.w-p35-f{width:35%!important;min-width:300px!important}.w-p45-f{width:45%!important;min-width:400px!important}.h-5px{height:5px!important}.h-10px{height:10px!important}.h-20px{height:20px!important}.h-30px{height:30px!important}.h-35px{height:35px!important}.h-40px{height:40px!important}.h-45px{height:45px!important}.h-50px{height:50px!important}.h-60px{height:60px!important}.h-70px{height:70px!important}.h-80px{height:80px!important}.h-100px{height:100px!important}.h-120px{height:120px!important}.h-130px{height:130px!important}.h-140px{height:140px!important}.h-150px{height:150px!important}.h-200px{height:200px!important}.pd-0{padding:0!important}.mg-0{margin:0!important}.mgb-20{margin-bottom:20px!important}.mgb-10{margin-bottom:10px!important}.pdb-20{padding-bottom:20px!important}.pdt-20{padding-top:20px!important}.br-0{border-radius:0!important}.bd-0,.bd-none,.borderless{border:none!important}.bg-none{background:0 0!important}.red{color:#ff5d5d!important}.icon-pro-version{font-size:14px!important}.icon-pro-version:before{position:relative;top:-1px;font-size:14px;color:#ff5d5d;content:"\e92b"}.bg-primary{color:#fff;background:#1183fb -webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:#1183fb -webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:#1183fb -o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:#1183fb linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);background-color:#00b1fd}.bg-primary-pure{color:#fff;background-color:#0c64eb}.bg-primary-pale{color:#0c64eb;background-color:#e9f2fb}.bg-secondary{color:#fff;background:#16a8f8}.hl-tutorial{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 0 0 #000!important;box-shadow:0 0 0 0 #000!important;-webkit-transition:-webkit-box-shadow 1s!important;-o-transition:box-shadow 1s!important;transition:-webkit-box-shadow 1s!important;transition:box-shadow 1s!important;transition:box-shadow 1s,-webkit-box-shadow 1s!important}.hl-tutorial.hl-in{-webkit-box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important;box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important}.btn.tooltip-tutorial,.hl-tutorial.hl-in:hover{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important;box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important}.tooltip-max .tooltip-inner{max-width:1000px;padding:8px 10px}.transition-all *{-webkit-transition:all .2s!important;-o-transition:all .2s!important;transition:all .2s!important}.scroll-x{overflow-x:auto!important}.scroll-y{overflow-y:auto!important}.divider+.divider{display:none}.ie *{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}@font-face{font-family:Oswald;font-weight:400;src:url(../fonts/Oswald-Regular.ttf)}@font-face{font-family:Oswald;font-weight:500;src:url(../fonts/Oswald-Medium.ttf)}@font-face{font-family:Oswald;font-weight:300;src:url(../fonts/Oswald-Light.ttf)}.num{font-family:Oswald;font-weight:400}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(../fonts/ZentaoIcon.eot?v=1.28);src:url(../fonts/ZentaoIcon.eot?#iefix&v=1.28) format('embedded-opentype'),url(../fonts/ZentaoIcon.woff?v=1.28) format('woff'),url(../fonts/ZentaoIcon.ttf?v=1.28) format('truetype'),url(../fonts/ZentaoIcon.svg#regular?v=1.28) format('svg')}.icon,[class*=" icon-"],[class^=icon-]{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}a .icon,a [class*=" icon-"],a [class^=icon-]{display:inline}.icon-lg:before{font-size:1.33333333em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-spin{display:inline-block;-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-spin{display:inline-block;text-decoration:none}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);-o-transform:rotate(359deg);transform:rotate(359deg)}}.icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.icon-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.icon.icon-flip-horizontal,.icon.icon-flip-vertical,.icon.icon-rotate-180,.icon.icon-rotate-270,.icon.icon-rotate-90{display:inline-block}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-help:before{content:"\e968"}.icon-import:before{content:"\e904"}.icon-download:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-plus:before{content:"\e925"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-chart-bar:before{content:"\e95d"}.icon-bar-chart:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before{content:"\e940"}.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-college:before{content:"\e9c8"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-menu-my:before{content:"\e97a"}.icon-home:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before{content:"\e98f"}.icon-product:before{content:"\e98f"}.icon-rocket:before{content:"\e99c"}.icon-project:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-test:before{content:"\e956"}.icon-infinite:before{content:"\e9a3"}.icon-devops:before{content:"\e9a3"}.icon-ops:before{content:"\e903"}.icon-doc:before{content:"\e99b"}.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-menu-backend:before{content:"\e993"}.icon-assets:before{content:"\e9ae"}.icon-diamond:before{content:"\e9ae"}.icon-feedback:before{content:"\e991"}.icon-flow:before{content:"\e994"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before{content:"\e996"}.icon-info:before{content:"\e996"}.icon-cog-outline:before{content:"\e997"}.icon-backend:before{content:"\e997"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before{content:"\f0ac"}.icon-lang:before{content:"\f0ac"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-kanban:before{content:"\e983"}.icon-lane:before{content:"\e9b1"}.icon-back:before{content:"\e9d3"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before{content:"\e9c7"}.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-hash:before{content:"\e9ab"}.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file:before{content:"\f016"}.icon-file-empty:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-group:before{content:"\e97e"}.icon-menu-users:before{content:"\e97e"}.icon-persons:before{content:"\e97e"}.icon-team:before{content:"\e97e"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-cancel:before{content:"\e951"}.icon-ban-circle:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before{content:"\e950"}.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-start:before{content:"\e90a"}.icon-play:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-change:before{content:"\e970"}.icon-alter:before{content:"\e970"}.icon-glasses:before{content:"\e914"}.icon-review:before{content:"\e914"}.icon-sitemap:before{content:"\e915"}.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-magic:before{content:"\e919"}.icon-active:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-delay:before{content:"\e91d"}.icon-calendar:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.icon-sm:before{font-size:14px;vertical-align:10%}.icon-qc{position:relative}.icon-qc:before{width:1em;color:#7cb938;content:"\e985"}.icon-qc:after{position:absolute;top:0;left:0;width:1em;height:1em;font-family:ZentaoIcon;font-size:14px;font-size:inherit;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#36a742;text-transform:none;content:"\e987";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-message.has-dot{position:relative}.icon-message.has-dot::after{position:absolute;top:-3px;right:-5px;display:block;width:6px;height:6px;content:' ';background-color:#ff5d5d;border-radius:50%}.icon-project{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.icon-product{-webkit-transform:scale(1.15);-ms-transform:scale(1.15);-o-transform:scale(1.15);transform:scale(1.15)}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:18px;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px;-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background,border,outline,opacity,-webkit-box-shadow;-o-transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,outline,opacity,-webkit-box-shadow;transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,box-shadow,outline,opacity,-webkit-box-shadow}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{color:#3c4353;text-decoration:none}.btn:active{text-decoration:none;background-image:none;outline:0;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.1)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:grayscale(1);-webkit-box-shadow:none;box-shadow:none;opacity:.5;-webkit-filter:grayscale(1)}.btn{color:#3c4353;background-color:#fff;border-color:#d6dae3}.btn.active,.btn.hover,.btn:active,.btn:focus,.btn:hover,.open .dropdown-toggle.btn{color:#3c4353;background-color:rgba(255,255,255,.8);border-color:#b8bfce}.btn.active,.btn:active,.open .dropdown-toggle.btn{background-color:#f2f2f2;background-image:none;border-color:#b8bfce}.btn.disabled,.btn.disabled.active,.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover,.btn[disabled],.btn[disabled].active,.btn[disabled]:active,.btn[disabled]:focus,.btn[disabled]:hover,fieldset[disabled] .btn,fieldset[disabled] .btn.active,fieldset[disabled] .btn:active,fieldset[disabled] .btn:focus,fieldset[disabled] .btn:hover{color:rgba(60,67,83,.3);background-color:#fff;border-color:#d6dae3}.btn-gray{color:#82899f;background-color:#f1f1f1;border-color:#f1f1f1}.btn-gray.active,.btn-gray.hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.open .dropdown-toggle.btn-gray{color:#82899f;background-color:rgba(241,241,241,.8);border-color:#d8d8d8}.btn-gray.active,.btn-gray:active,.open .dropdown-toggle.btn-gray{background-color:#e4e4e4;background-image:none;border-color:#d8d8d8}.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,fieldset[disabled] .btn-gray,fieldset[disabled] .btn-gray.active,fieldset[disabled] .btn-gray:active,fieldset[disabled] .btn-gray:focus,fieldset[disabled] .btn-gray:hover{color:rgba(130,137,159,.3);background-color:#f1f1f1;border-color:#f1f1f1}.btn-primary{color:#fff;background-color:#0c64eb;border-color:transparent}.btn-primary.active,.btn-primary.hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:rgba(12,100,235,.8);border-color:rgba(0,0,0,0)}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background-color:#0b5ad3;background-image:none;border-color:rgba(0,0,0,0)}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{color:rgba(255,255,255,.3);background-color:#0c64eb;border-color:transparent}.btn-secondary{color:#fff;background-color:#16a8f8;border-color:transparent}.btn-secondary.active,.btn-secondary.hover,.btn-secondary:active,.btn-secondary:focus,.btn-secondary:hover,.open .dropdown-toggle.btn-secondary{color:#fff;background-color:rgba(22,168,248,.8);border-color:rgba(0,0,0,0)}.btn-secondary.active,.btn-secondary:active,.open .dropdown-toggle.btn-secondary{background-color:#079ced;background-image:none;border-color:rgba(0,0,0,0)}.btn-secondary.disabled,.btn-secondary.disabled.active,.btn-secondary.disabled:active,.btn-secondary.disabled:focus,.btn-secondary.disabled:hover,.btn-secondary[disabled],.btn-secondary[disabled].active,.btn-secondary[disabled]:active,.btn-secondary[disabled]:focus,.btn-secondary[disabled]:hover,fieldset[disabled] .btn-secondary,fieldset[disabled] .btn-secondary.active,fieldset[disabled] .btn-secondary:active,fieldset[disabled] .btn-secondary:focus,fieldset[disabled] .btn-secondary:hover{color:rgba(255,255,255,.3);background-color:#16a8f8;border-color:transparent}.btn-warning{color:#fff;background-color:#ff9800;border-color:transparent}.btn-warning.active,.btn-warning.hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:rgba(255,152,0,.8);border-color:rgba(0,0,0,0)}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background-color:#e68900;background-image:none;border-color:rgba(0,0,0,0)}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{color:rgba(255,255,255,.3);background-color:#ff9800;border-color:transparent}.btn-danger{color:#fff;background-color:#ff5d5d;border-color:transparent}.btn-danger.active,.btn-danger.hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:rgba(255,93,93,.8);border-color:rgba(0,0,0,0)}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background-color:#ff4343;background-image:none;border-color:rgba(0,0,0,0)}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{color:rgba(255,255,255,.3);background-color:#ff5d5d;border-color:transparent}.btn-success{color:#fff;background-color:#00da88;border-color:transparent}.btn-success.active,.btn-success.hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:rgba(0,218,136,.8);border-color:rgba(0,0,0,0)}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background-color:#00c178;background-image:none;border-color:rgba(0,0,0,0)}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{color:rgba(255,255,255,.3);background-color:#00da88;border-color:transparent}.btn-info{color:#0c64eb;background-color:#e9f2fb;border-color:transparent}.btn-info.active,.btn-info.hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#0c64eb;background-color:rgba(233,242,251,.8);border-color:rgba(0,0,0,0)}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background-color:#d3e5f7;background-image:none;border-color:rgba(0,0,0,0)}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{color:rgba(12,100,235,.3);background-color:#e9f2fb;border-color:transparent}.btn-link{padding-right:6px;padding-left:6px;font-weight:400;color:#3c495c;text-shadow:none;cursor:pointer;background:0 0;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover,.btn-link[disabled],fieldset[disabled] .btn-link{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{color:#222;background:#f1f1f1;background:rgba(0,0,0,.075)}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#cbd0db;text-decoration:none}.btn-lg{padding:11px 16px;font-size:14px;line-height:18px;border-radius:4px}.btn-mini,.btn-sm{padding:3px 8px;font-size:12px;line-height:18px;border-radius:4px}.btn-mini,.btn-xs{padding:0 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-wide{min-width:120px}.btn-limit{max-width:180px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-limit>.caret{position:absolute;top:14px;right:8px}.btn-circle{border-radius:17px}.btn>.label-icon{top:3px;padding:3px;margin:-2px;background-color:rgba(0,0,0,.2);border-radius:12px}.btn>.label-icon>.icon{font-size:16px;line-height:18px}.btn>.icon+.text{margin-left:5px}.btn.btn-sm.btn-circle{border-radius:12px}.btn.btn-sm>.label-icon{top:2px;width:20px;height:20px;padding:1px;line-height:20px}.btn.btn-sm>.label-icon>.icon{position:relative;top:-1px;display:inline-block;font-size:14px;line-height:18px}.btn-icon-left{position:relative;padding-left:35px;overflow:hidden;text-align:right}.btn-icon-left>.label-icon{position:absolute;left:5px;margin:0}.btn-icon-left>.icon{position:absolute;top:0;bottom:0;left:0;display:block;width:30px;line-height:30px;color:#16a8f8;text-align:center;background:#e9f2fb}.btn-icon-left.btn-sm{padding-left:28px}.btn-icon-left.btn-sm>.label-icon{left:2px}.btn-icon-left.btn-sm>.icon{width:24px;line-height:24px}.btn-icon-right{position:relative;padding-right:35px;text-align:left}.btn-icon-right>.label-icon{position:absolute;right:5px;margin:0}.btn-icon-right.btn-sm{padding-right:28px}.btn-icon-right.btn-sm>.label-icon{right:2px}.btn-icon{min-width:32px;padding-right:0;padding-left:0}.btn-icon.btn-sm{width:24px;min-width:24px;height:24px}.btn-group{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group>.btn-group{float:left}.btn-group>.btn{border-radius:0}.btn-group>.btn:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.btn-group>.btn:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.dropdown{float:left;margin-right:10px}.btn-toolbar>.btn-group:last-child,.btn-toolbar>.btn:last-child,.btn-toolbar>.dropdown:last-child{margin-right:0}.btn-toolbar>.divider{float:left;height:20px;margin:7px 5px 4px 10px;border-left:1px solid rgba(0,0,0,.1)}.btn-toolbar .space{float:left;min-height:1px;margin:0 10px 0 10px}.btn-toolbar .input-control{float:left;width:120px}.btn-toolbar .page-title{float:left;line-height:34px}.btn-toolbar .page-title .text{font-size:14px;font-weight:700}.btn-toolbar .page-title .label{top:-2px;margin-right:10px}.btn-toolbar .divider+.page-title{margin-left:15px}.btn-active-line{position:relative;font-weight:700;color:#0c64eb}.btn-active-line:after{position:absolute;right:5px;bottom:1px;left:5px;display:block;content:' ';border-bottom:2px solid #0c64eb}.btn-active-line:hover{color:#0c64eb}.btn-active-text .text{position:relative;top:-1px;display:inline-block;font-weight:700;color:#0c64eb}.btn-active-text .text:after{position:absolute;bottom:-5px;display:block;width:100%;content:' ';border-bottom:2px solid #0c64eb}.angle-btn{position:relative;padding:1px;background:#fff;border:1px solid #cbd0db;border-right:none}.angle-btn:first-child{border-radius:2px 0 0 2px}.btn-toolbar>.angle-btn{margin-right:8px}.angle-btn:after,.angle-btn:before{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn:after{right:-7px;border-color:transparent transparent transparent #fff;border-radius:2px}.angle-btn .btn{padding:6px;font-weight:700;background:#fff;border:none;border-radius:4px!important}.angle-btn .btn.btn-limit{padding-right:16px}.angle-btn .btn.btn-limit>.caret{right:4px}.angle-btn+.angle-btn{border-left:none}.angle-btn+.angle-btn>.btn-group:first-child{padding-left:8px}.angle-btn+.angle-btn>.btn-group:first-child:after,.angle-btn+.angle-btn>.btn-group:first-child:before{position:absolute;top:-2px;left:0;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn+.angle-btn>.btn-group:first-child:after{left:-1px;border-color:transparent transparent transparent #fff;border-width:17px 0 17px 8px}.btn-toolbar>.angle-btn.active,.btn-toolbar>.angle-btn:last-child{border-color:#0c64eb}.btn-toolbar>.angle-btn.active .btn,.btn-toolbar>.angle-btn:last-child .btn{color:#0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn.active:before,.btn-toolbar>.angle-btn:last-child:after,.btn-toolbar>.angle-btn:last-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn:last-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:before,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn,.btn-toolbar>.angle-btn.normal{border-color:#cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn .btn,.btn-toolbar>.angle-btn.normal .btn{color:#3c4353}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.active+.angle-btn:before,.btn-toolbar>.angle-btn.normal:after,.btn-toolbar>.angle-btn.normal:before{border-color:transparent transparent transparent #cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.normal:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before,.btn-toolbar>.angle-btn.normal>.btn-group:first-child:before{border-color:transparent transparent transparent #cbd0db!important}.nav>li>.btn.btn-primary{color:#fff}.nav>li>.btn.btn-primary:focus,.nav>li>.btn.btn-primary:hover{background:rgba(12,100,235,.8)}.btn.btn-action,.c-actions .btn{display:inline-block;width:26px;padding:2px;overflow:hidden;line-height:20px;color:#16a8f8;background:0 0;border-color:transparent}.btn.btn-action>i,.c-actions .btn>i{position:relative;top:1px;font-size:18px}.btn.btn-action:hover,.c-actions .btn:hover{color:#0c64eb;background-color:#d3e5f7}.c-actions .btn+.btn{margin-left:-4px}.label{position:relative;display:inline-block;padding:3px 5px;font-size:12px;font-weight:400;vertical-align:middle;border-radius:2px}.label+.label{margin-left:4px}.label-pale{background:#bed8f3!important}.label-badge{border-radius:9px}.label-light{color:#3c4353;background-color:#ddd}.label-primary{background:#0c64eb!important}.label-gray{color:#878da0;background:#e8ebef}.label-outline.label-danger{color:#ff5d5d;background:#ffebee;border-color:rgba(255,93,93,.25)}.label-outline.label-light{color:#838a9d;background:#f2f5fb;border-color:#e1e5ee}.label-primary.label-outline{background:#e9f2fb!important;border-color:rgba(12,100,235,.25)}.label-outline.label-success{background:#e8f5e9;border-color:rgba(0,218,136,.25)}.label-outline.label-info{border-color:rgba(33,150,243,.25)}.label-outline.label-warning{border-color:rgba(255,152,0,.25)}.label-dot{position:relative;top:-1px;padding:0;border-radius:50%}.label-dot+.status-text{display:inline-block;margin-left:5px}.label-icon{min-width:18px;padding:0;line-height:18px;border-radius:10px}.label-id{display:inline-block;min-width:30px;padding:0 5px;font-size:12px;line-height:16px;color:#838a9d;text-align:center;vertical-align:middle;background-color:transparent;border:1px solid #838a9d;border-radius:2px}.pri-1,.todo-pri-1{color:#ff5d5d}[class*=" status-"],[class^=status-]{color:#3c4353}.status-changed,.status-delayed,.status-doing,.status-fail,.status-investigate{color:#ff5d5d}.status-changed>.label-dot,.status-delayed>.label-dot,.status-doing>.label-dot,.status-fail>.label-dot,.status-investigate>.label-dot{background-color:#ff5d5d}.status-wait{color:#838a9d}.status-wait>.label-dot{background-color:#7ec5ff}.status-unclosed{color:#838a9d}.status-unclosed>.label-dot{background-color:#0c64eb}.status-done,.status-normal,.status-pass,.status-resolved{color:#43a047}.status-done>.label-dot,.status-normal>.label-dot,.status-pass>.label-dot,.status-resolved>.label-dot{background-color:#00da88}.status-postpone{color:#838a9d}.status-postpone>.label-dot{background-color:#ff5d5d}.status-blocked{position:relative;left:-5px;display:inline-block;padding:0 5px;line-height:20px;color:#3c4353;background:0 0;border-radius:10px}.status-blocked>.label-dot{background-color:#ff9800}.status-pause,.status-suspended{color:#ff9800}.status-pause>.label-dot,.status-suspended>.label-dot{background-color:#ff9800}.status-active.status-bug,.status-draft{color:#8666b8}.status-active.status-bug>.label-dot,.status-draft>.label-dot{background-color:#8666b8}.status-closed,.status-terminate{color:#838a9d}.status-closed>.label-dot,.status-terminate>.label-dot{background-color:#838a9d}.status-cancel{color:#838a9d}.status-cancel>.label-dot{background-color:#cbd0db}.label-pri{display:inline-block;min-width:18px;max-width:100%;height:18px;padding:0 4px;overflow:hidden;font-size:12px;line-height:16px;color:#838a9d;text-align:center;text-overflow:clip;white-space:normal;vertical-align:middle;border:1px solid #838a9d;border-radius:10px}.label-selector>.label-pri,[class*=label-pri-]{color:#158af1;border-color:#2098ee}.label-pri-1,.label-selector>.label-pri[data-value="1"]{color:#d50000;border-color:#d50000}.label-pri-2,.label-selector>.label-pri[data-value="2"]{color:#ff9800;border-color:#ff9800}.label-pri-3,.label-selector>.label-pri[data-value="3"]{color:#2098ee;border-color:#2098ee}.label-pri-4,.label-selector>.label-pri[data-value="4"]{color:#009688;border-color:#009688}.label-pri-5,.label-selector>.label-pri[data-value="5"]{color:#838a9d;border-color:#838a9d}.label-pri-0,.label-selector>.label-pri.active[data-value="0"]{color:#d5d9df;border-color:#d5d9df}.label-severity{position:relative;display:inline-block;width:24px;height:20px;font-weight:bolder;text-align:center;vertical-align:middle}.label-severity:before{position:absolute;top:-3px;left:0;z-index:0;display:block;font-family:ZentaoIcon;font-size:14px;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:inherit;text-transform:none;content:"\e973";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.label-severity:after{position:absolute;top:7px;left:0;z-index:1;display:block;width:24px;font-size:12px;line-height:12px;text-align:center;content:attr(data-severity)}.label-severity[data-severity],.label-severity[data-value]{color:#ccc}.label-severity[data-severity="0"],.label-severity[data-value="0"]{color:#ccc}.label-severity[data-severity="0"]:after,.label-severity[data-value="0"]:after{display:none}.label-severity[data-severity="1"],.label-severity[data-value="1"]{color:#c62828}.label-severity[data-severity="2"],.label-severity[data-value="2"]{color:#ff8f00}.label-severity[data-severity="3"],.label-severity[data-value="3"]{color:#fdd835}.label-severity[data-severity="4"],.label-severity[data-value="4"]{color:#cddc39}.label-severity[data-severity="5"],.label-severity[data-value="5"]{color:#8bc34a}.label-severity-custom[data-severity]{color:#d5d9df}.label-severity-custom[data-severity="1"]{color:#c62828}.label-severity-custom[data-severity="2"]{color:#ff8f00}.label-severity-custom[data-severity="3"]{color:#fdd835}.label-severity-custom[data-severity="4"]{color:#cddc39}.label-severity-custom[data-severity="5"]{color:#8bc34a}.label-selector{padding:0 10px}.label-selector>.label{display:inline-block;min-width:24px;height:24px;padding:0 5px;font-size:14px;line-height:20px;text-align:center;cursor:pointer;background:0 0;border:2px solid #d5d9df;border-radius:15px}.label-selector>.label+.label{margin-left:10px}.label-selector>.label.empty{border-color:transparent}.label-selector>.label.label-severity{font-size:12px;line-height:28px;border-color:transparent}.label-selector>.label.label-severity:before{top:-2px;left:-2px}.label-selector>.label.label-severity:after{display:none}.label-selector>.label.label-severity.active{background:0 0;filter:none;-webkit-filter:none}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-top:2px}.ie .checkbox input[type=checkbox],.ie .checkbox-inline input[type=checkbox],.ie .radio input[type=radio],.ie .radio-inline input[type=radio]{margin-top:4px}.is-firefox .checkbox input[type=checkbox],.is-firefox .checkbox-inline input[type=checkbox],.is-firefox .radio input[type=radio],.is-firefox .radio-inline input[type=radio]{margin-top:3px}.checkbox-primary,.radio-primary{position:relative;display:block;vertical-align:middle}.checkbox-primary.inline-block,.radio-primary.inline-block{display:inline-block}.checkbox-primary.inline-block+.inline-block,.radio-primary.inline-block+.inline-block{margin-left:15px}.checkbox-primary>input,.radio-primary>input{position:absolute;top:0;left:0;z-index:3;width:100%;height:100%;margin:0;opacity:0}.checkbox-primary>label,.radio-primary>label{display:block;height:20px;padding-left:30px;margin:0;font-weight:400;line-height:20px;cursor:pointer}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{position:absolute;top:1px;right:0;left:0;display:block;width:18px;height:18px;line-height:18px;text-align:center;content:' ';border-radius:3px}.checkbox-primary>label:after,.radio-primary>label:after{z-index:1;border:2px solid #eee;border-color:rgba(0,0,0,.15);-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:border,background-color;-o-transition-property:border,background-color;transition-property:border,background-color}.checkbox-primary>label:before,.radio-primary>label:before{top:3px;z-index:2;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-weight:900;font-variant:normal;line-height:1;text-transform:none;content:"\e5ca";opacity:0;-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:opacity,-webkit-transform;-o-transition-property:opacity,-o-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform,-o-transform;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.checkbox-primary.checked>label:after,.checkbox-primary>input:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:#00da88;border-color:#00da88;border-width:4px}.checkbox-primary.checked>label:before,.checkbox-primary>input:checked+label:before,.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{color:#fff;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary input:indeterminate+label:before,.checkbox-primary.indeterminate>label:before,.radio-primary input:indeterminate+label:before,.radio-primary.indeterminate>label:before{top:9px;left:5px;width:8px;height:2px;content:' ';background-color:#a3a2bc;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary.focus>label:after,.checkbox-primary>input:focus+label:after,.radio-primary.focus>label:after,.radio-primary>input:focus+label:after{border-color:#00da88;-webkit-box-shadow:0 0 0 3px rgba(0,218,136,.2);box-shadow:0 0 0 3px rgba(0,218,136,.2)}.checkbox-primary:hover>label:after,.radio-primary:hover>label:after{border-color:#00da88}.checkbox-primary.checkbox-right>label,.radio-primary.checkbox-right>label{padding:0 30px 0 0}.checkbox-primary.checkbox-right>label:after,.checkbox-primary.checkbox-right>label:before,.radio-primary.checkbox-right>label:after,.radio-primary.checkbox-right>label:before{right:0;left:auto}.checkbox-primary input:disabled+label:after,.checkbox-primary.disabled>label:after,.radio-primary input:disabled+label:after,.radio-primary.disabled>label:after{background-color:#e5e5e5!important;border-color:#bbb!important}.checkbox-primary input:disabled:checked+label:after,.checkbox-primary.checked.disabled>label:after,.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:#bbb!important}.radio-primary>label:after{border-radius:50%}.radio-primary>label:before{top:7px;left:6px;width:6px;height:6px;content:' ';border:none;border-radius:50%}.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:transparent;border-color:#00da88;border-width:2px}.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{background-color:#00da88}.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:transparent;border-color:#bbb}.radio-primary input:disabled:checked+label:before,.radio-primary.checked.disabled>label:before{background-color:#bbb}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li>a{position:relative;border:none!important;border-radius:2px!important}.nav-tabs>li.active>a{font-weight:700;color:#3c4353!important}.nav-tabs>li.active>a:before{position:absolute;right:0;bottom:-1px;left:0;display:block;height:2px;content:' ';background:#0c64eb}.nav-tabs-primary>li.active>a{color:#0c64eb!important}.panel{position:relative;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.panel-body{padding:20px}.panel-body.has-table{padding:10px}.panel-body.has-table .table{margin-bottom:0;table-layout:fixed}.panel-heading{padding:12px 48px 12px 20px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading+.panel-body{padding-top:0}.panel-title{font-size:14px;font-weight:700;line-height:20px}.panel-title .label{top:-1px}.panel-actions{position:absolute;top:0;right:0;padding:7px 8px}.panel:hover .panel-actions{z-index:10}.panel-actions>li>a{display:inline-block;min-width:30px;padding:0 5px;line-height:30px;color:#a6aab8;text-align:center;border-radius:4px}.panel-actions>li>a:hover{color:#3c495c;text-decoration:initial;background-color:#f1f1f1}.panel-actions .btn-icon{color:#a6aab8}.panel-actions .btn.text-primary{color:#0c64eb}.panel .empty-tip{padding:30px 10px 50px;font-size:14px;color:#838a9d;text-align:center}.progress-text-left{position:relative;margin:7px 0;margin-left:35px;overflow:visible}.progress-text-left .progress-text{position:absolute;top:-7px;left:-35px;display:block;width:35px;height:20px;padding-right:5px;line-height:20px;color:#838a9d;text-align:right}.chart-color{width:20px}.chart-color-dot{display:inline-block;width:10px;height:10px;border-radius:50%}.chart-row{margin-top:10px}.chart-row+.chart-row{padding-top:10px;border-top:1px solid #eee}.chart-wrapper{padding:10px 5px;background:#eee}.chart-wrapper>h4{margin:5px 0 10px}.table-wrapper{max-height:250px;overflow:auto}.table-wrapper .table{margin:0}.progress-pie{position:relative}.progress-pie canvas{display:block}.progress-pie .progress-info{position:absolute;top:0;left:0;width:100%;height:100%;padding-top:25px;text-align:center}.progress-pie .progress-info>small{display:block;line-height:14px;color:#a6aab8}.progress-pie .progress-info>strong{display:block;font-size:36px;line-height:40px}.progress-pie .progress-info>strong>small{font-size:20px}.progress-pie-120 .progress-info{padding-top:30px}.progress-pie-120 .progress-info>small{line-height:18px}.progress-pie-50 .progress-info{padding-top:4px}.progress-pie-50 .progress-info>strong{font-size:20px;font-weight:400}.progress-pie-50 .progress-info>strong>small{font-size:14px}.progress-pie[data-value="100"] .progress-info>strong{-webkit-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);transform:scale(.7)}.progress-pie-24 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:24px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-24[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.progress-pie-26 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:26px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-26[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.status-bars{display:table;width:100%;height:140px;padding:5px;padding-top:50px;margin:0;overflow:hidden}.status-bars>li{position:relative;display:table-cell;text-align:center;vertical-align:bottom}.status-bars .bar{position:absolute;bottom:20px;left:50%;display:block;width:10px;margin-left:-5px;background:#0c64eb;border-radius:5px 5px 0 0}.status-bars .bar:after{position:absolute;right:-50px;bottom:0;left:-50px;display:block;height:1px;content:' ';background:#eee}.status-bars .title{font-size:12px;font-weight:400;color:#a6a8b6}.status-bars .value{position:relative;top:-20px;left:-20px;display:inline-block;width:50px;font-size:16px;font-weight:700;text-align:center}.status-bars-h{display:block;padding-right:50px;padding-left:60px;list-style:none}.status-bars-h>li{position:relative;height:40px;border-left:1px solid #eee}.status-bars-h .bar{position:relative;top:15px;display:block;height:10px;line-height:20px;background:#0c64eb;border-radius:0 5px 5px 0}.status-bars-h .title{position:absolute;top:-5px;left:-60px;width:60px;padding-right:10px;font-size:12px;color:#a6a8b6;text-align:right}.status-bars-h .value{position:absolute;top:-5px;right:-50px;display:block;width:40px;font-size:14px;font-weight:700;text-align:left;white-space:nowrap}.ring,[class*=" ring-"],[class^=ring-]{width:24px;height:24px;font-size:12px;line-height:24px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACZAAAAAwCAMAAACyyT3hAAAAP1BMVEUAAAAAAAA5rm06sG87snE4q200o2o7sG86r244q2w6r244rWw7snA7sG86rG05rm07snA5qWw7sW86sG48s3ECZypFAAAAFHRSTlMACl2b8TkPtnsqj0fVv4Zt4RrIqxUkbyYAAA1gSURBVHja7NrbbtswEIRhmyJ1IiVS0v/+z9rCbeGkdZodNEnVdHmTxP4wmF1exLB9eXCu12tqLX39cTGcm78use2z5Msx19wLfunGpOZvSv4xh/798tt+dKPSZ+jGMNn9/pWnXp1X7f9e+ynf53Xv3r37j/bLyfq4/1u+n8T8VI8jLWY/hbEbSjT76+2ssH77zeyBJHooom9dkHzssuQ5wvau+YuWz141/87zMoTewP9kP+7d2/31ZPln82e7L/fuP9LnJPk+DDDb/TQvEaDc/1//vk9Yvrl7vmHa+ztk347BXwcA1UMRPXCIfq+b5Jm3d82PneY5guSHG1fmVfu/837m5N69e/fu3T89fRZ9bRTBpyMCLFa/zfG7CU98l1/M/+EBS/59PT//bfD9lCS/pbAeR7bnb1OqC7AI+QWAkiz5Kdd1B6BVLb8Fk891Poox/7bPUNcIwGHrM3YDAHu1zyv0yWHcjfNen++nWvsvANC5d6/468nyz+bPdl/u3es+NFbFjw1A8BGAPUv5xGFMz/382HcAsNy+W9Sb9/PwwbP4ra5J8WluQDb7qQ4Ayybl05nnrQVgSFafB4AyWfvPEaBT57X2Seu3ecX9HBfN75t79+7du/+sPnVBy++A1e6nHaAEsz9ufk7W/gUgrvmBP/pf/bYDtDlp+/x8j4du1XwBFsHvQMlW348NIJjz0yH5bbz1n7R5m71/bUAL2n5iMueHAYjZvXv37t1/Tp8bJMFPDYhCfgTa2Ft9aEDJ5vzUbvnbC3562GcI5j6vf3T43/h+hlnJnwFGs99WgGDPv/lq9yPQsjCv1mcT/aUDGEVf3bt37979v+DH1kk+RIiCrwCz0AeI82bvc8vvzT5HYP1NfnjQv3uL/d+f/X/8ljUfGiD4ChDsPkcgCX0iUMX8UfDDw/6Xl+fV+q8Awb373/rLyfLP5s92X+4/rQ8QFV+BmO0+AyTND0nqT1H6xFf715/zWe35l5fXf3/e/YtnGugUnxsQhD47sNl9Klp+ipq/DmL/ovXPAJN79+7du/9on5dV80An+BEoye4nYLhofu/tPgAtafO26RWfn/chv9F93YX7N/PTDoOSHzW/LVA2Ib9Am+y+34Es5DdYlHmB2Lt37969+4/1fYQs+KlB6e0+Acsm9CnQXTQfJ61PTMI+dyiv99me7pO3u6+7cf9mvj/Ikgc6xRfNXyIcgt8KLIoX+0/A4d69e/fu/8znoPkOBsH3O8Qk5C8wiH12xR9AFvwAUfEzREOf/Wmf6Q3v967cv52fNJ+BIPgg+gmogk/xmb9a+lex/+ze/WN/PVn+2fzZ7sv93/MVVsUHIAn+AKrgV4hK/gxsYv+q7Ycg+AxMFt/d+9vy/QXZP+RHCIrvoGyCr9B6wa/QNq3/ftHyye7df2HP3pbQBKIgihqGmzKA4P7/b02lTOX2EncSEky1z8uungPosYyPj/8Nv8Mk/HaHm/Adzk/AIvy1hUb4vkKR5y0yf33Nd+K89vo+Xfy/81Oj/FahmPwBRuH7CjeTX6GRfUp8fHx8/Fc/UpRvoBpf4L4ZL/MfsLvzUoxfgM6e1/V5vNjn9jl/eLV/FrL/2DcwS1+lZxN+9X3a+Pj4+Pgvvm9B5Q8wyvxV+K11+VdgMv2r810LRZ63MX1m6IwX+ep+eMr49/HL3ChfoTF+eD65r/q+wiTy+zus8fHf+8vJ8s/mz3a94n/im075FarxE7Sby2975+8mf5T9G9gvLp/O9Jf5nfHNcz6vzzMLWfyX1wiz8Ss8ZP5g/A32+Pj4+P/XP0D5GRbjC9xkfjF+l/lV9h9gtP2PnOfN9JntfMQPsCeN/3/9dmc2/gqtym+d74BrfHx8/P/q+xaM34CryZf+CnTCT9Ca/A7YnG+N71V/P89La/r7eZ5pIYj/x35aNuUH6IzfpZ+hiY+Pj38X35dF+Ql241eoxncwGD/K/EbmL8r7/En2X+X8J99/dveb+4L/EB//zX+Wo/EFVunH+Pj4+HfxI0zG3+BmfIHF+AaKzB/VeU+Wv8BwZJ/14P56IbvEx39+bdDIBa4YP8bHx8e/kS/QGb/DZPwDVuMXGGV+Y3yR+QM+X/py5HlvB/e3C1l8/Fe/TYZfJtjNGxoY4uN/8JeT5Z/Nn+16vbVf7kX5Ga7GV+iM32Ey/gHNkfnDyfJnWA+d58H9L+aB/4Tj43/Vb4DxHdT4+Pj4f+WhVb7CZnwrfYWr8Tt0xt9lfj1ZfoVJedvn4P5ZyOL/nn+wGN9DGx8fH/+vPKB8630f/0f9drI+ymchiz+vB5Q/4Qd6fHz8efxCycIU/5G9e9lRHAaAKEr7kZi8nIT7/986UlatWaWGCbjpYn1UKizAQU7sZr0vyOzb9QkUv8Ek+qT4u77ksYv5q5g/tZQv91F9g0ta9j/Loy8RZnv7795LlvYf4b/U/JgWccLur/xBH2EXfbw4v28pP8B8cZ9HgzfR27/Tj9utpZvK7e2f8W09tWdv/8S+aBmi4OWnPis8FF+gKD7o+VHM78X8QfGD3uch+qG1bQ7s3+sDbIqPUEVf7O2/+5a2vWhqHyx7+++vUbwAGsQJfhEnjAhB8UXPLy3l97BcOgF7Y2H7v3yBeuVGqcXe/oW+qaN77O2f8jF2it9hVPwE9eKjpYqYH0S/XJk/ieM5i+P5gLG1o3Ls/7PfllE9Gkj0u3r0jb39q3xbE6q9/Qs9pE7wd+BKn4FNyU8wCn4DsuKT5vPF49Phw+k/389Mm+IT3DWf5MOh7e1f5G/n1ywPaW//MR4eil9EP0AU83sxf1d8Ub3YJ4q+iONZYRDHZ7b/aX6GovgIVfG9kr8ffYbz+fb2z/nbTZnw7O2f8V9N9clV8hMEwW8JRsF3q5i/QlX676rX+mSgqPmKnyGr42n/dh/mRfEjTIoP0Kv53Vlfj/z1tA/29s/5039hDmdv/2s9pE7wBXolv+r5aRP8CIh+UvpHSFnwQXy/GeabmG//fj9DUPyk+Q0IYp+q+ATB3v4lvqkJz96+ZR+pip8gCH5bIUr5ot/hofgIRfAZWK58vzMUxfcw2F/hQ1D8ANMm+Aq9mt8JPsB0Mj8e+UIfe/vn/Olv5KHs7e3P+QC74gdY75onC34BRsFXSEqfCFOn+XUT/KDnk+0v8AGK4LcJouC7FQYlf4VF6b9DEb4vmfP97X+HX859fvT843Vq880D2dv/o7811udyv0AV/IjmK/AQfE6wKB4YxD5B8AGoYp9R8AsQ7f+0a287bsJQFIapTxxssA3/+z9rJVS1VVOmezeDOp1s7mI+LS1bxJZChH7WeAdkpXcKX4Gs8yHqPFXyfC4/jspNlG/+VbyTPD/6/G+X9EAyb9681Dun8SMcCh8D7Enu0wirpk/T+QyMGh90fgiwKPvs5oU+45PCH4DGeyjK/KDpv0Lpyv7z237mp+/jDmRBvvnX8YLn5y/yxd/gU5g3b/4enyF0uU8FWpT7vgIKf56JSe5jgNY1XtlnV+5XQOjmhf6AfVb4AkGR3wuMXe7nBrsiPwN7evf+3xN7AAR9zJt/yst3uPO+efPmb/LbmhXeAwofCzAp8kcgyn0qyj4NcHLflfkzr+494yz3DmhZ7mdgH3T5JSp91/lxeL/+GWC++HyZb/6lfL72+Yl80d8OztvmzYv8I/9gff5/H6DKfQ6ofARwCj+i61MAp+sfstw7gPrZfO4KDzQn9w5A4TMQZrmvQFDkT0DIuv5j1Hku87eH1aiC9TH/Yn678tsT+Vdn5uM98+bNfxDvwyT3KUBwcr/o9oe+BJVPZ76T529AyBf+8jz9bH6BJYn9BLDI8x3A1nX5VZ6fGzAp+yxJ6ZX9t+ufn6m/W5+3+pt/Oe+vnx99/tWxYOM2buOfanyGluU+AHuX+jQ1IERxfi5Ac1Lfz/wmzk9uBML8P/jNO7lfgSL3sQC73DuANiWpzwA+i/Pns//UxflNN1/XgFaTuE8D1sv8/OADMLrLfPPmn/JXO/qX3w+aN2/+P/X1iHK/AZM43xWAsQt9XE5/zEKftwBQoji/nfnpH/m41S72GQg+Cn1aAcZpluYvqPLjCFCqdL59B1jFfvAAYZH2j8r5dq+b77Bd+70/8nQAtOX3+ebNP+Wvd9zz+vWjefNaP3ywPuZFfqNluQcIm9DnndNPIh+nMQDQJL5HN/kVAJY/+TinJPX5OCYXhX4F1hrnPgh8LAAUaX5tnH6rWdTfNXX+yZeaRd4DELaaZetZdwBGf/N8Jyfz+Wp9/Buv8mF97G/e/JP+egt6vAbz5s2/is9J4QthEvsVIBxR5F2A0y9d4Avwzfv8Jw8g9gXk/gDkvtdd5xfuzfdB5d2Iyg9uvHe+PrzD+izxyueLfPPmn/OaLXoYzJv/az98sD7m39XHrPAe1pqEfgUI6zJL/AYAsNc/94mA3O+g8M43lc8+aPxcR+7M73VH5aei7cOd8011fW59Vve2f1wf8+bv84+vmsybN2/+Xfzc5b4fR43i/DWU0U9uFvlpb0HsU578WOR+iJNfFb4r85Nbjjvz58kfe1N4p+wf3Xbsyvmq+9+4Ps68+dv8V5yOdlOUBd3vAAAAAElFTkSuQmCC);background-position:0 0;-webkit-background-size:1224px 24px;background-size:1224px 24px}.ring>span,[class*=" ring-"]>span,[class^=ring-]>span{display:inline-block;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.messager{border-radius:4px;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1)}.messager-icon{vertical-align:middle}.messager-icon>.icon{font-size:24px}.messager-content{padding:18px 20px;font-size:18px;line-height:30px}.messager-content>.icon{font-size:28px;line-height:30px}.messager-actions{vertical-align:middle}.messagger-zt{color:#3c4353;background-color:#fff!important}.messagger-zt .messager-icon>.icon{color:#0c64eb}.messagger-zt .messager-actions>.action{color:#838a9d}.messagger-zt.messager-success .messager-icon>.icon{color:#00da88}.messagger-zt.messager-danger .messager-icon>.icon{color:#ff5d5d}.messagger-zt.messager-warning .messager-icon>.icon{color:#ff9800}.messagger-zt.messager-info .messager-icon>.icon{color:#2196f3}.tree{padding-left:0;overflow:hidden}.tree ul{position:relative;display:none;padding-left:0}.tree li{position:relative;padding:2px 0 2px 15px;list-style:none}.tree li.heading{padding-left:5px;color:#3c495c}.tree li>a{display:block;max-width:90%;padding:2px 6px;color:#3c495c;word-break:break-all}.tree li>a:hover{color:#3c4353}.tree li>a.tree-toggle:hover{background:0 0}.tree li.active>a{position:relative;font-weight:700;color:#0c64eb}.tree li>.list-toggle{position:absolute;top:1px;left:1px;z-index:10;width:20px;font-size:14px;line-height:22px;color:#cbd0db;text-align:center;cursor:pointer;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.tree li>.list-toggle:before{content:"\f0da"}.tree li>.list-toggle:active,.tree li>.list-toggle:hover{color:#0c64eb}.tree li.has-active-item>.list-toggle{color:#3c4353}.tree li.has-list.open>ul{display:block}.tree li.has-list.open>.list-toggle{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.tree li.has-list.open:before{position:absolute;top:16px;bottom:-5px;left:10px;display:block;content:' ';border-left:1px solid #d8d8d8}.tree-actions{display:inline-block;margin-left:5px;vertical-align:middle}.tree-actions a{display:inline-block;margin-left:5px;font-size:13px;opacity:.6}.tree-actions a:hover{opacity:1}.tree li>.module-name{color:#3c495c;vertical-align:middle}.tree li>.module-name:hover{background-color:#f0f2f5}.tree li>.module-name:hover>a{color:#3c4353}.treemap-node-fold-icon:before{position:relative;left:-4px;min-width:18px}.dropdown-menu{padding:5px 0;border-color:rgba(0,0,0,.1)}.dropdown-menu>li{padding:0 10px}.dropdown-menu>li>a{padding:2px 10px;margin:5px 0;border-radius:3px}.dropdown-menu>li>a>.icon{position:relative;left:-5px;opacity:.5}.dropdown-menu>li>a:hover>.icon{opacity:.8}.dropdown-menu>li.active>a,.dropdown-menu>li.selected>a{position:relative;color:#fff;background-color:#16a8f8}.dropdown-menu>li.selected>a:after{position:absolute;top:2px;right:4px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:20px;text-transform:none;content:"\e5ca";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>li.divider{margin:10px}.dropdown-submenu>a:after{margin-right:-5px}.dropdown-submenu>.dropdown-menu.pull-left{margin-left:-1px}.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#3c4353;background-color:#e9f2fb}.dropdown-submenu:hover>a:after{border-left-color:#0c64eb}.dropdown-submenu>a:hover:after{border-left-color:#fff}.pager .btn{padding:3px 10px}.pager .btn .caret{opacity:.7}.pager>li>.pager-label{padding:2px;line-height:20px}.pager>li>.pager-item{min-width:20px;padding:1px;margin:2px 0;font-size:16px;line-height:20px;text-align:center;background:0 0;border-color:transparent}.pager>li>.pager-item:hover{background-color:rgba(0,0,0,.1)}.pager>li>.pager-item>.icon{position:relative;top:-1px}.pager>li>.btn:hover,.pager>li>a:hover{background:rgba(0,0,0,.1)}.pager>li.disabled>a.pager-item{background:0 0;border-color:transparent;opacity:.5}.pager>li.active>a{background-color:#16a8f8}.pager>li .btn-group .btn{padding:1px;margin:1px 0;border-radius:4px}.pager .dropdown-menu{width:200px}.pager .dropdown-menu>li{float:left;width:33.333333%}.modal-dialog{width:900px;max-width:1360px;border:none;border-radius:0;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,.25);box-shadow:0 0 20px 0 rgba(0,0,0,.25)}.modal-dialog.modal-md{width:700px}.modal-dialog.modal-xs{width:400px}.modal-dialog.modal-sm{width:500px}.modal-dialog.modal-lg{width:1200px}.modal-dialog.modal-fullscreen{position:fixed;max-width:initial}.modal-header{padding:20px 0;margin:0 20px}.modal-header>.close{color:#838a9d;text-shadow:0 1px 0 rgba(255,255,255,.85);opacity:1}.modal-header>.close:hover{color:#222}.modal-footer{padding:20px 0;margin:0 20px}.modal-title{font-size:14px;font-weight:400;line-height:20px}.modal-actions{position:absolute;top:16px;right:16px}.modal-actions .divider{position:relative;top:5px;display:inline-block;width:0;height:20px;margin:0 10px;border-left:#eee 1px solid}.modal-actions>.dropdown{display:inline-block}.modal-body{padding:20px}.modal-iframe .modal-body>iframe{border-radius:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-3%);-ms-transform:translate(0,-3%);-o-transform:translate(0,-3%);transform:translate(0,-3%)}.modal.fade.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-simple .modal-footer{padding-top:0;border-top:none}.modal-iframe .modal-header{position:relative;z-index:10;min-height:0;padding:0;border:none}.modal-iframe .modal-title{display:none}.modal-iframe .modal-header .close{position:absolute;top:12px;right:10px;font-size:32px;font-weight:200}.modal-iframe .modal-dialog{overflow:hidden}.modal-inverse .modal-header>.close{color:rgba(255,255,255,.7);text-shadow:none}.modal-inverse .modal-header>.close:hover{color:#fff}.modal-scroll-inside>.modal-dialog{max-height:100%}.hide-modal-close .modal-iframe .modal-header .close{display:none}.tile{text-align:center}.tile-title{line-height:20px;color:#3c495c}.tile-amount{font-size:32px;font-weight:700;line-height:56px}.timeline>li{position:relative;list-style:none}.timeline>li:before,.timeline>li>a:after,.timeline>li>div:after{position:absolute;left:-20px;display:block;width:15px;height:15px;content:' ';border-radius:50%}.timeline>li:before{top:12px;left:-16px;z-index:3;width:7px;height:7px;background-color:#cbd0db;border:none;border:1px solid #cbd0db}.timeline>li>a:after,.timeline>li>div:after{top:11px;left:-17px;z-index:3;width:9px;height:9px;background-color:#0c64eb;border-radius:50%;opacity:0}.timeline>li+li:after{position:absolute;top:-12px;bottom:20px;left:-13px;z-index:1;display:block;content:' ';border-left:1px solid #eee}.timeline>li.active>a:after,.timeline>li.active>div:after{opacity:1}.timeline>li.active:before{top:8px;left:-20px;width:15px;height:15px;background-color:rgba(12,100,235,.2);border:none}.timeline>li>a,.timeline>li>div{display:block;padding:5px;line-height:20px}.timeline>li.active>a{color:#3c4353}.timeline-tag{position:absolute;top:5px;left:-115px;font-size:12px}.timeline-tag-left{padding-left:115px}.timeline-sm{font-size:12px}.timeline-sm>li:before,.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:10px;left:-20px;width:11px;height:11px}.timeline-sm>li.active:before,.timeline-sm>li:before{top:10px;left:-18px;width:11px;height:11px;background:0 0;border:1px solid #eee}.timeline-sm>li>a,.timeline-sm>li>div{line-height:20px}.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:13px;left:-15px;width:5px;height:5px}.form-control{-webkit-box-shadow:none;box-shadow:none}.form-horizontal .form-group>label{padding-right:0}.form-actions{margin-top:20px;margin-bottom:0}.form-actions .btn{margin-right:10px}form label{font-weight:400;color:#3c495c}.form-group .btn+.btn{margin-left:5px}.table-form{margin-bottom:0;table-layout:fixed}.table-form>thead>tr>th.required:after{position:relative;top:3px;right:auto;left:4px;display:inline-block;vertical-align:middle}.table-form>tbody>tr>td,.table-form>tbody>tr>th,.table-form>tfoot>tr>td,.table-form>thead>tr>th{padding:7px;vertical-align:middle;border-bottom:none}.table-form>tfoot>tr>td{padding:20px 7px 10px}.table-form>tbody>tr>th{width:100px;font-weight:700;text-align:right}.table-form .input-group{width:100%}.chosen-container-single .chosen-single{position:relative}.chosen-container-single .chosen-single>span{height:20px;line-height:20px;word-break:break-all;white-space:normal}.chosen-container-single .chosen-single div b{position:relative;top:1px;color:#cbd0db;opacity:1}.chosen-container-single .chosen-search:before{top:8px;right:15px}.chosen-container-multi .chosen-choices li.search-choice{font-size:13px;background:#eee;border-color:#cbd0db;-webkit-box-shadow:none;box-shadow:none}.chosen-container-single .chosen-search input[type=text]{height:30px;padding:3px 25px 3px 5px}.chosen-container-single .chosen-search{padding:3px 10px 0}.chosen-container-single .chosen-single{overflow:visible}.chosen-container .chosen-results{max-height:245px;padding:10px}.chosen-container .chosen-results>li{border-radius:4px}.chosen-container .chosen-results li.highlighted em{color:#fff}.table-responsive .chosen-container .chosen-results{max-height:200px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{top:-2px;right:-1px;bottom:-1px;left:-1px;display:none;height:auto;padding:0;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:31px;padding:5px 26px 5px 8px;font-size:inherit;line-height:20px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{right:8px}.datetimepicker{padding:10px}.datetimepicker td.day.today{background-color:#f77}.datetimepicker td.day.active{background-color:#16a8f8}.datetimepicker tfoot th,.datetimepicker thead th{color:#838a9d}.input-control .colorpicker{top:0;z-index:auto;opacity:1}.input-control .colorpicker .btn{padding:5px}.input-control .input-control-icon-right.btn{top:0}.colorpicker .dropdown-menu{min-width:232px;padding:5px 10px 10px 10px}.colorpicker .dropdown-menu>li{display:block;float:left;padding:5px}.colorpicker .dropdown-menu>li.heading{width:100%;margin-bottom:5px;font-size:16px;font-weight:700;text-align:left}.colorpicker .dropdown-menu>li.heading>.icon-close{position:relative;top:4px;float:right;cursor:pointer;opacity:.6}.colorpicker .dropdown-menu>li>a{position:relative;display:block;width:100%;height:100%;padding:0;margin:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;border:1px solid transparent;border-radius:50%;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.colorpicker .dropdown-menu>li>a:before{position:absolute;top:0;display:block;width:100%;height:20px;line-height:18px}.colorpicker .dropdown-menu>li>a:hover{-webkit-box-shadow:0 1px 4px rgba(0,0,0,.25);box-shadow:0 1px 4px rgba(0,0,0,.25)}.colorpicker .dropdown-menu>li>a.active:before{font-size:14px;content:"\e5ca"}.colorpicker .dropdown-menu>li>a.empty{color:#666;background:#fff}.colorpicker .dropdown-menu>li>a.empty:before{content:"\e90d"}.colorpicker .btn{position:relative}.colorpicker .btn .color-bar{position:absolute;right:5px;bottom:3px;left:5px;height:3px}.colorpicker .btn .color-bar[style*='background: ']+.ic{position:relative;top:-2px}.colorpicker .btn .ic{color:#cbd0db}.colorpicker .btn:hover .ic{color:#838a9d}.input-group .colorpicker{z-index:3}.input-group .chosen-container{display:table-cell}.input-group-addon{border-right-width:0;border-left-width:0}.input-group-addon:first-child{border-left-width:1px}.input-group-addon:last-child{border-right-width:1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin:0}.input-group-cell{display:table-cell;width:1%;padding:0 12px;white-space:nowrap;vertical-align:middle}.ke-container{border-color:#dcdcdc!important;border-radius:2px!important}.ke-container.focus{border-color:#0c64eb!important}.ke-toolbar{border-color:#dcdcdc!important}.required:after{top:6px;right:-10px;font-size:20px}td.required:after{top:12px;right:-5px}.input-group>.chosen-container.required:after,.input-group>.input-control.required:after{top:1px;right:1px;z-index:2}.input-group.required .required:after{display:none}.file-input{position:relative;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.file-input .input-group{width:auto}.file-input .input-group>.input-group-cell:first-child{padding-right:0;padding-left:7px}.file-input input[type=file]{position:absolute;width:0;height:0;opacity:0}.file-input .file-title{display:inline-block;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.file-input .file-editbox{min-width:200px;max-width:100%}.file-input .file-size{display:inline-block;vertical-align:middle}.edit .file-input-empty,.file-input-edit,.file-input-normal,.normal .file-input-empty{display:none}.edit .file-input-edit,.normal .file-input-normal{display:block}.edit .file-input-edit.input-group,.normal .file-input-normal.input-group{display:table}.edit .file-input-normal{display:none!important}.file-input-normal>.input-group-btn{width:auto}.input-group .chosen-container-active .chosen-choices{border-color:#0c64eb!important}.input-group .chosen-container{min-width:100px}.input-group .input-group-btn .btn>.icon{line-height:17px}.os-mac select.form-control{-webkit-appearance:none;background-image:url(data:image/gif;base64,R0lGODlhCQAFAIAAAMvQ2////yH5BAEAAAEALAAAAAAJAAUAAAIKhH+BGYoNGWxgFgA7);background-image:url(data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==);background-repeat:no-repeat;background-position:right 5px top 12px;-moz-appearance:none}input::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none!important;pointer-events:none;visibility:hidden}.chosen-choices.has-error,.chosen-single.has-error,.form-control.has-error{border-color:#ff5d5d!important;-webkit-box-shadow:0 0 6px #ffc3c3!important;box-shadow:0 0 6px #ffc3c3!important}.popover-success.popover-form-result{font-weight:700;color:#fff;background:#00da88}.popover-success.popover-form-result.popover.right .arrow:after{border-right-color:#00da88}.form-unsaved{outline:2px solid #ff9800;-webkit-box-shadow:0 1px 12px #ff9800;box-shadow:0 1px 12px #ff9800;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s}.picker-selection-remove:before{font-size:18px}.picker-user-option{position:relative;padding-left:40px}.picker-user-option>.avatar{position:absolute;top:5px;left:10px}.picker-user-option>.picker-option-text{display:inline-block;min-width:40px;font-weight:700}.picker-user-option>.dept-name,.picker-user-option>.role-name{display:inline-block;margin-left:10px;font-size:12px;opacity:.6}.picker-user-option>.dept-name{min-width:50px}#mainHeader{height:50px;color:#fff;background:#1183fb -webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:#1183fb -webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:#1183fb -o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:#1183fb linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);background-color:#1183fb;border-top-color:#0c64eb;border-bottom-color:#e9f2fb}#mainHeader>.container{min-width:1200px;padding:0}#heading{position:absolute;top:10px;left:20px}@media (min-width:1400px){#heading{left:40px}}#heading h1{float:left;max-width:250px;margin:0;overflow:hidden;font-size:20px;font-weight:400;line-height:30px;text-overflow:ellipsis;white-space:nowrap}#heading h1 a{color:inherit;text-decoration:inherit}#heading h1.long-name{position:relative;top:-5px;display:table-cell;font-size:16px;line-height:20px;word-break:break-all;white-space:normal}#heading>.btn{display:block;float:left;height:20px;padding:1px 5px;margin:0;margin:5px 0 0 10px;font-size:12px;font-weight:lighter;line-height:18px;background-color:rgba(255,255,255,.2);border:none}#heading>.btn:hover{background-color:rgba(0,0,0,.1)}#navbar{margin:0 auto;text-align:center}#navbar .nav{display:inline-block}#navbar .nav>li>a{padding:10px;line-height:30px;color:#fff;border-radius:0;opacity:.9}@media (max-width:1400px){#navbar .nav>li>a{padding:10px 8px}}#navbar .nav>li>a:focus,#navbar .nav>li>a:hover{background:rgba(0,0,0,.15);opacity:1}#navbar .nav>li.active>a{font-weight:700;background:rgba(0,0,0,.1);opacity:1}#navbar .nav>li.divider{display:block;width:2px;height:20px;margin:15px 8px;background:rgba(255,255,255,.4)}@media (max-width:1400px){#navbar .nav>li.divider{margin:15px 5px}}@media (max-width:1300px){#navbar .nav>li.divider{margin:15px 3px}}#navbar .nav>li.divider:last-child{display:none}#navbar .nav .dropdown-menu li>a{text-align:left}#toolbar{position:absolute;top:12px;right:20px;font-size:12px;color:#fff}@media (min-width:1400px){#toolbar{right:40px}}#extraNav{text-align:right}#extraNav>li{display:inline-block;float:none;text-align:left}#extraNav>li>a{display:block;padding:0;color:#fff;opacity:.75}#extraNav>li>a:hover{text-decoration:unset;background-color:rgba(0,0,0,.1);opacity:1}#extraNav>li.open>a{background-color:rgba(0,0,0,.1)}#extraNav>li+li{margin-left:10px}#showSearchGo{color:#fff;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.5)}#searchbox{position:relative;float:left;width:150px}#searchbox .input-group-btn .btn{position:relative;padding:1px 4px;font-size:12px;line-height:20px;color:#fff;background-color:rgba(255,255,255,.15);border-right:none;border-radius:2px}#searchbox .input-group-btn .btn:after{position:absolute;top:3px;right:0;bottom:3px;display:block;width:1px;content:' ';background-color:rgba(255,255,255,.15)}#searchbox .input-group-btn .btn:hover{background-color:rgba(255,255,255,.25)}#searchGo{position:absolute;top:0;right:-1px;z-index:9;min-width:24px;height:24px;padding:2px 3px;font-size:12px;line-height:20px;color:#fff;background-color:#16a8f8;border-radius:2px}#searchGo:hover{color:#fff!important;background-color:#0c64eb}#searchInput{height:24px;padding:2px 30px 2px 5px;color:#fff;text-align:left;background:rgba(255,255,255,.15);border-color:transparent;border-radius:0 12px 12px 0;-webkit-transition:background .2s,border .2s;-o-transition:background .2s,border .2s;transition:background .2s,border .2s}#searchInput:hover{background:rgba(255,255,255,.25)}#searchInput:focus{color:#333;background:#fff}#searchInput::-webkit-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::-moz-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:-ms-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:focus::-webkit-input-placeholder{color:#838a9d}#searchInput:focus::-moz-placeholder{color:#838a9d}#searchInput:focus:-ms-input-placeholder{color:#838a9d}#searchInput:focus::placeholder{color:#838a9d}#searchTypeMenu{min-width:220px}#searchTypeMenu>li{float:left;width:50%}#searchTypeMenu>li>a{margin:4px 0}#userNav .avatar{display:inline-block;vertical-align:middle}#userNav>li>a{padding:2px 6px;line-height:20px;color:#fff;opacity:.9}#userNav>li>a .user-name{max-width:100px;overflow:hidden;font-size:15px;text-overflow:ellipsis;white-space:nowrap}#userNav>li>a:hover{background-color:rgba(0,0,0,.1);opacity:1}#userNav>li>a:hover>i{opacity:1}#userNav>li>a span{vertical-align:middle}#userNav>li.open>a{background-color:rgba(0,0,0,.1)}#userNav>li.has-new-items>a{position:relative}#userNav>li.has-new-items>a:before{position:absolute;top:3px;right:-1px;display:block;width:4px;height:4px;content:' ';background-color:#ff5d5d;border-radius:50%}#userNav .dropdown-menu{min-width:150px}#userNav .dropdown-menu>li>a>.icon{position:absolute;top:10px;right:5px;display:block;width:20px;height:20px;line-height:20px;text-align:center}#userNav .user-profile-item>a{position:relative;padding-left:45px}#userNav .user-profile-item .avatar{position:absolute;top:6px;left:5px}#userNav .user-profile-name{font-size:16px}#userNav .user-profile-role{font-size:12px;color:#a9abb8}#userNav .no-role .user-profile-role{display:none}#userNav .no-role .user-profile-name{line-height:40px}#subHeader{min-height:50px;background:#fff}#subHeader>.container{padding:0 20px}@media (min-width:1400px){#subHeader>.container{padding:0 40px}}#pageNav{position:absolute;top:8px;left:0;left:20px}@media (min-width:1400px){#pageNav{left:40px}}#subNavbar{margin-top:5px;font-size:14px;text-align:center}#subNavbar .nav{display:inline-block}#subNavbar .nav>li>a{padding:8px 12px;line-height:24px;color:#3c495c}#subNavbar .nav>li>a:hover{color:#3c495c;background-color:rgba(0,0,0,.075)}#subNavbar .nav>li.active>a{font-weight:700;color:#0c64eb}#subNavbar .nav>li.divider{display:block;width:2px;height:20px;margin:9px 5px;background-color:rgba(0,0,0,.05)}#subNavbar .dropdown-menu{text-align:left}[lang=en] #subNavbar>.nav>li>a{padding-right:8px;padding-left:8px}#pageActions{position:absolute;top:9px;right:20px}@media (min-width:1400px){#pageActions{right:40px}}.cell{padding:10px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.cell+.cell{margin-top:10px}.cell>.panel{margin:0;-webkit-box-shadow:none;box-shadow:none}.cell>.panel>.panel-heading{padding:5px 5px 10px}.cell>.panel>.panel-heading .panel-actions{padding:0}.cell>.panel>.panel-body{padding:5px}.cell>.table{margin:0}#main{min-width:1200px;padding:20px 0}#main>.container{padding:0 20px}@media (min-width:1400px){#main>.container{padding:0 40px}}#header,#header+#main{min-width:1200px}#mainMenu{margin:-10px 0 8px}.main-content{padding:20px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}@media (min-width:1400px){.main-content>.center-block{max-width:1350px;padding:20px;border:1px solid #eee}.main-content>.center-block .main-header{background-color:#f1f1f1}}.main-content>h2{margin:0 0 20px}.main-content .cell{-webkit-box-shadow:none;box-shadow:none}.main-header{padding:5px 20px;border-bottom:1px solid #eee}.main-header:after,.main-header:before{display:table;content:" "}.main-header:after{clear:both}.main-header>h2{display:block;float:left;margin:0 10px 0 0;font-size:14px;line-height:34px}.main-header>h2 .label-id{margin-right:5px}.main-header>h2 small{font-size:14px;font-weight:400}.main-content .main-header{margin:-20px -20px 10px}.main-header .label{top:-1px}.main-row{display:table;width:100%;table-layout:fixed}.main-row>[class*=" col-"],.main-row>[class*="-col"],.main-row>[class^=col-]{display:table-cell;vertical-align:top}@media (max-width:720px){.main-row{display:block}.main-row>*{display:block;width:100%}.main-row .side-col{width:100%;padding:0}.main-row .main-col+.side-col,.main-row .side-col+.main-col{margin-top:10px}}.main-row.hide-side .side-col{display:none}.main-form{margin:0}@media (min-width:720px){.main-content>.center-block .main-form{padding-right:20px}}#main .side-col .tabs{padding:5px}#main .side-col .nav-tabs{margin:0 5px 5px 5px}#main .side-col .nav-tabs>li{margin:0}#main .side-col .nav-tabs>li+li{margin-left:10px}#main .side-col .nav-tabs>li>a{padding:8px 5px}#main .side-col .tab-content .tab-pane table{border:none}.main-actions .btn-toolbar{display:inline-block;padding:4px 15px;color:#fff;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);border-radius:4px}.main-actions .btn-toolbar .divider{margin-right:15px;margin-left:15px;border-color:rgba(255,255,255,.1)}.main-actions .btn-toolbar .btn{height:30px;padding-right:10px;padding-left:10px;margin-right:0;color:#fff;background-color:transparent;border:none}.main-actions .btn-toolbar .btn+.btn{margin-left:10px}.main-actions .btn-toolbar .btn:focus,.main-actions .btn-toolbar .btn:hover{background-color:rgba(255,255,255,.2)}.main-actions .btn-toolbar .btn.btn-icon{min-width:32px;padding-right:0;padding-left:0}.main-actions .btn-toolbar .btn+.btn-group{margin-right:0;margin-left:10px}#mainContent .main-col>.main-actions{padding:30px 0 0 0;text-align:center}#mainContent .main-col>.main-actions>.btn-toolbar{visibility:visible;opacity:1;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}#mainActions{position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;pointer-events:none}#mainActions .btn-toolbar{position:relative;top:-90px}#mainActions .dropdown-menu{text-align:left}#mainActions>.container{height:100%}.main-actions-holder{display:none}.main-actions-fixed .main-actions-holder{display:block}.main-actions-fixed #mainContent .main-col>.main-actions{position:fixed;bottom:10px}.main-actions-fixed.body-modal #mainContent .main-col>.main-actions{bottom:20px}#nextPage,#prevPage{position:absolute;top:50%;left:-10px;width:40px;height:60px;padding:10px 0;margin-top:-30px;line-height:40px;color:#fff;text-align:center;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.05);box-shadow:0 2px 15px 2px rgba(0,0,0,.05)}#nextPage:hover,#prevPage:hover{-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.15);box-shadow:0 2px 15px 2px rgba(0,0,0,.15)}#nextPage>i,#prevPage>i{display:block;font-size:18px;line-height:36px}#nextPage{right:-10px;left:auto}@media (max-width:1800px){#prevPage{left:-3px}#nextPage{right:-3px}}#sidebarHeader{position:relative;float:left;width:180px;height:34px;padding-right:20px;margin-right:20px;background:#fff;border-left:4px solid #0c64eb;border-radius:4px 2px 2px 4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}#sidebarHeader:after{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #fff;border-style:solid;border-width:18px 0 18px 8px}#sidebarHeader .title{padding:0 5px;overflow:hidden;font-size:14px;font-weight:700;line-height:32px;color:#0c64eb;text-align:center;text-overflow:ellipsis;white-space:nowrap}#sidebarHeader .title>a{position:absolute;top:0;right:0;width:20px;opacity:.5}#sidebarHeader .title>a:hover{opacity:1}#sidebar{position:relative;-webkit-transition:width .2s,padding .2s;-o-transition:width .2s,padding .2s;transition:width .2s,padding .2s}#sidebar>.sidebar-toggle{position:absolute;top:0;right:5px;bottom:0;width:10px;cursor:pointer;background:0 0;border-radius:5px;-webkit-transition:background-color .2s,opacity .5s;-o-transition:background-color .2s,opacity .5s;transition:background-color .2s,opacity .5s}#sidebar>.sidebar-toggle>.icon{position:absolute;top:50%;left:-1px;width:12px;height:30px;margin-top:-10px;line-height:30px;color:#fff;text-align:center;background:#79cdfb;border-radius:6px}#sidebar>.sidebar-toggle>.icon:before{position:relative;left:-1px}#sidebar>.sidebar-toggle:before{position:absolute;top:0;right:-5px;bottom:0;left:-5px;display:block;content:' '}#sidebar>.sidebar-toggle:hover{background:rgba(0,0,0,.075)}#sidebar>.cell{position:relative;left:0;width:180px;-webkit-transition:left .2s,opacity .2s;-o-transition:left .2s,opacity .2s;transition:left .2s,opacity .2s}#sidebar.no-animate>.cell{display:none;-webkit-transition:none;-o-transition:none;transition:none}.hide-sidebar #sidebar>.cell{position:absolute;left:-200px;visibility:hidden;opacity:0}.hide-sidebar #sidebar{position:relative;width:0;padding:0}.hide-sidebar #sidebar>.sidebar-toggle>.icon:before{content:"\e315"}@media (max-width:720px){#sidebar>.cell{width:100%}}#queryBox{max-height:0;padding:0;overflow:hidden;-webkit-transition:cubic-bezier(.175,.885,.32,1) .2s;-o-transition:cubic-bezier(.175,.885,.32,1) .2s;transition:cubic-bezier(.175,.885,.32,1) .2s;-webkit-transition-property:padding,max-height,margin;-o-transition-property:padding,max-height,margin;transition-property:padding,max-height,margin}#queryBox>form{visibility:hidden;-webkit-transition:visibility .2s .2s;-o-transition:visibility .2s .2s;transition:visibility .2s .2s}#queryBox.loading{height:50px}#queryBox.show{min-height:110px;max-height:300px;margin-bottom:10px;overflow:visible}#queryBox.show>form{visibility:visible}#queryBox.divider{border-bottom:1px solid #eee}#main .querybox-toggle.querybox-opened{position:relative;color:#0c64eb;background:0 0;border:none}#main .querybox-toggle.querybox-opened:before{position:absolute;bottom:-14px;left:50%;width:0;height:0;content:' ';border-color:transparent transparent #fff transparent;border-style:solid;border-width:0 10px 10px 10px}#contentNav{padding:5px;background:#fff;border-bottom:1px solid #eee}#contentNav .nav>li>a{position:relative;padding:6px 10px;color:#838a9d}#contentNav .nav>li.active>a{font-weight:700;color:#0c64eb}#contentNav .nav>li.active>a:before{position:absolute;right:10px;bottom:3px;left:10px;display:block;height:2px;content:' ';background:#0c64eb}.body-modal{padding-bottom:0}.body-modal #main,.body-modal .container{min-width:0!important}.body-modal #main{padding:0}.body-modal .main-header{position:fixed;top:0;right:20px;left:20px;z-index:100;padding:13px 48px 13px 0;margin:0;background:#fff}.body-modal #mainContent{padding-top:70px}.body-modal .main-header>h2{max-width:100%;overflow:hidden;font-size:14px;text-overflow:ellipsis;white-space:nowrap}.body-modal .cell,.body-modal .main-content{-webkit-box-shadow:none;box-shadow:none}.body-modal #mainMenu{position:fixed;top:0;right:0;left:0;z-index:100;padding:12px 60px 12px 10px;margin:0;background:#fff}.body-modal #mainMenu>.btn-toolbar.pull-left.divider{display:none}.body-modal #mainMenu>.btn-toolbar{width:100%;margin-left:20px}.body-modal #mainMenu>.btn-toolbar>.divider:first-child{display:none}.body-modal #mainMenu>.btn-toolbar .page-title{width:100%;margin-left:0}.body-modal #mainMenu>.btn-toolbar .page-title>.text{position:relative;top:-2px;display:inline-block;max-width:85%;max-width:-webkit-calc(100% - 100px);max-width:calc(100% - 100px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.body-modal #mainMenu+#mainContent.main-row{padding:60px 10px 0}.body-modal #mainMenu+#mainContent.main-row .cell{border:1px solid #efefef;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.body-modal #mainActions{top:auto}.body-modal #mainActions .btn-toolbar{top:auto;bottom:10px}.body-modal.m-bug-view,.body-modal.m-story-view,.body-modal.m-task-view,.body-modal.m-testcase-view,.body-modal.m-testtask-view,.body-modal.m-todo-view{padding-bottom:20px;border-radius:3px}#tabsNav{position:relative}#tabsNav .tab-pane>.actions{position:absolute;top:-8px;right:0}#tabsNav .tab-pane>.cell,#tabsNav .tab-pane>.main-table{padding:0;border:1px solid #cbd0db;border-top:none;border-radius:0 0 4px 4px}#tabsNav .tab-pane>.cell .detail-title{padding-left:5px}#helpContent{position:fixed;top:50px;right:0;bottom:40px;left:0;display:none;background-color:#fff}#helpContent .load-error{display:none;padding:20px}#helpContent .show-error .load-error{display:block}.text-middle td,.text-middle th{vertical-align:middle}.text-center td,.text-center th{text-align:center}.c-sm{width:40px}.c-id{width:90px}.c-id-sm{width:70px}.c-id-xs{width:55px}.c-date{width:100px}.c-num,.c-pri,.c-type{width:80px;overflow:hidden}.c-begin,.c-end,.c-time{width:65px}.c-hours{width:60px}.c-actions-1{width:50px}.c-actions-2{width:75px}.c-actions-3{width:102px}.c-actions,.c-actions-4{width:128px}.c-actions-5{width:155px}.c-actions-6{width:180px}.c-product,.c-project{width:180px}.c-plan{width:130px}.c-datetime{width:120px}.c-stage,.c-status,.c-user{width:80px}.c-side{width:200px;border-right:10px solid #efefef}.c-assign,.c-assignedTo,.c-openedBy{width:130px}.c-progress{width:155px}.c-assign,.c-assignedTo,.c-openedBy,.c-product,.c-project,.c-status,.c-url,.c-user{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:ellipsis;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;white-space:nowrap;vertical-align:middle}td.c-actions .btn-link{color:#3c495c;background:0 0}td.c-actions .btn-link:hover{color:#0c64eb;background:#e9f2fb}td.c-actions .more{position:absolute;top:50%;right:100%;display:none;padding-right:4px;padding-left:20px;margin-top:-15px;margin-right:-6px;white-space:nowrap;background-color:#fafafa;-webkit-transition:opacity .3s,margin .3s;-o-transition:opacity .3s,margin .3s;transition:opacity .3s,margin .3s}tr:hover td.c-actions .more{display:block}td:hover+td.c-actions>.more{margin-right:-15px;pointer-events:none;opacity:.15}tr[data-url]{cursor:pointer}.table tbody>tr>td,.table thead>tr>th{vertical-align:middle}.table tbody>tr>td.has-btn,.table thead>tr>th.has-btn{padding-top:1px;padding-bottom:1px;overflow:visible}.table tbody>tr>td .progress,.table thead>tr>th .progress{height:6px}.table .em,.table em{color:#3c4353}.table .divider{border-bottom:10px solid #efefef}.table .divider-top{border-top:10px solid #efefef}.table .btn-icon-left{max-width:100%;padding-left:20px;overflow:hidden;line-height:18px;text-align:left;text-overflow:ellipsis;background:0 0;border-color:#eaf3fc}.table .btn-icon-left>.icon{width:20px;font-size:14px;background:0 0!important;opacity:0}.table .btn-icon-left.btn-sm{height:26px;font-size:13px}.table .btn-icon-left:active,.table .btn-icon-left:focus,.table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.table .btn-icon-left:active>.icon,.table .btn-icon-left:focus>.icon,.table .btn-icon-left:hover>.icon{opacity:1}.table .btn-icon-left>.text{padding-left:25px}.table thead>tr>th.c-assign,.table thead>tr>th.c-assignedTo{padding-left:29px}.table a{vertical-align:middle}.table tbody>tr:last-child{border-bottom:none}.table caption{margin-bottom:5px;background:#f1f1f1;border:none}.is-firefox .table .btn-icon-left>.icon{line-height:22px}.main-table{border-radius:4px}.main-table>.table,.main-table>.table-footer,.main-table>.table-header,.main-table>.table-responsive{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.main-table .table{font-size:13px;table-layout:fixed;background-color:#fff;border-radius:4px 4px 0 0}.main-table .table.table-lg{font-size:14px}.main-table .table .btn-icon-left{border-color:transparent}.main-table .table .btn-icon-left>.icon{background:0 0;border-radius:4px}.main-table .table .btn-icon-left.btn-sm{height:26px}.main-table .table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.main-table .table .btn-icon-left:hover>.icon{background:#e9f2fb;border-radius:4px 0 0 4px}.main-table tbody>tr>td,.main-table thead>tr>th{min-height:36px;padding:2px 8px;line-height:30px}.main-table tbody>tr>td:first-child,.main-table thead>tr>th:first-child{padding-right:4px;padding-left:15px}.main-table thead>tr>th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #ddd}.main-table tbody>tr:nth-child(odd){background-color:#f5f5f5}.main-table tbody>tr:last-child>td{border-bottom:1px solid #ddd}.main-table tbody>tr>td{position:relative;border-bottom:none;border-bottom:1px solid #eee}.main-table tbody>tr>td .label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main-table tbody>tr>td>a{line-height:28px;color:#0c60e1}.main-table tbody>tr>td>a:not(.btn):visited{color:#082999;opacity:.9}.main-table tbody>tr>td>a:hover,.main-table tbody>tr>td>a:visited:hover{color:#0c64eb}.main-table tbody>tr>td.c-actions{padding-right:10px}.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{position:absolute;top:0;bottom:0;left:0;display:block;width:0;content:'';background:#0c64eb;opacity:0;-webkit-transition:.2s linear;-o-transition:.2s linear;transition:.2s linear;-webkit-transition-property:width,opacity,border-radius;-o-transition-property:width,opacity,border-radius;transition-property:width,opacity,border-radius}@-moz-document url-prefix(){.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{bottom:-1px}}.main-table tbody>tr>td.c-side:before{display:none}.main-table tbody>tr{-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background-color,-webkit-box-shadow;-o-transition-property:box-shadow,background-color;transition-property:background-color,-webkit-box-shadow;transition-property:box-shadow,background-color;transition-property:box-shadow,background-color,-webkit-box-shadow}.main-table tbody>tr:hover{background:#e9f2fb}.main-table .table-grouped tbody>tr:hover{background:#f2f7fd;-webkit-box-shadow:none;box-shadow:none}.main-table .table-grouped tbody>tr:hover td.c-actions .more{background:#f2f7fd}.main-table tbody>tr.checked{background:#fff3e0}.main-table tbody>tr.checked:hover{background:#ffebbc}.main-table tbody>tr.checked>td.c-side+td:before,.main-table tbody>tr.checked>td:first-child:before{width:4px;opacity:1}.main-table tbody>tr.checked.row-check-begin{border-top-left-radius:4px;border-top-right-radius:2px}.main-table tbody>tr.checked.row-check-begin>td:first-child:before{border-top-left-radius:4px}.main-table tbody>tr.checked.row-check-end{border-bottom-right-radius:2px;border-bottom-left-radius:4px}.main-table tbody>tr.checked.row-check-end>td:first-child:before{border-bottom-left-radius:4px}.main-table .checkbox-primary{display:inline-block;line-height:20px}.main-table .checkbox-primary label{margin:0}.main-table .table{margin:0}.table-header{padding:4px 0 12px}.table-header .table-statistic{color:#838a9d}.table-header .table-statistic strong{font-size:15px;color:#3c4353}.table-header .btn-toolbar{margin-top:-28px}.table-header.fixed-right{position:relative;z-index:5;padding:0}.table-header.fixed-right>.btn-toolbar{position:absolute;top:1px;right:1px;z-index:1;padding:1px;margin:0;background:#fff;border-radius:4px}.table-header.fixed-right>.btn-toolbar .btn{opacity:.65}.table-header.fixed-right>.btn-toolbar .btn:hover{opacity:1}.table-header-fixed .table-header{position:fixed;top:0}.table-header-fixed .table-header>.btn-toolbar{background-color:transparent}.table-header-fixed .table-header>.btn-toolbar .btn{color:#fff}.table-footer{position:relative;min-height:40px;padding:6px 15px;background:#fff;border-radius:0 0 4px 4px}.body-modal .table-footer{margin-bottom:20px}.talbe-lg+.table-footer{padding:11px 15px}.table-footer .btn-toolbar,.table-footer .checkbox-primary{float:left}.table-footer .btn-toolbar+.btn-toolbar{margin-left:8px}.table-footer .checkbox-primary{margin:5px 20px 0 0}.table-footer .checkbox-primary.checked label:after{border-color:#00da88!important}.table-footer .btn{padding:3px 10px;line-height:20px}.table-footer .pager{position:absolute;top:0;right:0;z-index:5;height:40px;padding:6px 5px 6px 10px;margin:0;background:#fff;opacity:1;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.table-footer .pager:before{position:absolute;top:0;bottom:0;left:-50px;display:block;width:50px;content:' ';background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(#fff));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%)}.table-footer .pager .btn,.table-footer .pager>li>.pager-item,.table-footer .pager>li>.pager-label{color:#838a9d;background:0 0;border-color:transparent}.table-footer .pager .btn,.table-footer .pager>li>a{border-radius:3px}.table-footer .pager .btn:hover,.table-footer .pager>li>a:hover{background:rgba(0,0,0,.1)}.table-footer .pager>li.disabled>a.pager-item{opacity:1}.table-footer .form-control{height:28px;padding:3px 8px}.table-footer .table-statistic{position:relative;z-index:2;float:left;padding-right:30px;line-height:28px;color:#838a9d;background:#fff}.table-footer .table-statistic:hover{z-index:4}.table-footer .table-statistic:hover+.pager{z-index:2;opacity:.3}.table-footer .btn-toolbar+.table-statistic,.table-footer .btn-toolbar+.text{margin-left:10px}.table-footer .text{float:left;line-height:28px}.table-footer.fixed-footer{position:fixed;z-index:10;margin:0;background:rgba(75,75,75,.85);border-top-color:transparent}.table-footer.fixed-footer .checkbox-primary label{color:#fff}.table-footer.fixed-footer .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.table-footer.fixed-footer .table-statistic{color:#fff;background:0 0}.table-footer.fixed-footer .pager{background:#666}.table-footer.fixed-footer .pager:before{background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0)),to(#666));background:-webkit-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:-o-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:linear-gradient(to right,rgba(0,0,0,0) 0,#666 100%)}.table-footer.fixed-footer .pager .btn,.table-footer.fixed-footer .pager>li>.pager-item,.table-footer.fixed-footer .pager>li>.pager-label{color:#fff}.table-footer.fixed-footer .pager .btn:hover,.table-footer.fixed-footer .pager>li>a:hover{background:rgba(255,255,255,.3)}.table-footer.fixed-footer .pager>li.disabled>a.pager-item{opacity:.5}.table-actions{display:none;height:28px}.table-actions.show-always{display:block;pointer-events:none;cursor:not-allowed}.has-row-checked .table-actions{display:block;pointer-events:auto!important;cursor:default}.table-lg tbody>tr>td{padding:9px 10px}.table-lg tbody>tr>td .btn+.btn{margin-left:5px}.table.has-sort-head thead>tr>th{padding-right:0}.table.has-sort-head thead>tr>th>a{position:relative;display:inline-block;padding-right:16px;color:#3c4353}.table.has-sort-head thead>tr>th>a:after,.table.has-sort-head thead>tr>th>a:before{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:30px;color:#3c495c;text-transform:none;content:"\f0de";opacity:.5;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.table.has-sort-head thead>tr>th>a:after{content:"\f0dd"}.table.has-sort-head thead>tr>th>a.sort-down,.table.has-sort-head thead>tr>th>a.sort-up{color:#000;text-decoration:none}.table.has-sort-head thead>tr>th>a:hover,.table.has-sort-head thead>tr>th>a:hover:after,.table.has-sort-head thead>tr>th>a:hover:before{color:#0c64eb;opacity:1}.table.has-sort-head thead>tr>th>a.sort-down:after,.table.has-sort-head thead>tr>th>a.sort-up:before{color:#000;opacity:1}.head-fixed .datatable-head-span .table,.table.fixed-header-copy{z-index:10;color:#fff;background:rgba(75,75,75,.85)}.head-fixed .datatable-head-span .table thead>tr>th,.table.fixed-header-copy thead>tr>th{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a,.table.fixed-header-copy thead>tr>th>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>a:after,.head-fixed .datatable-head-span .table thead>tr>th>a:before,.table.fixed-header-copy thead>tr>th>a:after,.table.fixed-header-copy thead>tr>th>a:before{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down:after,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up:before,.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:after,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:before,.table.fixed-header-copy thead>tr>th>a.sort-down,.table.fixed-header-copy thead>tr>th>a.sort-down:after,.table.fixed-header-copy thead>tr>th>a.sort-up,.table.fixed-header-copy thead>tr>th>a.sort-up:before,.table.fixed-header-copy thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover:after,.table.fixed-header-copy thead>tr>th>a:hover:before{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a,.table.fixed-header-copy thead>tr>th>.dropdown>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a:hover,.table.fixed-header-copy thead>tr>th>.dropdown>a:hover{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary,.table.fixed-header-copy .checkbox-primary{z-index:1}.head-fixed .datatable-head-span .table .checkbox-primary label,.table.fixed-header-copy .checkbox-primary label{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary label:after,.table.fixed-header-copy .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.head-fixed .datatable-head-span .table .checkbox-primary.checked label:after,.table.fixed-header-copy .checkbox-primary.checked label:after{border-color:#00da88!important}.table-data{margin:0;table-layout:fixed}.table-data tbody>tr>td,.table-data tbody>tr>th{padding:6px 8px;word-break:break-all;border:none}.table-data tbody>tr>th{width:70px;padding-left:0;font-weight:400;color:#838a9d;text-align:right;vertical-align:middle}.table-data tbody>tr>td{padding-right:0}.table-data tbody>tr>td>a{color:#0c60e1}.table-data tbody>tr>td>a:not(.btn):visited{color:#082999}.table-data tbody>tr>td>a:hover,.table-data tbody>tr>td>a:visited:hover{color:#0c64eb}.table-data ol,.table-data ul{margin:0}.fixed-head-table{background:rgba(0,0,0,.7);border-bottom:1px solid #ddd}.fixed-head-table thead>tr>th{color:#fff}.table-empty-tip{padding:80px 10px;text-align:center;background:#fff}.not-firefox .table-grouped>tbody>tr>td.c-side{background:#fff!important}.table-grouped .group-toggle{cursor:pointer}.table-grouped .group-toggle.group-summary{border-top:10px solid #efefef}.table-grouped tbody>tr>td:first-child,.table-grouped thead>tr>th:first-child{padding-left:8px}.group-expand-all,.table-group-collapsed .group-collapse-all{display:none}.table-group-collapsed .group-expand-all{display:inline-block}.table-auto{table-layout:auto}.datatable .table>tbody>tr.checked.hover>td,.datatable .table>tbody>tr.checked>td.col-hover{background:#ffebbc}body.has-fixed-footer{padding-bottom:60px}.table.with-footer-fixed{margin-bottom:20px}.table-nest-hide{display:none!important}th.table-nest-title{position:relative;padding-left:30px!important}.table-nest-icon{position:relative;display:inline-block;width:22px;height:22px;font-size:16px;color:#a6aab8;text-align:center;border-radius:4px}.table-nest-toggle:before{line-height:22px;content:"\e6f2"}.table-nest-toggle:hover{color:#0c64eb;background-color:rgba(0,0,0,.1)}.table-nest-child-hide .table-nest-toggle:before{font-size:16px;content:"\e6f1"}th.table-nest-title .table-nest-toggle{position:absolute!important;top:7px;left:8px}.table-nest-toggle.table-nest-toggle-global{width:22px;height:22px;padding:0!important;line-height:22px;text-align:center;border-radius:4px}.table-nest-toggle.table-nest-toggle-global:before{position:static!important;font-size:16px!important;line-height:22px!important;content:"\e6f2"!important;opacity:1!important}.table-nest-toggle.table-nest-toggle-global:after{display:none!important}.table-nest-collapsed .table-nest-toggle.table-nest-toggle-global:before{font-size:16px!important;content:"\e6f1"!important}.disable-empty-nest-row .is-nest-child .table-nest-icon:before,.disable-empty-nest-row .no-nest .table-nest-icon:before{position:relative;top:-1px;width:6px;min-width:6px;height:6px;content:' ';background-color:#cbd0db;border-radius:1px}.table-nest-child-hover>td:first-child,.table-nest-hover>td:first-child{-webkit-box-shadow:inset 3px 0 0 #cbd0db;box-shadow:inset 3px 0 0 #cbd0db}.article-content{overflow:auto}.article-content img{margin-top:0}.article-content table{margin:10px 0}.article-content table td,.article-content table th{border:1px solid #cbd0db}.article-content table th{background:#eee}.article-content a{color:#0c64eb}.article-content a:focus,.article-content a:hover{color:#16a8f8}.article-content,.article>.content{word-wrap:break-word}.detail{padding:10px 0;margin:0 10px}.detail+.detail{padding-top:25px;border-top:1px solid #eee}.detail-title{font-size:14px;font-weight:700;line-height:20px}.detail-title>.pull-right{position:relative;top:-8px}h2.detail-title{margin:0;font-size:15px;font-weight:700}h2.detail-title .label,h2.detail-title .label-id{position:relative;top:-1px}.detail-content{padding:0;margin-top:10px}.detail-content em{color:#3c4353}.detail-content .list-unstyled>li+li{margin-top:5px}.side-col .detail-content{padding-left:0}details.detail{padding:10px 0}details.detail summary{position:relative;cursor:pointer;outline:0}details.detail summary::-webkit-details-marker{display:none}details.detail summary:after{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e316";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}details.detail[open] summary:after{content:"\e313"}.files-list{padding-left:0;list-style:none}.files-list>li>a{display:block;line-height:24px}.files-list>li>a>.icon{display:inline-block;margin-right:5px;opacity:.7}.files-list>li>a:hover{color:#0c64eb}.files-list>li>.right-icon{opacity:0;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.files-list>li:hover>.right-icon{opacity:1}.histories-list{padding-left:15px;margin-bottom:0}.histories-list>li{position:relative}.histories-list>li+li{margin-top:5px}.histories-list>li strong{color:#3c4353}.histories-list .comment,.histories-list .show-form .comment-edit-form{padding:5px 5px 5px 10px;margin:5px 0 0;background-color:rgba(0,0,0,.025);border:1px solid #eee}.histories-list .btn-edit-comment{position:absolute;top:28px;right:2px}.histories-list .comment-edit-form,.histories-list .show-form .btn-edit-comment,.histories-list .show-form .comment{display:none}.histories-list .show-form .comment-edit-form{display:block;padding:10px;border:1px solid #eee}.histories .btn-mini{width:16px;min-width:16px;height:16px;overflow:hidden;line-height:16px;color:#cbd0db;vertical-align:-8%;border-radius:1px}.histories .btn-mini:focus,.histories .btn-mini:hover{color:#0c64eb;border-color:#0c64eb}.histories .show-changes .btn-expand>.icon:before{content:"\e926"}.histories .btn-strip{display:none}.histories .show-changes .btn-strip{display:inline-block}.history-changes{display:none;padding:5px;margin-bottom:-5px;margin-left:5px;font-size:12px;line-height:20px}.history-changes blockquote{padding:5px 5px 5px 10px;margin:5px 0 0;font-size:12px;background-color:rgba(0,0,0,.05);border-left:3px solid #eee}.history-changes blockquote.original{display:none}.show-changes .history-changes,.show-original .history-changes blockquote.original{display:block}.show-original .history-changes blockquote.textdiff{display:none}.syntaxhighlighter{overflow:auto}.list-group{overflow-y:auto}.list-group>a{display:block;padding:2px 10px 2px 5px;overflow:hidden;line-height:20px;text-overflow:ellipsis;white-space:nowrap;border-radius:4px}.list-group>a+a{margin-top:5px}.list-group>a>.icon{display:inline-block;margin-right:3px;opacity:.5}.list-group>a.selected{color:#e9f2fb;background-color:#0c64eb}.list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.list-group>a.active:hover,.list-group>a:hover{color:#fff;background-color:#0c64eb}.list-group>.heading{padding:2px 5px;line-height:20px;color:#838a9d}.list-group>a+.heading{margin-top:4px}.dropup .search-box-sink{padding-top:5px;padding-bottom:45px}.dropup .search-box-sink .search-box{position:absolute;right:10px;bottom:10px;left:10px;margin:0}.dropup .search-box-sink .search-box+.list-group{height:auto;max-height:171px}.search-list{min-width:200px;max-width:300px;padding:0}.search-list .search-box{float:none;width:auto;margin:10px}.search-list .search-box .icon-search{opacity:.5}.search-list .list-group{max-height:248px;padding:5px 10px;margin:5px 0}.dropup .search-list .search-box+.list-group{height:171px;padding-top:0}.search-list .search-input{height:30px}.search-list .input-control-icon-right{height:28px;line-height:28px}.search-list .list-group>a.active{color:inherit;background-color:inherit}.search-list.searchbox-focus .list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.search-list .list-group>a.active:hover,.search-list.searchbox-focus .list-group>a.active:hover{color:#fff;background-color:#0c64eb}#dropMenu{width:initial;max-width:initial}#dropMenu>.search-box{width:100%;padding:10px 10px 0;margin:0}#dropMenu>.search-box .icon-search{color:#333}#dropMenu>.search-box.has-icon-right>.form-control{padding-left:26px}#dropMenu .input-control-icon-left{top:10px;left:10px}#dropMenu .input-control-icon-right{top:11px;right:11px}#dropMenu .input-control-icon-right .icon{position:relative;top:2px}#dropMenu .list-group{max-height:initial;margin:0}#dropMenu .table-row{margin:0 -10px;table-layout:auto}#dropMenu .table-col{position:relative;width:100%;min-width:250px;max-width:450px}#dropMenu .table-col .list-group{max-height:300px;padding:0 10px 5px}#dropMenu .col-left{padding-bottom:30px}#dropMenu .col-right{display:none}#dropMenu .col-footer{position:absolute;right:0;bottom:-5px;left:0;padding:8px 10px;border-top:1px solid #eee}#dropMenu .col-footer>a{opacity:.8}#dropMenu .col-footer>a:hover{opacity:1}#dropMenu.show-right-col .table-col{width:50%}#dropMenu.show-right-col .col-right{display:table-cell;border-left:1px solid #eee}#dropMenu.show-right-col .col-right>.list-group{max-height:335px;margin:0}#dropMenu.show-right-col .col-right>.list-group>a{opacity:.7}#dropMenu.show-right-col .col-right>.list-group>a:hover{opacity:1}#dropMenu.show-right-col .toggle-right-col>.icon-angle-right:before{content:"\e314"}#dropMenu.has-search-text .list-group{overflow-x:hidden}#dropMenu.has-search-text>.search-box{width:100%!important}#dropMenu.has-search-text>.list-group>.table-row{display:block}#dropMenu.has-search-text>.list-group>.table-row>.table-col{display:block;width:100%}#dropMenu.has-search-text .col-left{padding-bottom:0}#dropMenu.has-search-text .pull-right.toggle-right-col{display:none}#dropMenu.has-search-text .col-left .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group>a{opacity:.7}#dropMenu.has-search-text .col-footer,#dropMenu.has-search-text .hide-in-search{display:none}#swapper{position:relative}#swapper #dropMenu .tree li>.selected{color:#0c64eb!important;background:#e9f2fb!important}#swapper #dropMenu .list-group>a.active:hover,#swapper #dropMenu .search-box .list-group>a.active,#swapper #dropMenu .tree li>.clickable:hover,#swapper #dropMenu.searchbox-focus .list-group>a.active:hover{color:#fff!important;background:#0c64eb!important}#swapper #dropMenu .tree{margin:0}.release-path{overflow:hidden}.release-line{display:table;width:100%;padding:0;table-layout:fixed}.release-line>li{display:table-cell;list-style:none}.release-line>li>a{position:relative;display:block}.release-line>li>a:before{position:absolute;left:0;display:block;width:13px;height:13px;content:' ';background:#fff;border:2px solid #838a9d;border-radius:50%}.release-line>li>a:after{position:absolute;left:5px;display:block;width:2px;height:30px;content:' ';background:#cbe0f6}.release-line>li>a>.icon{position:absolute;left:4px;font-size:24px}.release-line>li>a .title{display:block;font-size:14px;white-space:nowrap}.release-line>li>a .date,.release-line>li>a .info{display:block;max-height:18px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.release-line>li>a:hover:before{background-color:#e9f2fb}.release-line>li>a:hover:after{background-color:#838a9d}.release-line>li>a:hover .title{color:#0c64eb}.release-line>li>a:hover .date,.release-line>li>a:hover .info{color:#838a9d}.release-line>li:nth-child(odd){padding-top:80px;vertical-align:top}.release-line>li:nth-child(odd)>a{height:85px;padding-top:36px;border-top:5px solid #cbe0f6}.release-line>li:nth-child(odd)>a:before{top:-9px}.release-line>li:nth-child(odd)>a:after{top:6px}.release-line>li:nth-child(odd)>a>.icon{top:-26px}.release-line>li:nth-child(even){padding-bottom:80px;vertical-align:bottom}.release-line>li:nth-child(even)>a{height:85px;padding-bottom:36px;border-bottom:5px solid #cbe0f6}.release-line>li:nth-child(even)>a:before{bottom:-9px}.release-line>li:nth-child(even)>a:after{bottom:6px}.release-line>li:nth-child(even)>a>.icon{bottom:-2px}.release-line>li:last-child>a{border-color:transparent}.release-line>li.active>a:before{border-color:#0c64eb}.release-line>li+li>a>.date,.release-line>li+li>a>.info,.release-line>li+li>a>.title{position:relative;left:-36%}#footer{position:fixed;right:0;bottom:0;left:0;z-index:1010;height:40px;background:#fff;border-top:1px solid #eff1f7}#footer .breadcrumb{padding:10px 0;margin:0}#footer .breadcrumb>li{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#footer .breadcrumb>.active,#footer .breadcrumb>li>a{color:#838a9e}#footer .breadcrumb>.active>.icon,#footer .breadcrumb>li>a>.icon{display:none}#footer .breadcrumb>.active:hover,#footer .breadcrumb>li>a:hover{color:#16a8f8}#footer .breadcrumb>li+li:before{content:'>'}#footer>.container{padding:0 20px}@media (min-width:1400px){#footer>.container{padding:0 40px}}#poweredBy{position:absolute;top:4px;right:0;padding:5px 10px}#poweredBy .icon-zentao{color:#0097fd}#poweredBy a{color:#3c4353}#poweredBy a:hover{color:#0c64eb}#poweredBy a:hover .icon-zentao{color:#0c64eb}#poweredBy a.text-important{color:#bd7b46}#poweredBy a.text-important:hover{color:#ff5d5d}#poweredBy a.text-primary{color:#0c64eb}#poweredBy a.text-primary:hover{color:#16a8f8}#poweredBy #aiux{color:#cbd0dc}#noticeBox .alert{-webkit-box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px;box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px}#heading{top:0}.header-btn{position:relative;padding:8px 0}.header-btn .btn{position:relative;height:34px;padding:1px 6px;margin:0;overflow:visible;font-size:13px;font-weight:400;line-height:28px;color:#fff;background-color:transparent;border-color:transparent!important;border-right:none;-webkit-transition:none;-o-transition:none;transition:none}.header-btn .btn>.caret{margin-left:0;border-width:4px}.header-btn .btn>.text{display:inline-block;max-width:150px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.header-btn .btn:hover{-webkit-box-shadow:none;box-shadow:none}.header-btn .btn:hover,.header-btn.active .btn{color:#fff;background:rgba(0,0,0,.15)}.header-btn .btn:hover>.caret,.header-btn.active .btn>.caret{opacity:1}.header-btn+.header-btn{margin-left:10px}.header-btn+.header-btn:before{position:absolute;top:16px;left:-13px;display:block;font-family:ZentaoIcon;font-size:14px;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e315";opacity:.6;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.header-btn .dropdown-menu{margin-top:-10px}#toolbar{top:0;height:50px}#userNav>li{margin-right:0}#userNav>li>a{padding:10px 5px}#userNav>li>a>.icon{font-size:30px;filter:brightness(1.2) hue-rotate(30deg);opacity:.9;-webkit-filter:brightness(1.2) hue-rotate(30deg)}#userNav>li:hover>a{background-color:rgba(0,0,0,.1)}#userNav .dropdown-menu>li>a{position:relative;padding-left:24px}#userNav .dropdown-menu>li>a>.icon{top:1px;left:0}#userNav .dropdown-menu>li.user-profile-item>a{padding-left:45px} \ No newline at end of file +*/.chosen-container{position:relative;display:block;font-size:13px;vertical-align:middle;zoom:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;display:none;width:100%;background:#fff;border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-top:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container .chosen-drop.chosen-drop-size-limited{border-top:1px solid rgba(0,0,0,.15)}.chosen-container .chosen-drop.chosen-auto-max-width{min-width:100%;border-top:1px solid rgba(0,0,0,.15);opacity:0}.chosen-container .chosen-drop.chosen-auto-max-width>.chosen-results>li{display:inline-block;white-space:nowrap}.chosen-container .chosen-drop.chosen-auto-max-width.in{opacity:1}.chosen-container .chosen-drop.chosen-auto-max-width.in>.chosen-results>li{display:block;white-space:normal}.chosen-container .chosen-drop.chosen-no-wrap>.chosen-results>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap!important}.chosen-container.chosen-with-drop .chosen-drop{display:block}.chosen-container a{cursor:pointer}.chosen-container.chosen-up .chosen-drop{top:inherit;bottom:100%;margin-top:auto;margin-bottom:-1px;border-radius:2px 2px 0 0;-webkit-box-shadow:0 -3px 5px rgba(0,0,0,.175);box-shadow:0 -3px 5px rgba(0,0,0,.175)}.chosen-container.chosen-highlight-selected .result-selected{color:#0c64eb;background:#e9f2fb}.chosen-container-single .chosen-single{display:block;width:100%;height:32px;padding:5px 8px;overflow:hidden;line-height:1.42857143;color:#222;text-decoration:none;white-space:nowrap;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-single .chosen-default{color:#838a9d}.chosen-container-single .chosen-single>span{display:block;margin-right:26px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:5px;right:24px;display:block;width:20px;height:20px;font-family:sans-serif;font-size:18px;font-weight:700;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-single .chosen-single abbr:before{display:block;content:'×'}.chosen-container-single .chosen-single abbr:focus,.chosen-container-single .chosen-single abbr:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;height:100%;padding:5px 8px}.chosen-container-single .chosen-single div b{display:inline-block;width:0;height:0;margin-bottom:2px;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent;opacity:.5}.chosen-container-single .chosen-search{position:relative;z-index:1010;padding:3px 4px;margin:0;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{width:100%;height:27px;padding:2px 26px 2px 8px;margin:1px 0;font-size:12px;line-height:1.5;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;outline:0}.chosen-container-single .chosen-search input[type=text]:focus{border-color:#0c64eb}.chosen-container-single .chosen-search:before{position:absolute;top:10px;right:10px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-single .chosen-drop{margin-top:-1px;-webkit-background-clip:padding-box;background-clip:padding-box;border-radius:0 0 4px 4px}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{position:relative;max-height:240px;padding:0;margin:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;padding:5px 10px;margin:0;line-height:15px;list-style:none;-webkit-transition:background-color .2s cubic-bezier(.175,.885,.32,1);-o-transition:background-color .2s cubic-bezier(.175,.885,.32,1);transition:background-color .2s cubic-bezier(.175,.885,.32,1);-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{color:#fff;background-color:#0c64eb}.chosen-container .chosen-results li.no-results{display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;width:100%;min-height:32px;min-height:30px\9;padding:0;margin:0;overflow:hidden;cursor:text;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.chosen-container-multi .chosen-choices:after,.chosen-container-multi .chosen-choices:before{display:table;content:" "}.chosen-container-multi .chosen-choices:after{clear:both}.chosen-container-multi .chosen-choices li{display:block;float:left;padding:0 6px;margin:5px 4px;list-style:none}.chosen-container-multi .chosen-choices li.search-field{padding:0;line-height:12px;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{height:20px;font-size:100%;color:#838a9d;background:0 0!important;border:0!important;border-radius:0;outline:0;-webkit-box-shadow:none;box-shadow:none}.chosen-container-multi .chosen-choices li.search-field .default{color:#999}.chosen-container-multi .chosen-choices li.search-field:before{position:absolute;right:8px;bottom:8px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#838a9d;text-transform:none;content:"\e928";opacity:0;-webkit-transition:opacity .2s cubic-bezier(.175,.885,.32,1);-o-transition:opacity .2s cubic-bezier(.175,.885,.32,1);transition:opacity .2s cubic-bezier(.175,.885,.32,1);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice{position:relative;padding:3px 20px 3px 5px;line-height:12px;cursor:default;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);-webkit-transition:all .4s cubic-bezier(.175,.885,.32,1);-o-transition:all .4s cubic-bezier(.175,.885,.32,1);transition:all .4s cubic-bezier(.175,.885,.32,1)}.chosen-container-multi .chosen-choices li.search-choice:hover{background-color:#fff;border-color:#adb5c6;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 0 rgba(0,0,0,.1)}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:1px;right:0;display:block;width:20px;height:18px;line-height:18px;color:#000;text-align:center;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:focus,.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;color:#666;background-color:#e4e4e4;border:1px solid #ccc}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{padding:5px 0;margin:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #b6bdcc;border:1px solid rgba(0,0,0,.15);border-bottom-right-radius:0!important;border-bottom-left-radius:0!important;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active.chosen-with-drop .chosen-single div{background:0 0;border-left:none}.chosen-container-active.chosen-with-drop .chosen-single div b{content:"";border-top:0 dotted;border-bottom:4px solid}.chosen-container-active.chosen-with-drop.chosen-up .chosen-single{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.chosen-container-active .chosen-choices{border-color:#0c64eb;-webkit-box-shadow:none,0 0 8px rgba(12,100,235,.6);box-shadow:none,0 0 8px rgba(12,100,235,.6)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#111!important}.chosen-container-active .chosen-choices li.search-field:before{opacity:1}.chosen-disabled{cursor:default;opacity:.5!important}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{left:0;display:none;padding:3px 4px;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:25px;padding:2px 26px 2px 4px;font-size:inherit}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{top:9px}.chosen-compact.chosen-with-search.chosen-with-drop .chosen-single>.chosen-search{display:block;opacity:1}select.chosen[multiple]{height:32px;overflow:hidden}select.chosen[multiple] option{visibility:hidden}.picker{min-height:32px;background-color:#eee}.picker:not(.picker-ready)>*{display:none}.picker-selections{position:relative;min-height:32px;color:#222;background-color:#fff;border:1px solid #dcdcdc;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.picker-focus .picker-selections{border-color:#0c64eb;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(12,100,235,.6)}.picker-multi .picker-selections{padding:3px}.picker-multi.picker-focus .picker-selections:before{position:absolute;right:0;bottom:8px;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\e928";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-multi.picker-focus.picker-loading .picker-selections::before{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-multi .picker-selection{position:relative;display:inline-block;padding:0 20px 0 5px;margin:2px;line-height:18px;background-color:#f1f1f1;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #cbd0db;border-radius:3px;-webkit-box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05)}.picker-selection-single{max-width:100%;padding:5px 20px 5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.picker-focus .picker-selection-single .picker-selection-text{display:none}.picker-selection-single:after{position:absolute;top:7px;right:0;display:block;width:24px;height:14px;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;content:"\f0d7";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-focus .picker-selection-single::after{content:"\e928"}.picker-focus.picker-loading .picker-selection-single::after{display:inline-block;content:"\e982";-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}.picker-selection-remove{position:absolute;top:0;right:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:18px;height:18px;text-align:center;cursor:pointer;opacity:.2;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.picker-selection-remove:before{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-shadow:0 1px 0 #fff;text-transform:none;content:'\d7';speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.picker-selection-remove:hover{opacity:.5}.picker-single .picker-selection-remove{top:5px;right:20px;z-index:1}.picker-no-value .picker-selection-remove,.picker-single.picker-focus .picker-selection-remove{display:none}.picker-multi.picker-sortable .picker-selection-text{cursor:move}.picker-search{color:transparent;background:0 0;border:none}.picker-search:focus{color:inherit;outline:0}.picker-single .picker-search{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;width:100%;padding:5px 8px}.picker-multi .picker-search{display:inline-block;width:10px;min-width:10px;max-width:100%;padding:0 2px;margin:2px 0}.picker-placeholder{position:absolute;top:5px;right:20px;left:8px;z-index:0;display:none;overflow:hidden;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.picker-no-value.picker-focus .picker-placeholder{display:none}.picker-input-empty.picker-focus.picker-no-value .picker-placeholder,.picker-no-value .picker-placeholder{display:block}.picker-drop-menu{position:fixed;z-index:1200;display:none;min-width:100px;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);box-shadow:0 6px 12px rgba(0,0,0,.12),0 1px 3px rgba(0,0,0,.1);opacity:0}.picker-drop-menu.picker-drop-show{display:block}.picker-option-list{padding:5px 0;margin:0;overflow-y:auto}.picker-no-options .picker-option-list{display:none}.picker-option{display:block;min-height:30px;padding:5px 10px;overflow:hidden;clear:both;font-weight:400;line-height:1.42857143;color:#3c4353;text-overflow:ellipsis;white-space:nowrap;-webkit-transition:none;-o-transition:none;transition:none}.picker-single .picker-option.picker-option-selected{color:#0c64eb;background:#e9f2fb}.picker-option:focus,.picker-option:hover{text-decoration:none}.picker-option.picker-option-active,.picker-single .picker-option.picker-option-selected.picker-option-active{color:#fff;background-color:#0c64eb}.picker-multi .picker-option.picker-option-selected,.picker-multi .picker-option.picker-option-selected.picker-option-active{color:#ccc;cursor:not-allowed;background-color:#fff}.picker-option-text-matched{position:relative;color:#0c64eb}.picker-option-text-matched:before{position:absolute;right:0;bottom:-4px;left:0;display:block;height:2px;content:' ';background-color:#0c64eb;border-radius:2px;opacity:.5}.picker-option-active .picker-option-text-matched,.picker-option:hover .picker-option-text-matched{color:#fff}.picker-option-active .picker-option-text-matched:before,.picker-option:hover .picker-option-text-matched:before{background-color:#fff}.picker-message{display:none;height:22px;padding:2px 5px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap;background-color:#f1f1f1}.picker-has-message .picker-message{display:block}.picker-message[data-type=danger]{color:#ff5d5d}.picker-actions{padding:5px;border-top:1px solid #eee}.picker-no-actions .picker-actions{display:none}.picker-actions .btn{padding:2px 4px}.picker-actions .btn[disabled]{background-color:transparent;filter:grayscale(1);-webkit-filter:grayscale(1)}.picker-actions .btn+.btn{margin-left:4px}.container,.container-fixed,.container-fluid{position:relative}.container{max-width:1800px!important}body{background-color:#efefef}body.article-content,body.body-modal{background:0 0}body.body-modal{padding:0}@media screen and (min-width:1920px){body{font-size:14px}}a:active,a:focus,button:active,button:focus{outline:0!important}.strong{font-weight:700}.font-normal{font-weight:400!important}.text-middle{vertical-align:middle!important}.text-bottom{vertical-align:bottom!important}.text-top{vertical-align:top!important}.inline-block{display:inline-block!important}.layer{border-radius:4px;-webkit-box-shadow:0 0 20px 0 #bdc9d8;box-shadow:0 0 20px 0 #bdc9d8}.space{margin-bottom:20px}.space-lg{margin-bottom:30px}.space-sm{margin-bottom:10px}.muted{opacity:.5}.text-muted em{color:#3c4353}.no-animate{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}.template{display:none!important}.text-left{text-align:left!important}.text-yellow.icon-folder{color:#ffe066}.table-row{display:table;width:100%;table-layout:fixed}.table-col,.table-row>.col,.table-row>[class*=col-],.table-row>[class*="-col"]{display:table-cell;float:none;vertical-align:top}.side-col{width:200px;padding-right:20px}.side-col.col-4{width:33.3333333%}.col-lg{width:260px}.col-xl{width:320px}.col-sm{width:150px}.col-xs{width:100px}.main-col+.side-col{padding-right:0;padding-left:20px}.row-grid>[class*=col-],.row-grid>[class*="-col"]{padding-top:6px;padding-bottom:6px}hr.space{margin:10px 0;border:none}hr.space-sm{margin:5px 0;border:none}.text-secondary{color:#16a8f8}a.text-primary{color:#0c64eb}.nav-primary>li>a{min-width:100px;padding:5px 8px;color:#838a9d;border-color:#e7f1fc}.nav-primary>li.active>a{color:#0c64eb;background-color:#e7f1fc;border-color:#e7f1fc}.nav-primary>li.active>a:hover{color:#0c64eb;background-color:#c3dcf7;border-color:#c3dcf7}.end-marker{margin-bottom:20px;color:#cbd0db;text-align:center}@-webkit-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@-o-keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}@keyframes highlight{0%{background:#fff;outline:1px solid transparent}100%{background:#fff0d5;outline:2px solid #ffdcbc}}.highlight{-webkit-animation:highlight .5s linear 0s 2 alternate;-o-animation:highlight .5s linear 0s 2 alternate;animation:highlight .5s linear 0s 2 alternate}.progress.inline-block{width:100px;margin:0}.w-p5{width:5%!important}.w-p10{width:10%!important}.w-p15{width:15%!important}.w-p20{width:20%!important}.w-p25{width:25%!important}.w-p30{width:30%!important}.w-p35{width:35%!important}.w-p40{width:40%!important}.w-p45{width:45%!important}.w-p50{width:50%!important}.w-p55{width:55%!important}.w-p60{width:60%!important}.w-p65{width:65%!important}.w-p70{width:70%!important}.w-p75{width:75%!important}.w-p80{width:80%!important}.w-p85{width:85%!important}.w-p90{width:90%!important}.w-p94{width:94%!important}.w-p95{width:95%!important}.w-p98{width:98%!important}.w-p99{width:99%!important}.w-p100{width:100%!important}.w-auto{width:auto!important}.w-10px{width:10px!important}.w-20px{width:20px!important}.w-30px{width:30px!important}.w-35px{width:35px!important}.w-40px{width:40px!important}.w-45px{width:45px!important}.w-50px{width:50px!important}.w-60px{width:60px!important}.w-70px{width:70px!important}.w-80px{width:80px!important}.w-90px{width:90px!important}.w-100px{width:100px!important}.w-110px{width:110px!important}.w-120px{width:120px!important}.w-130px{width:130px!important}.w-140px{width:140px!important}.w-150px{width:150px!important}.w-160px{width:160px!important}.w-180px{width:180px!important}.w-200px{width:200px!important}.w-230px{width:230px!important}.w-250px{width:250px!important}.w-300px{width:300px!important}.w-400px{width:400px!important}.w-500px{width:500px!important}.w-600px{width:600px!important}.w-700px{width:700px!important}.w-800px{width:800px!important}.w-900px{width:900px!important}.mw-200px{max-width:200px!important}.mw-300px{max-width:300px!important}.mw-400px{max-width:400px!important}.mw-500px{max-width:500px!important}.mw-600px{max-width:600px!important}.mw-700px{max-width:700px!important}.mw-800px{max-width:800px!important}.mw-900px{max-width:900px!important}.mw-1400px{max-width:1400px!important}.w-id{width:70px!important}.w-pri{width:40px!important}.w-severity{width:50px!important}.w-hour{width:57px!important}.w-date{width:90px!important}.w-status{width:60px!important}.w-resolution,.w-type,.w-user{width:80px!important}.w-p15-f{width:15%!important;min-width:120px!important}.w-p25-f{width:25%!important;min-width:200px!important}.w-p35-f{width:35%!important;min-width:300px!important}.w-p45-f{width:45%!important;min-width:400px!important}.h-5px{height:5px!important}.h-10px{height:10px!important}.h-20px{height:20px!important}.h-30px{height:30px!important}.h-35px{height:35px!important}.h-40px{height:40px!important}.h-45px{height:45px!important}.h-50px{height:50px!important}.h-60px{height:60px!important}.h-70px{height:70px!important}.h-80px{height:80px!important}.h-100px{height:100px!important}.h-120px{height:120px!important}.h-130px{height:130px!important}.h-140px{height:140px!important}.h-150px{height:150px!important}.h-200px{height:200px!important}.pd-0{padding:0!important}.mg-0{margin:0!important}.mgb-20{margin-bottom:20px!important}.mgb-10{margin-bottom:10px!important}.pdb-20{padding-bottom:20px!important}.pdt-20{padding-top:20px!important}.br-0{border-radius:0!important}.bd-0,.bd-none,.borderless{border:none!important}.bg-none{background:0 0!important}.red{color:#ff5d5d!important}.icon-pro-version{font-size:14px!important}.icon-pro-version:before{position:relative;top:-1px;font-size:14px;color:#ff5d5d;content:"\e92b"}.bg-primary{color:#fff;background:#1183fb -webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:#1183fb -webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:#1183fb -o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:#1183fb linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);background-color:#00b1fd}.bg-primary-pure{color:#fff;background-color:#0c64eb}.bg-primary-pale{color:#0c64eb;background-color:#e9f2fb}.bg-secondary{color:#fff;background:#16a8f8}.hl-tutorial{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 0 0 #000!important;box-shadow:0 0 0 0 #000!important;-webkit-transition:-webkit-box-shadow 1s!important;-o-transition:box-shadow 1s!important;transition:-webkit-box-shadow 1s!important;transition:box-shadow 1s!important;transition:box-shadow 1s,-webkit-box-shadow 1s!important}.hl-tutorial.hl-in{-webkit-box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important;box-shadow:0 0 20px 0 #ffff8d,0 0 0 2px #ffd180,0 0 0 3000px rgba(0,0,0,.2)!important}.btn.tooltip-tutorial,.hl-tutorial.hl-in:hover{position:relative!important;z-index:1010!important;-webkit-box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important;box-shadow:0 0 30px 0 #ffff8d,0 0 0 5px #ffd180,0 0 0 3000px rgba(0,0,0,.3)!important}.tooltip-max .tooltip-inner{max-width:1000px;padding:8px 10px}.transition-all *{-webkit-transition:all .2s!important;-o-transition:all .2s!important;transition:all .2s!important}.scroll-x{overflow-x:auto!important}.scroll-y{overflow-y:auto!important}.divider+.divider{display:none}.ie *{-webkit-transition:none!important;-o-transition:none!important;transition:none!important}@font-face{font-family:Oswald;font-weight:400;src:url(../fonts/Oswald-Regular.ttf)}@font-face{font-family:Oswald;font-weight:500;src:url(../fonts/Oswald-Medium.ttf)}@font-face{font-family:Oswald;font-weight:300;src:url(../fonts/Oswald-Light.ttf)}.num{font-family:Oswald;font-weight:400}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(../fonts/ZentaoIcon.eot?v=1.28);src:url(../fonts/ZentaoIcon.eot?#iefix&v=1.28) format('embedded-opentype'),url(../fonts/ZentaoIcon.woff?v=1.28) format('woff'),url(../fonts/ZentaoIcon.ttf?v=1.28) format('truetype'),url(../fonts/ZentaoIcon.svg#regular?v=1.28) format('svg')}.icon,[class*=" icon-"],[class^=icon-]{font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}a .icon,a [class*=" icon-"],a [class^=icon-]{display:inline}.icon-lg:before{font-size:1.33333333em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-spin{display:inline-block;-webkit-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}a .icon-spin{display:inline-block;text-decoration:none}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);-o-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);-o-transform:rotate(359deg);transform:rotate(359deg)}}.icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.icon-flip-horizontal{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.icon-flip-vertical{-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.icon.icon-flip-horizontal,.icon.icon-flip-vertical,.icon.icon-rotate-180,.icon.icon-rotate-270,.icon.icon-rotate-90{display:inline-block}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-help:before{content:"\e968"}.icon-import:before{content:"\e904"}.icon-download:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-plus:before{content:"\e925"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-chart-bar:before{content:"\e95d"}.icon-bar-chart:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before{content:"\e940"}.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-college:before{content:"\e9c8"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-menu-my:before{content:"\e97a"}.icon-home:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before{content:"\e98f"}.icon-product:before{content:"\e98f"}.icon-rocket:before{content:"\e99c"}.icon-project:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-test:before{content:"\e956"}.icon-infinite:before{content:"\e9a3"}.icon-devops:before{content:"\e9a3"}.icon-ops:before{content:"\e903"}.icon-doc:before{content:"\e99b"}.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-menu-backend:before{content:"\e993"}.icon-assets:before{content:"\e9ae"}.icon-diamond:before{content:"\e9ae"}.icon-feedback:before{content:"\e991"}.icon-flow:before{content:"\e994"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before{content:"\e996"}.icon-info:before{content:"\e996"}.icon-cog-outline:before{content:"\e997"}.icon-backend:before{content:"\e997"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before{content:"\f0ac"}.icon-lang:before{content:"\f0ac"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-kanban:before{content:"\e983"}.icon-lane:before{content:"\e9b1"}.icon-back:before{content:"\e9d3"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before{content:"\e9c7"}.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-hash:before{content:"\e9ab"}.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file:before{content:"\f016"}.icon-file-empty:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-group:before{content:"\e97e"}.icon-menu-users:before{content:"\e97e"}.icon-persons:before{content:"\e97e"}.icon-team:before{content:"\e97e"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-cancel:before{content:"\e951"}.icon-ban-circle:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before{content:"\e950"}.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-start:before{content:"\e90a"}.icon-play:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-change:before{content:"\e970"}.icon-alter:before{content:"\e970"}.icon-glasses:before{content:"\e914"}.icon-review:before{content:"\e914"}.icon-sitemap:before{content:"\e915"}.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-magic:before{content:"\e919"}.icon-active:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-delay:before{content:"\e91d"}.icon-calendar:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.icon-sm:before{font-size:14px;vertical-align:10%}.icon-qc{position:relative}.icon-qc:before{width:1em;color:#7cb938;content:"\e985"}.icon-qc:after{position:absolute;top:0;left:0;width:1em;height:1em;font-family:ZentaoIcon;font-size:14px;font-size:inherit;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:#36a742;text-transform:none;content:"\e987";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-message.has-dot{position:relative}.icon-message.has-dot::after{position:absolute;top:-3px;right:-5px;display:block;width:6px;height:6px;content:' ';background-color:#ff5d5d;border-radius:50%}.icon-project{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}.icon-product{-webkit-transform:scale(1.15);-ms-transform:scale(1.15);-o-transform:scale(1.15);transform:scale(1.15)}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:13px;font-weight:400;line-height:18px;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px;-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background,border,outline,opacity,-webkit-box-shadow;-o-transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,outline,opacity,-webkit-box-shadow;transition-property:background,border,box-shadow,outline,opacity;transition-property:background,border,box-shadow,outline,opacity,-webkit-box-shadow}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{color:#3c4353;text-decoration:none}.btn:active{text-decoration:none;background-image:none;outline:0;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.1)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:grayscale(1);-webkit-box-shadow:none;box-shadow:none;opacity:.5;-webkit-filter:grayscale(1)}.btn{color:#3c4353;background-color:#fff;border-color:#d6dae3}.btn.active,.btn.hover,.btn:active,.btn:focus,.btn:hover,.open .dropdown-toggle.btn{color:#3c4353;background-color:rgba(255,255,255,.8);border-color:#b8bfce}.btn.active,.btn:active,.open .dropdown-toggle.btn{background-color:#f2f2f2;background-image:none;border-color:#b8bfce}.btn.disabled,.btn.disabled.active,.btn.disabled:active,.btn.disabled:focus,.btn.disabled:hover,.btn[disabled],.btn[disabled].active,.btn[disabled]:active,.btn[disabled]:focus,.btn[disabled]:hover,fieldset[disabled] .btn,fieldset[disabled] .btn.active,fieldset[disabled] .btn:active,fieldset[disabled] .btn:focus,fieldset[disabled] .btn:hover{color:rgba(60,67,83,.3);background-color:#fff;border-color:#d6dae3}.btn-gray{color:#82899f;background-color:#f1f1f1;border-color:#f1f1f1}.btn-gray.active,.btn-gray.hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.open .dropdown-toggle.btn-gray{color:#82899f;background-color:rgba(241,241,241,.8);border-color:#d8d8d8}.btn-gray.active,.btn-gray:active,.open .dropdown-toggle.btn-gray{background-color:#e4e4e4;background-image:none;border-color:#d8d8d8}.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,fieldset[disabled] .btn-gray,fieldset[disabled] .btn-gray.active,fieldset[disabled] .btn-gray:active,fieldset[disabled] .btn-gray:focus,fieldset[disabled] .btn-gray:hover{color:rgba(130,137,159,.3);background-color:#f1f1f1;border-color:#f1f1f1}.btn-primary{color:#fff;background-color:#0c64eb;border-color:transparent}.btn-primary.active,.btn-primary.hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:rgba(12,100,235,.8);border-color:rgba(0,0,0,0)}.btn-primary.active,.btn-primary:active,.open .dropdown-toggle.btn-primary{background-color:#0b5ad3;background-image:none;border-color:rgba(0,0,0,0)}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{color:rgba(255,255,255,.3);background-color:#0c64eb;border-color:transparent}.btn-secondary{color:#fff;background-color:#16a8f8;border-color:transparent}.btn-secondary.active,.btn-secondary.hover,.btn-secondary:active,.btn-secondary:focus,.btn-secondary:hover,.open .dropdown-toggle.btn-secondary{color:#fff;background-color:rgba(22,168,248,.8);border-color:rgba(0,0,0,0)}.btn-secondary.active,.btn-secondary:active,.open .dropdown-toggle.btn-secondary{background-color:#079ced;background-image:none;border-color:rgba(0,0,0,0)}.btn-secondary.disabled,.btn-secondary.disabled.active,.btn-secondary.disabled:active,.btn-secondary.disabled:focus,.btn-secondary.disabled:hover,.btn-secondary[disabled],.btn-secondary[disabled].active,.btn-secondary[disabled]:active,.btn-secondary[disabled]:focus,.btn-secondary[disabled]:hover,fieldset[disabled] .btn-secondary,fieldset[disabled] .btn-secondary.active,fieldset[disabled] .btn-secondary:active,fieldset[disabled] .btn-secondary:focus,fieldset[disabled] .btn-secondary:hover{color:rgba(255,255,255,.3);background-color:#16a8f8;border-color:transparent}.btn-warning{color:#fff;background-color:#ff9800;border-color:transparent}.btn-warning.active,.btn-warning.hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:rgba(255,152,0,.8);border-color:rgba(0,0,0,0)}.btn-warning.active,.btn-warning:active,.open .dropdown-toggle.btn-warning{background-color:#e68900;background-image:none;border-color:rgba(0,0,0,0)}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{color:rgba(255,255,255,.3);background-color:#ff9800;border-color:transparent}.btn-danger{color:#fff;background-color:#ff5d5d;border-color:transparent}.btn-danger.active,.btn-danger.hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:rgba(255,93,93,.8);border-color:rgba(0,0,0,0)}.btn-danger.active,.btn-danger:active,.open .dropdown-toggle.btn-danger{background-color:#ff4343;background-image:none;border-color:rgba(0,0,0,0)}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{color:rgba(255,255,255,.3);background-color:#ff5d5d;border-color:transparent}.btn-success{color:#fff;background-color:#00da88;border-color:transparent}.btn-success.active,.btn-success.hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:rgba(0,218,136,.8);border-color:rgba(0,0,0,0)}.btn-success.active,.btn-success:active,.open .dropdown-toggle.btn-success{background-color:#00c178;background-image:none;border-color:rgba(0,0,0,0)}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{color:rgba(255,255,255,.3);background-color:#00da88;border-color:transparent}.btn-info{color:#0c64eb;background-color:#e9f2fb;border-color:transparent}.btn-info.active,.btn-info.hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#0c64eb;background-color:rgba(233,242,251,.8);border-color:rgba(0,0,0,0)}.btn-info.active,.btn-info:active,.open .dropdown-toggle.btn-info{background-color:#d3e5f7;background-image:none;border-color:rgba(0,0,0,0)}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{color:rgba(12,100,235,.3);background-color:#e9f2fb;border-color:transparent}.btn-link{padding-right:6px;padding-left:6px;font-weight:400;color:#3c495c;text-shadow:none;cursor:pointer;background:0 0;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover,.btn-link[disabled],fieldset[disabled] .btn-link{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{color:#222;background:#f1f1f1;background:rgba(0,0,0,.075)}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#cbd0db;text-decoration:none}.btn-lg{padding:11px 16px;font-size:14px;line-height:18px;border-radius:4px}.btn-mini,.btn-sm{padding:3px 8px;font-size:12px;line-height:18px;border-radius:4px}.btn-mini,.btn-xs{padding:0 5px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.btn-wide{min-width:120px}.btn-limit{max-width:180px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.btn-limit>.caret{position:absolute;top:14px;right:8px}.btn-circle{border-radius:17px}.btn>.label-icon{top:3px;padding:3px;margin:-2px;background-color:rgba(0,0,0,.2);border-radius:12px}.btn>.label-icon>.icon{font-size:16px;line-height:18px}.btn>.icon+.text{margin-left:5px}.btn.btn-sm.btn-circle{border-radius:12px}.btn.btn-sm>.label-icon{top:2px;width:20px;height:20px;padding:1px;line-height:20px}.btn.btn-sm>.label-icon>.icon{position:relative;top:-1px;display:inline-block;font-size:14px;line-height:18px}.btn-icon-left{position:relative;padding-left:35px;overflow:hidden;text-align:right}.btn-icon-left>.label-icon{position:absolute;left:5px;margin:0}.btn-icon-left>.icon{position:absolute;top:0;bottom:0;left:0;display:block;width:30px;line-height:30px;color:#16a8f8;text-align:center;background:#e9f2fb}.btn-icon-left.btn-sm{padding-left:28px}.btn-icon-left.btn-sm>.label-icon{left:2px}.btn-icon-left.btn-sm>.icon{width:24px;line-height:24px}.btn-icon-right{position:relative;padding-right:35px;text-align:left}.btn-icon-right>.label-icon{position:absolute;right:5px;margin:0}.btn-icon-right.btn-sm{padding-right:28px}.btn-icon-right.btn-sm>.label-icon{right:2px}.btn-icon{min-width:32px;padding-right:0;padding-left:0}.btn-icon.btn-sm{width:24px;min-width:24px;height:24px}.btn-group{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group>.btn-group{float:left}.btn-group>.btn{border-radius:0}.btn-group>.btn:first-child{border-top-left-radius:2px;border-bottom-left-radius:2px}.btn-group>.btn:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.dropdown{float:left;margin-right:10px}.btn-toolbar>.btn-group:last-child,.btn-toolbar>.btn:last-child,.btn-toolbar>.dropdown:last-child{margin-right:0}.btn-toolbar>.divider{float:left;height:20px;margin:7px 5px 4px 10px;border-left:1px solid rgba(0,0,0,.1)}.btn-toolbar .space{float:left;min-height:1px;margin:0 10px 0 10px}.btn-toolbar .input-control{float:left;width:120px}.btn-toolbar .page-title{float:left;line-height:34px}.btn-toolbar .page-title .text{font-size:14px;font-weight:700}.btn-toolbar .page-title .label{top:-2px;margin-right:10px}.btn-toolbar .divider+.page-title{margin-left:15px}.btn-active-line{position:relative;font-weight:700;color:#0c64eb}.btn-active-line:after{position:absolute;right:5px;bottom:1px;left:5px;display:block;content:' ';border-bottom:2px solid #0c64eb}.btn-active-line:hover{color:#0c64eb}.btn-active-text .text{position:relative;top:-1px;display:inline-block;font-weight:700;color:#0c64eb}.btn-active-text .text:after{position:absolute;bottom:-5px;display:block;width:100%;content:' ';border-bottom:2px solid #0c64eb}.angle-btn{position:relative;padding:1px;background:#fff;border:1px solid #cbd0db;border-right:none}.angle-btn:first-child{border-radius:2px 0 0 2px}.btn-toolbar>.angle-btn{margin-right:8px}.angle-btn:after,.angle-btn:before{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn:after{right:-7px;border-color:transparent transparent transparent #fff;border-radius:2px}.angle-btn .btn{padding:6px;font-weight:700;background:#fff;border:none;border-radius:4px!important}.angle-btn .btn.btn-limit{padding-right:16px}.angle-btn .btn.btn-limit>.caret{right:4px}.angle-btn+.angle-btn{border-left:none}.angle-btn+.angle-btn>.btn-group:first-child{padding-left:8px}.angle-btn+.angle-btn>.btn-group:first-child:after,.angle-btn+.angle-btn>.btn-group:first-child:before{position:absolute;top:-2px;left:0;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #cbd0db;border-style:solid;border-width:17px 0 17px 8px}.angle-btn+.angle-btn>.btn-group:first-child:after{left:-1px;border-color:transparent transparent transparent #fff;border-width:17px 0 17px 8px}.btn-toolbar>.angle-btn.active,.btn-toolbar>.angle-btn:last-child{border-color:#0c64eb}.btn-toolbar>.angle-btn.active .btn,.btn-toolbar>.angle-btn:last-child .btn{color:#0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn.active:before,.btn-toolbar>.angle-btn:last-child:after,.btn-toolbar>.angle-btn:last-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn.active:after,.btn-toolbar>.angle-btn:last-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:before,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before{border-color:transparent transparent transparent #0c64eb}.btn-toolbar>.angle-btn+.angle-btn:last-child>.btn-group:first-child:after,.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn,.btn-toolbar>.angle-btn.normal{border-color:#cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn .btn,.btn-toolbar>.angle-btn.normal .btn{color:#3c4353}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.active+.angle-btn:before,.btn-toolbar>.angle-btn.normal:after,.btn-toolbar>.angle-btn.normal:before{border-color:transparent transparent transparent #cbd0db}.btn-toolbar>.angle-btn.active+.angle-btn:after,.btn-toolbar>.angle-btn.normal:after{border-color:transparent transparent transparent #fff}.btn-toolbar>.angle-btn.active+.angle-btn>.btn-group:first-child:before,.btn-toolbar>.angle-btn.normal>.btn-group:first-child:before{border-color:transparent transparent transparent #cbd0db!important}.nav>li>.btn.btn-primary{color:#fff}.nav>li>.btn.btn-primary:focus,.nav>li>.btn.btn-primary:hover{background:rgba(12,100,235,.8)}.btn.btn-action,.c-actions .btn{display:inline-block;width:26px;padding:2px;overflow:hidden;line-height:20px;color:#16a8f8;background:0 0;border-color:transparent}.btn.btn-action>i,.c-actions .btn>i{position:relative;top:1px;font-size:18px}.btn.btn-action:hover,.c-actions .btn:hover{color:#0c64eb;background-color:#d3e5f7}.c-actions .btn+.btn{margin-left:-4px}.label{position:relative;display:inline-block;padding:3px 5px;font-size:12px;font-weight:400;vertical-align:middle;border-radius:2px}.label+.label{margin-left:4px}.label-pale{background:#bed8f3!important}.label-badge{border-radius:9px}.label-light{color:#3c4353;background-color:#ddd}.label-primary{background:#0c64eb!important}.label-gray{color:#878da0;background:#e8ebef}.label-outline.label-danger{color:#ff5d5d;background:#ffebee;border-color:rgba(255,93,93,.25)}.label-outline.label-light{color:#838a9d;background:#f2f5fb;border-color:#e1e5ee}.label-primary.label-outline{background:#e9f2fb!important;border-color:rgba(12,100,235,.25)}.label-outline.label-success{background:#e8f5e9;border-color:rgba(0,218,136,.25)}.label-outline.label-info{border-color:rgba(33,150,243,.25)}.label-outline.label-warning{border-color:rgba(255,152,0,.25)}.label-dot{position:relative;top:-1px;padding:0;border-radius:50%}.label-dot+.status-text{display:inline-block;margin-left:5px}.label-icon{min-width:18px;padding:0;line-height:18px;border-radius:10px}.label-id{display:inline-block;min-width:30px;padding:0 5px;font-size:12px;line-height:16px;color:#838a9d;text-align:center;vertical-align:middle;background-color:transparent;border:1px solid #838a9d;border-radius:2px}.pri-1,.todo-pri-1{color:#ff5d5d}[class*=" status-"],[class^=status-]{color:#3c4353}.status-changed,.status-delayed,.status-doing,.status-fail,.status-investigate{color:#ff5d5d}.status-changed>.label-dot,.status-delayed>.label-dot,.status-doing>.label-dot,.status-fail>.label-dot,.status-investigate>.label-dot{background-color:#ff5d5d}.status-wait{color:#838a9d}.status-wait>.label-dot{background-color:#7ec5ff}.status-unclosed{color:#838a9d}.status-unclosed>.label-dot{background-color:#0c64eb}.status-done,.status-normal,.status-pass,.status-resolved{color:#43a047}.status-done>.label-dot,.status-normal>.label-dot,.status-pass>.label-dot,.status-resolved>.label-dot{background-color:#00da88}.status-postpone{color:#838a9d}.status-postpone>.label-dot{background-color:#ff5d5d}.status-blocked{position:relative;left:-5px;display:inline-block;padding:0 5px;line-height:20px;color:#3c4353;background:0 0;border-radius:10px}.status-blocked>.label-dot{background-color:#ff9800}.status-pause,.status-suspended{color:#ff9800}.status-pause>.label-dot,.status-suspended>.label-dot{background-color:#ff9800}.status-active.status-bug,.status-draft{color:#8666b8}.status-active.status-bug>.label-dot,.status-draft>.label-dot{background-color:#8666b8}.status-closed,.status-terminate{color:#838a9d}.status-closed>.label-dot,.status-terminate>.label-dot{background-color:#838a9d}.status-cancel{color:#838a9d}.status-cancel>.label-dot{background-color:#cbd0db}.label-pri{display:inline-block;min-width:18px;max-width:100%;height:18px;padding:0 4px;overflow:hidden;font-size:12px;line-height:16px;color:#838a9d;text-align:center;text-overflow:clip;white-space:normal;vertical-align:middle;border:1px solid #838a9d;border-radius:10px}.label-selector>.label-pri,[class*=label-pri-]{color:#158af1;border-color:#2098ee}.label-pri-1,.label-selector>.label-pri[data-value="1"]{color:#d50000;border-color:#d50000}.label-pri-2,.label-selector>.label-pri[data-value="2"]{color:#ff9800;border-color:#ff9800}.label-pri-3,.label-selector>.label-pri[data-value="3"]{color:#2098ee;border-color:#2098ee}.label-pri-4,.label-selector>.label-pri[data-value="4"]{color:#009688;border-color:#009688}.label-pri-5,.label-selector>.label-pri[data-value="5"]{color:#838a9d;border-color:#838a9d}.label-pri-0,.label-selector>.label-pri.active[data-value="0"]{color:#d5d9df;border-color:#d5d9df}.label-severity{position:relative;display:inline-block;width:24px;height:20px;font-weight:bolder;text-align:center;vertical-align:middle}.label-severity:before{position:absolute;top:-3px;left:0;z-index:0;display:block;font-family:ZentaoIcon;font-size:14px;font-size:24px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;color:inherit;text-transform:none;content:"\e973";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.label-severity:after{position:absolute;top:7px;left:0;z-index:1;display:block;width:24px;font-size:12px;line-height:12px;text-align:center;content:attr(data-severity)}.label-severity[data-severity],.label-severity[data-value]{color:#ccc}.label-severity[data-severity="0"],.label-severity[data-value="0"]{color:#ccc}.label-severity[data-severity="1"],.label-severity[data-value="1"]{color:#c62828}.label-severity[data-severity="2"],.label-severity[data-value="2"]{color:#ff8f00}.label-severity[data-severity="3"],.label-severity[data-value="3"]{color:#fdd835}.label-severity[data-severity="4"],.label-severity[data-value="4"]{color:#cddc39}.label-severity[data-severity="5"],.label-severity[data-value="5"]{color:#8bc34a}.label-severity-custom[data-severity]{color:#d5d9df}.label-severity-custom[data-severity="1"]{color:#c62828}.label-severity-custom[data-severity="2"]{color:#ff8f00}.label-severity-custom[data-severity="3"]{color:#fdd835}.label-severity-custom[data-severity="4"]{color:#cddc39}.label-severity-custom[data-severity="5"]{color:#8bc34a}.label-selector{padding:0 10px}.label-selector>.label{display:inline-block;min-width:24px;height:24px;padding:0 5px;font-size:14px;line-height:20px;text-align:center;cursor:pointer;background:0 0;border:2px solid #d5d9df;border-radius:15px}.label-selector>.label+.label{margin-left:10px}.label-selector>.label.empty{border-color:transparent}.label-selector>.label.label-severity{font-size:12px;line-height:28px;border-color:transparent}.label-selector>.label.label-severity:before{top:-2px;left:-2px}.label-selector>.label.label-severity:after{display:none}.label-selector>.label.label-severity.active{background:0 0;filter:none;-webkit-filter:none}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{margin-top:2px}.ie .checkbox input[type=checkbox],.ie .checkbox-inline input[type=checkbox],.ie .radio input[type=radio],.ie .radio-inline input[type=radio]{margin-top:4px}.is-firefox .checkbox input[type=checkbox],.is-firefox .checkbox-inline input[type=checkbox],.is-firefox .radio input[type=radio],.is-firefox .radio-inline input[type=radio]{margin-top:3px}.checkbox-primary,.radio-primary{position:relative;display:block;vertical-align:middle}.checkbox-primary.inline-block,.radio-primary.inline-block{display:inline-block}.checkbox-primary.inline-block+.inline-block,.radio-primary.inline-block+.inline-block{margin-left:15px}.checkbox-primary>input,.radio-primary>input{position:absolute;top:0;left:0;z-index:3;width:100%;height:100%;margin:0;opacity:0}.checkbox-primary>label,.radio-primary>label{display:block;height:20px;padding-left:30px;margin:0;font-weight:400;line-height:20px;cursor:pointer}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{position:absolute;top:1px;right:0;left:0;display:block;width:18px;height:18px;line-height:18px;text-align:center;content:' ';border-radius:3px}.checkbox-primary>label:after,.radio-primary>label:after{z-index:1;border:2px solid #eee;border-color:rgba(0,0,0,.15);-webkit-transition:.4s cubic-bezier(.175,.885,.32,1);-o-transition:.4s cubic-bezier(.175,.885,.32,1);transition:.4s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:border,background-color;-o-transition-property:border,background-color;transition-property:border,background-color}.checkbox-primary>label:before,.radio-primary>label:before{top:3px;z-index:2;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-weight:900;font-variant:normal;line-height:1;text-transform:none;content:"\e5ca";opacity:0;-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:opacity,-webkit-transform;-o-transition-property:opacity,-o-transform;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform,-o-transform;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.checkbox-primary.checked>label:after,.checkbox-primary>input:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:#00da88;border-color:#00da88;border-width:4px}.checkbox-primary.checked>label:before,.checkbox-primary>input:checked+label:before,.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{color:#fff;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary input:indeterminate+label:before,.checkbox-primary.indeterminate>label:before,.radio-primary input:indeterminate+label:before,.radio-primary.indeterminate>label:before{top:9px;left:5px;width:8px;height:2px;content:' ';background-color:#a3a2bc;opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}.checkbox-primary.focus>label:after,.checkbox-primary>input:focus+label:after,.radio-primary.focus>label:after,.radio-primary>input:focus+label:after{border-color:#00da88;-webkit-box-shadow:0 0 0 3px rgba(0,218,136,.2);box-shadow:0 0 0 3px rgba(0,218,136,.2)}.checkbox-primary:hover>label:after,.radio-primary:hover>label:after{border-color:#00da88}.checkbox-primary.checkbox-right>label,.radio-primary.checkbox-right>label{padding:0 30px 0 0}.checkbox-primary.checkbox-right>label:after,.checkbox-primary.checkbox-right>label:before,.radio-primary.checkbox-right>label:after,.radio-primary.checkbox-right>label:before{right:0;left:auto}.checkbox-primary input:disabled+label:after,.checkbox-primary.disabled>label:after,.radio-primary input:disabled+label:after,.radio-primary.disabled>label:after{background-color:#e5e5e5!important;border-color:#bbb!important}.checkbox-primary input:disabled:checked+label:after,.checkbox-primary.checked.disabled>label:after,.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:#bbb!important}.radio-primary>label:after{border-radius:50%}.radio-primary>label:before{top:7px;left:6px;width:6px;height:6px;content:' ';border:none;border-radius:50%}.radio-primary.checked>label:after,.radio-primary>input:checked+label:after{background-color:transparent;border-color:#00da88;border-width:2px}.radio-primary.checked>label:before,.radio-primary>input:checked+label:before{background-color:#00da88}.radio-primary input:disabled:checked+label:after,.radio-primary.checked.disabled>label:after{background-color:transparent;border-color:#bbb}.radio-primary input:disabled:checked+label:before,.radio-primary.checked.disabled>label:before{background-color:#bbb}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li>a{position:relative;border:none!important;border-radius:2px!important}.nav-tabs>li.active>a{font-weight:700;color:#3c4353!important}.nav-tabs>li.active>a:before{position:absolute;right:0;bottom:-1px;left:0;display:block;height:2px;content:' ';background:#0c64eb}.nav-tabs-primary>li.active>a{color:#0c64eb!important}.panel{position:relative;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.panel-body{padding:20px}.panel-body.has-table{padding:10px}.panel-body.has-table .table{margin-bottom:0;table-layout:fixed}.panel-heading{padding:12px 48px 12px 20px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading+.panel-body{padding-top:0}.panel-title{font-size:14px;font-weight:700;line-height:20px}.panel-title .label{top:-1px}.panel-actions{position:absolute;top:0;right:0;padding:7px 8px}.panel:hover .panel-actions{z-index:10}.panel-actions>li>a{display:inline-block;min-width:30px;padding:0 5px;line-height:30px;color:#a6aab8;text-align:center;border-radius:4px}.panel-actions>li>a:hover{color:#3c495c;text-decoration:initial;background-color:#f1f1f1}.panel-actions .btn-icon{color:#a6aab8}.panel-actions .btn.text-primary{color:#0c64eb}.panel .empty-tip{padding:30px 10px 50px;font-size:14px;color:#838a9d;text-align:center}.progress-text-left{position:relative;margin:7px 0;margin-left:35px;overflow:visible}.progress-text-left .progress-text{position:absolute;top:-7px;left:-35px;display:block;width:35px;height:20px;padding-right:5px;line-height:20px;color:#838a9d;text-align:right}.chart-color{width:20px}.chart-color-dot{display:inline-block;width:10px;height:10px;border-radius:50%}.chart-row{margin-top:10px}.chart-row+.chart-row{padding-top:10px;border-top:1px solid #eee}.chart-wrapper{padding:10px 5px;background:#eee}.chart-wrapper>h4{margin:5px 0 10px}.table-wrapper{max-height:250px;overflow:auto}.table-wrapper .table{margin:0}.progress-pie{position:relative}.progress-pie canvas{display:block}.progress-pie .progress-info{position:absolute;top:0;left:0;width:100%;height:100%;padding-top:25px;text-align:center}.progress-pie .progress-info>small{display:block;line-height:14px;color:#a6aab8}.progress-pie .progress-info>strong{display:block;font-size:36px;line-height:40px}.progress-pie .progress-info>strong>small{font-size:20px}.progress-pie-120 .progress-info{padding-top:30px}.progress-pie-120 .progress-info>small{line-height:18px}.progress-pie-50 .progress-info{padding-top:4px}.progress-pie-50 .progress-info>strong{font-size:20px;font-weight:400}.progress-pie-50 .progress-info>strong>small{font-size:14px}.progress-pie[data-value="100"] .progress-info>strong{-webkit-transform:scale(.7);-ms-transform:scale(.7);-o-transform:scale(.7);transform:scale(.7)}.progress-pie-24 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:24px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-24[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.progress-pie-26 .progress-info{right:-10px;left:-10px;width:auto;padding-top:0;font-size:12px;line-height:26px;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.progress-pie-26[data-value="100"] .progress-info{-webkit-transform:scale(.8,1);-ms-transform:scale(.8,1);-o-transform:scale(.8,1);transform:scale(.8,1)}.status-bars{display:table;width:100%;height:140px;padding:5px;padding-top:50px;margin:0;overflow:hidden}.status-bars>li{position:relative;display:table-cell;text-align:center;vertical-align:bottom}.status-bars .bar{position:absolute;bottom:20px;left:50%;display:block;width:10px;margin-left:-5px;background:#0c64eb;border-radius:5px 5px 0 0}.status-bars .bar:after{position:absolute;right:-50px;bottom:0;left:-50px;display:block;height:1px;content:' ';background:#eee}.status-bars .title{font-size:12px;font-weight:400;color:#a6a8b6}.status-bars .value{position:relative;top:-20px;left:-20px;display:inline-block;width:50px;font-size:16px;font-weight:700;text-align:center}.status-bars-h{display:block;padding-right:50px;padding-left:60px;list-style:none}.status-bars-h>li{position:relative;height:40px;border-left:1px solid #eee}.status-bars-h .bar{position:relative;top:15px;display:block;height:10px;line-height:20px;background:#0c64eb;border-radius:0 5px 5px 0}.status-bars-h .title{position:absolute;top:-5px;left:-60px;width:60px;padding-right:10px;font-size:12px;color:#a6a8b6;text-align:right}.status-bars-h .value{position:absolute;top:-5px;right:-50px;display:block;width:40px;font-size:14px;font-weight:700;text-align:left;white-space:nowrap}.ring,[class*=" ring-"],[class^=ring-]{width:24px;height:24px;font-size:12px;line-height:24px;text-align:center;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAACZAAAAAwCAMAAACyyT3hAAAAP1BMVEUAAAAAAAA5rm06sG87snE4q200o2o7sG86r244q2w6r244rWw7snA7sG86rG05rm07snA5qWw7sW86sG48s3ECZypFAAAAFHRSTlMACl2b8TkPtnsqj0fVv4Zt4RrIqxUkbyYAAA1gSURBVHja7NrbbtswEIRhmyJ1IiVS0v/+z9rCbeGkdZodNEnVdHmTxP4wmF1exLB9eXCu12tqLX39cTGcm78use2z5Msx19wLfunGpOZvSv4xh/798tt+dKPSZ+jGMNn9/pWnXp1X7f9e+ynf53Xv3r37j/bLyfq4/1u+n8T8VI8jLWY/hbEbSjT76+2ssH77zeyBJHooom9dkHzssuQ5wvau+YuWz141/87zMoTewP9kP+7d2/31ZPln82e7L/fuP9LnJPk+DDDb/TQvEaDc/1//vk9Yvrl7vmHa+ztk347BXwcA1UMRPXCIfq+b5Jm3d82PneY5guSHG1fmVfu/837m5N69e/fu3T89fRZ9bRTBpyMCLFa/zfG7CU98l1/M/+EBS/59PT//bfD9lCS/pbAeR7bnb1OqC7AI+QWAkiz5Kdd1B6BVLb8Fk891Poox/7bPUNcIwGHrM3YDAHu1zyv0yWHcjfNen++nWvsvANC5d6/468nyz+bPdl/u3es+NFbFjw1A8BGAPUv5xGFMz/382HcAsNy+W9Sb9/PwwbP4ra5J8WluQDb7qQ4Ayybl05nnrQVgSFafB4AyWfvPEaBT57X2Seu3ecX9HBfN75t79+7du/+sPnVBy++A1e6nHaAEsz9ufk7W/gUgrvmBP/pf/bYDtDlp+/x8j4du1XwBFsHvQMlW348NIJjz0yH5bbz1n7R5m71/bUAL2n5iMueHAYjZvXv37t1/Tp8bJMFPDYhCfgTa2Ft9aEDJ5vzUbvnbC3562GcI5j6vf3T43/h+hlnJnwFGs99WgGDPv/lq9yPQsjCv1mcT/aUDGEVf3bt37979v+DH1kk+RIiCrwCz0AeI82bvc8vvzT5HYP1NfnjQv3uL/d+f/X/8ljUfGiD4ChDsPkcgCX0iUMX8UfDDw/6Xl+fV+q8Awb373/rLyfLP5s92X+4/rQ8QFV+BmO0+AyTND0nqT1H6xFf715/zWe35l5fXf3/e/YtnGugUnxsQhD47sNl9Klp+ipq/DmL/ovXPAJN79+7du/9on5dV80An+BEoye4nYLhofu/tPgAtafO26RWfn/chv9F93YX7N/PTDoOSHzW/LVA2Ib9Am+y+34Es5DdYlHmB2Lt37969+4/1fYQs+KlB6e0+Acsm9CnQXTQfJ61PTMI+dyiv99me7pO3u6+7cf9mvj/Ikgc6xRfNXyIcgt8KLIoX+0/A4d69e/fu/8znoPkOBsH3O8Qk5C8wiH12xR9AFvwAUfEzREOf/Wmf6Q3v967cv52fNJ+BIPgg+gmogk/xmb9a+lex/+ze/WN/PVn+2fzZ7sv93/MVVsUHIAn+AKrgV4hK/gxsYv+q7Ycg+AxMFt/d+9vy/QXZP+RHCIrvoGyCr9B6wa/QNq3/ftHyye7df2HP3pbQBKIgihqGmzKA4P7/b02lTOX2EncSEky1z8uungPosYyPj/8Nv8Mk/HaHm/Adzk/AIvy1hUb4vkKR5y0yf33Nd+K89vo+Xfy/81Oj/FahmPwBRuH7CjeTX6GRfUp8fHx8/Fc/UpRvoBpf4L4ZL/MfsLvzUoxfgM6e1/V5vNjn9jl/eLV/FrL/2DcwS1+lZxN+9X3a+Pj4+Pgvvm9B5Q8wyvxV+K11+VdgMv2r810LRZ63MX1m6IwX+ep+eMr49/HL3ChfoTF+eD65r/q+wiTy+zus8fHf+8vJ8s/mz3a94n/im075FarxE7Sby2975+8mf5T9G9gvLp/O9Jf5nfHNcz6vzzMLWfyX1wiz8Ss8ZP5g/A32+Pj4+P/XP0D5GRbjC9xkfjF+l/lV9h9gtP2PnOfN9JntfMQPsCeN/3/9dmc2/gqtym+d74BrfHx8/P/q+xaM34CryZf+CnTCT9Ca/A7YnG+N71V/P89La/r7eZ5pIYj/x35aNuUH6IzfpZ+hiY+Pj38X35dF+Ql241eoxncwGD/K/EbmL8r7/En2X+X8J99/dveb+4L/EB//zX+Wo/EFVunH+Pj4+HfxI0zG3+BmfIHF+AaKzB/VeU+Wv8BwZJ/14P56IbvEx39+bdDIBa4YP8bHx8e/kS/QGb/DZPwDVuMXGGV+Y3yR+QM+X/py5HlvB/e3C1l8/Fe/TYZfJtjNGxoY4uN/8JeT5Z/Nn+16vbVf7kX5Ga7GV+iM32Ey/gHNkfnDyfJnWA+d58H9L+aB/4Tj43/Vb4DxHdT4+Pj4f+WhVb7CZnwrfYWr8Tt0xt9lfj1ZfoVJedvn4P5ZyOL/nn+wGN9DGx8fH/+vPKB8630f/0f9drI+ymchiz+vB5Q/4Qd6fHz8efxCycIU/5G9e9lRHAaAKEr7kZi8nIT7/986UlatWaWGCbjpYn1UKizAQU7sZr0vyOzb9QkUv8Ek+qT4u77ksYv5q5g/tZQv91F9g0ta9j/Loy8RZnv7795LlvYf4b/U/JgWccLur/xBH2EXfbw4v28pP8B8cZ9HgzfR27/Tj9utpZvK7e2f8W09tWdv/8S+aBmi4OWnPis8FF+gKD7o+VHM78X8QfGD3uch+qG1bQ7s3+sDbIqPUEVf7O2/+5a2vWhqHyx7+++vUbwAGsQJfhEnjAhB8UXPLy3l97BcOgF7Y2H7v3yBeuVGqcXe/oW+qaN77O2f8jF2it9hVPwE9eKjpYqYH0S/XJk/ieM5i+P5gLG1o3Ls/7PfllE9Gkj0u3r0jb39q3xbE6q9/Qs9pE7wd+BKn4FNyU8wCn4DsuKT5vPF49Phw+k/389Mm+IT3DWf5MOh7e1f5G/n1ywPaW//MR4eil9EP0AU83sxf1d8Ub3YJ4q+iONZYRDHZ7b/aX6GovgIVfG9kr8ffYbz+fb2z/nbTZnw7O2f8V9N9clV8hMEwW8JRsF3q5i/QlX676rX+mSgqPmKnyGr42n/dh/mRfEjTIoP0Kv53Vlfj/z1tA/29s/5039hDmdv/2s9pE7wBXolv+r5aRP8CIh+UvpHSFnwQXy/GeabmG//fj9DUPyk+Q0IYp+q+ATB3v4lvqkJz96+ZR+pip8gCH5bIUr5ot/hofgIRfAZWK58vzMUxfcw2F/hQ1D8ANMm+Aq9mt8JPsB0Mj8e+UIfe/vn/Olv5KHs7e3P+QC74gdY75onC34BRsFXSEqfCFOn+XUT/KDnk+0v8AGK4LcJouC7FQYlf4VF6b9DEb4vmfP97X+HX859fvT843Vq880D2dv/o7811udyv0AV/IjmK/AQfE6wKB4YxD5B8AGoYp9R8AsQ7f+0a287bsJQFIapTxxssA3/+z9rJVS1VVOmezeDOp1s7mI+LS1bxJZChH7WeAdkpXcKX4Gs8yHqPFXyfC4/jspNlG/+VbyTPD/6/G+X9EAyb9681Dun8SMcCh8D7Enu0wirpk/T+QyMGh90fgiwKPvs5oU+45PCH4DGeyjK/KDpv0Lpyv7z237mp+/jDmRBvvnX8YLn5y/yxd/gU5g3b/4enyF0uU8FWpT7vgIKf56JSe5jgNY1XtlnV+5XQOjmhf6AfVb4AkGR3wuMXe7nBrsiPwN7evf+3xN7AAR9zJt/yst3uPO+efPmb/LbmhXeAwofCzAp8kcgyn0qyj4NcHLflfkzr+494yz3DmhZ7mdgH3T5JSp91/lxeL/+GWC++HyZb/6lfL72+Yl80d8OztvmzYv8I/9gff5/H6DKfQ6ofARwCj+i61MAp+sfstw7gPrZfO4KDzQn9w5A4TMQZrmvQFDkT0DIuv5j1Hku87eH1aiC9TH/Yn678tsT+Vdn5uM98+bNfxDvwyT3KUBwcr/o9oe+BJVPZ76T529AyBf+8jz9bH6BJYn9BLDI8x3A1nX5VZ6fGzAp+yxJ6ZX9t+ufn6m/W5+3+pt/Oe+vnx99/tWxYOM2buOfanyGluU+AHuX+jQ1IERxfi5Ac1Lfz/wmzk9uBML8P/jNO7lfgSL3sQC73DuANiWpzwA+i/Pns//UxflNN1/XgFaTuE8D1sv8/OADMLrLfPPmn/JXO/qX3w+aN2/+P/X1iHK/AZM43xWAsQt9XE5/zEKftwBQoji/nfnpH/m41S72GQg+Cn1aAcZpluYvqPLjCFCqdL59B1jFfvAAYZH2j8r5dq+b77Bd+70/8nQAtOX3+ebNP+Wvd9zz+vWjefNaP3ywPuZFfqNluQcIm9DnndNPIh+nMQDQJL5HN/kVAJY/+TinJPX5OCYXhX4F1hrnPgh8LAAUaX5tnH6rWdTfNXX+yZeaRd4DELaaZetZdwBGf/N8Jyfz+Wp9/Buv8mF97G/e/JP+egt6vAbz5s2/is9J4QthEvsVIBxR5F2A0y9d4Avwzfv8Jw8g9gXk/gDkvtdd5xfuzfdB5d2Iyg9uvHe+PrzD+izxyueLfPPmn/OaLXoYzJv/az98sD7m39XHrPAe1pqEfgUI6zJL/AYAsNc/94mA3O+g8M43lc8+aPxcR+7M73VH5aei7cOd8011fW59Vve2f1wf8+bv84+vmsybN2/+Xfzc5b4fR43i/DWU0U9uFvlpb0HsU578WOR+iJNfFb4r85Nbjjvz58kfe1N4p+wf3Xbsyvmq+9+4Ps68+dv8V5yOdlOUBd3vAAAAAElFTkSuQmCC);background-position:0 0;-webkit-background-size:1224px 24px;background-size:1224px 24px}.ring>span,[class*=" ring-"]>span,[class^=ring-]>span{display:inline-block;-webkit-transform:scale(.9,1);-ms-transform:scale(.9,1);-o-transform:scale(.9,1);transform:scale(.9,1)}.messager{border-radius:4px;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.2),0 2px 8px rgba(0,0,0,.1)}.messager-icon{vertical-align:middle}.messager-icon>.icon{font-size:24px}.messager-content{padding:18px 20px;font-size:18px;line-height:30px}.messager-content>.icon{font-size:28px;line-height:30px}.messager-actions{vertical-align:middle}.messagger-zt{color:#3c4353;background-color:#fff!important}.messagger-zt .messager-icon>.icon{color:#0c64eb}.messagger-zt .messager-actions>.action{color:#838a9d}.messagger-zt.messager-success .messager-icon>.icon{color:#00da88}.messagger-zt.messager-danger .messager-icon>.icon{color:#ff5d5d}.messagger-zt.messager-warning .messager-icon>.icon{color:#ff9800}.messagger-zt.messager-info .messager-icon>.icon{color:#2196f3}.tree{padding-left:0;overflow:hidden}.tree ul{position:relative;display:none;padding-left:0}.tree li{position:relative;padding:2px 0 2px 15px;list-style:none}.tree li.heading{padding-left:5px;color:#3c495c}.tree li>a{display:block;max-width:90%;padding:2px 6px;color:#3c495c;word-break:break-all}.tree li>a:hover{color:#3c4353}.tree li>a.tree-toggle:hover{background:0 0}.tree li.active>a{position:relative;font-weight:700;color:#0c64eb}.tree li>.list-toggle{position:absolute;top:1px;left:1px;z-index:10;width:20px;font-size:14px;line-height:22px;color:#cbd0db;text-align:center;cursor:pointer;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.tree li>.list-toggle:before{content:"\f0da"}.tree li>.list-toggle:active,.tree li>.list-toggle:hover{color:#0c64eb}.tree li.has-active-item>.list-toggle{color:#3c4353}.tree li.has-list.open>ul{display:block}.tree li.has-list.open>.list-toggle{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.tree li.has-list.open:before{position:absolute;top:16px;bottom:-5px;left:10px;display:block;content:' ';border-left:1px solid #d8d8d8}.tree-actions{display:inline-block;margin-left:5px;vertical-align:middle}.tree-actions a{display:inline-block;margin-left:5px;font-size:13px;opacity:.6}.tree-actions a:hover{opacity:1}.tree li>.module-name{color:#3c495c;vertical-align:middle}.tree li>.module-name:hover{background-color:#f0f2f5}.tree li>.module-name:hover>a{color:#3c4353}.treemap-node-fold-icon:before{position:relative;left:-4px;min-width:18px}.dropdown-menu{padding:5px 0;border-color:rgba(0,0,0,.1)}.dropdown-menu>li{padding:0 10px}.dropdown-menu>li>a{padding:2px 10px;margin:5px 0;border-radius:3px}.dropdown-menu>li>a>.icon{position:relative;left:-5px;opacity:.5}.dropdown-menu>li>a:hover>.icon{opacity:.8}.dropdown-menu>li.active>a,.dropdown-menu>li.selected>a{position:relative;color:#fff;background-color:#16a8f8}.dropdown-menu>li.selected>a:after{position:absolute;top:2px;right:4px;display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:20px;text-transform:none;content:"\e5ca";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>li.divider{margin:10px}.dropdown-submenu>a:after{margin-right:-5px}.dropdown-submenu>.dropdown-menu.pull-left{margin-left:-1px}.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#3c4353;background-color:#e9f2fb}.dropdown-submenu:hover>a:after{border-left-color:#0c64eb}.dropdown-submenu>a:hover:after{border-left-color:#fff}.pager .btn{padding:3px 10px}.pager .btn .caret{opacity:.7}.pager>li>.pager-label{padding:2px;line-height:20px}.pager>li>.pager-item{min-width:20px;padding:1px;margin:2px 0;font-size:16px;line-height:20px;text-align:center;background:0 0;border-color:transparent}.pager>li>.pager-item:hover{background-color:rgba(0,0,0,.1)}.pager>li>.pager-item>.icon{position:relative;top:-1px}.pager>li>.btn:hover,.pager>li>a:hover{background:rgba(0,0,0,.1)}.pager>li.disabled>a.pager-item{background:0 0;border-color:transparent;opacity:.5}.pager>li.active>a{background-color:#16a8f8}.pager>li .btn-group .btn{padding:1px;margin:1px 0;border-radius:4px}.pager .dropdown-menu{width:200px}.pager .dropdown-menu>li{float:left;width:33.333333%}.modal-dialog{width:900px;max-width:1360px;border:none;border-radius:0;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,.25);box-shadow:0 0 20px 0 rgba(0,0,0,.25)}.modal-dialog.modal-md{width:700px}.modal-dialog.modal-xs{width:400px}.modal-dialog.modal-sm{width:500px}.modal-dialog.modal-lg{width:1200px}.modal-dialog.modal-fullscreen{position:fixed;max-width:initial}.modal-header{padding:20px 0;margin:0 20px}.modal-header>.close{color:#838a9d;text-shadow:0 1px 0 rgba(255,255,255,.85);opacity:1}.modal-header>.close:hover{color:#222}.modal-footer{padding:20px 0;margin:0 20px}.modal-title{font-size:14px;font-weight:400;line-height:20px}.modal-actions{position:absolute;top:16px;right:16px}.modal-actions .divider{position:relative;top:5px;display:inline-block;width:0;height:20px;margin:0 10px;border-left:#eee 1px solid}.modal-actions>.dropdown{display:inline-block}.modal-body{padding:20px}.modal-iframe .modal-body>iframe{border-radius:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-3%);-ms-transform:translate(0,-3%);-o-transform:translate(0,-3%);transform:translate(0,-3%)}.modal.fade.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-simple .modal-footer{padding-top:0;border-top:none}.modal-iframe .modal-header{position:relative;z-index:10;min-height:0;padding:0;border:none}.modal-iframe .modal-title{display:none}.modal-iframe .modal-header .close{position:absolute;top:12px;right:10px;font-size:32px;font-weight:200}.modal-iframe .modal-dialog{overflow:hidden}.modal-inverse .modal-header>.close{color:rgba(255,255,255,.7);text-shadow:none}.modal-inverse .modal-header>.close:hover{color:#fff}.modal-scroll-inside>.modal-dialog{max-height:100%}.hide-modal-close .modal-iframe .modal-header .close{display:none}.tile{text-align:center}.tile-title{line-height:20px;color:#3c495c}.tile-amount{font-size:32px;font-weight:700;line-height:56px}.timeline>li{position:relative;list-style:none}.timeline>li:before,.timeline>li>a:after,.timeline>li>div:after{position:absolute;left:-20px;display:block;width:15px;height:15px;content:' ';border-radius:50%}.timeline>li:before{top:12px;left:-16px;z-index:3;width:7px;height:7px;background-color:#cbd0db;border:none;border:1px solid #cbd0db}.timeline>li>a:after,.timeline>li>div:after{top:11px;left:-17px;z-index:3;width:9px;height:9px;background-color:#0c64eb;border-radius:50%;opacity:0}.timeline>li+li:after{position:absolute;top:-12px;bottom:20px;left:-13px;z-index:1;display:block;content:' ';border-left:1px solid #eee}.timeline>li.active>a:after,.timeline>li.active>div:after{opacity:1}.timeline>li.active:before{top:8px;left:-20px;width:15px;height:15px;background-color:rgba(12,100,235,.2);border:none}.timeline>li>a,.timeline>li>div{display:block;padding:5px;line-height:20px}.timeline>li.active>a{color:#3c4353}.timeline-tag{position:absolute;top:5px;left:-115px;font-size:12px}.timeline-tag-left{padding-left:115px}.timeline-sm{font-size:12px}.timeline-sm>li:before,.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:10px;left:-20px;width:11px;height:11px}.timeline-sm>li.active:before,.timeline-sm>li:before{top:10px;left:-18px;width:11px;height:11px;background:0 0;border:1px solid #eee}.timeline-sm>li>a,.timeline-sm>li>div{line-height:20px}.timeline-sm>li>a:after,.timeline-sm>li>div:after{top:13px;left:-15px;width:5px;height:5px}.form-control{-webkit-box-shadow:none;box-shadow:none}.form-horizontal .form-group>label{padding-right:0}.form-actions{margin-top:20px;margin-bottom:0}.form-actions .btn{margin-right:10px}form label{font-weight:400;color:#3c495c}.form-group .btn+.btn{margin-left:5px}.table-form{margin-bottom:0;table-layout:fixed}.table-form>thead>tr>th.required:after{position:relative;top:3px;right:auto;left:4px;display:inline-block;vertical-align:middle}.table-form>tbody>tr>td,.table-form>tbody>tr>th,.table-form>tfoot>tr>td,.table-form>thead>tr>th{padding:7px;vertical-align:middle;border-bottom:none}.table-form>tfoot>tr>td{padding:20px 7px 10px}.table-form>tbody>tr>th{width:100px;font-weight:700;text-align:right}.table-form .input-group{width:100%}.chosen-container-single .chosen-single{position:relative}.chosen-container-single .chosen-single>span{height:20px;line-height:20px;word-break:break-all;white-space:normal}.chosen-container-single .chosen-single div b{position:relative;top:1px;color:#cbd0db;opacity:1}.chosen-container-single .chosen-search:before{top:8px;right:15px}.chosen-container-multi .chosen-choices li.search-choice{font-size:13px;background:#eee;border-color:#cbd0db;-webkit-box-shadow:none;box-shadow:none}.chosen-container-single .chosen-search input[type=text]{height:30px;padding:3px 25px 3px 5px}.chosen-container-single .chosen-search{padding:3px 10px 0}.chosen-container-single .chosen-single{overflow:visible}.chosen-container .chosen-results{max-height:245px;padding:10px}.chosen-container .chosen-results>li{border-radius:4px}.chosen-container .chosen-results li.highlighted em{color:#fff}.table-responsive .chosen-container .chosen-results{max-height:200px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search{top:-2px;right:-1px;bottom:-1px;left:-1px;display:none;height:auto;padding:0;opacity:0}.chosen-compact.chosen-container-single .chosen-single>.chosen-search>input{height:31px;padding:5px 26px 5px 8px;font-size:inherit;line-height:20px}.chosen-compact.chosen-container-single .chosen-single>.chosen-search:before{right:8px}.datetimepicker{padding:10px}.datetimepicker td.day.today{background-color:#f77}.datetimepicker td.day.active{background-color:#16a8f8}.datetimepicker tfoot th,.datetimepicker thead th{color:#838a9d}.input-control .colorpicker{top:0;z-index:auto;opacity:1}.input-control .colorpicker .btn{padding:5px}.input-control .input-control-icon-right.btn{top:0}.colorpicker .dropdown-menu{min-width:232px;padding:5px 10px 10px 10px}.colorpicker .dropdown-menu>li{display:block;float:left;padding:5px}.colorpicker .dropdown-menu>li.heading{width:100%;margin-bottom:5px;font-size:16px;font-weight:700;text-align:left}.colorpicker .dropdown-menu>li.heading>.icon-close{position:relative;top:4px;float:right;cursor:pointer;opacity:.6}.colorpicker .dropdown-menu>li>a{position:relative;display:block;width:100%;height:100%;padding:0;margin:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-align:center;text-transform:none;border:1px solid transparent;border-radius:50%;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.colorpicker .dropdown-menu>li>a:before{position:absolute;top:0;display:block;width:100%;height:20px;line-height:18px}.colorpicker .dropdown-menu>li>a:hover{-webkit-box-shadow:0 1px 4px rgba(0,0,0,.25);box-shadow:0 1px 4px rgba(0,0,0,.25)}.colorpicker .dropdown-menu>li>a.active:before{font-size:14px;content:"\e5ca"}.colorpicker .dropdown-menu>li>a.empty{color:#666;background:#fff}.colorpicker .dropdown-menu>li>a.empty:before{content:"\e90d"}.colorpicker .btn{position:relative}.colorpicker .btn .color-bar{position:absolute;right:5px;bottom:3px;left:5px;height:3px}.colorpicker .btn .color-bar[style*='background: ']+.ic{position:relative;top:-2px}.colorpicker .btn .ic{color:#cbd0db}.colorpicker .btn:hover .ic{color:#838a9d}.input-group .colorpicker{z-index:3}.input-group .chosen-container{display:table-cell}.input-group-addon{border-right-width:0;border-left-width:0}.input-group-addon:first-child{border-left-width:1px}.input-group-addon:last-child{border-right-width:1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin:0}.input-group-cell{display:table-cell;width:1%;padding:0 12px;white-space:nowrap;vertical-align:middle}.ke-container{border-color:#dcdcdc!important;border-radius:2px!important}.ke-container.focus{border-color:#0c64eb!important}.ke-toolbar{border-color:#dcdcdc!important}.required:after{top:6px;right:-10px;font-size:20px}td.required:after{top:12px;right:-5px}.input-group>.chosen-container.required:after,.input-group>.input-control.required:after{top:1px;right:1px;z-index:2}.input-group.required .required:after{display:none}.file-input{position:relative;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.file-input .input-group{width:auto}.file-input .input-group>.input-group-cell:first-child{padding-right:0;padding-left:7px}.file-input input[type=file]{position:absolute;width:0;height:0;opacity:0}.file-input .file-title{display:inline-block;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.file-input .file-editbox{min-width:200px;max-width:100%}.file-input .file-size{display:inline-block;vertical-align:middle}.edit .file-input-empty,.file-input-edit,.file-input-normal,.normal .file-input-empty{display:none}.edit .file-input-edit,.normal .file-input-normal{display:block}.edit .file-input-edit.input-group,.normal .file-input-normal.input-group{display:table}.edit .file-input-normal{display:none!important}.file-input-normal>.input-group-btn{width:auto}.input-group .chosen-container-active .chosen-choices{border-color:#0c64eb!important}.input-group .chosen-container{min-width:100px}.input-group .input-group-btn .btn>.icon{line-height:17px}.os-mac select.form-control{-webkit-appearance:none;background-image:url(data:image/gif;base64,R0lGODlhCQAFAIAAAMvQ2////yH5BAEAAAEALAAAAAAJAAUAAAIKhH+BGYoNGWxgFgA7);background-image:url(data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==);background-repeat:no-repeat;background-position:right 5px top 12px;-moz-appearance:none}input::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none!important;pointer-events:none;visibility:hidden}.chosen-choices.has-error,.chosen-single.has-error,.form-control.has-error{border-color:#ff5d5d!important;-webkit-box-shadow:0 0 6px #ffc3c3!important;box-shadow:0 0 6px #ffc3c3!important}.popover-success.popover-form-result{font-weight:700;color:#fff;background:#00da88}.popover-success.popover-form-result.popover.right .arrow:after{border-right-color:#00da88}.form-unsaved{outline:2px solid #ff9800;-webkit-box-shadow:0 1px 12px #ff9800;box-shadow:0 1px 12px #ff9800;-webkit-transition:all .5s;-o-transition:all .5s;transition:all .5s}.picker-selection-remove:before{font-size:18px}.picker-user-option{position:relative;padding-left:40px}.picker-user-option>.avatar{position:absolute;top:5px;left:10px}.picker-user-option>.picker-option-text{display:inline-block;min-width:40px;font-weight:700}.picker-user-option>.dept-name,.picker-user-option>.role-name{display:inline-block;margin-left:10px;font-size:12px;opacity:.6}.picker-user-option>.dept-name{min-width:50px}#mainHeader{height:50px;color:#fff;background:#1183fb -webkit-gradient(linear,right top,left top,from(#0a48d1),to(#1183fb));background:#1183fb -webkit-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:#1183fb -o-linear-gradient(right,#0a48d1 0,#1183fb 100%);background:#1183fb linear-gradient(-90deg,#0a48d1 0,#1183fb 100%);background-color:#1183fb;border-top-color:#0c64eb;border-bottom-color:#e9f2fb}#mainHeader>.container{min-width:1200px;padding:0}#heading{position:absolute;top:10px;left:20px}@media (min-width:1400px){#heading{left:40px}}#heading h1{float:left;max-width:250px;margin:0;overflow:hidden;font-size:20px;font-weight:400;line-height:30px;text-overflow:ellipsis;white-space:nowrap}#heading h1 a{color:inherit;text-decoration:inherit}#heading h1.long-name{position:relative;top:-5px;display:table-cell;font-size:16px;line-height:20px;word-break:break-all;white-space:normal}#heading>.btn{display:block;float:left;height:20px;padding:1px 5px;margin:0;margin:5px 0 0 10px;font-size:12px;font-weight:lighter;line-height:18px;background-color:rgba(255,255,255,.2);border:none}#heading>.btn:hover{background-color:rgba(0,0,0,.1)}#navbar{margin:0 auto;text-align:center}#navbar .nav{display:inline-block}#navbar .nav>li>a{padding:10px;line-height:30px;color:#fff;border-radius:0;opacity:.9}@media (max-width:1400px){#navbar .nav>li>a{padding:10px 8px}}#navbar .nav>li>a:focus,#navbar .nav>li>a:hover{background:rgba(0,0,0,.15);opacity:1}#navbar .nav>li.active>a{font-weight:700;background:rgba(0,0,0,.1);opacity:1}#navbar .nav>li.divider{display:block;width:2px;height:20px;margin:15px 8px;background:rgba(255,255,255,.4)}@media (max-width:1400px){#navbar .nav>li.divider{margin:15px 5px}}@media (max-width:1300px){#navbar .nav>li.divider{margin:15px 3px}}#navbar .nav>li.divider:last-child{display:none}#navbar .nav .dropdown-menu li>a{text-align:left}#toolbar{position:absolute;top:12px;right:20px;font-size:12px;color:#fff}@media (min-width:1400px){#toolbar{right:40px}}#extraNav{text-align:right}#extraNav>li{display:inline-block;float:none;text-align:left}#extraNav>li>a{display:block;padding:0;color:#fff;opacity:.75}#extraNav>li>a:hover{text-decoration:unset;background-color:rgba(0,0,0,.1);opacity:1}#extraNav>li.open>a{background-color:rgba(0,0,0,.1)}#extraNav>li+li{margin-left:10px}#showSearchGo{color:#fff;background:rgba(255,255,255,.1);border:1px solid rgba(255,255,255,.5)}#searchbox{position:relative;float:left;width:150px}#searchbox .input-group-btn .btn{position:relative;padding:1px 4px;font-size:12px;line-height:20px;color:#fff;background-color:rgba(255,255,255,.15);border-right:none;border-radius:2px}#searchbox .input-group-btn .btn:after{position:absolute;top:3px;right:0;bottom:3px;display:block;width:1px;content:' ';background-color:rgba(255,255,255,.15)}#searchbox .input-group-btn .btn:hover{background-color:rgba(255,255,255,.25)}#searchGo{position:absolute;top:0;right:-1px;z-index:9;min-width:24px;height:24px;padding:2px 3px;font-size:12px;line-height:20px;color:#fff;background-color:#16a8f8;border-radius:2px}#searchGo:hover{color:#fff!important;background-color:#0c64eb}#searchInput{height:24px;padding:2px 30px 2px 5px;color:#fff;text-align:left;background:rgba(255,255,255,.15);border-color:transparent;border-radius:0 12px 12px 0;-webkit-transition:background .2s,border .2s;-o-transition:background .2s,border .2s;transition:background .2s,border .2s}#searchInput:hover{background:rgba(255,255,255,.25)}#searchInput:focus{color:#333;background:#fff}#searchInput::-webkit-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::-moz-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:-ms-input-placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput::placeholder{font-size:12px;color:#fff;color:rgba(255,255,255,.5)}#searchInput:focus::-webkit-input-placeholder{color:#838a9d}#searchInput:focus::-moz-placeholder{color:#838a9d}#searchInput:focus:-ms-input-placeholder{color:#838a9d}#searchInput:focus::placeholder{color:#838a9d}#searchTypeMenu{min-width:220px}#searchTypeMenu>li{float:left;width:50%}#searchTypeMenu>li>a{margin:4px 0}#userNav .avatar{display:inline-block;vertical-align:middle}#userNav>li>a{padding:2px 6px;line-height:20px;color:#fff;opacity:.9}#userNav>li>a .user-name{max-width:100px;overflow:hidden;font-size:15px;text-overflow:ellipsis;white-space:nowrap}#userNav>li>a:hover{background-color:rgba(0,0,0,.1);opacity:1}#userNav>li>a:hover>i{opacity:1}#userNav>li>a span{vertical-align:middle}#userNav>li.open>a{background-color:rgba(0,0,0,.1)}#userNav>li.has-new-items>a{position:relative}#userNav>li.has-new-items>a:before{position:absolute;top:3px;right:-1px;display:block;width:4px;height:4px;content:' ';background-color:#ff5d5d;border-radius:50%}#userNav .dropdown-menu{min-width:150px}#userNav .dropdown-menu>li>a>.icon{position:absolute;top:10px;right:5px;display:block;width:20px;height:20px;line-height:20px;text-align:center}#userNav .user-profile-item>a{position:relative;padding-left:45px}#userNav .user-profile-item .avatar{position:absolute;top:6px;left:5px}#userNav .user-profile-name{font-size:16px}#userNav .user-profile-role{font-size:12px;color:#a9abb8}#userNav .no-role .user-profile-role{display:none}#userNav .no-role .user-profile-name{line-height:40px}#subHeader{min-height:50px;background:#fff}#subHeader>.container{padding:0 20px}@media (min-width:1400px){#subHeader>.container{padding:0 40px}}#pageNav{position:absolute;top:8px;left:0;left:20px}@media (min-width:1400px){#pageNav{left:40px}}#subNavbar{margin-top:5px;font-size:14px;text-align:center}#subNavbar .nav{display:inline-block}#subNavbar .nav>li>a{padding:8px 12px;line-height:24px;color:#3c495c}#subNavbar .nav>li>a:hover{color:#3c495c;background-color:rgba(0,0,0,.075)}#subNavbar .nav>li.active>a{font-weight:700;color:#0c64eb}#subNavbar .nav>li.divider{display:block;width:2px;height:20px;margin:9px 5px;background-color:rgba(0,0,0,.05)}#subNavbar .dropdown-menu{text-align:left}[lang=en] #subNavbar>.nav>li>a{padding-right:8px;padding-left:8px}#pageActions{position:absolute;top:9px;right:20px}@media (min-width:1400px){#pageActions{right:40px}}.cell{padding:10px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.cell+.cell{margin-top:10px}.cell>.panel{margin:0;-webkit-box-shadow:none;box-shadow:none}.cell>.panel>.panel-heading{padding:5px 5px 10px}.cell>.panel>.panel-heading .panel-actions{padding:0}.cell>.panel>.panel-body{padding:5px}.cell>.table{margin:0}#main{min-width:1200px;padding:20px 0}#main>.container{padding:0 20px}@media (min-width:1400px){#main>.container{padding:0 40px}}#header,#header+#main{min-width:1200px}#mainMenu{margin:-10px 0 8px}.main-content{padding:20px;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}@media (min-width:1400px){.main-content>.center-block{max-width:1350px;padding:20px;border:1px solid #eee}.main-content>.center-block .main-header{background-color:#f1f1f1}}.main-content>h2{margin:0 0 20px}.main-content .cell{-webkit-box-shadow:none;box-shadow:none}.main-header{padding:5px 20px;border-bottom:1px solid #eee}.main-header:after,.main-header:before{display:table;content:" "}.main-header:after{clear:both}.main-header>h2{display:block;float:left;margin:0 10px 0 0;font-size:14px;line-height:34px}.main-header>h2 .label-id{margin-right:5px}.main-header>h2 small{font-size:14px;font-weight:400}.main-content .main-header{margin:-20px -20px 10px}.main-header .label{top:-1px}.main-row{display:table;width:100%;table-layout:fixed}.main-row>[class*=" col-"],.main-row>[class*="-col"],.main-row>[class^=col-]{display:table-cell;vertical-align:top}@media (max-width:720px){.main-row{display:block}.main-row>*{display:block;width:100%}.main-row .side-col{width:100%;padding:0}.main-row .main-col+.side-col,.main-row .side-col+.main-col{margin-top:10px}}.main-row.hide-side .side-col{display:none}.main-form{margin:0}@media (min-width:720px){.main-content>.center-block .main-form{padding-right:20px}}#main .side-col .tabs{padding:5px}#main .side-col .nav-tabs{margin:0 5px 5px 5px}#main .side-col .nav-tabs>li{margin:0}#main .side-col .nav-tabs>li+li{margin-left:10px}#main .side-col .nav-tabs>li>a{padding:8px 5px}#main .side-col .tab-content .tab-pane table{border:none}.main-actions .btn-toolbar{display:inline-block;padding:4px 15px;color:#fff;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);border-radius:4px}.main-actions .btn-toolbar .divider{margin-right:15px;margin-left:15px;border-color:rgba(255,255,255,.1)}.main-actions .btn-toolbar .btn{height:30px;padding-right:10px;padding-left:10px;margin-right:0;color:#fff;background-color:transparent;border:none}.main-actions .btn-toolbar .btn+.btn{margin-left:10px}.main-actions .btn-toolbar .btn:focus,.main-actions .btn-toolbar .btn:hover{background-color:rgba(255,255,255,.2)}.main-actions .btn-toolbar .btn.btn-icon{min-width:32px;padding-right:0;padding-left:0}.main-actions .btn-toolbar .btn+.btn-group{margin-right:0;margin-left:10px}#mainContent .main-col>.main-actions{padding:30px 0 0 0;text-align:center}#mainContent .main-col>.main-actions>.btn-toolbar{visibility:visible;opacity:1;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}#mainActions{position:fixed;top:0;right:0;bottom:0;left:0;text-align:center;pointer-events:none}#mainActions .btn-toolbar{position:relative;top:-90px}#mainActions .dropdown-menu{text-align:left}#mainActions>.container{height:100%}.main-actions-holder{display:none}.main-actions-fixed .main-actions-holder{display:block}.main-actions-fixed #mainContent .main-col>.main-actions{position:fixed;bottom:10px}.main-actions-fixed.body-modal #mainContent .main-col>.main-actions{bottom:20px}#nextPage,#prevPage{position:absolute;top:50%;left:-10px;width:40px;height:60px;padding:10px 0;margin-top:-30px;line-height:40px;color:#fff;text-align:center;pointer-events:auto;background:#717171;background-color:rgba(90,90,90,.85);-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.05);box-shadow:0 2px 15px 2px rgba(0,0,0,.05)}#nextPage:hover,#prevPage:hover{-webkit-box-shadow:0 2px 15px 2px rgba(0,0,0,.15);box-shadow:0 2px 15px 2px rgba(0,0,0,.15)}#nextPage>i,#prevPage>i{display:block;font-size:18px;line-height:36px}#nextPage{right:-10px;left:auto}@media (max-width:1800px){#prevPage{left:-3px}#nextPage{right:-3px}}#sidebarHeader{position:relative;float:left;width:180px;height:34px;padding-right:20px;margin-right:20px;background:#fff;border-left:4px solid #0c64eb;border-radius:4px 2px 2px 4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}#sidebarHeader:after{position:absolute;top:-1px;right:-8px;display:block;width:0;height:0;content:' ';border-color:transparent transparent transparent #fff;border-style:solid;border-width:18px 0 18px 8px}#sidebarHeader .title{padding:0 5px;overflow:hidden;font-size:14px;font-weight:700;line-height:32px;color:#0c64eb;text-align:center;text-overflow:ellipsis;white-space:nowrap}#sidebarHeader .title>a{position:absolute;top:0;right:0;width:20px;opacity:.5}#sidebarHeader .title>a:hover{opacity:1}#sidebar{position:relative;-webkit-transition:width .2s,padding .2s;-o-transition:width .2s,padding .2s;transition:width .2s,padding .2s}#sidebar>.sidebar-toggle{position:absolute;top:0;right:5px;bottom:0;width:10px;cursor:pointer;background:0 0;border-radius:5px;-webkit-transition:background-color .2s,opacity .5s;-o-transition:background-color .2s,opacity .5s;transition:background-color .2s,opacity .5s}#sidebar>.sidebar-toggle>.icon{position:absolute;top:50%;left:-1px;width:12px;height:30px;margin-top:-10px;line-height:30px;color:#fff;text-align:center;background:#79cdfb;border-radius:6px}#sidebar>.sidebar-toggle>.icon:before{position:relative;left:-1px}#sidebar>.sidebar-toggle:before{position:absolute;top:0;right:-5px;bottom:0;left:-5px;display:block;content:' '}#sidebar>.sidebar-toggle:hover{background:rgba(0,0,0,.075)}#sidebar>.cell{position:relative;left:0;width:180px;-webkit-transition:left .2s,opacity .2s;-o-transition:left .2s,opacity .2s;transition:left .2s,opacity .2s}#sidebar.no-animate>.cell{display:none;-webkit-transition:none;-o-transition:none;transition:none}.hide-sidebar #sidebar>.cell{position:absolute;left:-200px;visibility:hidden;opacity:0}.hide-sidebar #sidebar{position:relative;width:0;padding:0}.hide-sidebar #sidebar>.sidebar-toggle>.icon:before{content:"\e315"}@media (max-width:720px){#sidebar>.cell{width:100%}}#queryBox{max-height:0;padding:0;overflow:hidden;-webkit-transition:cubic-bezier(.175,.885,.32,1) .2s;-o-transition:cubic-bezier(.175,.885,.32,1) .2s;transition:cubic-bezier(.175,.885,.32,1) .2s;-webkit-transition-property:padding,max-height,margin;-o-transition-property:padding,max-height,margin;transition-property:padding,max-height,margin}#queryBox>form{visibility:hidden;-webkit-transition:visibility .2s .2s;-o-transition:visibility .2s .2s;transition:visibility .2s .2s}#queryBox.loading{height:50px}#queryBox.show{min-height:110px;max-height:300px;margin-bottom:10px;overflow:visible}#queryBox.show>form{visibility:visible}#queryBox.divider{border-bottom:1px solid #eee}#main .querybox-toggle.querybox-opened{position:relative;color:#0c64eb;background:0 0;border:none}#main .querybox-toggle.querybox-opened:before{position:absolute;bottom:-14px;left:50%;width:0;height:0;content:' ';border-color:transparent transparent #fff transparent;border-style:solid;border-width:0 10px 10px 10px}#contentNav{padding:5px;background:#fff;border-bottom:1px solid #eee}#contentNav .nav>li>a{position:relative;padding:6px 10px;color:#838a9d}#contentNav .nav>li.active>a{font-weight:700;color:#0c64eb}#contentNav .nav>li.active>a:before{position:absolute;right:10px;bottom:3px;left:10px;display:block;height:2px;content:' ';background:#0c64eb}.body-modal{padding-bottom:0}.body-modal #main,.body-modal .container{min-width:0!important}.body-modal #main{padding:0}.body-modal .main-header{position:fixed;top:0;right:20px;left:20px;z-index:100;padding:13px 48px 13px 0;margin:0;background:#fff}.body-modal #mainContent{padding-top:70px}.body-modal .main-header>h2{max-width:100%;overflow:hidden;font-size:14px;text-overflow:ellipsis;white-space:nowrap}.body-modal .cell,.body-modal .main-content{-webkit-box-shadow:none;box-shadow:none}.body-modal #mainMenu{position:fixed;top:0;right:0;left:0;z-index:100;padding:12px 60px 12px 10px;margin:0;background:#fff}.body-modal #mainMenu>.btn-toolbar.pull-left.divider{display:none}.body-modal #mainMenu>.btn-toolbar{width:100%;margin-left:20px}.body-modal #mainMenu>.btn-toolbar>.divider:first-child{display:none}.body-modal #mainMenu>.btn-toolbar .page-title{width:100%;margin-left:0}.body-modal #mainMenu>.btn-toolbar .page-title>.text{position:relative;top:-2px;display:inline-block;max-width:85%;max-width:-webkit-calc(100% - 100px);max-width:calc(100% - 100px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.body-modal #mainMenu+#mainContent.main-row{padding:60px 10px 0}.body-modal #mainMenu+#mainContent.main-row .cell{border:1px solid #efefef;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.body-modal #mainActions{top:auto}.body-modal #mainActions .btn-toolbar{top:auto;bottom:10px}.body-modal.m-bug-view,.body-modal.m-story-view,.body-modal.m-task-view,.body-modal.m-testcase-view,.body-modal.m-testtask-view,.body-modal.m-todo-view{padding-bottom:20px;border-radius:3px}#tabsNav{position:relative}#tabsNav .tab-pane>.actions{position:absolute;top:-8px;right:0}#tabsNav .tab-pane>.cell,#tabsNav .tab-pane>.main-table{padding:0;border:1px solid #cbd0db;border-top:none;border-radius:0 0 4px 4px}#tabsNav .tab-pane>.cell .detail-title{padding-left:5px}#helpContent{position:fixed;top:50px;right:0;bottom:40px;left:0;display:none;background-color:#fff}#helpContent .load-error{display:none;padding:20px}#helpContent .show-error .load-error{display:block}.text-middle td,.text-middle th{vertical-align:middle}.text-center td,.text-center th{text-align:center}.c-sm{width:40px}.c-id{width:90px}.c-id-sm{width:70px}.c-id-xs{width:55px}.c-date{width:100px}.c-num,.c-pri,.c-type{width:80px;overflow:hidden}.c-begin,.c-end,.c-time{width:65px}.c-hours{width:60px}.c-actions-1{width:50px}.c-actions-2{width:75px}.c-actions-3{width:102px}.c-actions,.c-actions-4{width:128px}.c-actions-5{width:155px}.c-actions-6{width:180px}.c-product,.c-project{width:180px}.c-plan{width:130px}.c-datetime{width:120px}.c-stage,.c-status,.c-user{width:80px}.c-side{width:200px;border-right:10px solid #efefef}.c-assign,.c-assignedTo,.c-openedBy{width:130px}.c-progress{width:155px}.c-assign,.c-assignedTo,.c-openedBy,.c-product,.c-project,.c-status,.c-url,.c-user{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}td.c-name,td.c-title{overflow:hidden;text-align:left!important;text-overflow:ellipsis;white-space:nowrap}td.c-actions{position:relative;padding-top:0;padding-bottom:0;overflow:hidden;white-space:nowrap;vertical-align:middle}td.c-actions .btn-link{color:#3c495c;background:0 0}td.c-actions .btn-link:hover{color:#0c64eb;background:#e9f2fb}td.c-actions .more{position:absolute;top:50%;right:100%;display:none;padding-right:4px;padding-left:20px;margin-top:-15px;margin-right:-6px;white-space:nowrap;background-color:#fafafa;-webkit-transition:opacity .3s,margin .3s;-o-transition:opacity .3s,margin .3s;transition:opacity .3s,margin .3s}tr:hover td.c-actions .more{display:block}td:hover+td.c-actions>.more{margin-right:-15px;pointer-events:none;opacity:.15}tr[data-url]{cursor:pointer}.table tbody>tr>td,.table thead>tr>th{vertical-align:middle}.table tbody>tr>td.has-btn,.table thead>tr>th.has-btn{padding-top:1px;padding-bottom:1px;overflow:visible}.table tbody>tr>td .progress,.table thead>tr>th .progress{height:6px}.table .em,.table em{color:#3c4353}.table .divider{border-bottom:10px solid #efefef}.table .divider-top{border-top:10px solid #efefef}.table .btn-icon-left{max-width:100%;padding-left:20px;overflow:hidden;line-height:18px;text-align:left;text-overflow:ellipsis;background:0 0;border-color:#eaf3fc}.table .btn-icon-left>.icon{width:20px;font-size:14px;background:0 0!important;opacity:0}.table .btn-icon-left.btn-sm{height:26px;font-size:13px}.table .btn-icon-left:active,.table .btn-icon-left:focus,.table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.table .btn-icon-left:active>.icon,.table .btn-icon-left:focus>.icon,.table .btn-icon-left:hover>.icon{opacity:1}.table .btn-icon-left>.text{padding-left:25px}.table thead>tr>th.c-assign,.table thead>tr>th.c-assignedTo{padding-left:29px}.table a{vertical-align:middle}.table tbody>tr:last-child{border-bottom:none}.table caption{margin-bottom:5px;background:#f1f1f1;border:none}.is-firefox .table .btn-icon-left>.icon{line-height:22px}.main-table{border-radius:4px}.main-table>.table,.main-table>.table-footer,.main-table>.table-header,.main-table>.table-responsive{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045);box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.main-table .table{font-size:13px;table-layout:fixed;background-color:#fff;border-radius:4px 4px 0 0}.main-table .table.table-lg{font-size:14px}.main-table .table .btn-icon-left{border-color:transparent}.main-table .table .btn-icon-left>.icon{background:0 0;border-radius:4px}.main-table .table .btn-icon-left.btn-sm{height:26px}.main-table .table .btn-icon-left:hover{border-color:rgba(0,0,0,.2)}.main-table .table .btn-icon-left:hover>.icon{background:#e9f2fb;border-radius:4px 0 0 4px}.main-table tbody>tr>td,.main-table thead>tr>th{min-height:36px;padding:2px 8px;line-height:30px}.main-table tbody>tr>td:first-child,.main-table thead>tr>th:first-child{padding-right:4px;padding-left:15px}.main-table thead>tr>th{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-bottom:1px solid #ddd}.main-table tbody>tr:nth-child(odd){background-color:#f5f5f5}.main-table tbody>tr:last-child>td{border-bottom:1px solid #ddd}.main-table tbody>tr>td{position:relative;border-bottom:none;border-bottom:1px solid #eee}.main-table tbody>tr>td .label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.main-table tbody>tr>td>a{line-height:28px;color:#0c60e1}.main-table tbody>tr>td>a:not(.btn):visited{color:#082999;opacity:.9}.main-table tbody>tr>td>a:hover,.main-table tbody>tr>td>a:visited:hover{color:#0c64eb}.main-table tbody>tr>td.c-actions{padding-right:10px}.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{position:absolute;top:0;bottom:0;left:0;display:block;width:0;content:'';background:#0c64eb;opacity:0;-webkit-transition:.2s linear;-o-transition:.2s linear;transition:.2s linear;-webkit-transition-property:width,opacity,border-radius;-o-transition-property:width,opacity,border-radius;transition-property:width,opacity,border-radius}@-moz-document url-prefix(){.main-table tbody>tr>td.c-side+td:before,.main-table tbody>tr>td:first-child:before{bottom:-1px}}.main-table tbody>tr>td.c-side:before{display:none}.main-table tbody>tr{-webkit-transition:.2s cubic-bezier(.175,.885,.32,1);-o-transition:.2s cubic-bezier(.175,.885,.32,1);transition:.2s cubic-bezier(.175,.885,.32,1);-webkit-transition-property:background-color,-webkit-box-shadow;-o-transition-property:box-shadow,background-color;transition-property:background-color,-webkit-box-shadow;transition-property:box-shadow,background-color;transition-property:box-shadow,background-color,-webkit-box-shadow}.main-table tbody>tr:hover{background:#e9f2fb}.main-table .table-grouped tbody>tr:hover{background:#f2f7fd;-webkit-box-shadow:none;box-shadow:none}.main-table .table-grouped tbody>tr:hover td.c-actions .more{background:#f2f7fd}.main-table tbody>tr.checked{background:#fff3e0}.main-table tbody>tr.checked:hover{background:#ffebbc}.main-table tbody>tr.checked>td.c-side+td:before,.main-table tbody>tr.checked>td:first-child:before{width:4px;opacity:1}.main-table tbody>tr.checked.row-check-begin{border-top-left-radius:4px;border-top-right-radius:2px}.main-table tbody>tr.checked.row-check-begin>td:first-child:before{border-top-left-radius:4px}.main-table tbody>tr.checked.row-check-end{border-bottom-right-radius:2px;border-bottom-left-radius:4px}.main-table tbody>tr.checked.row-check-end>td:first-child:before{border-bottom-left-radius:4px}.main-table .checkbox-primary{display:inline-block;line-height:20px}.main-table .checkbox-primary label{margin:0}.main-table .table{margin:0}.table-header{padding:4px 0 12px}.table-header .table-statistic{color:#838a9d}.table-header .table-statistic strong{font-size:15px;color:#3c4353}.table-header .btn-toolbar{margin-top:-28px}.table-header.fixed-right{position:relative;z-index:5;padding:0}.table-header.fixed-right>.btn-toolbar{position:absolute;top:1px;right:1px;z-index:1;padding:1px;margin:0;background:#fff;border-radius:4px}.table-header.fixed-right>.btn-toolbar .btn{opacity:.65}.table-header.fixed-right>.btn-toolbar .btn:hover{opacity:1}.table-header-fixed .table-header{position:fixed;top:0}.table-header-fixed .table-header>.btn-toolbar{background-color:transparent}.table-header-fixed .table-header>.btn-toolbar .btn{color:#fff}.table-footer{position:relative;min-height:40px;padding:6px 15px;background:#fff;border-radius:0 0 4px 4px}.body-modal .table-footer{margin-bottom:20px}.talbe-lg+.table-footer{padding:11px 15px}.table-footer .btn-toolbar,.table-footer .checkbox-primary{float:left}.table-footer .btn-toolbar+.btn-toolbar{margin-left:8px}.table-footer .checkbox-primary{margin:5px 20px 0 0}.table-footer .checkbox-primary.checked label:after{border-color:#00da88!important}.table-footer .btn{padding:3px 10px;line-height:20px}.table-footer .pager{position:absolute;top:0;right:0;z-index:5;height:40px;padding:6px 5px 6px 10px;margin:0;background:#fff;opacity:1;-webkit-transition:opacity .4s;-o-transition:opacity .4s;transition:opacity .4s}.table-footer .pager:before{position:absolute;top:0;bottom:0;left:-50px;display:block;width:50px;content:' ';background:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,0)),to(#fff));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,#fff 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,#fff 100%)}.table-footer .pager .btn,.table-footer .pager>li>.pager-item,.table-footer .pager>li>.pager-label{color:#838a9d;background:0 0;border-color:transparent}.table-footer .pager .btn,.table-footer .pager>li>a{border-radius:3px}.table-footer .pager .btn:hover,.table-footer .pager>li>a:hover{background:rgba(0,0,0,.1)}.table-footer .pager>li.disabled>a.pager-item{opacity:1}.table-footer .form-control{height:28px;padding:3px 8px}.table-footer .table-statistic{position:relative;z-index:2;float:left;padding-right:30px;line-height:28px;color:#838a9d;background:#fff}.table-footer .table-statistic:hover{z-index:4}.table-footer .table-statistic:hover+.pager{z-index:2;opacity:.3}.table-footer .btn-toolbar+.table-statistic,.table-footer .btn-toolbar+.text{margin-left:10px}.table-footer .text{float:left;line-height:28px}.table-footer.fixed-footer{position:fixed;z-index:10;margin:0;background:rgba(75,75,75,.85);border-top-color:transparent}.table-footer.fixed-footer .checkbox-primary label{color:#fff}.table-footer.fixed-footer .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.table-footer.fixed-footer .table-statistic{color:#fff;background:0 0}.table-footer.fixed-footer .pager{background:#666}.table-footer.fixed-footer .pager:before{background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,0)),to(#666));background:-webkit-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:-o-linear-gradient(left,rgba(0,0,0,0) 0,#666 100%);background:linear-gradient(to right,rgba(0,0,0,0) 0,#666 100%)}.table-footer.fixed-footer .pager .btn,.table-footer.fixed-footer .pager>li>.pager-item,.table-footer.fixed-footer .pager>li>.pager-label{color:#fff}.table-footer.fixed-footer .pager .btn:hover,.table-footer.fixed-footer .pager>li>a:hover{background:rgba(255,255,255,.3)}.table-footer.fixed-footer .pager>li.disabled>a.pager-item{opacity:.5}.table-actions{display:none;height:28px}.table-actions.show-always{display:block;pointer-events:none;cursor:not-allowed}.has-row-checked .table-actions{display:block;pointer-events:auto!important;cursor:default}.table-lg tbody>tr>td{padding:9px 10px}.table-lg tbody>tr>td .btn+.btn{margin-left:5px}.table.has-sort-head thead>tr>th{padding-right:0}.table.has-sort-head thead>tr>th>a{position:relative;display:inline-block;padding-right:16px;color:#3c4353}.table.has-sort-head thead>tr>th>a:after,.table.has-sort-head thead>tr>th>a:before{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;line-height:30px;color:#3c495c;text-transform:none;content:"\f0de";opacity:.5;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.table.has-sort-head thead>tr>th>a:after{content:"\f0dd"}.table.has-sort-head thead>tr>th>a.sort-down,.table.has-sort-head thead>tr>th>a.sort-up{color:#000;text-decoration:none}.table.has-sort-head thead>tr>th>a:hover,.table.has-sort-head thead>tr>th>a:hover:after,.table.has-sort-head thead>tr>th>a:hover:before{color:#0c64eb;opacity:1}.table.has-sort-head thead>tr>th>a.sort-down:after,.table.has-sort-head thead>tr>th>a.sort-up:before{color:#000;opacity:1}.head-fixed .datatable-head-span .table,.table.fixed-header-copy{z-index:10;color:#fff;background:rgba(75,75,75,.85)}.head-fixed .datatable-head-span .table thead>tr>th,.table.fixed-header-copy thead>tr>th{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a,.table.fixed-header-copy thead>tr>th>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>a:after,.head-fixed .datatable-head-span .table thead>tr>th>a:before,.table.fixed-header-copy thead>tr>th>a:after,.table.fixed-header-copy thead>tr>th>a:before{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-down:after,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up,.head-fixed .datatable-head-span .table thead>tr>th>a.sort-up:before,.head-fixed .datatable-head-span .table thead>tr>th>a:hover,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:after,.head-fixed .datatable-head-span .table thead>tr>th>a:hover:before,.table.fixed-header-copy thead>tr>th>a.sort-down,.table.fixed-header-copy thead>tr>th>a.sort-down:after,.table.fixed-header-copy thead>tr>th>a.sort-up,.table.fixed-header-copy thead>tr>th>a.sort-up:before,.table.fixed-header-copy thead>tr>th>a:hover,.table.fixed-header-copy thead>tr>th>a:hover:after,.table.fixed-header-copy thead>tr>th>a:hover:before{color:#fff}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a,.table.fixed-header-copy thead>tr>th>.dropdown>a{color:#eee}.head-fixed .datatable-head-span .table thead>tr>th>.dropdown>a:hover,.table.fixed-header-copy thead>tr>th>.dropdown>a:hover{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary,.table.fixed-header-copy .checkbox-primary{z-index:1}.head-fixed .datatable-head-span .table .checkbox-primary label,.table.fixed-header-copy .checkbox-primary label{color:#fff}.head-fixed .datatable-head-span .table .checkbox-primary label:after,.table.fixed-header-copy .checkbox-primary label:after{border-color:rgba(255,255,255,.8)}.head-fixed .datatable-head-span .table .checkbox-primary.checked label:after,.table.fixed-header-copy .checkbox-primary.checked label:after{border-color:#00da88!important}.table-data{margin:0;table-layout:fixed}.table-data tbody>tr>td,.table-data tbody>tr>th{padding:6px 8px;word-break:break-all;border:none}.table-data tbody>tr>th{width:70px;padding-left:0;font-weight:400;color:#838a9d;text-align:right;vertical-align:middle}.table-data tbody>tr>td{padding-right:0}.table-data tbody>tr>td>a{color:#0c60e1}.table-data tbody>tr>td>a:not(.btn):visited{color:#082999}.table-data tbody>tr>td>a:hover,.table-data tbody>tr>td>a:visited:hover{color:#0c64eb}.table-data ol,.table-data ul{margin:0}.fixed-head-table{background:rgba(0,0,0,.7);border-bottom:1px solid #ddd}.fixed-head-table thead>tr>th{color:#fff}.table-empty-tip{padding:80px 10px;text-align:center;background:#fff}.not-firefox .table-grouped>tbody>tr>td.c-side{background:#fff!important}.table-grouped .group-toggle{cursor:pointer}.table-grouped .group-toggle.group-summary{border-top:10px solid #efefef}.table-grouped tbody>tr>td:first-child,.table-grouped thead>tr>th:first-child{padding-left:8px}.group-expand-all,.table-group-collapsed .group-collapse-all{display:none}.table-group-collapsed .group-expand-all{display:inline-block}.table-auto{table-layout:auto}.datatable .table>tbody>tr.checked.hover>td,.datatable .table>tbody>tr.checked>td.col-hover{background:#ffebbc}body.has-fixed-footer{padding-bottom:60px}.table.with-footer-fixed{margin-bottom:20px}.table-nest-hide{display:none!important}th.table-nest-title{position:relative;padding-left:30px!important}.table-nest-icon{position:relative;display:inline-block;width:22px;height:22px;font-size:16px;color:#a6aab8;text-align:center;border-radius:4px}.table-nest-toggle:before{line-height:22px;content:"\e6f2"}.table-nest-toggle:hover{color:#0c64eb;background-color:rgba(0,0,0,.1)}.table-nest-child-hide .table-nest-toggle:before{font-size:16px;content:"\e6f1"}th.table-nest-title .table-nest-toggle{position:absolute!important;top:7px;left:8px}.table-nest-toggle.table-nest-toggle-global{width:22px;height:22px;padding:0!important;line-height:22px;text-align:center;border-radius:4px}.table-nest-toggle.table-nest-toggle-global:before{position:static!important;font-size:16px!important;line-height:22px!important;content:"\e6f2"!important;opacity:1!important}.table-nest-toggle.table-nest-toggle-global:after{display:none!important}.table-nest-collapsed .table-nest-toggle.table-nest-toggle-global:before{font-size:16px!important;content:"\e6f1"!important}.disable-empty-nest-row .is-nest-child .table-nest-icon:before,.disable-empty-nest-row .no-nest .table-nest-icon:before{position:relative;top:-1px;width:6px;min-width:6px;height:6px;content:' ';background-color:#cbd0db;border-radius:1px}.table-nest-child-hover>td:first-child,.table-nest-hover>td:first-child{-webkit-box-shadow:inset 3px 0 0 #cbd0db;box-shadow:inset 3px 0 0 #cbd0db}.article-content{overflow:auto}.article-content img{margin-top:0}.article-content table{margin:10px 0}.article-content table td,.article-content table th{border:1px solid #cbd0db}.article-content table th{background:#eee}.article-content a{color:#0c64eb}.article-content a:focus,.article-content a:hover{color:#16a8f8}.article-content,.article>.content{word-wrap:break-word}.detail{padding:10px 0;margin:0 10px}.detail+.detail{padding-top:25px;border-top:1px solid #eee}.detail-title{font-size:14px;font-weight:700;line-height:20px}.detail-title>.pull-right{position:relative;top:-8px}h2.detail-title{margin:0;font-size:15px;font-weight:700}h2.detail-title .label,h2.detail-title .label-id{position:relative;top:-1px}.detail-content{padding:0;margin-top:10px}.detail-content em{color:#3c4353}.detail-content .list-unstyled>li+li{margin-top:5px}.side-col .detail-content{padding-left:0}details.detail{padding:10px 0}details.detail summary{position:relative;cursor:pointer;outline:0}details.detail summary::-webkit-details-marker{display:none}details.detail summary:after{position:absolute;top:0;right:0;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e316";opacity:.4;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}details.detail[open] summary:after{content:"\e313"}.files-list{padding-left:0;list-style:none}.files-list>li>a{display:block;line-height:24px}.files-list>li>a>.icon{display:inline-block;margin-right:5px;opacity:.7}.files-list>li>a:hover{color:#0c64eb}.files-list>li>.right-icon{opacity:0;-webkit-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.files-list>li:hover>.right-icon{opacity:1}.histories-list{padding-left:15px;margin-bottom:0}.histories-list>li{position:relative}.histories-list>li+li{margin-top:5px}.histories-list>li strong{color:#3c4353}.histories-list .comment,.histories-list .show-form .comment-edit-form{padding:5px 5px 5px 10px;margin:5px 0 0;background-color:rgba(0,0,0,.025);border:1px solid #eee}.histories-list .btn-edit-comment{position:absolute;top:28px;right:2px}.histories-list .comment-edit-form,.histories-list .show-form .btn-edit-comment,.histories-list .show-form .comment{display:none}.histories-list .show-form .comment-edit-form{display:block;padding:10px;border:1px solid #eee}.histories .btn-mini{width:16px;min-width:16px;height:16px;overflow:hidden;line-height:16px;color:#cbd0db;vertical-align:-8%;border-radius:1px}.histories .btn-mini:focus,.histories .btn-mini:hover{color:#0c64eb;border-color:#0c64eb}.histories .show-changes .btn-expand>.icon:before{content:"\e926"}.histories .btn-strip{display:none}.histories .show-changes .btn-strip{display:inline-block}.history-changes{display:none;padding:5px;margin-bottom:-5px;margin-left:5px;font-size:12px;line-height:20px}.history-changes blockquote{padding:5px 5px 5px 10px;margin:5px 0 0;font-size:12px;background-color:rgba(0,0,0,.05);border-left:3px solid #eee}.history-changes blockquote.original{display:none}.show-changes .history-changes,.show-original .history-changes blockquote.original{display:block}.show-original .history-changes blockquote.textdiff{display:none}.syntaxhighlighter{overflow:auto}.list-group{overflow-y:auto}.list-group>a{display:block;padding:2px 10px 2px 5px;overflow:hidden;line-height:20px;text-overflow:ellipsis;white-space:nowrap;border-radius:4px}.list-group>a+a{margin-top:5px}.list-group>a>.icon{display:inline-block;margin-right:3px;opacity:.5}.list-group>a.selected{color:#e9f2fb;background-color:#0c64eb}.list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.list-group>a.active:hover,.list-group>a:hover{color:#fff;background-color:#0c64eb}.list-group>.heading{padding:2px 5px;line-height:20px;color:#838a9d}.list-group>a+.heading{margin-top:4px}.dropup .search-box-sink{padding-top:5px;padding-bottom:45px}.dropup .search-box-sink .search-box{position:absolute;right:10px;bottom:10px;left:10px;margin:0}.dropup .search-box-sink .search-box+.list-group{height:auto;max-height:171px}.search-list{min-width:200px;max-width:300px;padding:0}.search-list .search-box{float:none;width:auto;margin:10px}.search-list .search-box .icon-search{opacity:.5}.search-list .list-group{max-height:248px;padding:5px 10px;margin:5px 0}.dropup .search-list .search-box+.list-group{height:171px;padding-top:0}.search-list .search-input{height:30px}.search-list .input-control-icon-right{height:28px;line-height:28px}.search-list .list-group>a.active{color:inherit;background-color:inherit}.search-list.searchbox-focus .list-group>a.active{color:#0c64eb;background-color:#e9f2fb}.search-list .list-group>a.active:hover,.search-list.searchbox-focus .list-group>a.active:hover{color:#fff;background-color:#0c64eb}#dropMenu{width:initial;max-width:initial}#dropMenu>.search-box{width:100%;padding:10px 10px 0;margin:0}#dropMenu>.search-box .icon-search{color:#333}#dropMenu>.search-box.has-icon-right>.form-control{padding-left:26px}#dropMenu .input-control-icon-left{top:10px;left:10px}#dropMenu .input-control-icon-right{top:11px;right:11px}#dropMenu .input-control-icon-right .icon{position:relative;top:2px}#dropMenu .list-group{max-height:initial;margin:0}#dropMenu .table-row{margin:0 -10px;table-layout:auto}#dropMenu .table-col{position:relative;width:100%;min-width:250px;max-width:450px}#dropMenu .table-col .list-group{max-height:300px;padding:0 10px 5px}#dropMenu .col-left{padding-bottom:30px}#dropMenu .col-right{display:none}#dropMenu .col-footer{position:absolute;right:0;bottom:-5px;left:0;padding:8px 10px;border-top:1px solid #eee}#dropMenu .col-footer>a{opacity:.8}#dropMenu .col-footer>a:hover{opacity:1}#dropMenu.show-right-col .table-col{width:50%}#dropMenu.show-right-col .col-right{display:table-cell;border-left:1px solid #eee}#dropMenu.show-right-col .col-right>.list-group{max-height:335px;margin:0}#dropMenu.show-right-col .col-right>.list-group>a{opacity:.7}#dropMenu.show-right-col .col-right>.list-group>a:hover{opacity:1}#dropMenu.show-right-col .toggle-right-col>.icon-angle-right:before{content:"\e314"}#dropMenu.has-search-text .list-group{overflow-x:hidden}#dropMenu.has-search-text>.search-box{width:100%!important}#dropMenu.has-search-text>.list-group>.table-row{display:block}#dropMenu.has-search-text>.list-group>.table-row>.table-col{display:block;width:100%}#dropMenu.has-search-text .col-left{padding-bottom:0}#dropMenu.has-search-text .pull-right.toggle-right-col{display:none}#dropMenu.has-search-text .col-left .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group{margin-bottom:0}#dropMenu.has-search-text .col-right .list-group>a{opacity:.7}#dropMenu.has-search-text .col-footer,#dropMenu.has-search-text .hide-in-search{display:none}#swapper{position:relative}#swapper #dropMenu .tree li>.selected{color:#0c64eb!important;background:#e9f2fb!important}#swapper #dropMenu .list-group>a.active:hover,#swapper #dropMenu .search-box .list-group>a.active,#swapper #dropMenu .tree li>.clickable:hover,#swapper #dropMenu.searchbox-focus .list-group>a.active:hover{color:#fff!important;background:#0c64eb!important}#swapper #dropMenu .tree{margin:0}.release-path{overflow:hidden}.release-line{display:table;width:100%;padding:0;table-layout:fixed}.release-line>li{display:table-cell;list-style:none}.release-line>li>a{position:relative;display:block}.release-line>li>a:before{position:absolute;left:0;display:block;width:13px;height:13px;content:' ';background:#fff;border:2px solid #838a9d;border-radius:50%}.release-line>li>a:after{position:absolute;left:5px;display:block;width:2px;height:30px;content:' ';background:#cbe0f6}.release-line>li>a>.icon{position:absolute;left:4px;font-size:24px}.release-line>li>a .title{display:block;font-size:14px;white-space:nowrap}.release-line>li>a .date,.release-line>li>a .info{display:block;max-height:18px;overflow:hidden;font-size:12px;color:#838a9d;text-overflow:ellipsis;white-space:nowrap}.release-line>li>a:hover:before{background-color:#e9f2fb}.release-line>li>a:hover:after{background-color:#838a9d}.release-line>li>a:hover .title{color:#0c64eb}.release-line>li>a:hover .date,.release-line>li>a:hover .info{color:#838a9d}.release-line>li:nth-child(odd){padding-top:80px;vertical-align:top}.release-line>li:nth-child(odd)>a{height:85px;padding-top:36px;border-top:5px solid #cbe0f6}.release-line>li:nth-child(odd)>a:before{top:-9px}.release-line>li:nth-child(odd)>a:after{top:6px}.release-line>li:nth-child(odd)>a>.icon{top:-26px}.release-line>li:nth-child(even){padding-bottom:80px;vertical-align:bottom}.release-line>li:nth-child(even)>a{height:85px;padding-bottom:36px;border-bottom:5px solid #cbe0f6}.release-line>li:nth-child(even)>a:before{bottom:-9px}.release-line>li:nth-child(even)>a:after{bottom:6px}.release-line>li:nth-child(even)>a>.icon{bottom:-2px}.release-line>li:last-child>a{border-color:transparent}.release-line>li.active>a:before{border-color:#0c64eb}.release-line>li+li>a>.date,.release-line>li+li>a>.info,.release-line>li+li>a>.title{position:relative;left:-36%}#footer{position:fixed;right:0;bottom:0;left:0;z-index:1010;height:40px;background:#fff;border-top:1px solid #eff1f7}#footer .breadcrumb{padding:10px 0;margin:0}#footer .breadcrumb>li{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#footer .breadcrumb>.active,#footer .breadcrumb>li>a{color:#838a9e}#footer .breadcrumb>.active>.icon,#footer .breadcrumb>li>a>.icon{display:none}#footer .breadcrumb>.active:hover,#footer .breadcrumb>li>a:hover{color:#16a8f8}#footer .breadcrumb>li+li:before{content:'>'}#footer>.container{padding:0 20px}@media (min-width:1400px){#footer>.container{padding:0 40px}}#poweredBy{position:absolute;top:4px;right:0;padding:5px 10px}#poweredBy .icon-zentao{color:#0097fd}#poweredBy a{color:#3c4353}#poweredBy a:hover{color:#0c64eb}#poweredBy a:hover .icon-zentao{color:#0c64eb}#poweredBy a.text-important{color:#bd7b46}#poweredBy a.text-important:hover{color:#ff5d5d}#poweredBy a.text-primary{color:#0c64eb}#poweredBy a.text-primary:hover{color:#16a8f8}#poweredBy #aiux{color:#cbd0dc}#noticeBox .alert{-webkit-box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px;box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.25) 0 3px 10px}#heading{top:0}.header-btn{position:relative;padding:8px 0}.header-btn .btn{position:relative;height:34px;padding:1px 6px;margin:0;overflow:visible;font-size:13px;font-weight:400;line-height:28px;color:#fff;background-color:transparent;border-color:transparent!important;border-right:none;-webkit-transition:none;-o-transition:none;transition:none}.header-btn .btn>.caret{margin-left:0;border-width:4px}.header-btn .btn>.text{display:inline-block;max-width:150px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.header-btn .btn:hover{-webkit-box-shadow:none;box-shadow:none}.header-btn .btn:hover,.header-btn.active .btn{color:#fff;background:rgba(0,0,0,.15)}.header-btn .btn:hover>.caret,.header-btn.active .btn>.caret{opacity:1}.header-btn+.header-btn{margin-left:10px}.header-btn+.header-btn:before{position:absolute;top:16px;left:-13px;display:block;font-family:ZentaoIcon;font-size:14px;font-size:16px;font-style:normal;font-weight:400;font-variant:normal;line-height:1;text-transform:none;content:"\e315";opacity:.6;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.header-btn .dropdown-menu{margin-top:-10px}#toolbar{top:0;height:50px}#userNav>li{margin-right:0}#userNav>li>a{padding:10px 5px}#userNav>li>a>.icon{font-size:30px;filter:brightness(1.2) hue-rotate(30deg);opacity:.9;-webkit-filter:brightness(1.2) hue-rotate(30deg)}#userNav>li:hover>a{background-color:rgba(0,0,0,.1)}#userNav .dropdown-menu>li>a{position:relative;padding-left:24px}#userNav .dropdown-menu>li>a>.icon{top:1px;left:0}#userNav .dropdown-menu>li.user-profile-item>a{padding-left:45px} \ No newline at end of file From af43ca6bb32847b277276327181e4b9961e3b4b3 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 18 Apr 2022 10:25:28 +0800 Subject: [PATCH 04/42] * bug #6910, optimize helper "text-limit" and support for displaying html. --- module/execution/js/view.js | 35 +++++++++++++++++++++++++++++ module/execution/view/view.html.php | 2 +- module/project/js/view.js | 35 +++++++++++++++++++++++++++++ module/project/view/view.html.php | 2 +- www/js/zui/min.js | 6 ++--- 5 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 module/execution/js/view.js create mode 100644 module/project/js/view.js diff --git a/module/execution/js/view.js b/module/execution/js/view.js new file mode 100644 index 0000000000..eaac300e20 --- /dev/null +++ b/module/execution/js/view.js @@ -0,0 +1,35 @@ +(function() +{ + /* Expand or collapse text */ + function limitText() + { + var $text = $(this); + var fullText; + var limitText; + var options = $.extend({limitSize: 40, suffix: '…'}, $text.data()); + var text = $text.text(); + if(text.length > options.limitSize) + { + fullText = $text.html(); + limitText = text.substring(0, options.limitSize) + options.suffix; + $text.text(limitText).addClass('limit-text-on'); + + var $toggleBtn = options.toggleBtn ? $(options.toggleBtn) : $text.next('.text-limit-toggle'); + $toggleBtn.text($toggleBtn.data('textExpand')); + $toggleBtn.on('click', function() + { + var isLimitOn = $text.toggleClass('limit-text-on').hasClass('limit-text-on'); + if(isLimitOn) $text.text(limitText); + else $text.html(fullText); + $toggleBtn.text($toggleBtn.data(isLimitOn ? 'textExpand' : 'textCollapse')); + }); + } + else + { + (options.toggleBtn ? $(options.toggleBtn) : $text.next('.text-limit-toggle')).hide(); + } + $text.removeClass('hidden'); + }; + $.fn.textLimit = function(){return this.each(limitText);}; + $(function(){$('.text-limit').textLimit();}); +})(); diff --git a/module/execution/view/view.html.php b/module/execution/view/view.html.php index a2de707acb..33b3a87e02 100644 --- a/module/execution/view/view.html.php +++ b/module/execution/view/view.html.php @@ -176,7 +176,7 @@

id;?> code;?> name;?>

-
desc;?>
+

deleted):?> execution->deleted;?> diff --git a/module/project/js/view.js b/module/project/js/view.js new file mode 100644 index 0000000000..eaac300e20 --- /dev/null +++ b/module/project/js/view.js @@ -0,0 +1,35 @@ +(function() +{ + /* Expand or collapse text */ + function limitText() + { + var $text = $(this); + var fullText; + var limitText; + var options = $.extend({limitSize: 40, suffix: '…'}, $text.data()); + var text = $text.text(); + if(text.length > options.limitSize) + { + fullText = $text.html(); + limitText = text.substring(0, options.limitSize) + options.suffix; + $text.text(limitText).addClass('limit-text-on'); + + var $toggleBtn = options.toggleBtn ? $(options.toggleBtn) : $text.next('.text-limit-toggle'); + $toggleBtn.text($toggleBtn.data('textExpand')); + $toggleBtn.on('click', function() + { + var isLimitOn = $text.toggleClass('limit-text-on').hasClass('limit-text-on'); + if(isLimitOn) $text.text(limitText); + else $text.html(fullText); + $toggleBtn.text($toggleBtn.data(isLimitOn ? 'textExpand' : 'textCollapse')); + }); + } + else + { + (options.toggleBtn ? $(options.toggleBtn) : $text.next('.text-limit-toggle')).hide(); + } + $text.removeClass('hidden'); + }; + $.fn.textLimit = function(){return this.each(limitText);}; + $(function(){$('.text-limit').textLimit();}); +})(); diff --git a/module/project/view/view.html.php b/module/project/view/view.html.php index 085887fa70..562956096c 100644 --- a/module/project/view/view.html.php +++ b/module/project/view/view.html.php @@ -125,7 +125,7 @@

id;?> code;?> name;?>

-
desc;?>
+

deleted):?> project->deleted;?> diff --git a/www/js/zui/min.js b/www/js/zui/min.js index 7ef505846e..a5df054898 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-13 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-18 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT @@ -76,5 +76,5 @@ function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"= */ function(t){function e(e){if("string"==typeof e.data){var i=e.handler,n=e.data.toLowerCase().split(" ");e.handler=function(e){if(this===e.target||!/textarea|select/i.test(e.target.nodeName)&&"text"!==e.target.type){var o="keypress"!==e.type&&t.hotkeys.specialKeys[e.which],a=String.fromCharCode(e.which).toLowerCase(),s="",r={};e.altKey&&"alt"!==o&&(s+="alt+"),e.ctrlKey&&"ctrl"!==o&&(s+="ctrl+"),e.metaKey&&!e.ctrlKey&&"meta"!==o&&(s+="meta+"),e.shiftKey&&"shift"!==o&&(s+="shift+"),o?r[s+o]=!0:(r[s+a]=!0,r[s+t.hotkeys.shiftNums[a]]=!0,"shift+"===s&&(r[t.hotkeys.shiftNums[a]]=!0));for(var l=0,c=n.length;l","/":"?","\\":"|"}},t.each(["keydown","keyup","keypress"],function(){t.event.special[this]={add:e}})}(jQuery),function(t,e,i){"use strict";var n="zui.picker",o={},a={lang:null,remote:null,remoteConverter:null,remoteOnly:!1,onRemoteError:null,disableEmptySearch:!1,textKey:"text",valueKey:"value",keysKey:"keys",multi:"auto",formItem:"auto",list:null,allowSingleDeselect:null,autoSelectFirst:!1,maxSelectedCount:0,maxListCount:50,hideEmptyTextOption:!0,searchValueKey:!0,emptyResultHint:null,hideOnScroll:!0,inheritFormItemClasses:!1,emptySearchResultHint:null,accurateSearchHint:null,remoteErrorHint:null,deleteByBackspace:!0,disableScrollOnShow:!0,maxDropHeight:250,dropDirection:"auto",dropWidth:"100%",maxAutoDropWidth:450,multiValueSplitter:",",multiSelectActions:5,searchDelay:200,autoClearDrop:6e4,fixLabelFor:!0,hotkey:!0,onSelect:null,onDeselect:null,onBeforeChange:null,onChange:null,onReady:null,onNoResults:null,onShowingDrop:null,onHidingDrop:null,onShowedDrop:null,onHiddenDrop:null,valueMustInList:!0},s={zh_cn:{emptyResultHint:"没有可选项",emptySearchResultHint:"没有找到 “{0}”",accurateSearchHint:"请提供更多关键词缩小匹配范围",remoteErrorHint:"无法从服务器获取结果 - {0}",selectAll:"全选",deselectAll:"取消选择"},zh_tw:{emptyResultHint:"沒有可選項",emptySearchResultHint:"沒有找到 “{0}”",accurateSearchHint:"請提供更多關鍵詞縮小匹配範圍",remoteErrorHint:"無法從服務器獲取結果 - {0}",selectAll:"全選",deselectAll:"取消選擇"},en:{emptyResultHint:"No options",emptySearchResultHint:'Cannot found "{0}"',accurateSearchHint:"Suggest to provide more keywords",remoteErrorHint:"Unable to get result from server: {0}",selectAll:"Select all",deselectAll:"Deselect all"}},r=function(o,a){var l=this;l.name=n,l.$=t(o),l.id="pk_"+(l.$.attr("id")||t.zui.uuid()),a=l.options=t.extend({},r.DEFAULTS,this.$.data(),a),void 0!==a.hideOnWindowScroll&&(a.hideOnScroll=a.hideOnWindowScroll);var c=t.zui.clientLang?t.zui.clientLang():"en",h=a.lang||c;l.lang=t.zui.getLangData?t.zui.getLangData(n,h,s):s[h]||s[c];var d,u,p=a.formItem,f='.form-item,input[type="hidden"],select,input[type="text"]';if(d="self"===p?l.$:"auto"!==p&&p?l.$.find(p):l.$.is(f)?l.$:l.$.find(f).first(),!d.length)return console.error&&console.error("Cannot found form item for picker.");if(d.is('input[type="hidden"]'))u="hidden";else if(d.is("select"))u="select";else{if(!d.is('input[type="text"]'))return console.error&&console.error("Unknown form type for picker.");u="text"}a.inheritFormItemClasses&&v.addClass(d.attr("class")),l.formType=u,l.$formItem=d.removeClass("picker").hide(),l.selfFormItem=d.is(l.$);var g=a.multi;g&&"auto"!==g||(g="select"===u&&"multiple"===d.attr("multiple")),g=!!g,l.multi=g;var m=a.list;m?l.setList("function"==typeof m?m({search:l.search,limit:a.maxListCount}):m,!0):"select"===u?l.updateFromSelect():l.setList([],!0);var v;v=!l.selfFormItem&&l.$.hasClass("picker")?l.$:t('

').insertAfter(l.$),v.addClass("picker").toggleClass("picker-multi",g).toggleClass("picker-single",!g);var y=v.children(".picker-selections");y.length?y.empty():y=t('
');var b=l.id+"-search",w=t('').appendTo(y);if(!g){var x=t('
');a.allowSingleDeselect&&x.append(''),x.appendTo(y),l.$singleSelection=x}v.toggleClass("picker-input-empty",!w.val().length).append(y),l.$container=v,l.$selections=y,l.$search=w,l.search="";var C=a.placeholder;if(void 0===C&&(C=d.attr("placeholder")),"string"==typeof C&&C.length&&y.append(t('
').text(C)),a.placeholder=C,a.fixLabelFor){var _=d.attr("id");_&&t('label[for="'+_+'"]').attr("for",b)}var k=void 0!==a.defaultValue?a.defaultValue:d.val();if(l.setValue(k,!0),w.on("focus",function(){l._blurTimer&&(clearTimeout(l._blurTimer),l._blurTimer=0),v.addClass("picker-focus"),l.showDropList()}).on("blur",function(){l._blurTimer&&clearTimeout(l._blurTimer),l._blurTimer=setTimeout(function(){l._blurTimer=0,w.is(":focus")||v.removeClass("picker-focus")},100)}).on("input change",function(){var t=w.val();g&&w.width(14*t.length),v.toggleClass("picker-input-empty",!t.length),l.tryUpdateList(t)}),a.hotkey&&w.on("keydown",function(t){var e=t.key||t.which;if(l.dropListShowed){var i=l.activeValue,n="string"==typeof i;if("Enter"===e||13===e)n&&(l.select(i,g),g?(l.$search.val(""),l.tryUpdateList("")):w.blur(),t.preventDefault());else if("ArrowDown"===e||40===e){var o,s=l.$activeOption;if(s&&(o=s.next(".picker-option"),g))for(;o.length&&o.hasClass("picker-option-selected");)o=o.next(".picker-option");o&&o.length||(o=l.$optionsList.children(g?".picker-option:not(.picker-option-selected)":".picker-option").first()),o.length&&l.activeOption(o),t.preventDefault()}else if("ArrowUp"===e||30===e){var r,s=l.$activeOption;if(s&&(r=s.prev(".picker-option"),g))for(;r.length&&r.hasClass("picker-option-selected");)r=r.prev(".picker-option");r&&r.length||(r=l.$optionsList.children(g?".picker-option:not(.picker-option-selected)":".picker-option").last()),r.length&&l.activeOption(r),t.preventDefault()}else"Escape"===e||27===e?l.hideDropList(!0):a.deleteByBackspace&&g&&("Backspace"===e||8===e)&&l.value&&l.value.length&&!w.val().length&&l.deselect(l.value[l.value.length-1])}}),g){y.on("mousedown",function(t){if(l.dropListShowed)return t.preventDefault(),void t.stopPropagation()}).on("mouseup",function(e){y.hasClass("sortable-sorting")||t(e.target).closest(".picker-selection-remove").length||l.dropListShowed||l.focus()});var T=a.sortValuesByDnd;if(T&&t.fn.sortable){v.addClass("picker-sortable");var S={selector:".picker-selection",stopPropagation:!0,start:function(){l.hideDropList(!0)},finish:function(e){var i=[];t.each(e.list,function(t,e){i.push(e.item.data("value"))}),l.setValue(i.slice(),!1,!0)}};"object"==typeof T&&t.extend(S,T),y.sortable(S)}}if(y.on("click",".picker-selection-remove",function(e){if(l.multi){var i=t(this).closest(".picker-selection");l.deselect(i.data("value"))}else l.deselect();e.stopPropagation()}),d.on("chosen:updated",function(){l.updateFromSelect(),l.setValue(d.val(),!0),l.updateList()}).on("chosen:activate",l.focus).on("chosen:open",l.showDropList).on("chosen:close",l.hideDropList),v.addClass("picker-ready"),t.zui.asap(function(){l.triggerEvent("ready",{picker:l},"","chosen:ready")}),!a.disableScrollOnShow){var D=a.hideOnScroll;D&&![e,i,!0].includes(D)&&t(D).on("scroll",this.handleParentScroll.bind(this))}};r.prototype.destroy=function(){var e=this,i=e.options;e.hideDropList(!0);var o=e.$search;o.off("focus blur input change"),i.hotkey&&o.off("keydown"),o.remove();var a=e.$selections;a.off("click"),e.multi&&a.off("mousedown mouseup"),a.remove();var s=e.$formItem;e.selectOptionsBackup&&(s.empty(),t.each(e.selectOptionsBackup,function(e,n){var o={value:n[i.valueKey]},a=n[i.keysKey];void 0!==a&&(o["data-"+i.keysKey]=a),s.append(t("
");i.$.addClass("load-indicator loading"),s.load(window.location.href+" #"+o,function(r){if(a===o)i.$.empty().html(s.children().html()),i.$.find('[data-ride="pager"]').pager();else{i.$.find("#"+o).empty().html(s.children().html());try{var l=t(r),c=l.find("#"+o).closest('[data-ride="table"],#'+a);if(c.length){var h=c.find(".table-statistic");h.length&&(i.defaultStatistic=h.html());var d=i.$.find('[data-ride="pager"]').data("zui.pager"),u=c.find('[data-ride="pager"]');d&&u.length&&d.set(u.data())}}catch(p){console.error(p)}}i.$.removeClass("load-indicator loading").trigger("beforeTableReload"),delete i.defaultStatistic,i.updateStatistic(),i.initModals(),i.$.datepickerAll();var f=i.$.find("tbody>tr"),g=!1;t.each(i.checkItems,function(t,e){e&&(i.checkRow(f.filter('[data-id="'+t+'"]'),!0,!0),g=!0)}),g&&i.updateCheckUI(),n.nested&&i.initNestedList(),i.$.trigger("tableReload");var m=t("#mainMenu>.btn-toolbar>.btn-active-text>.label");if(m.length){var u=i.$.find(".pager[data-rec-total]"),v=u.length?u.attr("data-rec-total"):i.getTable().find("tbody:first>tr:not(.table-children)").length;m.text(v)}e&&e(),n.afterReload&&n.afterReload()})},r.prototype.initModals=function(){var e=this,i=e.options,n=e.$.find(i.iframeModalTrigger);if(n.length){var o={type:"iframe",onHide:i.replaceId?function(){var n=t.cookie("selfClose");(1==n||i.hot)&&(t("#triggerModal").data("cancel-reload",1),e.reload(function(){t.cookie("selfClose",0)}))}:null};n.modalTrigger(o)}},r.prototype.getTable=function(){var t=this.$;if(this.isDataTable)return t.find("div.datatable");var e=t.is("table")?t:t.find("table:not(.fixed-header-copy)").first();return e.is(".datatable")&&(this.isDataTable=!0,e.data("zui.datatable")||window.initDatatable(e),e=t.find("div.datatable")),e},r.prototype.toggleGroups=function(e){var i=this,n={};i.$.find("tbody>tr").each(function(){var o=t(this).closest("tr").data("id");n[o]||i.toggleRowGroup(o,e)})},r.prototype.toggleRowGroup=function(i,n){var o=this.$.find('tbody>tr[data-id="'+i+'"]'),a=o.filter(".group-summary"),s=n===e?!a.hasClass("hidden"):!!n;o.not(".group-summary").toggleClass("hidden",!s),a.toggleClass("hidden",s),t("body").toggleClass("table-group-collapsed",!this.$.find("tbody>tr.group-summary.hidden").length)},r.prototype.updateStatistic=function(){var i=this,n=i.$.find(".table-statistic");if(n.length){if(i.defaultStatistic===e&&(i.defaultStatistic=n.html()),i.options.statisticCreator)return void n.html(i.options.statisticCreator(i)||i.defaultStatistic);var o=i.statisticCols;if(!o&&o!==!1){o={};var a=!1;i.getTable().find("thead th").each(function(e){var i=t(this),n=i.data("statistic");n&&(a=!0,o[e]={format:n,name:i.text()})}),i.statisticCols=!!a&&o}var s=0;o&&t.each(o,function(t){o[t].total=0,o[t].checkedTotal=0}),i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr").each(function(){var e=t(this),i=e.hasClass("checked"),n=e.children("td");i&&s++,o&&t.each(o,function(t){var e=parseFloat(n.eq(t).text());isNaN(e)&&(e=0),o[t].total+=e,i&&(o[t].checkedTotal+=e)})});var r=[];if(s)r.push(i.lang.selectedItems.format(s));else if(i.defaultStatistic)return void n.html(i.defaultStatistic);o&&t.each(o,function(t){var e=o[t],n=e[s?"checkedTotal":"total"];e.format&&(n=e.format.format(n)),r.push(i.lang.attrTotal.format(e.name,n))}),n.html(r.join(", "))}},r.prototype.updateFixUI=function(e){var i=this,n=(new Date).getTime();if(!e&&(i.lastUpdateCall&&clearTimeout(i.lastUpdateCall),!i.lastUpdateTime||n-i.lastUpdateTime
').append(t('
').addClass(i.attr("class")).append(n.clone())).insertAfter(i)),h){var d=c[0].getBoundingClientRect();l.css({left:d.left,width:c.width(),overflow:"hidden"}),l.find(".fixed-header-copy").css({left:o.left-d.left,position:"relative",minWidth:i.width()}),a||c.data("fixHeaderScroll")||(c.data("fixHeaderScroll",1),i.width()>c.width()&&c.on("scroll",function(){e.fixHeader()}))}else l.css({left:o.left,width:o.width});var u=l.find("th");n.find("th").each(function(e){u.eq(e).css("width",t(this).outerWidth())})}else l.remove()},r.prototype.fixFooter=function(){var e,i=this,n=i.getTable(),o=i.$.find(".table-footer");if(i.isDataTable)e=n[0].getBoundingClientRect();else{var a=n.find("tbody");if(!a.length)return;e=a[0].getBoundingClientRect()}var s=i.options.fixFooter;o.toggleClass("fixed-footer",!!r);var r="function"==typeof s?s(e,o):e.bottom>window.innerHeight-50-("number"==typeof s?s:i.pageFooterHeight||5);o.toggleClass("fixed-footer",!!r),n.toggleClass("with-footer-fixed",!!r),n.trigger("fixFooter",r);var l=t("body"),c=l.hasClass("body-modal");if(r){var h=n.parent(),d=h.is(".table-responsive");o.css({bottom:i.pageFooterHeight||0,left:d?h[0].getBoundingClientRect().left:e.left,width:d?h.width():e.width}),c&&l.css("padding-bottom",40)}else o.css({width:"",left:0,bottom:0}),c&&l.css("padding-bottom",0)},r.prototype.checkAll=function(e){var i=this,n=i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr");n.each(function(){i.checkRow(t(this),e,!0)}),i.updateCheckUI()},r.prototype.checkRow=function(i,n,o){var a=this,s=a.getTable();a.isDataTable&&!i.is(".datatable-row-left")&&(i=s.find('.datatable-row-left[data-index="'+i.data("index")+'"]'));var r=i.find('input[type="checkbox"]');if(r.length&&!r.is(":disabled")){n===e&&(n=!r.is(":checked")),a.isDataTable?s.find('.datatable-row[data-index="'+i.data("index")+'"]').toggleClass("checked",n):i.toggleClass("checked",n);var l=i.data("id");this.checkItems[l]=n,r.prop("checked",n).trigger("change"),o||(i.hasClass("table-parent")&&s.find((a.isDataTable?".fixed-left ":"")+"tbody>tr.parent-"+l).each(function(){a.checkRow(t(this),n,!0)}),a.updateCheckUI())}},r.prototype.updateCheckUI=function(){var e=this,i=e.getTable(),n=i.find(e.isDataTable?".fixed-left tbody>tr":"tbody>tr").not(".group-summary"),o=!1,a=null,s=0,r=!1,l=n.length;n.each(function(n){var c=t(this),h=c.find('input[type="checkbox"]');if(!h.length)return void l--;r=h.is(":checked");var d=e.isDataTable?i.find('.datatable-row[data-index="'+c.data("index")+'"]'):c;d.toggleClass("checked",r),d.toggleClass("row-check-begin",r&&!o),a&&a.toggleClass("row-check-end",!r&&o),r&&(s+=1),a=d,o=r,l===n+1&&d.toggleClass("row-check-end",r)}),e.$.toggleClass("has-row-checked",s>0).find(".check-all").toggleClass("checked",!(!l||s!==l)),e.updateStatistic(),e.options.onCheckChange&&e.options.onCheckChange(),i.trigger("checkChange")},r.DEFAULTS={checkable:!0,checkOnClickRow:!0,ajaxForm:!1,selectable:!0,fixHeader:!a,fixFooter:!a,iframeWidth:900,replaceId:"self",nestLevelIndent:18,nested:!1,preserveNested:!0,hot:!1,iframeModalTrigger:".iframe"},t.fn.table=function(e){return this.each(function(){var n=t(this),o=n.data(i),a="object"==typeof e&&e;o||n.data(i,o=new r(this,a)),"string"==typeof e&&o[e]()})},r.NAME=i,t.fn.table.Constructor=r,t(function(){t('[data-ride="table"]').table()})}(jQuery,void 0),function(t,e,i){t.fn._ajaxForm=t.fn.ajaxForm;var n={timeout:e.config?e.config.timeout:0,dataType:"json",method:"post"},o="";t.fn.enableForm=function(e,n,o){return e===i&&(e=!0),this.each(function(){var i=t(this);n||i.find('[type="submit"]').attr("disabled",e?null:"disabled"),!o&&i.hasClass("load-indicator")&&i.toggleClass("loading",!e),i.toggleClass("form-disabled",!e)})},t.enableForm=function(e,i,n,o){"string"==typeof e||e instanceof t?e=t(e):(o=n,n=i,i=e,e=t("form")),e.enableForm(i!==!1,n,o)},t.disableForm=function(e,i,n){t.enableForm(e,!1,i,n)};var a=function(e,i,n){"string"==typeof i&&(n=i,i=null),n=n||"show",t.zui.messager?t.zui.messager[n](e,i):alert(e)};t.ajaxForm=function(s,r){var l=t(s);if(l.length>1)return l.each(function(){t.ajaxForm(this,r)});"function"==typeof r&&(r={complete:r}),r=t.extend({},n,l.data(),r);var c=r.beforeSubmit,h=r.error,d=r.success,u=r.finish;delete r.finish,delete r.success,delete r.onError,delete r.beforeSubmit,r=t.extend({beforeSubmit:function(n,a,s){if(l.removeClass("form-watched").enableForm(!1),(c&&c(n,a,s))!==!1){var r={},h=a.find('[type="file"]');r.fileapi=h.length&&h[0].files!==i,r.formdata=e.FormData!==i;var d=r.fileapi&&a.find('input[type="file"]:enabled').filter(function(){return""!==t(this).val()}),u=d.length,p="multipart/form-data",f=a.attr("enctype")==p||a.attr("encoding")==p,g=r.fileapi&&r.formdata,m=u&&!g||f&&!r.formdata;m&&(""==o&&(o=s.url),s.url!=o&&(s.url=o),s.url=s.url.indexOf("&")>=0?s.url+"&HTTP_X_REQUESTED_WITH=XMLHttpRequest":s.url+"?HTTP_X_REQUESTED_WITH=XMLHttpRequest")}},success:function(i,n,o){if((d&&d(i,n,o,l))!==!1){try{"string"==typeof i&&(i=JSON.parse(i))}catch(s){}if(null===i||"object"!=typeof i)return i?alert(i):a("No response.","danger");var c=r.responser?t(r.responser):l.find(".form-responser");c.length||(c=t("#responser"));var h=i.message,p=function(){var n=i.callback;if(n){var o=n.indexOf("("),a=(o>0?n.substr(0,o):n).split("."),s=e,r=a[0]; -a.length>1&&(r=a[1],"top"===a[0]?s=e.top:"parent"===a[0]&&(s=e.parent));var c=s[r];if("function"==typeof c){var h=[];return o>0&&")"==n[n.length-1]&&(h=t.parseJSON("["+n.substring(o+1,n.length-1)+"]")),h.push(i),c.apply(l,h)}}};if("success"===i.result){var f=r.locate||i.locate,g=r.closeModal||i.closeModal,m=r.ajaxReload||i.ajaxReload;if(l.enableForm(!0,!!(f||g||m)),h){var v=l.find('[type="submit"]').first(),y=!1;v.length&&(v.popover({container:"body",trigger:"manual",content:h,tipClass:"popover-in-modal popover-success popover-form-result",placement:i.placement||v.data("placement")||r.popoverPlacement||"right"}).popover("show"),setTimeout(function(){v.popover("destroy")},r.popoverTime||2e3),y=!0),c.length&&(c.html(''+h+"").show().delay(3e3).fadeOut(100),y=!0),y||a(h,"success")}if(u)return u(i,!0,l);if(g&&setTimeout(t.zui.closeModal,r.closeModalTime||2e3),p()===!1)return;if(f)if("loadInModal"==f){var b=t(".modal");setTimeout(function(){b.load(b.attr("ref"),function(){t(this).find(".modal-dialog").css("width",t(this).data("width")),t.zui.ajustModalPosition()})},1e3)}else"parent"===f||"top"===f?e[f]&&setTimeout(function(){e[f].location.reload()},1200):"reload"===f?setTimeout(function(){e.location.href=e.location.href},1200):setTimeout(function(){t.tabs?t.tabs.open(f):e.location.href=f},1200);if(m){var w=t(m);w.length&&w.load(e.location.href+" "+m,function(){w.find('[data-toggle="modal"]').modalTrigger()})}}else{if(l.enableForm(),"string"==typeof h)c.length?c.html(''+h+"").show().delay(3e3).fadeOut(100):a(h,"danger");else if("object"==typeof h){var x=!1,C=[];t.each(h,function(e,i){var n=t.isArray(i)?i.join(""):i,o=t("#"+e);if(!o.length)return void C.push(n);var a=e+"Label",s=t("#"+a);if(!s.length){var r=o.closest(".input-group").length,l=o.closest("td").length;s=t('
').appendTo(l?o.closest("td"):r?o.closest(".input-group").parent():o.parent())}s.empty().append(n),o.addClass("has-error");var c=function(){var e=t("#"+a);if(e.length)return e.remove(),o.removeClass("has-error"),!0};o.on("change input mousedown",c);var h=t("#"+e+"_chosen");if(h.length&&h.find(".chosen-single,.chosen-choices").addClass("has-error").on("mousedown",function(){c()===!0&&t(this).removeClass("has-error")}),!x){var d=o[0];if(o.hasClass("chosen"))o.trigger("chosen:activate").trigger("chosen:open"),d=o.parent().find(".chosen-container")[0];else if(o.is("textarea")&&o.data("keditor")){var u=o.data("keditor");u.focus(),u.edit.doc.body.focus(),d=o.parent().find(".ke-container")[0]}else o.focus();d.scrollIntoView&&d.scrollIntoView(),console.log("focus first",o),x=!0}}),C.length&&a(C.join(";"),"danger")}if(u)return u(i,!1,l);if(p()===!1)return}}},error:function(t,i,n){if((h&&h(t,i,n,l))!==!1){l.enableForm();var o="timeout"==i||"error"==i?e.lang?e.lang.timeout:i:t.responseText+i+n;a(o,"danger")}}},r),l._ajaxForm(r).data("zui.ajaxform",!0),l.on("click","[data-form-action]",function(){l.attr("action",t(this).data("formAction")).submit()})},t.setAjaxForm=function(e,i,n){t.ajaxForm(e,t.isPlainObject(i)?i:{finish:i,beforeSubmit:n})},t.fn.ajaxForm=function(e){return this.each(function(){t.ajaxForm(this,e)})},t.fn.setInputRequired=function(){return this.each(function(){var e=t(this),i=e.parent();i.is(".input-control,td")?i.addClass("required"):e.is(".chosen")?e.attr("required",null).next(".chosen-container").addClass("required"):i.addClass("required"),e.attr("required",null);var n=i.closest(".input-group");n.length&&1===n.find(".required,input[required],select[required]").length&&n.addClass("required")})},t(function(){t('.form-ajax,form[data-type="ajax"]').ajaxForm(),setTimeout(function(){var i=e.config.requiredFields,n=t("form");i&&(i=i.split(",")),i&&i.length&&t.each(i,function(t,e){n.find("#"+e).attr("required","required")}),n.find("input[required],select[required],textarea[required]").setInputRequired()},400),t('form[target="hiddenwin"]').on("submit",function(){var e=t(this);e.data("zui.ajaxform")||e.enableForm(!1).data("disabledTime",(new Date).getTime())}).on("click",function(){var e=t(this),i=e.data("disabledTime");i&&(new Date).getTime()-i>1e4&&e.enableForm(!0).data("disabledTime",null)})})}(jQuery,window,void 0),function(t){"use strict";var e="zui.searchList",i=function(t,e){if(t&&t.length)for(var i=0;i
').append(s)),i.$menu.append(s),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].scrollIntoViewIfNeeded&&t[0].scrollIntoViewIfNeeded({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,o=void 0===e||null===e||""===e;n.$.toggleClass("has-search-text",!o);var a=n.getItems().removeClass("active");if(o)a.removeClass("hidden");else{var s=e.trim().split(" ");a.each(function(){var e=t(this),n=(e.text()+" "+(e.data("key")||e.data("filter")||"")).trim();e.toggleClass("hidden",!i(s,n))})}n.scrollTo(a.not(".hidden").first().addClass("active")),n.$.trigger("onSearchComplete",e)},n.DEFAULTS={selector:".list-group a:not(.not-list-item)",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof i&&i;a||o.data(e,a=new n(this,s)),"string"==typeof i&&a[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,o){var a=this;a.name=e,a.$=t(n),o=a.options=t.extend({},i.DEFAULTS,this.$.data(),o),a.$.hide(),a.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 o=e.$.next();n=o.hasClass(".label-selector")?o:t('
')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),o=t(this).data("value");e.hasEmptyValue!==!1&&o==n&&(o=e.hasEmptyValue),e.select(o),i.preventDefault()})}n.empty();var a=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),o={label:e.text(),value:e.val()},s=""===o.value||"0"===o.value,r=t(i.labelTemplate||'');i.labelClass&&!s&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",o).attr("data-value",o.value),s&&!o.label?r.addClass("empty").append(''):r.text(o.label).toggleClass("active",a===o.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[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=ts.fileMaxSize&&(c.val(""),(window.bootbox||window).alert(s.fileSizeError.format(n(s.fileMaxSize)))),r.update()}),r.update()};a.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},a.prototype.update=function(){var t=this,e=t.$,i=t.getFile(),o=!i;e.toggleClass("normal",!o).toggleClass("empty",o),i?(t.oldName=i.name,e.find(".file-title").text(i.name).attr("title",i.name),e.find(".file-size").text(n(i.size)),e.find(".file-editbox").val(i.name).attr("size",i.name.length),t.options.onSelect&&t.options.onSelect(i,t)):e.find(".file-editbox").val("")},a.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),o=n.data(e),s="object"==typeof i&&i;o||n.data(e,o=new a(this,s)),"string"==typeof i&&o[i]()})},a.NAME=e,t.fn.fileInput.Constructor=a,t(function(){t('[data-provide="fileInput"]').fileInput()});var s="zui.fileInputList",r=function(e,i){var n=this;n.name=s;var o=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=o.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(s),o="object"==typeof e&&e;n||i.data(s,n=new r(this,o)),"string"==typeof e&&n[e]()})},r.NAME=s,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(e,n,o,a,s,r,l){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid);if(t.tabSession&&!l&&(l=t.tabSession.getTid()),a||(a=config.defaultView),s||(s=!1),o)for("string"==typeof o&&(o=o.split("&")),i=0;i'+d+"")}}t.val()||(time=e(a.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var s=t(this),r=t.extend({},i,s.data()),l=s.find('[name="begin"],.control-time-begin'),c=s.find('[name="end"],.control-time-end'),h=function(){var t=l.val();if(s.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);c.find('option[value="'+i+'"]').length&&c.val(i),r.onChange&&r.onChange(c,i)}};if(s.data("timeSpanControlInit")){if(r.begin){var d=o(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=o(r.end).format("hh:mm");c.find('option[value="'+u+'"]').length&&c.val(u),r.onChange&&r.onChange(c,u)}}else l.on("change",h),a(l,r.begin),a(c,r.end),s.data("timeSpanControlInit",!0);r.end||h()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:a,createTime:o};var s=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var o=t("#searchTypeMenu");o.find("li.selected").removeClass("selected");var a=o.find('a[data-value="'+e+'"]'),s=a.text();a.parent().addClass("selected"),t("#searchTypeName").text(s),i||t("#searchInput").focus()};t.gotoObject=function(e,i){if(e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e)if(i=i.replace(/[^\d]/g,"")){var n=e.split("-");e=n[0];var o=n.length>1?n[1]:"testsuite"===e?"library":"view",a=t.createLink(e,o,"id="+i);t.apps?t.apps.open(a):window.location.href=a}else{var s={zh_cn:"请输入数字ID进行搜索",zh_tw:"請輸入數值ID行搜索"};alert(lang.searchTip||s[t.zui.clientLang()]||"Please enter a numberic id to search")}t("#searchInput").val(i).focus()},t(function(){s(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(t){t?window.top.location.reload():window.location.reload()},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage(1)},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage(1)},t.zui.Picker&&(t.zui.Picker.DEFAULTS.optionRender=function(e,i,n){if("user"===n.options.type){var o=n.options.users;if(!o)return;var a=o[i.value];if(!a)return;if(e.find(".picker-option-text").text(a.realname||a.account),e.hasClass("picker-user-option"))return;return e.prepend(t('
').avatar({user:a})),a.deptName&&e.append(t('').text(a.deptName)),a.roleName&&e.append(t('').text(a.roleName)),e.addClass("picker-user-option")}},t.zui.setUserPickerInfos=function(e){t.zui.Picker.DEFAULTS.users=t.extend({},t.zui.Picker.DEFAULTS.users,e)},t(function(){t(".picker-select[data-pickertype!='remote']").picker({chosenMode:!0}),t("[data-pickertype='remote']").each(function(){var e=t(this).attr("data-pickerremote");t(this).picker({chosenMode:!0,remote:e})}),window.pickerUsers&&t.zui.setUserPickerInfos(window.pickerUsers),t(".user-picker").picker({type:"user"})})),t.chosenDefaultOptions={middle_highlight:!0,disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,max_drop_width:500,max_drop_height:245,no_wrap:!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;e.css("position","relative");var i="down",n=this.container.find(".chosen-drop"),o=this.container.position(),a=n.outerHeight();return o.top>=a&&o.top+31+a>e.outerHeight()&&(i="up"),this.drop_directionFixed=i,i}return"auto"}},t.chosenSimpleOptions=t.extend({},t.chosenDefaultOptions,{disable_search_threshold:6}),t.fn._chosen=t.fn.chosen,t.fn.chosen=function(e){return"string"==typeof e?this._chosen(e):this.each(function(){var i=t(this).addClass("chosen-controled");return i._chosen(t.extend({},i.hasClass("chosen-simple")?t.chosenSimpleOptions:t.chosenDefaultOptions,i.data(),e))})},t.fn.chosen.Constructor=t.fn._chosen.Constructor,t(function(){t(".chosen,.chosen-simple").each(function(){var e=t(this);e.closest(".template").length||e.chosen()})}),t.extend(t.fn.pager.Constructor.DEFAULTS,{maxNavCount:8,prevIcon:"icon-angle-left",nextIcon:"icon-angle-right",firstIcon:"icon-first-page",lastIcon:"icon-last-page",navEllipsisItem:"…",menuDirection:"dropup",pageSizeOptions:[5,10,15,20,25,30,35,40,45,50,100,200,500,1e3,2e3],elements:["total_text","size_menu","first_icon","prev_icon",'
{page}/{totalPage}
',"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.extend(!0,t.zui.Messager.DEFAULTS,{cssClass:"messagger-zt",icons:{success:"check-circle",info:"chat-line",warning:"exclamation-sign",danger:"exclamation-sign"}}),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);if(!n.data("historiesInited")){n.data("historiesInited",1),i=t.extend({},n.data(),i);var o=n.find(".histories-list"),a=!0,s=!1;n.on("click",".btn-reverse",function(){o.children("li").reverseOrder(),a=!a,t(this).find(".icon").toggleClass("icon-arrow-up",a).toggleClass("icon-arrow-down",!a);var e="#lastComment",i=t(e);i.length&&window.KindEditor&&(window.KindEditor.remove(e),i.kindeditor())}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");s=!s,e.toggleClass("icon-plus",!s).toggleClass("icon-minus",s),o.children("li").toggleClass("show-changes",s)}).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"),o=n.hasClass("icon-code");n.toggleClass("icon-code",!o).toggleClass("icon-text",o),e.attr("title",o?i.original:i.textdiff),e.closest("li").toggleClass("show-original",o)}),o.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,c=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(c,e);var o=i.children(".cell"),a={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&&(a={overflow:"hidden",maxHeight:t(window).height()-45})),o.css(a)}};var h=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;c="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");if(i.length){i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(c,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var o=e.find(".sidebar-toggle");if(o.length){var a=function(){var e=o[0].getBoundingClientRect(),i=t(window).height(),n=Math.max(0,Math.floor(Math.min(i-40,e.top+e.height)-Math.max(e.top,0))/2)+(e.top<0?0-e.top:0);o.removeClass("fade").find(".icon").css("top",n+(t.zui.browser.isIE()?(i-80)/2:0))};a(),e.data("init",1).on("sidebar.toggle",a);var s=t.zui.browser.isIE()?1500:0,r=0,l=null,h=function(){var t=Date.now();return l&&(clearTimeout(l),l=null),t-rtr 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"}),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.data()),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()});var d=function(){var e,i,n=t(this),o=t.extend({limitSize:40,suffix:"…"},n.data()),a=n.text();if(a.length>o.limitSize){e=a,i=a.substr(0,o.limitSize)+o.suffix,n.text(i).addClass("limit-text-on");var s=o.toggleBtn?t(o.toggleBtn):n.next(".text-limit-toggle");s.text(s.data("textExpand")),s.on("click",function(){var t=n.toggleClass("limit-text-on").hasClass("limit-text-on");n.text(t?i:e),s.text(s.data(t?"textExpand":"textCollapse"))})}else(o.toggleBtn?t(o.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 o=t(i||window),a=null,s=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),o=n.next(".fixed-head-table");if(i.top<0){var s=e.width();if(o.length){if(a!==s){a=s;var r=o.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var o=t("
").addClass(n.attr("class")),l=e.clone(),r=l.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())}),o.append(l).insertAfter(n)}o.css({left:i.left,width:i.width}).show()}else o.hide()};o.on("scroll",s).on("resize",s),s()}},t(document).on("click","tr[data-url]",function(){var e=t(this),i=e.data("href")||e.data("url");i&&(window.location.href=i)}),"yes"===config.onlybody&&self===parent&&(window.location.href=window.location.href.replace("?onlybody=yes","").replace("&onlybody=yes","")),t(function(){t("body").addClass("m-{currentModule}-{currentMethod}".format(config))});var u,p,f,g,m,v=function(){u||(u=t("#subNavbar"),p=t("#pageNav"),f=t("#pageActions"),g=u.children(".nav"),m=g.outerWidth());var e=u.outerWidth(),i=p.outerWidth()||0,n=f.outerWidth()||0;if(i=i?i+15:0,n=n?n+15:0,!i&&!n)return void g.css({maxWidth:null,left:null,position:"static"});var o=Math.max(300,e-i-n),a=Math.min(o,m),s=(e-a)/2,r=i&&s.btn-toolbar");if(e.length){var i,n,o=e.children(),a=o.length,s=!1,r=null;if(a)for(o.each(function(e){i=t(this),n=i.is(".divider"),n&&!r&&i.hide(),s||n||(s=!0),r=n?null:i,!n||e!==a-1&&0!==e||i.hide()});i.length&&i.is(".divider");)i=i.hide().prev();s||e.hide()}};t(function(){t(".input-group,.btn-group").fixInputGroup(),C()}),window.holders&&t.each(window.holders,function(e){var i=t("#"+e);i.length&&i.is("input")&&i.attr("placeholder",window.holders[e])}),t(function(){var e=t(".table-responsive"),i=t.fixTableResponsive=function(){e.each(function(){this.scrollHeight-3<=this.clientHeight&&this.scrollWidth-3<=this.clientWidth?t(this).addClass("scroll-none").css("overflow","visible"):t(this).removeClass("scroll-none").css("overflow","auto")})};e.length&&(t(window).on("resize",i),setTimeout(i,100))});var _=function(){var e=this,i=t(e),n=i.closest("tr").find("textarea");if(n.length){var o=32;n.each(function(){var e=t(this).closest("td"),i=e.css("height");e.css("height",this.style.height),this.style.height="auto";var n=this.value?this.scrollHeight+2:32;o=Math.max(o,n),e.css("height",i)}),n.css("height",o)}else{e.style.height="auto";var a=e.value?e.scrollHeight+2:32;e.style.height=a+"px"}};t.autoResizeTextarea=function(e){t(e).each(_)},t(function(){t("textarea.autosize").each(_),t(document).on("input paste change","textarea.autosize",_)}),t(function(){var e=t("#dropMenu,.drop-menu");e.length&&e.on("click",".toggle-right-col",function(e){t(this).closest("#dropMenu,.drop-menu").toggleClass("show-right-col"),e.stopPropagation(),e.preventDefault()})});var k="undefined"!=typeof InstallTrigger;t.zui.browser.firefox=k,t("html").toggleClass("is-firefox",k).toggleClass("not-firefox",!k),t(function(){var e=t("#mainContent>.main-col"),i=e.children(".main-actions");if(i.length){var n=i.prev();if(i.length&&n.length){t('
').css("height",i.outerHeight()).insertAfter(i);var o=0,a=function(){var e=n[0].getBoundingClientRect(),s=e.top+e.height+120>t(window).height();if(t("body").toggleClass("main-actions-fixed",s),s){var r=n.width();r?i.width(r):o<10&&setTimeout(a,1e3)}o++};t.resetToolbarPosition=a,a(),t(window).on("resize scroll",a)}}}),t(document).on("show.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&t(e.target).is(".modal")&&window.parent.$("body").addClass("hide-modal-close")}).on("hidden.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&window.parent.$("body").removeClass("hide-modal-close")}).on("loaded.zui.modal",function(e){ -t("body").removeClass("hide-modal-close")}),t(function(){var e=t(".dropdown-menu.with-search");e.length&&(e.find(".menu-search").on("click",function(t){return t.stopPropagation(),!1}),e.on("keyup change paste","input",function(){var e=t(this),i=e.closest(".dropdown-menu.with-search"),n=e.val().toLowerCase(),o=i.find(".option");""==n?o.removeClass("hide"):o.each(function(){var e=t(this);e.toggleClass("hide",e.text().toString().toLowerCase().indexOf(n)<0&&e.data("key").toString().toLowerCase().indexOf(n)<0)})}),e.parents(".dropdown-submenu").one("mouseenter",function(){var e=t(this).find(".dropdown-list")[0];e&&e.getBoundingClientRect&&setTimeout(function(){var t=270,i=e.getBoundingClientRect();i.top<0&&(t=Math.min(270,i.height)+i.top),e.style.maxHeight=Math.min(270,t)+"px"},50)})),t(".dropdown-menu.with-search .menu-search").on("click",function(t){return t.stopPropagation(),!1})})}(jQuery),function(t){function e(){if(!config.skipRedirect&&!window.skipRedirect){var e=window.parent,i=config.currentModule,n=config.currentMethod,o="index"===i&&"index"===n,a="#_single"===location.hash||/(\?|\&)_single/.test(location.search)||o||!t("#mainHeader,#editorNav").length||"tutorial"===i||"install"===i||"upgrade"===i||"user"===i&&("login"===n||"deny"===n)||"my"===i&&"changepassword"===n||t("body").hasClass("allow-self-open"),s=location.href;if(e===window&&!a){var r=location.pathname+location.search+location.hash;return void(location.href=t.createLink("index","index","")+"#app="+encodeURIComponent(r))}if(e!==window&&e.$.apps){o&&e.location.reload();var l=window.name;if(0===l.indexOf("app-")){t.apps=window.apps=e.$.apps;var c=l.substring(4);t.appCode=c,t(document).on("click",function(t){var i=e.document.getElementById(window.name);if(i){var n=e.document.getElementById(i.name)||i;n&&n.dispatchEvent(new Event(t.type,{bubbles:!0}))}}).on("click","a,.open-in-app,.show-in-app",function(e){var i=t(this);if(!i.is("[data-modal],[data-toggle],[data-ride],[data-tab],.iframe,.not-in-app,[target]")&&!i.data("zui.modaltrigger")){var n=i.hasClass("show-in-app")?"":i.attr("href")||(i.is("a")?"":i.data("url")),o=i.data("app")||i.data("group");if(n){if(0===n.indexOf("javascript:")||"#"===n[0])return;var a=t.parseLink(n);if(a.external)return;if("index"===a.moduleName&&"index"===a.methodName)return window.location.reload(),void e.preventDefault()}else if(!o)return;o||(o=t.apps.getAppCode(n)),o&&("help"===o&&(t.apps.appsMap.help.text=i.text(),t.apps.appsMap.help.url||(t.apps.appsMap.help.url=n)),t.apps.open(n,o)&&e.preventDefault())}}),t.apps.updateUrl(c,s,document.title)}}}}function i(){var e=t("#navbar>.nav");if(e.length){var i=t("#heading"),n=+i.css("left").replace("px",""),o=i.outerWidth(),a=e.width(),s=t("#mainHeader>.container").width()-2*n,r=Math.floor((s-a)/2);e.css("marginLeft",r>>0;if(0===o)return!1;for(var a=0|e,s=Math.max(a>=0?a:o-Math.abs(a),0);s1&&("?"===e[0]&&(e=e.substr(1)),e.split("&").forEach(function(t){var e=t.split("=",2);if(e.length>1)try{i[e[0]]=decodeURIComponent(e[1])}catch(n){i[e[0]]=""}else i[e[0]]=""})),t?i[t]:i},t.parseLink=function(e){if(!e)return{};var i=0===e.indexOf("http:")||0===e.indexOf("https:");if(i){var n=window.location.origin;if(e.indexOf(n)<0)return{external:!0,url:e};e=e.substr((n+config.webRoot).length)}var o=e.split("#"),a=o[0].split("?"),s=a[1],r=s?t.getSearchParam("",s):{},l=a[0],c={url:e,isOnlyBody:"yes"===r.onlybody,vars:[],hash:o[1]||"",params:r,tid:r.tid||""};if("GET"===config.requestType){c.moduleName=r[config.moduleVar]||"index",c.methodName=r[config.methodVar]||"index",c.viewType=r[config.viewVar]||config.defaultView;for(var h in r)h!==config.moduleVar&&h!==config.methodVar&&h!==config.viewVar&&"onlybody"!==h&&"tid"!==h&&c.vars.push([h,r[h]])}else{var d=l.lastIndexOf("/");d===l.length-1&&(l=l.substr(0,d),d=l.lastIndexOf("/")),d>=0&&(l=l.substr(d+1));var u=l.lastIndexOf(".");u>=0?(c.viewType=l.substr(u+1),l=l.substr(0,u)):c.viewType=config.defaultView;var p=l.split(config.requestFix);if(c.moduleName=p[0]||"index",c.methodName=p[1]||"index",p.length>2)for(var f=2;f.nav>li").length>10&&(i(),t(window).on("resize",i)),setTimeout(n,1e3)})}(jQuery),function(t){"use strict";function e(e,i){"object"!=typeof i&&(i={user:i});var n=t(e);i=t.extend({},n.data(),i);var o=i.user;"string"==typeof o&&(o={account:o});var a={},s=i.size;s&&(a.width=s,a.height=s,a.lineHeight=s,Number.isNaN(+s)||n.addClass("size-"+s));var r=!!o.avatar;if(n.toggleClass("has-image",r).toggleClass("has-text",!r),n.empty(),r)n.append(t("").attr("src",o.avatar));else{var l=t.zui.strCode(o.account)*(i.hueDistance||43)%360;a.background="hsl("+l+","+(i.saturation||"40%")+","+(i.lightness||"60%")+")",Number.isNaN(+s)||(a.fontSize=Math.round(s/2)+"px");var c=o.name||o.realname||o.account;c=/^[\u4e00-\u9fa5\s]+$/.test(c)?c.length<=2?c:c.substring(c.length-2):/^[A-Za-z\d\s]+$/.test(c)?c[0].toUpperCase():c.length<=2?c:c.substring(0,2),n.append(t('').text(c))}return n.css(a)}t.fn.avatar=function(t){return this.each(function(){e(this,t)})}}(jQuery),$.zui.lang("de",{"zui.pager":{pageOfText:"Seite {0}",prev:"Zurück",next:"Nächste Seite",first:"Erste Seite",last:"Letzte Seite","goto":"Goto",pageOf:"Seite {page}",totalPage:"{totalPage} Seiten",totalCount:"Total: {recTotal} Artikel",pageSize:"{recPerPage} Artikel pro Seite",itemsRange:"Seiten {start} bis {end}",pageOfTotal:"Seite {page}/{totalPage}"},"zui.boards":{append2end:"Gehen Sie zum Ende"},"zui.browser":{tip:"Online. Sorgenfrei. Aktualisiere deinen Browser noch heute!"},"zui.calendar":{weekNames:["Son","Mon","Die","Mit","Don","Fri","Sam"],monthNames:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",year:"{0}Jahr",month:"{0}Monat",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Kein Icon]",commonIcons:"Gemeinsame Symbole",webIcons:"Web-Symbol",editorIcons:"Editor-Symbol",directionalIcons:"Pfeil Zusammenfluss",otherIcons:"Andere Symbole"},"zui.colorPicker":{errorTip:"Kein gültiger Farbwert"},"zui.datagrid":{errorCannotGetDataFromRemote:"Daten vom Remote-Server ({0}) können nicht abgerufen werden.",errorCannotHandleRemoteData:"Die vom Remote-Server zurückgegebenen Daten können nicht verarbeitet werden."},"zui.guideViewer":{prevStep:"Vorheriger Schritt",nextStep:"Nächster Schritt"},"zui.tabs":{reload:"Neu laden",close:"Schliessen",closeOthers:"Schließen Sie andere Registerkarten",closeRight:"Schließen Sie die rechte Registerkarte",reopenLast:"Letzten geschlossenen Tab wiederherstellen",errorCannotFetchFromRemote:"Inhalt kann nicht vom Remote-Server abgerufen werden ({0})."},"zui.uploader":{},datetimepicker:{days:["Sonntag","Montag","Diensteg","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["Son","Mon","Die","Mit","Don","Fri","Sam"],daysMin:["Son","Mon","Die","Mit","Don","Fri","Sam"],months:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",suffix:[],meridiem:[]},chosen:{no_results_text:"Nicht gefunden"},bootbox:{OK:"OK",CANCEL:"Stornieren",CONFIRM:"Bestätigen"}}),$.zui.lang("fr",{"zui.pager":{pageOfText:"Page {0}",prev:"Prev",next:"Suivant",first:"First",last:"Last","goto":"Goto",pageOf:"Page {page}",totalPage:"{totalPage} pages",totalCount:"Total: {recTotal} items",pageSize:"{recPerPage} per page",itemsRange:"De {start} à {end}",pageOfTotal:"Page {page} de {totalPage}"},"zui.boards":{append2end:"Aller jusqu'au bout"},"zui.browser":{tip:"Naviguez sans crainte sur Internet. Mettez votre navigateur à jour dès aujourd'hui!"},"zui.calendar":{weekNames:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],monthNames:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",year:"{0} Année",month:"{0} Mois",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Aucune icône]",commonIcons:"Icônes communes",webIcons:"Icône Web",editorIcons:"Icône de l'éditeur",directionalIcons:"Flèche confluence",otherIcons:"Autres icônes"},"zui.colorPicker":{errorTip:"Pas une valeur de couleur valide"},"zui.datagrid":{errorCannotGetDataFromRemote:"Impossible d'obtenir les données du serveur distant ({0}).",errorCannotHandleRemoteData:"Impossible de traiter les données renvoyées par le serveur distant."},"zui.guideViewer":{prevStep:"Étape précédente",nextStep:"Prochaine étape"},"zui.tabs":{reload:"Recharger",close:"Fermer",closeOthers:"Fermez les autres onglets",closeRight:"Fermer l'onglet de droite",reopenLast:"Restaurer le dernier onglet fermé",errorCannotFetchFromRemote:"Impossible d'obtenir le contenu du serveur distant ({0})."},"zui.uploader":{},datetimepicker:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",suffix:[],meridiem:[]},chosen:{no_results_text:"Pas trouvé"},bootbox:{OK:"D'accord",CANCEL:"Annuler",CONFIRM:"Confirmer"}}); \ No newline at end of file +a.length>1&&(r=a[1],"top"===a[0]?s=e.top:"parent"===a[0]&&(s=e.parent));var c=s[r];if("function"==typeof c){var h=[];return o>0&&")"==n[n.length-1]&&(h=t.parseJSON("["+n.substring(o+1,n.length-1)+"]")),h.push(i),c.apply(l,h)}}};if("success"===i.result){var f=r.locate||i.locate,g=r.closeModal||i.closeModal,m=r.ajaxReload||i.ajaxReload;if(l.enableForm(!0,!!(f||g||m)),h){var v=l.find('[type="submit"]').first(),y=!1;v.length&&(v.popover({container:"body",trigger:"manual",content:h,tipClass:"popover-in-modal popover-success popover-form-result",placement:i.placement||v.data("placement")||r.popoverPlacement||"right"}).popover("show"),setTimeout(function(){v.popover("destroy")},r.popoverTime||2e3),y=!0),c.length&&(c.html(''+h+"").show().delay(3e3).fadeOut(100),y=!0),y||a(h,"success")}if(u)return u(i,!0,l);if(g&&setTimeout(t.zui.closeModal,r.closeModalTime||2e3),p()===!1)return;if(f)if("loadInModal"==f){var b=t(".modal");setTimeout(function(){b.load(b.attr("ref"),function(){t(this).find(".modal-dialog").css("width",t(this).data("width")),t.zui.ajustModalPosition()})},1e3)}else"parent"===f||"top"===f?e[f]&&setTimeout(function(){e[f].location.reload()},1200):"reload"===f?setTimeout(function(){e.location.href=e.location.href},1200):setTimeout(function(){t.tabs?t.tabs.open(f):e.location.href=f},1200);if(m){var w=t(m);w.length&&w.load(e.location.href+" "+m,function(){w.find('[data-toggle="modal"]').modalTrigger()})}}else{if(l.enableForm(),"string"==typeof h)c.length?c.html(''+h+"").show().delay(3e3).fadeOut(100):a(h,"danger");else if("object"==typeof h){var x=!1,C=[];t.each(h,function(e,i){var n=t.isArray(i)?i.join(""):i,o=t("#"+e);if(!o.length)return void C.push(n);var a=e+"Label",s=t("#"+a);if(!s.length){var r=o.closest(".input-group").length,l=o.closest("td").length;s=t('
').appendTo(l?o.closest("td"):r?o.closest(".input-group").parent():o.parent())}s.empty().append(n),o.addClass("has-error");var c=function(){var e=t("#"+a);if(e.length)return e.remove(),o.removeClass("has-error"),!0};o.on("change input mousedown",c);var h=t("#"+e+"_chosen");if(h.length&&h.find(".chosen-single,.chosen-choices").addClass("has-error").on("mousedown",function(){c()===!0&&t(this).removeClass("has-error")}),!x){var d=o[0];if(o.hasClass("chosen"))o.trigger("chosen:activate").trigger("chosen:open"),d=o.parent().find(".chosen-container")[0];else if(o.is("textarea")&&o.data("keditor")){var u=o.data("keditor");u.focus(),u.edit.doc.body.focus(),d=o.parent().find(".ke-container")[0]}else o.focus();d.scrollIntoView&&d.scrollIntoView(),console.log("focus first",o),x=!0}}),C.length&&a(C.join(";"),"danger")}if(u)return u(i,!1,l);if(p()===!1)return}}},error:function(t,i,n){if((h&&h(t,i,n,l))!==!1){l.enableForm();var o="timeout"==i||"error"==i?e.lang?e.lang.timeout:i:t.responseText+i+n;a(o,"danger")}}},r),l._ajaxForm(r).data("zui.ajaxform",!0),l.on("click","[data-form-action]",function(){l.attr("action",t(this).data("formAction")).submit()})},t.setAjaxForm=function(e,i,n){t.ajaxForm(e,t.isPlainObject(i)?i:{finish:i,beforeSubmit:n})},t.fn.ajaxForm=function(e){return this.each(function(){t.ajaxForm(this,e)})},t.fn.setInputRequired=function(){return this.each(function(){var e=t(this),i=e.parent();i.is(".input-control,td")?i.addClass("required"):e.is(".chosen")?e.attr("required",null).next(".chosen-container").addClass("required"):i.addClass("required"),e.attr("required",null);var n=i.closest(".input-group");n.length&&1===n.find(".required,input[required],select[required]").length&&n.addClass("required")})},t(function(){t('.form-ajax,form[data-type="ajax"]').ajaxForm(),setTimeout(function(){var i=e.config.requiredFields,n=t("form");i&&(i=i.split(",")),i&&i.length&&t.each(i,function(t,e){n.find("#"+e).attr("required","required")}),n.find("input[required],select[required],textarea[required]").setInputRequired()},400),t('form[target="hiddenwin"]').on("submit",function(){var e=t(this);e.data("zui.ajaxform")||e.enableForm(!1).data("disabledTime",(new Date).getTime())}).on("click",function(){var e=t(this),i=e.data("disabledTime");i&&(new Date).getTime()-i>1e4&&e.enableForm(!0).data("disabledTime",null)})})}(jQuery,window,void 0),function(t){"use strict";var e="zui.searchList",i=function(t,e){if(t&&t.length)for(var i=0;i
').append(s)),i.$menu.append(s),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].scrollIntoViewIfNeeded&&t[0].scrollIntoViewIfNeeded({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,o=void 0===e||null===e||""===e;n.$.toggleClass("has-search-text",!o);var a=n.getItems().removeClass("active");if(o)a.removeClass("hidden");else{var s=e.trim().split(" ");a.each(function(){var e=t(this),n=(e.text()+" "+(e.data("key")||e.data("filter")||"")).trim();e.toggleClass("hidden",!i(s,n))})}n.scrollTo(a.not(".hidden").first().addClass("active")),n.$.trigger("onSearchComplete",e)},n.DEFAULTS={selector:".list-group a:not(.not-list-item)",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof i&&i;a||o.data(e,a=new n(this,s)),"string"==typeof i&&a[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,o){var a=this;a.name=e,a.$=t(n),o=a.options=t.extend({},i.DEFAULTS,this.$.data(),o),a.$.hide(),a.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 o=e.$.next();n=o.hasClass(".label-selector")?o:t('
')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),o=t(this).data("value");e.hasEmptyValue!==!1&&o==n&&(o=e.hasEmptyValue),e.select(o),i.preventDefault()})}n.empty();var a=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),o={label:e.text(),value:e.val()},s=(""===o.value||"0"===o.value)&&!o.label,r=t(i.labelTemplate||'');i.labelClass&&!s&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",o).attr("data-value",o.value),s?r.addClass("empty").append(''):r.text(o.label).toggleClass("active",a===o.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[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=ts.fileMaxSize&&(c.val(""),(window.bootbox||window).alert(s.fileSizeError.format(n(s.fileMaxSize)))),r.update()}),r.update()};a.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},a.prototype.update=function(){var t=this,e=t.$,i=t.getFile(),o=!i;e.toggleClass("normal",!o).toggleClass("empty",o),i?(t.oldName=i.name,e.find(".file-title").text(i.name).attr("title",i.name),e.find(".file-size").text(n(i.size)),e.find(".file-editbox").val(i.name).attr("size",i.name.length),t.options.onSelect&&t.options.onSelect(i,t)):e.find(".file-editbox").val("")},a.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),o=n.data(e),s="object"==typeof i&&i;o||n.data(e,o=new a(this,s)),"string"==typeof i&&o[i]()})},a.NAME=e,t.fn.fileInput.Constructor=a,t(function(){t('[data-provide="fileInput"]').fileInput()});var s="zui.fileInputList",r=function(e,i){var n=this;n.name=s;var o=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=o.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(s),o="object"==typeof e&&e;n||i.data(s,n=new r(this,o)),"string"==typeof e&&n[e]()})},r.NAME=s,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(e,n,o,a,s,r,l){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid);if(t.tabSession&&!l&&(l=t.tabSession.getTid()),a||(a=config.defaultView),s||(s=!1),o)for("string"==typeof o&&(o=o.split("&")),i=0;i'+d+"")}}t.val()||(time=e(a.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var s=t(this),r=t.extend({},i,s.data()),l=s.find('[name="begin"],.control-time-begin'),c=s.find('[name="end"],.control-time-end'),h=function(){var t=l.val();if(s.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);c.find('option[value="'+i+'"]').length&&c.val(i),r.onChange&&r.onChange(c,i)}};if(s.data("timeSpanControlInit")){if(r.begin){var d=o(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=o(r.end).format("hh:mm");c.find('option[value="'+u+'"]').length&&c.val(u),r.onChange&&r.onChange(c,u)}}else l.on("change",h),a(l,r.begin),a(c,r.end),s.data("timeSpanControlInit",!0);r.end||h()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:a,createTime:o};var s=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var o=t("#searchTypeMenu");o.find("li.selected").removeClass("selected");var a=o.find('a[data-value="'+e+'"]'),s=a.text();a.parent().addClass("selected"),t("#searchTypeName").text(s),i||t("#searchInput").focus()};t.gotoObject=function(e,i){if(e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e)if(i=i.replace(/[^\d]/g,"")){var n=e.split("-");e=n[0];var o=n.length>1?n[1]:"testsuite"===e?"library":"view",a=t.createLink(e,o,"id="+i);t.apps?t.apps.open(a):window.location.href=a}else{var s={zh_cn:"请输入数字ID进行搜索",zh_tw:"請輸入數值ID行搜索"};alert(lang.searchTip||s[t.zui.clientLang()]||"Please enter a numberic id to search")}t("#searchInput").val(i).focus()},t(function(){s(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(t){t?window.top.location.reload():window.location.reload()},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage(1)},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage(1)},t.zui.Picker&&(t.zui.Picker.DEFAULTS.optionRender=function(e,i,n){if("user"===n.options.type){var o=n.options.users;if(!o)return;var a=o[i.value];if(!a)return;if(e.find(".picker-option-text").text(a.realname||a.account),e.hasClass("picker-user-option"))return;return e.prepend(t('
').avatar({user:a})),a.deptName&&e.append(t('').text(a.deptName)),a.roleName&&e.append(t('').text(a.roleName)),e.addClass("picker-user-option")}},t.zui.setUserPickerInfos=function(e){t.zui.Picker.DEFAULTS.users=t.extend({},t.zui.Picker.DEFAULTS.users,e)},t(function(){t(".picker-select[data-pickertype!='remote']").picker({chosenMode:!0}),t("[data-pickertype='remote']").each(function(){var e=t(this).attr("data-pickerremote");t(this).picker({chosenMode:!0,remote:e})}),window.pickerUsers&&t.zui.setUserPickerInfos(window.pickerUsers),t(".user-picker").picker({type:"user"})})),t.chosenDefaultOptions={middle_highlight:!0,disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,max_drop_width:500,max_drop_height:245,no_wrap:!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;e.css("position","relative");var i="down",n=this.container.find(".chosen-drop"),o=this.container.position(),a=n.outerHeight();return o.top>=a&&o.top+31+a>e.outerHeight()&&(i="up"),this.drop_directionFixed=i,i}return"auto"}},t.chosenSimpleOptions=t.extend({},t.chosenDefaultOptions,{disable_search_threshold:6}),t.fn._chosen=t.fn.chosen,t.fn.chosen=function(e){return"string"==typeof e?this._chosen(e):this.each(function(){var i=t(this).addClass("chosen-controled");return i._chosen(t.extend({},i.hasClass("chosen-simple")?t.chosenSimpleOptions:t.chosenDefaultOptions,i.data(),e))})},t.fn.chosen.Constructor=t.fn._chosen.Constructor,t(function(){t(".chosen,.chosen-simple").each(function(){var e=t(this);e.closest(".template").length||e.chosen()})}),t.extend(t.fn.pager.Constructor.DEFAULTS,{maxNavCount:8,prevIcon:"icon-angle-left",nextIcon:"icon-angle-right",firstIcon:"icon-first-page",lastIcon:"icon-last-page",navEllipsisItem:"…",menuDirection:"dropup",pageSizeOptions:[5,10,15,20,25,30,35,40,45,50,100,200,500,1e3,2e3],elements:["total_text","size_menu","first_icon","prev_icon",'
{page}/{totalPage}
',"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.extend(!0,t.zui.Messager.DEFAULTS,{cssClass:"messagger-zt",icons:{success:"check-circle",info:"chat-line",warning:"exclamation-sign",danger:"exclamation-sign"}}),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);if(!n.data("historiesInited")){n.data("historiesInited",1),i=t.extend({},n.data(),i);var o=n.find(".histories-list"),a=!0,s=!1;n.on("click",".btn-reverse",function(){o.children("li").reverseOrder(),a=!a,t(this).find(".icon").toggleClass("icon-arrow-up",a).toggleClass("icon-arrow-down",!a);var e="#lastComment",i=t(e);i.length&&window.KindEditor&&(window.KindEditor.remove(e),i.kindeditor())}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");s=!s,e.toggleClass("icon-plus",!s).toggleClass("icon-minus",s),o.children("li").toggleClass("show-changes",s)}).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"),o=n.hasClass("icon-code");n.toggleClass("icon-code",!o).toggleClass("icon-text",o),e.attr("title",o?i.original:i.textdiff),e.closest("li").toggleClass("show-original",o)}),o.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,c=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(c,e);var o=i.children(".cell"),a={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&&(a={overflow:"hidden",maxHeight:t(window).height()-45})),o.css(a)}};var h=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;c="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");if(i.length){i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(c,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var o=e.find(".sidebar-toggle");if(o.length){var a=function(){var e=o[0].getBoundingClientRect(),i=t(window).height(),n=Math.max(0,Math.floor(Math.min(i-40,e.top+e.height)-Math.max(e.top,0))/2)+(e.top<0?0-e.top:0);o.removeClass("fade").find(".icon").css("top",n+(t.zui.browser.isIE()?(i-80)/2:0))};a(),e.data("init",1).on("sidebar.toggle",a);var s=t.zui.browser.isIE()?1500:0,r=0,l=null,h=function(){var t=Date.now();return l&&(clearTimeout(l),l=null),t-rtr 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"}),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.data()),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()}),t.fixedTableHead=window.fixedTableHead=function(e,i){var n=t(e);if(n.is("table")||(n=n.find("table")),n.length){var o=t(i||window),a=null,s=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),o=n.next(".fixed-head-table");if(i.top<0){var s=e.width();if(o.length){if(a!==s){a=s;var r=o.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var o=t("
").addClass(n.attr("class")),l=e.clone(),r=l.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())}),o.append(l).insertAfter(n)}o.css({left:i.left,width:i.width}).show()}else o.hide()};o.on("scroll",s).on("resize",s),s()}},t(document).on("click","tr[data-url]",function(){var e=t(this),i=e.data("href")||e.data("url");i&&(window.location.href=i)}),"yes"===config.onlybody&&self===parent&&(window.location.href=window.location.href.replace("?onlybody=yes","").replace("&onlybody=yes","")),t(function(){t("body").addClass("m-{currentModule}-{currentMethod}".format(config))});var d,u,p,f,g,m=function(){d||(d=t("#subNavbar"),u=t("#pageNav"),p=t("#pageActions"),f=d.children(".nav"),g=f.outerWidth());var e=d.outerWidth(),i=u.outerWidth()||0,n=p.outerWidth()||0;if(i=i?i+15:0,n=n?n+15:0,!i&&!n)return void f.css({maxWidth:null,left:null,position:"static"});var o=Math.max(300,e-i-n),a=Math.min(o,g),s=(e-a)/2,r=i&&s.btn-toolbar");if(e.length){var i,n,o=e.children(),a=o.length,s=!1,r=null;if(a)for(o.each(function(e){i=t(this),n=i.is(".divider"),n&&!r&&i.hide(),s||n||(s=!0),r=n?null:i,!n||e!==a-1&&0!==e||i.hide()});i.length&&i.is(".divider");)i=i.hide().prev();s||e.hide()}};t(function(){t(".input-group,.btn-group").fixInputGroup(),x()}),window.holders&&t.each(window.holders,function(e){var i=t("#"+e);i.length&&i.is("input")&&i.attr("placeholder",window.holders[e])}),t(function(){var e=t(".table-responsive"),i=t.fixTableResponsive=function(){e.each(function(){this.scrollHeight-3<=this.clientHeight&&this.scrollWidth-3<=this.clientWidth?t(this).addClass("scroll-none").css("overflow","visible"):t(this).removeClass("scroll-none").css("overflow","auto")})};e.length&&(t(window).on("resize",i),setTimeout(i,100))});var C=function(){var e=this,i=t(e),n=i.closest("tr").find("textarea");if(n.length){var o=32;n.each(function(){var e=t(this).closest("td"),i=e.css("height");e.css("height",this.style.height),this.style.height="auto";var n=this.value?this.scrollHeight+2:32;o=Math.max(o,n),e.css("height",i)}),n.css("height",o)}else{e.style.height="auto";var a=e.value?e.scrollHeight+2:32;e.style.height=a+"px"}};t.autoResizeTextarea=function(e){t(e).each(C)},t(function(){t("textarea.autosize").each(C),t(document).on("input paste change","textarea.autosize",C)}),t(function(){var e=t("#dropMenu,.drop-menu");e.length&&e.on("click",".toggle-right-col",function(e){t(this).closest("#dropMenu,.drop-menu").toggleClass("show-right-col"),e.stopPropagation(),e.preventDefault()})});var _="undefined"!=typeof InstallTrigger;t.zui.browser.firefox=_,t("html").toggleClass("is-firefox",_).toggleClass("not-firefox",!_),t(function(){var e=t("#mainContent>.main-col"),i=e.children(".main-actions");if(i.length){var n=i.prev();if(i.length&&n.length){t('
').css("height",i.outerHeight()).insertAfter(i);var o=0,a=function(){var e=n[0].getBoundingClientRect(),s=e.top+e.height+120>t(window).height();if(t("body").toggleClass("main-actions-fixed",s),s){var r=n.width();r?i.width(r):o<10&&setTimeout(a,1e3)}o++};t.resetToolbarPosition=a,a(),t(window).on("resize scroll",a)}}}),t(document).on("show.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&t(e.target).is(".modal")&&window.parent.$("body").addClass("hide-modal-close")}).on("hidden.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&window.parent.$("body").removeClass("hide-modal-close")}).on("loaded.zui.modal",function(e){t("body").removeClass("hide-modal-close")}),t(function(){var e=t(".dropdown-menu.with-search");e.length&&(e.find(".menu-search").on("click",function(t){return t.stopPropagation(),!1}),e.on("keyup change paste","input",function(){var e=t(this),i=e.closest(".dropdown-menu.with-search"),n=e.val().toLowerCase(),o=i.find(".option");""==n?o.removeClass("hide"):o.each(function(){var e=t(this);e.toggleClass("hide",e.text().toString().toLowerCase().indexOf(n)<0&&e.data("key").toString().toLowerCase().indexOf(n)<0)})}),e.parents(".dropdown-submenu").one("mouseenter",function(){var e=t(this).find(".dropdown-list")[0]; +e&&e.getBoundingClientRect&&setTimeout(function(){var t=270,i=e.getBoundingClientRect();i.top<0&&(t=Math.min(270,i.height)+i.top),e.style.maxHeight=Math.min(270,t)+"px"},50)})),t(".dropdown-menu.with-search .menu-search").on("click",function(t){return t.stopPropagation(),!1})})}(jQuery),function(t){function e(){if(!config.skipRedirect&&!window.skipRedirect){var e=window.parent,i=config.currentModule,n=config.currentMethod,o="index"===i&&"index"===n,a="#_single"===location.hash||/(\?|\&)_single/.test(location.search)||o||!t("#mainHeader,#editorNav").length||"tutorial"===i||"install"===i||"upgrade"===i||"user"===i&&("login"===n||"deny"===n)||"my"===i&&"changepassword"===n||t("body").hasClass("allow-self-open"),s=location.href;if(e===window&&!a){var r=location.pathname+location.search+location.hash;return void(location.href=t.createLink("index","index","")+"#app="+encodeURIComponent(r))}if(e!==window&&e.$.apps){o&&e.location.reload();var l=window.name;if(0===l.indexOf("app-")){t.apps=window.apps=e.$.apps;var c=l.substring(4);t.appCode=c,t(document).on("click",function(t){var i=e.document.getElementById(window.name);if(i){var n=e.document.getElementById(i.name)||i;n&&n.dispatchEvent(new Event(t.type,{bubbles:!0}))}}).on("click","a,.open-in-app,.show-in-app",function(e){var i=t(this);if(!i.is("[data-modal],[data-toggle],[data-ride],[data-tab],.iframe,.not-in-app,[target]")&&!i.data("zui.modaltrigger")){var n=i.hasClass("show-in-app")?"":i.attr("href")||(i.is("a")?"":i.data("url")),o=i.data("app")||i.data("group");if(n){if(0===n.indexOf("javascript:")||"#"===n[0])return;var a=t.parseLink(n);if(a.external)return;if("index"===a.moduleName&&"index"===a.methodName)return window.location.reload(),void e.preventDefault()}else if(!o)return;o||(o=t.apps.getAppCode(n)),o&&("help"===o&&(t.apps.appsMap.help.text=i.text(),t.apps.appsMap.help.url||(t.apps.appsMap.help.url=n)),t.apps.open(n,o)&&e.preventDefault())}}),t.apps.updateUrl(c,s,document.title)}}}}function i(){var e=t("#navbar>.nav");if(e.length){var i=t("#heading"),n=+i.css("left").replace("px",""),o=i.outerWidth(),a=e.width(),s=t("#mainHeader>.container").width()-2*n,r=Math.floor((s-a)/2);e.css("marginLeft",r>>0;if(0===o)return!1;for(var a=0|e,s=Math.max(a>=0?a:o-Math.abs(a),0);s1&&("?"===e[0]&&(e=e.substr(1)),e.split("&").forEach(function(t){var e=t.split("=",2);if(e.length>1)try{i[e[0]]=decodeURIComponent(e[1])}catch(n){i[e[0]]=""}else i[e[0]]=""})),t?i[t]:i},t.parseLink=function(e){if(!e)return{};var i=0===e.indexOf("http:")||0===e.indexOf("https:");if(i){var n=window.location.origin;if(e.indexOf(n)<0)return{external:!0,url:e};e=e.substr((n+config.webRoot).length)}var o=e.split("#"),a=o[0].split("?"),s=a[1],r=s?t.getSearchParam("",s):{},l=a[0],c={url:e,isOnlyBody:"yes"===r.onlybody,vars:[],hash:o[1]||"",params:r,tid:r.tid||""};if("GET"===config.requestType){c.moduleName=r[config.moduleVar]||"index",c.methodName=r[config.methodVar]||"index",c.viewType=r[config.viewVar]||config.defaultView;for(var h in r)h!==config.moduleVar&&h!==config.methodVar&&h!==config.viewVar&&"onlybody"!==h&&"tid"!==h&&c.vars.push([h,r[h]])}else{var d=l.lastIndexOf("/");d===l.length-1&&(l=l.substr(0,d),d=l.lastIndexOf("/")),d>=0&&(l=l.substr(d+1));var u=l.lastIndexOf(".");u>=0?(c.viewType=l.substr(u+1),l=l.substr(0,u)):c.viewType=config.defaultView;var p=l.split(config.requestFix);if(c.moduleName=p[0]||"index",c.methodName=p[1]||"index",p.length>2)for(var f=2;f.nav>li").length>10&&(i(),t(window).on("resize",i)),setTimeout(n,1e3)})}(jQuery),function(t){"use strict";function e(e,i){"object"!=typeof i&&(i={user:i});var n=t(e);i=t.extend({},n.data(),i);var o=i.user;"string"==typeof o&&(o={account:o});var a={},s=i.size;s&&(a.width=s,a.height=s,a.lineHeight=s,Number.isNaN(+s)||n.addClass("size-"+s));var r=!!o.avatar;if(n.toggleClass("has-image",r).toggleClass("has-text",!r),n.empty(),r)n.append(t("").attr("src",o.avatar));else{var l=t.zui.strCode(o.account)*(i.hueDistance||43)%360;a.background="hsl("+l+","+(i.saturation||"40%")+","+(i.lightness||"60%")+")",Number.isNaN(+s)||(a.fontSize=Math.round(s/2)+"px");var c=o.name||o.realname||o.account;c=/^[\u4e00-\u9fa5\s]+$/.test(c)?c.length<=2?c:c.substring(c.length-2):/^[A-Za-z\d\s]+$/.test(c)?c[0].toUpperCase():c.length<=2?c:c.substring(0,2),n.append(t('').text(c))}return n.css(a)}t.fn.avatar=function(t){return this.each(function(){e(this,t)})}}(jQuery),$.zui.lang("de",{"zui.pager":{pageOfText:"Seite {0}",prev:"Zurück",next:"Nächste Seite",first:"Erste Seite",last:"Letzte Seite","goto":"Goto",pageOf:"Seite {page}",totalPage:"{totalPage} Seiten",totalCount:"Total: {recTotal} Artikel",pageSize:"{recPerPage} Artikel pro Seite",itemsRange:"Seiten {start} bis {end}",pageOfTotal:"Seite {page}/{totalPage}"},"zui.boards":{append2end:"Gehen Sie zum Ende"},"zui.browser":{tip:"Online. Sorgenfrei. Aktualisiere deinen Browser noch heute!"},"zui.calendar":{weekNames:["Son","Mon","Die","Mit","Don","Fri","Sam"],monthNames:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",year:"{0}Jahr",month:"{0}Monat",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Kein Icon]",commonIcons:"Gemeinsame Symbole",webIcons:"Web-Symbol",editorIcons:"Editor-Symbol",directionalIcons:"Pfeil Zusammenfluss",otherIcons:"Andere Symbole"},"zui.colorPicker":{errorTip:"Kein gültiger Farbwert"},"zui.datagrid":{errorCannotGetDataFromRemote:"Daten vom Remote-Server ({0}) können nicht abgerufen werden.",errorCannotHandleRemoteData:"Die vom Remote-Server zurückgegebenen Daten können nicht verarbeitet werden."},"zui.guideViewer":{prevStep:"Vorheriger Schritt",nextStep:"Nächster Schritt"},"zui.tabs":{reload:"Neu laden",close:"Schliessen",closeOthers:"Schließen Sie andere Registerkarten",closeRight:"Schließen Sie die rechte Registerkarte",reopenLast:"Letzten geschlossenen Tab wiederherstellen",errorCannotFetchFromRemote:"Inhalt kann nicht vom Remote-Server abgerufen werden ({0})."},"zui.uploader":{},datetimepicker:{days:["Sonntag","Montag","Diensteg","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["Son","Mon","Die","Mit","Don","Fri","Sam"],daysMin:["Son","Mon","Die","Mit","Don","Fri","Sam"],months:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",suffix:[],meridiem:[]},chosen:{no_results_text:"Nicht gefunden"},bootbox:{OK:"OK",CANCEL:"Stornieren",CONFIRM:"Bestätigen"}}),$.zui.lang("fr",{"zui.pager":{pageOfText:"Page {0}",prev:"Prev",next:"Suivant",first:"First",last:"Last","goto":"Goto",pageOf:"Page {page}",totalPage:"{totalPage} pages",totalCount:"Total: {recTotal} items",pageSize:"{recPerPage} per page",itemsRange:"De {start} à {end}",pageOfTotal:"Page {page} de {totalPage}"},"zui.boards":{append2end:"Aller jusqu'au bout"},"zui.browser":{tip:"Naviguez sans crainte sur Internet. Mettez votre navigateur à jour dès aujourd'hui!"},"zui.calendar":{weekNames:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],monthNames:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",year:"{0} Année",month:"{0} Mois",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Aucune icône]",commonIcons:"Icônes communes",webIcons:"Icône Web",editorIcons:"Icône de l'éditeur",directionalIcons:"Flèche confluence",otherIcons:"Autres icônes"},"zui.colorPicker":{errorTip:"Pas une valeur de couleur valide"},"zui.datagrid":{errorCannotGetDataFromRemote:"Impossible d'obtenir les données du serveur distant ({0}).",errorCannotHandleRemoteData:"Impossible de traiter les données renvoyées par le serveur distant."},"zui.guideViewer":{prevStep:"Étape précédente",nextStep:"Prochaine étape"},"zui.tabs":{reload:"Recharger",close:"Fermer",closeOthers:"Fermez les autres onglets",closeRight:"Fermer l'onglet de droite",reopenLast:"Restaurer le dernier onglet fermé",errorCannotFetchFromRemote:"Impossible d'obtenir le contenu du serveur distant ({0})."},"zui.uploader":{},datetimepicker:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",suffix:[],meridiem:[]},chosen:{no_results_text:"Pas trouvé"},bootbox:{OK:"D'accord",CANCEL:"Annuler",CONFIRM:"Confirmer"}}); \ No newline at end of file From e1a11341c6933356e07ecaa88153710b052230f9 Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 18 Apr 2022 10:34:14 +0800 Subject: [PATCH 05/42] * refactor: format. --- module/execution/js/view.js | 6 +++--- module/project/js/view.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/module/execution/js/view.js b/module/execution/js/view.js index eaac300e20..92fe169bf3 100644 --- a/module/execution/js/view.js +++ b/module/execution/js/view.js @@ -3,14 +3,14 @@ /* Expand or collapse text */ function limitText() { - var $text = $(this); var fullText; var limitText; + var $text = $(this); var options = $.extend({limitSize: 40, suffix: '…'}, $text.data()); - var text = $text.text(); + var text = $text.text(); if(text.length > options.limitSize) { - fullText = $text.html(); + fullText = $text.html(); limitText = text.substring(0, options.limitSize) + options.suffix; $text.text(limitText).addClass('limit-text-on'); diff --git a/module/project/js/view.js b/module/project/js/view.js index eaac300e20..92fe169bf3 100644 --- a/module/project/js/view.js +++ b/module/project/js/view.js @@ -3,14 +3,14 @@ /* Expand or collapse text */ function limitText() { - var $text = $(this); var fullText; var limitText; + var $text = $(this); var options = $.extend({limitSize: 40, suffix: '…'}, $text.data()); - var text = $text.text(); + var text = $text.text(); if(text.length > options.limitSize) { - fullText = $text.html(); + fullText = $text.html(); limitText = text.substring(0, options.limitSize) + options.suffix; $text.text(limitText).addClass('limit-text-on'); From bfabd93dce0d74d37fc254281f03d47f46f9ac2b Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 18 Apr 2022 11:16:15 +0800 Subject: [PATCH 06/42] * bug #21225, bug #16589, support for adjusting submenu position in dropdown. --- www/js/zui/min.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/www/js/zui/min.js b/www/js/zui/min.js index 7ef505846e..0380b76d7b 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-13 + * ZUI: ZUI for Zentao - v1.10.0 - 2022-04-18 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT @@ -17,7 +17,7 @@ function(t,e,i){"$:nomunge";function n(){o=e[r](function(){a.each(function(){var * Released under the MIT license */ function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function e(t){return r.raw?t:encodeURIComponent(t)}function i(t){return r.raw?t:decodeURIComponent(t)}function n(t){return e(r.json?JSON.stringify(t):String(t))}function o(t){0===t.indexOf('"')&&(t=t.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return t=decodeURIComponent(t.replace(s," ")),r.json?JSON.parse(t):t}catch(e){}}function a(t,e){var i=r.raw?t:o(t);return"function"==typeof e?e(i):i}var s=/\+/g,r=t.cookie=function(o,s,l){if(void 0!==s&&"function"!=typeof s){if(l=t.extend({},r.defaults,l),"number"==typeof l.expires){var c=l.expires,h=l.expires=new Date;h.setTime(+h+864e5*c)}return document.cookie=[e(o),"=",n(s),l.expires?"; expires="+l.expires.toUTCString():"",l.path?"; path="+l.path:"",l.domain?"; domain="+l.domain:"",l.secure?"; secure":""].join("")}for(var d=o?void 0:{},u=document.cookie?document.cookie.split("; "):[],p=0,f=u.length;p=0;t--)delete this.page[i[t]];this.set(a,this.page)}},s.prototype.pageRemove=function(t){"undefined"!=typeof this.page[t]&&(this.page[t]=null,this.pageSave())},s.prototype.pageClear=function(){this.page={},this.pageSave()},s.prototype.pageGet=function(t,e){var i=this.page[t];return void 0===e||null!==i&&void 0!==i?i:e},s.prototype.pageSet=function(t,i){e.isPlainObject(t)?e.extend(!0,this.page,t):this.page[this.serialize(t)]=i,this.pageSave()},s.prototype.check=function(){if(!this.enable&&!this.silence)throw new Error("Browser not support localStorage or enable status been set true.");return this.enable},s.prototype.length=function(){return this.check()?i.getLength?i.getLength():i.length:0},s.prototype.removeItem=function(t){return i.removeItem(t),this},s.prototype.remove=function(t){return this.removeItem(t)},s.prototype.getItem=function(t){return i.getItem(t)},s.prototype.get=function(t,e){var i=this.deserialize(this.getItem(t));return"undefined"!=typeof i&&null!==i||"undefined"==typeof e?i:e},s.prototype.key=function(t){return i.key(t)},s.prototype.setItem=function(t,e){return i.setItem(t,e),this},s.prototype.set=function(t,e){return void 0===e?this.remove(t):(this.setItem(t,this.serialize(e)),this)},s.prototype.clear=function(){return i.clear(),this},s.prototype.forEach=function(t){for(var e=this.length(),n=e-1;n>=0;n--){var o=i.key(n);t(o,this.get(o))}return this},s.prototype.getAll=function(){var t={};return this.forEach(function(e,i){t[e]=i}),t},s.prototype.serialize=function(t){return"string"==typeof t?t:JSON.stringify(t)},s.prototype.deserialize=function(t){if("string"==typeof t)try{return JSON.parse(t)}catch(e){return t||void 0}},e.zui({store:new s})}(window,jQuery),function(t){"use strict";var e="zui.searchBox",i=function(e,n){var o=this;o.name=name,o.$=t(e),o.options=n=t.extend({},i.DEFAULTS,o.$.data(),n);var a=o.$.is(n.inputSelector)?o.$:o.$.find(n.inputSelector);if(a.length){var s=function(){o.changeTimer&&(clearTimeout(o.changeTimer),o.changeTimer=null)},r=function(){s();var t=o.getSearch();if(t!==o.lastValue){var e=""===t;a.toggleClass("empty",e),o.$.callComEvent(o,"onSearchChange",[t,e]),o.lastValue=t}};o.$input=a=a.first(),a.on(n.listenEvent,function(t){o.changeTimer=setTimeout(function(){r()},n.changeDelay)}).on("focus",function(t){a.addClass("focus"),o.$.callComEvent(o,"onFocus",[t])}).on("blur",function(t){a.removeClass("focus"),o.$.callComEvent(o,"onBlur",[t])}).on("keydown",function(t){var e=0,i=t.which;27===i&&n.escToClear?(this.setSearch("",!0),r(),e=1):13===i&&n.onPressEnter&&(r(),o.$.callComEvent(o,"onPressEnter",[t]));var a=o.$.callComEvent(o,"onKeyDown",[t]);a===!1&&(e=1),e&&t.preventDefault()}),o.$.on("click",".search-clear-btn",function(t){o.setSearch("",!0),r(),o.focus(),t.preventDefault()}),r()}else console.error("ZUI: search box init error, cannot find search box input element.")};i.DEFAULTS={inputSelector:'input[type="search"],input[type="text"]',listenEvent:"change input paste",changeDelay:500},i.prototype.getSearch=function(){return this.$input&&t.trim(this.$input.val())},i.prototype.setSearch=function(t,e){var i=this.$input;i&&(i.val(t),e||i.trigger("change"))},i.prototype.focus=function(){this.$input&&this.$input.focus()},t.fn.searchBox=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[n]()})},i.NAME=e,t.fn.searchBox.Constructor=i}(jQuery),function(t,e){"use strict";var i="zui.draggable",n={container:"body",move:!0},o=0,a=function(e,i){var a=this;a.$=t(e),a.id=o++,a.options=t.extend({},n,a.$.data(),i),a.init()};a.DEFAULTS=n,a.NAME=i,a.prototype.init=function(){var n,o,a,s,r,l=this,c=l.$,h="before",d="drag",u="finish",p="."+i+"."+l.id,f="mousedown"+p,g="mouseup"+p,m="mousemove"+p,v=l.options,y=v.selector,b=v.handle,w=c,x="function"==typeof v.move,C=function(t){var e=t.pageX,i=t.pageY;r=!0;var o={left:e-a.x,top:i-a.y};w.removeClass("drag-ready").addClass("dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[d]&&v[d]({event:t,element:w,startOffset:a,pos:o,offset:{x:e-n.x,y:i-n.y},smallOffset:{x:e-s.x,y:i-s.y}}),s.x=e,s.y=i,v.stopPropagation&&t.stopPropagation()},_=0,k=function(e){_&&(t.zui.clearAsap||clearTimeout)(_),_=(t.zui.asap||setTimeout)(function(){_=0,C(e)},0)},T=function(i){if(t(e).off(p),!r)return void w.removeClass("drag-ready");var o={left:i.pageX-a.x,top:i.pageY-a.y};w.removeClass("drag-ready dragging"),v.move&&(x?v.move(o,w):w.css(o)),v[u]&&v[u]({event:i,element:w,startOffset:a,pos:o,offset:{x:i.pageX-n.x,y:i.pageY-n.y},smallOffset:{x:i.pageX-s.x,y:i.pageY-s.y}}),i.preventDefault(),v.stopPropagation&&i.stopPropagation()},S=function(i){var l=t.zui.getMouseButtonCode(v.mouseButton);if(!(l>-1&&i.button!==l)){var c=t(this);if(y&&(w=b?c.closest(y):c),v[h]){var d=v[h]({event:i,element:w});if(d===!1)return}var u=t(v.container),p=w.offset();o=u.offset(),n={x:i.pageX,y:i.pageY},a={x:i.pageX-p.left+o.left,y:i.pageY-p.top+o.top},s=t.extend({},n),r=!1,w.addClass("drag-ready"),i.preventDefault(),v.stopPropagation&&i.stopPropagation(),t(e).on(m,k).on(g,T)}};b?c.on(f,b,S):y?c.on(f,y,S):c.on(f,S)},a.prototype.destroy=function(){var n="."+i+"."+this.id;this.$.off(n),t(e).off(n),this.$.data(i,null)},t.fn.draggable=function(e){return this.each(function(){var n=t(this),o=n.data(i),s="object"==typeof e&&e;o||n.data(i,o=new a(this,s)),"string"==typeof e&&o[e]()})},t.fn.draggable.Constructor=a}(jQuery,document),function(t,e,i){"use strict";var n="zui.droppable",o={target:".droppable-target",deviation:5,sensorOffsetX:0,sensorOffsetY:0,dropToClass:"drop-to",dropTargetClass:"drop-target"},a=0,s=function(e,i){var n=this;n.id=a++,n.$=t(e),n.options=t.extend({},o,n.$.data(),i),n.init()};s.DEFAULTS=o,s.NAME=n,s.prototype.trigger=function(e,i){return t.zui.callEvent(this.options[e],i,this)},s.prototype.init=function(){var o,a,s,r,l,c,h,d,u,p,f,g,m,v,y=this,b=y.$,w=y.options,x=w.deviation,C="."+n+"."+y.id,_="mousedown"+C,k="mouseup"+C,T="mousemove"+C,S=w.selector,D=w.handle,M=w.flex,L=w.canMoveHere,z=w.dropToClass,P=w.noShadow,$=b,I=!1;w.dropOnMouseleave&&(k+=" mouseleave"+C);var F=function(e){if(I){if(g={left:e.pageX,top:e.pageY},!r){if(i.abs(g.left-u.left)a&&g.top>s&&g.left-1&&i.button!==n)){var g=t(this);S&&($=D?g.closest(S):g),$.hasClass("drag-shadow")||w.before&&w.before({event:i,element:$})===!1||(I=!0,o=w.container?"function"==typeof w.container?w.container($,b):t(w.container).first():S?b:t("body"),a="function"==typeof w.target?w.target($,b):o.find(w.target),s=null,r=null,l=!1,c=!0,h=null,d=$.offset(),p=o.offset(),p.top=p.top-o.scrollTop(),p.left=p.left-o.scrollLeft(),u={left:i.pageX,top:i.pageY},m=t.extend({},u),f={left:u.left-d.left,top:u.top-d.top},$.addClass("drag-from"),t(e).on(T,E).on(k,O),v=setTimeout(function(){t(e).on(_,O)},10),i.preventDefault(),w.stopPropagation&&i.stopPropagation())}};D?b.on(_,D,R):S?b.on(_,S,R):b.on(_,R)},s.prototype.destroy=function(){var i="."+n+"."+this.id;this.$.off(i),t(e).off(i),this.$.data(n,null)},s.prototype.reset=function(){this.destroy(),this.init()},t.fn.droppable=function(e){return this.each(function(){var i=t(this),o=i.data(n),a="object"==typeof e&&e;o||i.data(n,o=new s(this,a)),"string"==typeof e&&o[e]()})},t.fn.droppable.Constructor=s}(jQuery,document,Math),+function(t,e){"use strict";function i(e,i,a){return this.each(function(){var s=t(this),r=s.data(n),l=t.extend({},o.DEFAULTS,s.data(),"object"==typeof e&&e);r||s.data(n,r=new o(this,l)),"string"==typeof e?r[e](i,a):l.show&&r.show(i,a)})}var n="zui.modal",o=function(i,o){var a=this;a.options=o,a.$body=t(document.body),a.$element=t(i),a.$backdrop=a.isShown=null,a.scrollbarWidth=0,o.moveable===e&&(a.options.moveable=a.$element.hasClass("modal-moveable")),o.remote&&a.$element.find(".modal-content").load(o.remote,function(){a.$element.trigger("loaded."+n)}),o.scrollInside&&t(window).on("resize."+n,function(){a.isShown&&a.adjustPosition(e,100)})};o.VERSION="3.2.0",o.TRANSITION_DURATION=300,o.BACKDROP_TRANSITION_DURATION=150,o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0,position:"fit"};var a=function(e,i){var n=t(window);i.left=Math.max(0,Math.min(i.left,n.width()-e.outerWidth())),i.top=Math.max(0,Math.min(i.top,n.height()-e.outerHeight())),e.css(i)};o.prototype.toggle=function(t,e){return this.isShown?this.hide():this.show(t,e)},o.prototype.adjustPosition=function(i,o){var s=this;if(clearTimeout(s.reposTask),o)return void(s.reposTask=setTimeout(s.adjustPosition.bind(s,i,0),o));var r=s.options;if(i===e&&(i=r.position),i!==e&&null!==i){"function"==typeof i&&(i=i(s));var l=s.$element.find(".modal-dialog"),c=t(window).height(),h={maxHeight:"initial",overflow:"visible"},d=l.find(".modal-body").css(h);if(r.scrollInside&&d.length){var u=r.headerHeight,p=r.footerHeight,f=l.find(".modal-header"),g=l.find(".modal-footer");"number"!=typeof u&&(u=f.length?f.outerHeight():"function"==typeof u?u(f):0),"number"!=typeof p&&(p=g.length?g.outerHeight():"function"==typeof p?p(g):0),h.maxHeight=c-u-p,h.overflow=d[0].scrollHeight>h.maxHeight?"auto":"visible",d.css(h)}var m=Math.max(0,(c-l.outerHeight())/2);if("fit"===i?i={top:m>50?Math.floor(2*m/3):m}:"center"===i?i={top:m}:t.isPlainObject(i)||(i={top:i}),l.hasClass("modal-moveable")){var v=null,y=r.rememberPos;y&&(y===!0?v=s.$element.data("modal-pos"):t.zui.store&&(v=t.zui.store.pageGet(n+".rememberPos."+y))),i=t.extend(i,{left:Math.max(0,(t(window).width()-l.outerWidth())/2)},v),"inside"===r.moveable?a(l,i):l.css(i)}else l.css(i)}},o.prototype.setMoveable=function(){t.fn.draggable||console.error("Moveable modal requires draggable.js.");var e=this,i=e.options,o=e.$element.find(".modal-dialog").removeClass("modal-dragged");o.toggleClass("modal-moveable",!!i.moveable),e.$element.data("modal-moveable-setup")||o.draggable({container:e.$element,handle:".modal-header",before:function(){var t=o.css("margin-top");t&&"0px"!==t&&o.css("top",t).css("margin-top","").addClass("modal-dragged")},finish:function(o){var a=i.rememberPos;a&&(e.$element.data("modal-pos",o.pos),t.zui.store&&a!==!0&&t.zui.store.pageSet(n+".rememberPos."+a,o.pos))},move:"inside"!==i.moveable||function(t){a(o,t)}})},o.prototype.show=function(e,i){var a=this,s=t.Event("show."+n,{relatedTarget:e});a.$element.trigger(s),a.$element.toggleClass("modal-scroll-inside",!!a.options.scrollInside),a.isShown||s.isDefaultPrevented()||(a.isShown=!0,a.options.moveable&&a.setMoveable(),a.options.backdrop!==!1&&(a.setScrollbar(),a.$body.addClass("modal-open")),a.escape(),a.$element.on("click.dismiss."+n,'[data-dismiss="modal"]',function(t){a.hide(),t.stopPropagation()}),a.backdrop(function(){var s=t.support.transition&&a.$element.hasClass("fade");a.$element.parent().length||a.$element.appendTo(a.$body),a.$element.show().scrollTop(0),s&&a.$element[0].offsetWidth,a.$element.addClass("in").attr("aria-hidden",!1),a.adjustPosition(i),a.enforceFocus();var r=t.Event("shown."+n,{relatedTarget:e});s?a.$element.find(".modal-dialog").one("bsTransitionEnd",function(){a.$element.trigger("focus").trigger(r)}).emulateTransitionEnd(o.TRANSITION_DURATION):a.$element.trigger("focus").trigger(r)}))},o.prototype.hide=function(e){e&&e.preventDefault&&e.preventDefault();var i=this;e=t.Event("hide."+n),i.$element.trigger(e),i.isShown&&!e.isDefaultPrevented()&&(i.isShown=!1,i.options.backdrop!==!1&&(i.$body.removeClass("modal-open"),i.resetScrollbar()),i.escape(),t(document).off("focusin."+n),i.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss."+n),t.support.transition&&i.$element.hasClass("fade")?i.$element.one("bsTransitionEnd",i.hideModal.bind(i)).emulateTransitionEnd(o.TRANSITION_DURATION):i.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin."+n).on("focusin."+n,function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")}.bind(this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?t(document).on("keydown.dismiss."+n,function(i){if(27==i.which){var o=t.Event("escaping."+n),a=this.$element.triggerHandler(o,"esc");if(a!=e&&!a)return;this.hide()}}.bind(this)):this.isShown||t(document).off("keydown.dismiss."+n)},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden."+n)})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var i=this,a=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&a;if(this.$backdrop=t('"].join("")).appendTo(i),e.$actions.on("click",".picker-action",function(i){var n=t(this).data("type");"select-all"===n?e.selectAll():"deselect-all"===n&&e.deselectAll()})),e.$message=t('
').appendTo(i),e.$dropMenu=i,e.$optionsList=a}e.updateList(e.search,!1,function(){e.triggerEvent("showedDrop",{picker:e},"","chosen:showing_dropdown")}),e.$dropMenu.addClass("picker-drop-show")}},r.prototype.hideDropList=function(e){var i=this;if(i.triggerEvent("hidingDrop",{picker:i})!==!1){i.dropListShowed=!1,i.$activeOption=null,i.activeValue=null,i.$search.val(""),i.search="",delete o[i.id],i.$dropMenu&&i.$dropMenu.removeClass("picker-drop-show"),i.options.disableScrollOnShow&&t.zui.resetBodyScrollbar(),e&&this.$search.blur(),i.triggerEvent("hiddenDrop",{picker:i},"","chosen:hiding_dropdown");var n=i.options.autoClearDrop;n&&i.destroyDropList(n)}},r.prototype.updateFromSelect=function(e){var i=this,n=i.options,o=[];void 0===e&&(e=!0),i.$formItem.children("option").each(function(){var e=t(this),i=e.text(),a=e.val();if(i.length||a.length){var s={};s[n.valueKey]=a,s[n.textKey]=i,s[n.keysKey]=e.data(n.keysKey),o.push(s)}var r=n.allowSingleDeselect;"auto"!==r&&null!==r&&void 0!==r||a.length||(n.allowSingleDeselect=!0)}),i.selectOptionsBackup=o.slice(),i.setList(o,e)},r.prototype.setList=function(t,e){var i=this,n=i.options,o=e?[]:i.list||[],a=e?{}:i.listMap||{};"string"==typeof t&&(t=t.split(n.multiValueSplitter));for(var s=0;s')}):p&&u.find('option[value="'+e+'"]').length||u.append('
");i.$.addClass("load-indicator loading"),s.load(window.location.href+" #"+o,function(r){if(a===o)i.$.empty().html(s.children().html()),i.$.find('[data-ride="pager"]').pager();else{i.$.find("#"+o).empty().html(s.children().html());try{var l=t(r),c=l.find("#"+o).closest('[data-ride="table"],#'+a);if(c.length){var h=c.find(".table-statistic");h.length&&(i.defaultStatistic=h.html());var d=i.$.find('[data-ride="pager"]').data("zui.pager"),u=c.find('[data-ride="pager"]');d&&u.length&&d.set(u.data())}}catch(p){console.error(p)}}i.$.removeClass("load-indicator loading").trigger("beforeTableReload"),delete i.defaultStatistic,i.updateStatistic(),i.initModals(),i.$.datepickerAll();var f=i.$.find("tbody>tr"),g=!1;t.each(i.checkItems,function(t,e){e&&(i.checkRow(f.filter('[data-id="'+t+'"]'),!0,!0),g=!0)}),g&&i.updateCheckUI(),n.nested&&i.initNestedList(),i.$.trigger("tableReload");var m=t("#mainMenu>.btn-toolbar>.btn-active-text>.label");if(m.length){var u=i.$.find(".pager[data-rec-total]"),v=u.length?u.attr("data-rec-total"):i.getTable().find("tbody:first>tr:not(.table-children)").length;m.text(v)}e&&e(),n.afterReload&&n.afterReload()})},r.prototype.initModals=function(){var e=this,i=e.options,n=e.$.find(i.iframeModalTrigger);if(n.length){var o={type:"iframe",onHide:i.replaceId?function(){var n=t.cookie("selfClose");(1==n||i.hot)&&(t("#triggerModal").data("cancel-reload",1),e.reload(function(){t.cookie("selfClose",0)}))}:null};n.modalTrigger(o)}},r.prototype.getTable=function(){var t=this.$;if(this.isDataTable)return t.find("div.datatable");var e=t.is("table")?t:t.find("table:not(.fixed-header-copy)").first();return e.is(".datatable")&&(this.isDataTable=!0,e.data("zui.datatable")||window.initDatatable(e),e=t.find("div.datatable")),e},r.prototype.toggleGroups=function(e){var i=this,n={};i.$.find("tbody>tr").each(function(){var o=t(this).closest("tr").data("id");n[o]||i.toggleRowGroup(o,e)})},r.prototype.toggleRowGroup=function(i,n){var o=this.$.find('tbody>tr[data-id="'+i+'"]'),a=o.filter(".group-summary"),s=n===e?!a.hasClass("hidden"):!!n;o.not(".group-summary").toggleClass("hidden",!s),a.toggleClass("hidden",s),t("body").toggleClass("table-group-collapsed",!this.$.find("tbody>tr.group-summary.hidden").length)},r.prototype.updateStatistic=function(){var i=this,n=i.$.find(".table-statistic");if(n.length){if(i.defaultStatistic===e&&(i.defaultStatistic=n.html()),i.options.statisticCreator)return void n.html(i.options.statisticCreator(i)||i.defaultStatistic);var o=i.statisticCols;if(!o&&o!==!1){o={};var a=!1;i.getTable().find("thead th").each(function(e){var i=t(this),n=i.data("statistic");n&&(a=!0,o[e]={format:n,name:i.text()})}),i.statisticCols=!!a&&o}var s=0;o&&t.each(o,function(t){o[t].total=0,o[t].checkedTotal=0}),i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr").each(function(){var e=t(this),i=e.hasClass("checked"),n=e.children("td");i&&s++,o&&t.each(o,function(t){var e=parseFloat(n.eq(t).text());isNaN(e)&&(e=0),o[t].total+=e,i&&(o[t].checkedTotal+=e)})});var r=[];if(s)r.push(i.lang.selectedItems.format(s));else if(i.defaultStatistic)return void n.html(i.defaultStatistic);o&&t.each(o,function(t){var e=o[t],n=e[s?"checkedTotal":"total"];e.format&&(n=e.format.format(n)),r.push(i.lang.attrTotal.format(e.name,n))}),n.html(r.join(", "))}},r.prototype.updateFixUI=function(e){var i=this,n=(new Date).getTime();if(!e&&(i.lastUpdateCall&&clearTimeout(i.lastUpdateCall),!i.lastUpdateTime||n-i.lastUpdateTime
').append(t('
').addClass(i.attr("class")).append(n.clone())).insertAfter(i)),h){var d=c[0].getBoundingClientRect();l.css({left:d.left,width:c.width(),overflow:"hidden"}),l.find(".fixed-header-copy").css({left:o.left-d.left,position:"relative",minWidth:i.width()}),a||c.data("fixHeaderScroll")||(c.data("fixHeaderScroll",1),i.width()>c.width()&&c.on("scroll",function(){e.fixHeader()}))}else l.css({left:o.left,width:o.width});var u=l.find("th");n.find("th").each(function(e){u.eq(e).css("width",t(this).outerWidth())})}else l.remove()},r.prototype.fixFooter=function(){var e,i=this,n=i.getTable(),o=i.$.find(".table-footer");if(i.isDataTable)e=n[0].getBoundingClientRect();else{var a=n.find("tbody");if(!a.length)return;e=a[0].getBoundingClientRect()}var s=i.options.fixFooter;o.toggleClass("fixed-footer",!!r);var r="function"==typeof s?s(e,o):e.bottom>window.innerHeight-50-("number"==typeof s?s:i.pageFooterHeight||5);o.toggleClass("fixed-footer",!!r),n.toggleClass("with-footer-fixed",!!r),n.trigger("fixFooter",r);var l=t("body"),c=l.hasClass("body-modal");if(r){var h=n.parent(),d=h.is(".table-responsive");o.css({bottom:i.pageFooterHeight||0,left:d?h[0].getBoundingClientRect().left:e.left,width:d?h.width():e.width}),c&&l.css("padding-bottom",40)}else o.css({width:"",left:0,bottom:0}),c&&l.css("padding-bottom",0)},r.prototype.checkAll=function(e){var i=this,n=i.$.find(i.isDataTable?".fixed-left tbody>tr":"tbody>tr");n.each(function(){i.checkRow(t(this),e,!0)}),i.updateCheckUI()},r.prototype.checkRow=function(i,n,o){var a=this,s=a.getTable();a.isDataTable&&!i.is(".datatable-row-left")&&(i=s.find('.datatable-row-left[data-index="'+i.data("index")+'"]'));var r=i.find('input[type="checkbox"]');if(r.length&&!r.is(":disabled")){n===e&&(n=!r.is(":checked")),a.isDataTable?s.find('.datatable-row[data-index="'+i.data("index")+'"]').toggleClass("checked",n):i.toggleClass("checked",n);var l=i.data("id");this.checkItems[l]=n,r.prop("checked",n).trigger("change"),o||(i.hasClass("table-parent")&&s.find((a.isDataTable?".fixed-left ":"")+"tbody>tr.parent-"+l).each(function(){a.checkRow(t(this),n,!0)}),a.updateCheckUI())}},r.prototype.updateCheckUI=function(){var e=this,i=e.getTable(),n=i.find(e.isDataTable?".fixed-left tbody>tr":"tbody>tr").not(".group-summary"),o=!1,a=null,s=0,r=!1,l=n.length;n.each(function(n){var c=t(this),h=c.find('input[type="checkbox"]');if(!h.length)return void l--;r=h.is(":checked");var d=e.isDataTable?i.find('.datatable-row[data-index="'+c.data("index")+'"]'):c;d.toggleClass("checked",r),d.toggleClass("row-check-begin",r&&!o),a&&a.toggleClass("row-check-end",!r&&o),r&&(s+=1),a=d,o=r,l===n+1&&d.toggleClass("row-check-end",r)}),e.$.toggleClass("has-row-checked",s>0).find(".check-all").toggleClass("checked",!(!l||s!==l)),e.updateStatistic(),e.options.onCheckChange&&e.options.onCheckChange(),i.trigger("checkChange")},r.DEFAULTS={checkable:!0,checkOnClickRow:!0,ajaxForm:!1,selectable:!0,fixHeader:!a,fixFooter:!a,iframeWidth:900,replaceId:"self",nestLevelIndent:18,nested:!1,preserveNested:!0,hot:!1,iframeModalTrigger:".iframe"},t.fn.table=function(e){return this.each(function(){var n=t(this),o=n.data(i),a="object"==typeof e&&e;o||n.data(i,o=new r(this,a)),"string"==typeof e&&o[e]()})},r.NAME=i,t.fn.table.Constructor=r,t(function(){t('[data-ride="table"]').table()})}(jQuery,void 0),function(t,e,i){t.fn._ajaxForm=t.fn.ajaxForm;var n={timeout:e.config?e.config.timeout:0,dataType:"json",method:"post"},o="";t.fn.enableForm=function(e,n,o){return e===i&&(e=!0),this.each(function(){var i=t(this);n||i.find('[type="submit"]').attr("disabled",e?null:"disabled"),!o&&i.hasClass("load-indicator")&&i.toggleClass("loading",!e),i.toggleClass("form-disabled",!e)})},t.enableForm=function(e,i,n,o){"string"==typeof e||e instanceof t?e=t(e):(o=n,n=i,i=e,e=t("form")),e.enableForm(i!==!1,n,o)},t.disableForm=function(e,i,n){t.enableForm(e,!1,i,n)};var a=function(e,i,n){"string"==typeof i&&(n=i,i=null),n=n||"show",t.zui.messager?t.zui.messager[n](e,i):alert(e)};t.ajaxForm=function(s,r){var l=t(s);if(l.length>1)return l.each(function(){t.ajaxForm(this,r)});"function"==typeof r&&(r={complete:r}),r=t.extend({},n,l.data(),r);var c=r.beforeSubmit,h=r.error,d=r.success,u=r.finish;delete r.finish,delete r.success,delete r.onError,delete r.beforeSubmit,r=t.extend({beforeSubmit:function(n,a,s){if(l.removeClass("form-watched").enableForm(!1),(c&&c(n,a,s))!==!1){var r={},h=a.find('[type="file"]');r.fileapi=h.length&&h[0].files!==i,r.formdata=e.FormData!==i;var d=r.fileapi&&a.find('input[type="file"]:enabled').filter(function(){return""!==t(this).val()}),u=d.length,p="multipart/form-data",f=a.attr("enctype")==p||a.attr("encoding")==p,g=r.fileapi&&r.formdata,m=u&&!g||f&&!r.formdata;m&&(""==o&&(o=s.url),s.url!=o&&(s.url=o),s.url=s.url.indexOf("&")>=0?s.url+"&HTTP_X_REQUESTED_WITH=XMLHttpRequest":s.url+"?HTTP_X_REQUESTED_WITH=XMLHttpRequest")}},success:function(i,n,o){if((d&&d(i,n,o,l))!==!1){try{"string"==typeof i&&(i=JSON.parse(i))}catch(s){}if(null===i||"object"!=typeof i)return i?alert(i):a("No response.","danger");var c=r.responser?t(r.responser):l.find(".form-responser");c.length||(c=t("#responser"));var h=i.message,p=function(){var n=i.callback;if(n){var o=n.indexOf("("),a=(o>0?n.substr(0,o):n).split("."),s=e,r=a[0]; -a.length>1&&(r=a[1],"top"===a[0]?s=e.top:"parent"===a[0]&&(s=e.parent));var c=s[r];if("function"==typeof c){var h=[];return o>0&&")"==n[n.length-1]&&(h=t.parseJSON("["+n.substring(o+1,n.length-1)+"]")),h.push(i),c.apply(l,h)}}};if("success"===i.result){var f=r.locate||i.locate,g=r.closeModal||i.closeModal,m=r.ajaxReload||i.ajaxReload;if(l.enableForm(!0,!!(f||g||m)),h){var v=l.find('[type="submit"]').first(),y=!1;v.length&&(v.popover({container:"body",trigger:"manual",content:h,tipClass:"popover-in-modal popover-success popover-form-result",placement:i.placement||v.data("placement")||r.popoverPlacement||"right"}).popover("show"),setTimeout(function(){v.popover("destroy")},r.popoverTime||2e3),y=!0),c.length&&(c.html(''+h+"").show().delay(3e3).fadeOut(100),y=!0),y||a(h,"success")}if(u)return u(i,!0,l);if(g&&setTimeout(t.zui.closeModal,r.closeModalTime||2e3),p()===!1)return;if(f)if("loadInModal"==f){var b=t(".modal");setTimeout(function(){b.load(b.attr("ref"),function(){t(this).find(".modal-dialog").css("width",t(this).data("width")),t.zui.ajustModalPosition()})},1e3)}else"parent"===f||"top"===f?e[f]&&setTimeout(function(){e[f].location.reload()},1200):"reload"===f?setTimeout(function(){e.location.href=e.location.href},1200):setTimeout(function(){t.tabs?t.tabs.open(f):e.location.href=f},1200);if(m){var w=t(m);w.length&&w.load(e.location.href+" "+m,function(){w.find('[data-toggle="modal"]').modalTrigger()})}}else{if(l.enableForm(),"string"==typeof h)c.length?c.html(''+h+"").show().delay(3e3).fadeOut(100):a(h,"danger");else if("object"==typeof h){var x=!1,C=[];t.each(h,function(e,i){var n=t.isArray(i)?i.join(""):i,o=t("#"+e);if(!o.length)return void C.push(n);var a=e+"Label",s=t("#"+a);if(!s.length){var r=o.closest(".input-group").length,l=o.closest("td").length;s=t('
').appendTo(l?o.closest("td"):r?o.closest(".input-group").parent():o.parent())}s.empty().append(n),o.addClass("has-error");var c=function(){var e=t("#"+a);if(e.length)return e.remove(),o.removeClass("has-error"),!0};o.on("change input mousedown",c);var h=t("#"+e+"_chosen");if(h.length&&h.find(".chosen-single,.chosen-choices").addClass("has-error").on("mousedown",function(){c()===!0&&t(this).removeClass("has-error")}),!x){var d=o[0];if(o.hasClass("chosen"))o.trigger("chosen:activate").trigger("chosen:open"),d=o.parent().find(".chosen-container")[0];else if(o.is("textarea")&&o.data("keditor")){var u=o.data("keditor");u.focus(),u.edit.doc.body.focus(),d=o.parent().find(".ke-container")[0]}else o.focus();d.scrollIntoView&&d.scrollIntoView(),console.log("focus first",o),x=!0}}),C.length&&a(C.join(";"),"danger")}if(u)return u(i,!1,l);if(p()===!1)return}}},error:function(t,i,n){if((h&&h(t,i,n,l))!==!1){l.enableForm();var o="timeout"==i||"error"==i?e.lang?e.lang.timeout:i:t.responseText+i+n;a(o,"danger")}}},r),l._ajaxForm(r).data("zui.ajaxform",!0),l.on("click","[data-form-action]",function(){l.attr("action",t(this).data("formAction")).submit()})},t.setAjaxForm=function(e,i,n){t.ajaxForm(e,t.isPlainObject(i)?i:{finish:i,beforeSubmit:n})},t.fn.ajaxForm=function(e){return this.each(function(){t.ajaxForm(this,e)})},t.fn.setInputRequired=function(){return this.each(function(){var e=t(this),i=e.parent();i.is(".input-control,td")?i.addClass("required"):e.is(".chosen")?e.attr("required",null).next(".chosen-container").addClass("required"):i.addClass("required"),e.attr("required",null);var n=i.closest(".input-group");n.length&&1===n.find(".required,input[required],select[required]").length&&n.addClass("required")})},t(function(){t('.form-ajax,form[data-type="ajax"]').ajaxForm(),setTimeout(function(){var i=e.config.requiredFields,n=t("form");i&&(i=i.split(",")),i&&i.length&&t.each(i,function(t,e){n.find("#"+e).attr("required","required")}),n.find("input[required],select[required],textarea[required]").setInputRequired()},400),t('form[target="hiddenwin"]').on("submit",function(){var e=t(this);e.data("zui.ajaxform")||e.enableForm(!1).data("disabledTime",(new Date).getTime())}).on("click",function(){var e=t(this),i=e.data("disabledTime");i&&(new Date).getTime()-i>1e4&&e.enableForm(!0).data("disabledTime",null)})})}(jQuery,window,void 0),function(t){"use strict";var e="zui.searchList",i=function(t,e){if(t&&t.length)for(var i=0;i
').append(s)),i.$menu.append(s),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].scrollIntoViewIfNeeded&&t[0].scrollIntoViewIfNeeded({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,o=void 0===e||null===e||""===e;n.$.toggleClass("has-search-text",!o);var a=n.getItems().removeClass("active");if(o)a.removeClass("hidden");else{var s=e.trim().split(" ");a.each(function(){var e=t(this),n=(e.text()+" "+(e.data("key")||e.data("filter")||"")).trim();e.toggleClass("hidden",!i(s,n))})}n.scrollTo(a.not(".hidden").first().addClass("active")),n.$.trigger("onSearchComplete",e)},n.DEFAULTS={selector:".list-group a:not(.not-list-item)",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof i&&i;a||o.data(e,a=new n(this,s)),"string"==typeof i&&a[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,o){var a=this;a.name=e,a.$=t(n),o=a.options=t.extend({},i.DEFAULTS,this.$.data(),o),a.$.hide(),a.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 o=e.$.next();n=o.hasClass(".label-selector")?o:t('
')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),o=t(this).data("value");e.hasEmptyValue!==!1&&o==n&&(o=e.hasEmptyValue),e.select(o),i.preventDefault()})}n.empty();var a=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),o={label:e.text(),value:e.val()},s=""===o.value||"0"===o.value,r=t(i.labelTemplate||'');i.labelClass&&!s&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",o).attr("data-value",o.value),s&&!o.label?r.addClass("empty").append(''):r.text(o.label).toggleClass("active",a===o.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[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=ts.fileMaxSize&&(c.val(""),(window.bootbox||window).alert(s.fileSizeError.format(n(s.fileMaxSize)))),r.update()}),r.update()};a.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},a.prototype.update=function(){var t=this,e=t.$,i=t.getFile(),o=!i;e.toggleClass("normal",!o).toggleClass("empty",o),i?(t.oldName=i.name,e.find(".file-title").text(i.name).attr("title",i.name),e.find(".file-size").text(n(i.size)),e.find(".file-editbox").val(i.name).attr("size",i.name.length),t.options.onSelect&&t.options.onSelect(i,t)):e.find(".file-editbox").val("")},a.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),o=n.data(e),s="object"==typeof i&&i;o||n.data(e,o=new a(this,s)),"string"==typeof i&&o[i]()})},a.NAME=e,t.fn.fileInput.Constructor=a,t(function(){t('[data-provide="fileInput"]').fileInput()});var s="zui.fileInputList",r=function(e,i){var n=this;n.name=s;var o=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=o.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(s),o="object"==typeof e&&e;n||i.data(s,n=new r(this,o)),"string"==typeof e&&n[e]()})},r.NAME=s,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(e,n,o,a,s,r,l){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid);if(t.tabSession&&!l&&(l=t.tabSession.getTid()),a||(a=config.defaultView),s||(s=!1),o)for("string"==typeof o&&(o=o.split("&")),i=0;i'+d+"")}}t.val()||(time=e(a.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var s=t(this),r=t.extend({},i,s.data()),l=s.find('[name="begin"],.control-time-begin'),c=s.find('[name="end"],.control-time-end'),h=function(){var t=l.val();if(s.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);c.find('option[value="'+i+'"]').length&&c.val(i),r.onChange&&r.onChange(c,i)}};if(s.data("timeSpanControlInit")){if(r.begin){var d=o(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=o(r.end).format("hh:mm");c.find('option[value="'+u+'"]').length&&c.val(u),r.onChange&&r.onChange(c,u)}}else l.on("change",h),a(l,r.begin),a(c,r.end),s.data("timeSpanControlInit",!0);r.end||h()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:a,createTime:o};var s=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var o=t("#searchTypeMenu");o.find("li.selected").removeClass("selected");var a=o.find('a[data-value="'+e+'"]'),s=a.text();a.parent().addClass("selected"),t("#searchTypeName").text(s),i||t("#searchInput").focus()};t.gotoObject=function(e,i){if(e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e)if(i=i.replace(/[^\d]/g,"")){var n=e.split("-");e=n[0];var o=n.length>1?n[1]:"testsuite"===e?"library":"view",a=t.createLink(e,o,"id="+i);t.apps?t.apps.open(a):window.location.href=a}else{var s={zh_cn:"请输入数字ID进行搜索",zh_tw:"請輸入數值ID行搜索"};alert(lang.searchTip||s[t.zui.clientLang()]||"Please enter a numberic id to search")}t("#searchInput").val(i).focus()},t(function(){s(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(t){t?window.top.location.reload():window.location.reload()},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage(1)},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage(1)},t.zui.Picker&&(t.zui.Picker.DEFAULTS.optionRender=function(e,i,n){if("user"===n.options.type){var o=n.options.users;if(!o)return;var a=o[i.value];if(!a)return;if(e.find(".picker-option-text").text(a.realname||a.account),e.hasClass("picker-user-option"))return;return e.prepend(t('
').avatar({user:a})),a.deptName&&e.append(t('').text(a.deptName)),a.roleName&&e.append(t('').text(a.roleName)),e.addClass("picker-user-option")}},t.zui.setUserPickerInfos=function(e){t.zui.Picker.DEFAULTS.users=t.extend({},t.zui.Picker.DEFAULTS.users,e)},t(function(){t(".picker-select[data-pickertype!='remote']").picker({chosenMode:!0}),t("[data-pickertype='remote']").each(function(){var e=t(this).attr("data-pickerremote");t(this).picker({chosenMode:!0,remote:e})}),window.pickerUsers&&t.zui.setUserPickerInfos(window.pickerUsers),t(".user-picker").picker({type:"user"})})),t.chosenDefaultOptions={middle_highlight:!0,disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,max_drop_width:500,max_drop_height:245,no_wrap:!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;e.css("position","relative");var i="down",n=this.container.find(".chosen-drop"),o=this.container.position(),a=n.outerHeight();return o.top>=a&&o.top+31+a>e.outerHeight()&&(i="up"),this.drop_directionFixed=i,i}return"auto"}},t.chosenSimpleOptions=t.extend({},t.chosenDefaultOptions,{disable_search_threshold:6}),t.fn._chosen=t.fn.chosen,t.fn.chosen=function(e){return"string"==typeof e?this._chosen(e):this.each(function(){var i=t(this).addClass("chosen-controled");return i._chosen(t.extend({},i.hasClass("chosen-simple")?t.chosenSimpleOptions:t.chosenDefaultOptions,i.data(),e))})},t.fn.chosen.Constructor=t.fn._chosen.Constructor,t(function(){t(".chosen,.chosen-simple").each(function(){var e=t(this);e.closest(".template").length||e.chosen()})}),t.extend(t.fn.pager.Constructor.DEFAULTS,{maxNavCount:8,prevIcon:"icon-angle-left",nextIcon:"icon-angle-right",firstIcon:"icon-first-page",lastIcon:"icon-last-page",navEllipsisItem:"…",menuDirection:"dropup",pageSizeOptions:[5,10,15,20,25,30,35,40,45,50,100,200,500,1e3,2e3],elements:["total_text","size_menu","first_icon","prev_icon",'
{page}/{totalPage}
',"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.extend(!0,t.zui.Messager.DEFAULTS,{cssClass:"messagger-zt",icons:{success:"check-circle",info:"chat-line",warning:"exclamation-sign",danger:"exclamation-sign"}}),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);if(!n.data("historiesInited")){n.data("historiesInited",1),i=t.extend({},n.data(),i);var o=n.find(".histories-list"),a=!0,s=!1;n.on("click",".btn-reverse",function(){o.children("li").reverseOrder(),a=!a,t(this).find(".icon").toggleClass("icon-arrow-up",a).toggleClass("icon-arrow-down",!a);var e="#lastComment",i=t(e);i.length&&window.KindEditor&&(window.KindEditor.remove(e),i.kindeditor())}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");s=!s,e.toggleClass("icon-plus",!s).toggleClass("icon-minus",s),o.children("li").toggleClass("show-changes",s)}).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"),o=n.hasClass("icon-code");n.toggleClass("icon-code",!o).toggleClass("icon-text",o),e.attr("title",o?i.original:i.textdiff),e.closest("li").toggleClass("show-original",o)}),o.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,c=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(c,e);var o=i.children(".cell"),a={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&&(a={overflow:"hidden",maxHeight:t(window).height()-45})),o.css(a)}};var h=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;c="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");if(i.length){i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(c,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var o=e.find(".sidebar-toggle");if(o.length){var a=function(){var e=o[0].getBoundingClientRect(),i=t(window).height(),n=Math.max(0,Math.floor(Math.min(i-40,e.top+e.height)-Math.max(e.top,0))/2)+(e.top<0?0-e.top:0);o.removeClass("fade").find(".icon").css("top",n+(t.zui.browser.isIE()?(i-80)/2:0))};a(),e.data("init",1).on("sidebar.toggle",a);var s=t.zui.browser.isIE()?1500:0,r=0,l=null,h=function(){var t=Date.now();return l&&(clearTimeout(l),l=null),t-rtr 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"}),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.data()),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()});var d=function(){var e,i,n=t(this),o=t.extend({limitSize:40,suffix:"…"},n.data()),a=n.text();if(a.length>o.limitSize){e=a,i=a.substr(0,o.limitSize)+o.suffix,n.text(i).addClass("limit-text-on");var s=o.toggleBtn?t(o.toggleBtn):n.next(".text-limit-toggle");s.text(s.data("textExpand")),s.on("click",function(){var t=n.toggleClass("limit-text-on").hasClass("limit-text-on");n.text(t?i:e),s.text(s.data(t?"textExpand":"textCollapse"))})}else(o.toggleBtn?t(o.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 o=t(i||window),a=null,s=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),o=n.next(".fixed-head-table");if(i.top<0){var s=e.width();if(o.length){if(a!==s){a=s;var r=o.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var o=t("
").addClass(n.attr("class")),l=e.clone(),r=l.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())}),o.append(l).insertAfter(n)}o.css({left:i.left,width:i.width}).show()}else o.hide()};o.on("scroll",s).on("resize",s),s()}},t(document).on("click","tr[data-url]",function(){var e=t(this),i=e.data("href")||e.data("url");i&&(window.location.href=i)}),"yes"===config.onlybody&&self===parent&&(window.location.href=window.location.href.replace("?onlybody=yes","").replace("&onlybody=yes","")),t(function(){t("body").addClass("m-{currentModule}-{currentMethod}".format(config))});var u,p,f,g,m,v=function(){u||(u=t("#subNavbar"),p=t("#pageNav"),f=t("#pageActions"),g=u.children(".nav"),m=g.outerWidth());var e=u.outerWidth(),i=p.outerWidth()||0,n=f.outerWidth()||0;if(i=i?i+15:0,n=n?n+15:0,!i&&!n)return void g.css({maxWidth:null,left:null,position:"static"});var o=Math.max(300,e-i-n),a=Math.min(o,m),s=(e-a)/2,r=i&&s.btn-toolbar");if(e.length){var i,n,o=e.children(),a=o.length,s=!1,r=null;if(a)for(o.each(function(e){i=t(this),n=i.is(".divider"),n&&!r&&i.hide(),s||n||(s=!0),r=n?null:i,!n||e!==a-1&&0!==e||i.hide()});i.length&&i.is(".divider");)i=i.hide().prev();s||e.hide()}};t(function(){t(".input-group,.btn-group").fixInputGroup(),C()}),window.holders&&t.each(window.holders,function(e){var i=t("#"+e);i.length&&i.is("input")&&i.attr("placeholder",window.holders[e])}),t(function(){var e=t(".table-responsive"),i=t.fixTableResponsive=function(){e.each(function(){this.scrollHeight-3<=this.clientHeight&&this.scrollWidth-3<=this.clientWidth?t(this).addClass("scroll-none").css("overflow","visible"):t(this).removeClass("scroll-none").css("overflow","auto")})};e.length&&(t(window).on("resize",i),setTimeout(i,100))});var _=function(){var e=this,i=t(e),n=i.closest("tr").find("textarea");if(n.length){var o=32;n.each(function(){var e=t(this).closest("td"),i=e.css("height");e.css("height",this.style.height),this.style.height="auto";var n=this.value?this.scrollHeight+2:32;o=Math.max(o,n),e.css("height",i)}),n.css("height",o)}else{e.style.height="auto";var a=e.value?e.scrollHeight+2:32;e.style.height=a+"px"}};t.autoResizeTextarea=function(e){t(e).each(_)},t(function(){t("textarea.autosize").each(_),t(document).on("input paste change","textarea.autosize",_)}),t(function(){var e=t("#dropMenu,.drop-menu");e.length&&e.on("click",".toggle-right-col",function(e){t(this).closest("#dropMenu,.drop-menu").toggleClass("show-right-col"),e.stopPropagation(),e.preventDefault()})});var k="undefined"!=typeof InstallTrigger;t.zui.browser.firefox=k,t("html").toggleClass("is-firefox",k).toggleClass("not-firefox",!k),t(function(){var e=t("#mainContent>.main-col"),i=e.children(".main-actions");if(i.length){var n=i.prev();if(i.length&&n.length){t('
').css("height",i.outerHeight()).insertAfter(i);var o=0,a=function(){var e=n[0].getBoundingClientRect(),s=e.top+e.height+120>t(window).height();if(t("body").toggleClass("main-actions-fixed",s),s){var r=n.width();r?i.width(r):o<10&&setTimeout(a,1e3)}o++};t.resetToolbarPosition=a,a(),t(window).on("resize scroll",a)}}}),t(document).on("show.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&t(e.target).is(".modal")&&window.parent.$("body").addClass("hide-modal-close")}).on("hidden.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&window.parent.$("body").removeClass("hide-modal-close")}).on("loaded.zui.modal",function(e){ -t("body").removeClass("hide-modal-close")}),t(function(){var e=t(".dropdown-menu.with-search");e.length&&(e.find(".menu-search").on("click",function(t){return t.stopPropagation(),!1}),e.on("keyup change paste","input",function(){var e=t(this),i=e.closest(".dropdown-menu.with-search"),n=e.val().toLowerCase(),o=i.find(".option");""==n?o.removeClass("hide"):o.each(function(){var e=t(this);e.toggleClass("hide",e.text().toString().toLowerCase().indexOf(n)<0&&e.data("key").toString().toLowerCase().indexOf(n)<0)})}),e.parents(".dropdown-submenu").one("mouseenter",function(){var e=t(this).find(".dropdown-list")[0];e&&e.getBoundingClientRect&&setTimeout(function(){var t=270,i=e.getBoundingClientRect();i.top<0&&(t=Math.min(270,i.height)+i.top),e.style.maxHeight=Math.min(270,t)+"px"},50)})),t(".dropdown-menu.with-search .menu-search").on("click",function(t){return t.stopPropagation(),!1})})}(jQuery),function(t){function e(){if(!config.skipRedirect&&!window.skipRedirect){var e=window.parent,i=config.currentModule,n=config.currentMethod,o="index"===i&&"index"===n,a="#_single"===location.hash||/(\?|\&)_single/.test(location.search)||o||!t("#mainHeader,#editorNav").length||"tutorial"===i||"install"===i||"upgrade"===i||"user"===i&&("login"===n||"deny"===n)||"my"===i&&"changepassword"===n||t("body").hasClass("allow-self-open"),s=location.href;if(e===window&&!a){var r=location.pathname+location.search+location.hash;return void(location.href=t.createLink("index","index","")+"#app="+encodeURIComponent(r))}if(e!==window&&e.$.apps){o&&e.location.reload();var l=window.name;if(0===l.indexOf("app-")){t.apps=window.apps=e.$.apps;var c=l.substring(4);t.appCode=c,t(document).on("click",function(t){var i=e.document.getElementById(window.name);if(i){var n=e.document.getElementById(i.name)||i;n&&n.dispatchEvent(new Event(t.type,{bubbles:!0}))}}).on("click","a,.open-in-app,.show-in-app",function(e){var i=t(this);if(!i.is("[data-modal],[data-toggle],[data-ride],[data-tab],.iframe,.not-in-app,[target]")&&!i.data("zui.modaltrigger")){var n=i.hasClass("show-in-app")?"":i.attr("href")||(i.is("a")?"":i.data("url")),o=i.data("app")||i.data("group");if(n){if(0===n.indexOf("javascript:")||"#"===n[0])return;var a=t.parseLink(n);if(a.external)return;if("index"===a.moduleName&&"index"===a.methodName)return window.location.reload(),void e.preventDefault()}else if(!o)return;o||(o=t.apps.getAppCode(n)),o&&("help"===o&&(t.apps.appsMap.help.text=i.text(),t.apps.appsMap.help.url||(t.apps.appsMap.help.url=n)),t.apps.open(n,o)&&e.preventDefault())}}),t.apps.updateUrl(c,s,document.title)}}}}function i(){var e=t("#navbar>.nav");if(e.length){var i=t("#heading"),n=+i.css("left").replace("px",""),o=i.outerWidth(),a=e.width(),s=t("#mainHeader>.container").width()-2*n,r=Math.floor((s-a)/2);e.css("marginLeft",r>>0;if(0===o)return!1;for(var a=0|e,s=Math.max(a>=0?a:o-Math.abs(a),0);s1&&("?"===e[0]&&(e=e.substr(1)),e.split("&").forEach(function(t){var e=t.split("=",2);if(e.length>1)try{i[e[0]]=decodeURIComponent(e[1])}catch(n){i[e[0]]=""}else i[e[0]]=""})),t?i[t]:i},t.parseLink=function(e){if(!e)return{};var i=0===e.indexOf("http:")||0===e.indexOf("https:");if(i){var n=window.location.origin;if(e.indexOf(n)<0)return{external:!0,url:e};e=e.substr((n+config.webRoot).length)}var o=e.split("#"),a=o[0].split("?"),s=a[1],r=s?t.getSearchParam("",s):{},l=a[0],c={url:e,isOnlyBody:"yes"===r.onlybody,vars:[],hash:o[1]||"",params:r,tid:r.tid||""};if("GET"===config.requestType){c.moduleName=r[config.moduleVar]||"index",c.methodName=r[config.methodVar]||"index",c.viewType=r[config.viewVar]||config.defaultView;for(var h in r)h!==config.moduleVar&&h!==config.methodVar&&h!==config.viewVar&&"onlybody"!==h&&"tid"!==h&&c.vars.push([h,r[h]])}else{var d=l.lastIndexOf("/");d===l.length-1&&(l=l.substr(0,d),d=l.lastIndexOf("/")),d>=0&&(l=l.substr(d+1));var u=l.lastIndexOf(".");u>=0?(c.viewType=l.substr(u+1),l=l.substr(0,u)):c.viewType=config.defaultView;var p=l.split(config.requestFix);if(c.moduleName=p[0]||"index",c.methodName=p[1]||"index",p.length>2)for(var f=2;f.nav>li").length>10&&(i(),t(window).on("resize",i)),setTimeout(n,1e3)})}(jQuery),function(t){"use strict";function e(e,i){"object"!=typeof i&&(i={user:i});var n=t(e);i=t.extend({},n.data(),i);var o=i.user;"string"==typeof o&&(o={account:o});var a={},s=i.size;s&&(a.width=s,a.height=s,a.lineHeight=s,Number.isNaN(+s)||n.addClass("size-"+s));var r=!!o.avatar;if(n.toggleClass("has-image",r).toggleClass("has-text",!r),n.empty(),r)n.append(t("").attr("src",o.avatar));else{var l=t.zui.strCode(o.account)*(i.hueDistance||43)%360;a.background="hsl("+l+","+(i.saturation||"40%")+","+(i.lightness||"60%")+")",Number.isNaN(+s)||(a.fontSize=Math.round(s/2)+"px");var c=o.name||o.realname||o.account;c=/^[\u4e00-\u9fa5\s]+$/.test(c)?c.length<=2?c:c.substring(c.length-2):/^[A-Za-z\d\s]+$/.test(c)?c[0].toUpperCase():c.length<=2?c:c.substring(0,2),n.append(t('').text(c))}return n.css(a)}t.fn.avatar=function(t){return this.each(function(){e(this,t)})}}(jQuery),$.zui.lang("de",{"zui.pager":{pageOfText:"Seite {0}",prev:"Zurück",next:"Nächste Seite",first:"Erste Seite",last:"Letzte Seite","goto":"Goto",pageOf:"Seite {page}",totalPage:"{totalPage} Seiten",totalCount:"Total: {recTotal} Artikel",pageSize:"{recPerPage} Artikel pro Seite",itemsRange:"Seiten {start} bis {end}",pageOfTotal:"Seite {page}/{totalPage}"},"zui.boards":{append2end:"Gehen Sie zum Ende"},"zui.browser":{tip:"Online. Sorgenfrei. Aktualisiere deinen Browser noch heute!"},"zui.calendar":{weekNames:["Son","Mon","Die","Mit","Don","Fri","Sam"],monthNames:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",year:"{0}Jahr",month:"{0}Monat",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Kein Icon]",commonIcons:"Gemeinsame Symbole",webIcons:"Web-Symbol",editorIcons:"Editor-Symbol",directionalIcons:"Pfeil Zusammenfluss",otherIcons:"Andere Symbole"},"zui.colorPicker":{errorTip:"Kein gültiger Farbwert"},"zui.datagrid":{errorCannotGetDataFromRemote:"Daten vom Remote-Server ({0}) können nicht abgerufen werden.",errorCannotHandleRemoteData:"Die vom Remote-Server zurückgegebenen Daten können nicht verarbeitet werden."},"zui.guideViewer":{prevStep:"Vorheriger Schritt",nextStep:"Nächster Schritt"},"zui.tabs":{reload:"Neu laden",close:"Schliessen",closeOthers:"Schließen Sie andere Registerkarten",closeRight:"Schließen Sie die rechte Registerkarte",reopenLast:"Letzten geschlossenen Tab wiederherstellen",errorCannotFetchFromRemote:"Inhalt kann nicht vom Remote-Server abgerufen werden ({0})."},"zui.uploader":{},datetimepicker:{days:["Sonntag","Montag","Diensteg","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["Son","Mon","Die","Mit","Don","Fri","Sam"],daysMin:["Son","Mon","Die","Mit","Don","Fri","Sam"],months:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",suffix:[],meridiem:[]},chosen:{no_results_text:"Nicht gefunden"},bootbox:{OK:"OK",CANCEL:"Stornieren",CONFIRM:"Bestätigen"}}),$.zui.lang("fr",{"zui.pager":{pageOfText:"Page {0}",prev:"Prev",next:"Suivant",first:"First",last:"Last","goto":"Goto",pageOf:"Page {page}",totalPage:"{totalPage} pages",totalCount:"Total: {recTotal} items",pageSize:"{recPerPage} per page",itemsRange:"De {start} à {end}",pageOfTotal:"Page {page} de {totalPage}"},"zui.boards":{append2end:"Aller jusqu'au bout"},"zui.browser":{tip:"Naviguez sans crainte sur Internet. Mettez votre navigateur à jour dès aujourd'hui!"},"zui.calendar":{weekNames:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],monthNames:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",year:"{0} Année",month:"{0} Mois",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Aucune icône]",commonIcons:"Icônes communes",webIcons:"Icône Web",editorIcons:"Icône de l'éditeur",directionalIcons:"Flèche confluence",otherIcons:"Autres icônes"},"zui.colorPicker":{errorTip:"Pas une valeur de couleur valide"},"zui.datagrid":{errorCannotGetDataFromRemote:"Impossible d'obtenir les données du serveur distant ({0}).",errorCannotHandleRemoteData:"Impossible de traiter les données renvoyées par le serveur distant."},"zui.guideViewer":{prevStep:"Étape précédente",nextStep:"Prochaine étape"},"zui.tabs":{reload:"Recharger",close:"Fermer",closeOthers:"Fermez les autres onglets",closeRight:"Fermer l'onglet de droite",reopenLast:"Restaurer le dernier onglet fermé",errorCannotFetchFromRemote:"Impossible d'obtenir le contenu du serveur distant ({0})."},"zui.uploader":{},datetimepicker:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",suffix:[],meridiem:[]},chosen:{no_results_text:"Pas trouvé"},bootbox:{OK:"D'accord",CANCEL:"Annuler",CONFIRM:"Confirmer"}}); \ No newline at end of file +a.length>1&&(r=a[1],"top"===a[0]?s=e.top:"parent"===a[0]&&(s=e.parent));var c=s[r];if("function"==typeof c){var h=[];return o>0&&")"==n[n.length-1]&&(h=t.parseJSON("["+n.substring(o+1,n.length-1)+"]")),h.push(i),c.apply(l,h)}}};if("success"===i.result){var f=r.locate||i.locate,g=r.closeModal||i.closeModal,m=r.ajaxReload||i.ajaxReload;if(l.enableForm(!0,!!(f||g||m)),h){var v=l.find('[type="submit"]').first(),y=!1;v.length&&(v.popover({container:"body",trigger:"manual",content:h,tipClass:"popover-in-modal popover-success popover-form-result",placement:i.placement||v.data("placement")||r.popoverPlacement||"right"}).popover("show"),setTimeout(function(){v.popover("destroy")},r.popoverTime||2e3),y=!0),c.length&&(c.html(''+h+"").show().delay(3e3).fadeOut(100),y=!0),y||a(h,"success")}if(u)return u(i,!0,l);if(g&&setTimeout(t.zui.closeModal,r.closeModalTime||2e3),p()===!1)return;if(f)if("loadInModal"==f){var b=t(".modal");setTimeout(function(){b.load(b.attr("ref"),function(){t(this).find(".modal-dialog").css("width",t(this).data("width")),t.zui.ajustModalPosition()})},1e3)}else"parent"===f||"top"===f?e[f]&&setTimeout(function(){e[f].location.reload()},1200):"reload"===f?setTimeout(function(){e.location.href=e.location.href},1200):setTimeout(function(){t.tabs?t.tabs.open(f):e.location.href=f},1200);if(m){var w=t(m);w.length&&w.load(e.location.href+" "+m,function(){w.find('[data-toggle="modal"]').modalTrigger()})}}else{if(l.enableForm(),"string"==typeof h)c.length?c.html(''+h+"").show().delay(3e3).fadeOut(100):a(h,"danger");else if("object"==typeof h){var x=!1,C=[];t.each(h,function(e,i){var n=t.isArray(i)?i.join(""):i,o=t("#"+e);if(!o.length)return void C.push(n);var a=e+"Label",s=t("#"+a);if(!s.length){var r=o.closest(".input-group").length,l=o.closest("td").length;s=t('
').appendTo(l?o.closest("td"):r?o.closest(".input-group").parent():o.parent())}s.empty().append(n),o.addClass("has-error");var c=function(){var e=t("#"+a);if(e.length)return e.remove(),o.removeClass("has-error"),!0};o.on("change input mousedown",c);var h=t("#"+e+"_chosen");if(h.length&&h.find(".chosen-single,.chosen-choices").addClass("has-error").on("mousedown",function(){c()===!0&&t(this).removeClass("has-error")}),!x){var d=o[0];if(o.hasClass("chosen"))o.trigger("chosen:activate").trigger("chosen:open"),d=o.parent().find(".chosen-container")[0];else if(o.is("textarea")&&o.data("keditor")){var u=o.data("keditor");u.focus(),u.edit.doc.body.focus(),d=o.parent().find(".ke-container")[0]}else o.focus();d.scrollIntoView&&d.scrollIntoView(),x=!0}}),C.length&&a(C.join(";"),"danger")}if(u)return u(i,!1,l);if(p()===!1)return}}},error:function(t,i,n){if((h&&h(t,i,n,l))!==!1){l.enableForm();var o="timeout"==i||"error"==i?e.lang?e.lang.timeout:i:t.responseText+i+n;a(o,"danger")}}},r),l._ajaxForm(r).data("zui.ajaxform",!0),l.on("click","[data-form-action]",function(){l.attr("action",t(this).data("formAction")).submit()})},t.setAjaxForm=function(e,i,n){t.ajaxForm(e,t.isPlainObject(i)?i:{finish:i,beforeSubmit:n})},t.fn.ajaxForm=function(e){return this.each(function(){t.ajaxForm(this,e)})},t.fn.setInputRequired=function(){return this.each(function(){var e=t(this),i=e.parent();i.is(".input-control,td")?i.addClass("required"):e.is(".chosen")?e.attr("required",null).next(".chosen-container").addClass("required"):i.addClass("required"),e.attr("required",null);var n=i.closest(".input-group");n.length&&1===n.find(".required,input[required],select[required]").length&&n.addClass("required")})},t(function(){t('.form-ajax,form[data-type="ajax"]').ajaxForm(),setTimeout(function(){var i=e.config.requiredFields,n=t("form");i&&(i=i.split(",")),i&&i.length&&t.each(i,function(t,e){n.find("#"+e).attr("required","required")}),n.find("input[required],select[required],textarea[required]").setInputRequired()},400),t('form[target="hiddenwin"]').on("submit",function(){var e=t(this);e.data("zui.ajaxform")||e.enableForm(!1).data("disabledTime",(new Date).getTime())}).on("click",function(){var e=t(this),i=e.data("disabledTime");i&&(new Date).getTime()-i>1e4&&e.enableForm(!0).data("disabledTime",null)})})}(jQuery,window,void 0),function(t){"use strict";var e="zui.searchList",i=function(t,e){if(t&&t.length)for(var i=0;i
').append(s)),i.$menu.append(s),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].scrollIntoViewIfNeeded&&t[0].scrollIntoViewIfNeeded({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,o=void 0===e||null===e||""===e;n.$.toggleClass("has-search-text",!o);var a=n.getItems().removeClass("active");if(o)a.removeClass("hidden");else{var s=e.trim().split(" ");a.each(function(){var e=t(this),n=(e.text()+" "+(e.data("key")||e.data("filter")||"")).trim();e.toggleClass("hidden",!i(s,n))})}n.scrollTo(a.not(".hidden").first().addClass("active")),n.$.trigger("onSearchComplete",e)},n.DEFAULTS={selector:".list-group a:not(.not-list-item)",searchBox:".search-box",onSelectItem:null},t.fn.searchList=function(i){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof i&&i;a||o.data(e,a=new n(this,s)),"string"==typeof i&&a[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,o){var a=this;a.name=e,a.$=t(n),o=a.options=t.extend({},i.DEFAULTS,this.$.data(),o),a.$.hide(),a.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 o=e.$.next();n=o.hasClass(".label-selector")?o:t('
')}n.parent().length||e.$.after(n),e.$wrapper=n,n.on("click",".label",function(i){var n=e.$.val(),o=t(this).data("value");e.hasEmptyValue!==!1&&o==n&&(o=e.hasEmptyValue),e.select(o),i.preventDefault()})}n.empty();var a=e.$.val();e.hasEmptyValue=!1,e.$.children("option").each(function(){var e=t(this),o={label:e.text(),value:e.val()},s=(""===o.value||"0"===o.value)&&!o.label,r=t(i.labelTemplate||'');i.labelClass&&!s&&r.addClass(i.labelClass),i.labelCreator?r=i.labelCreator(r):(r.data("option",o).attr("data-value",o.value),s?r.addClass("empty").append(''):r.text(o.label).toggleClass("active",a===o.value)),n.append(r)})},i.DEFAULTS={},t.fn.labelSelector=function(n){return this.each(function(){var o=t(this),a=o.data(e),s="object"==typeof n&&n;a||o.data(e,a=new i(this,s)),"string"==typeof n&&a[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=ts.fileMaxSize&&(c.val(""),(window.bootbox||window).alert(s.fileSizeError.format(n(s.fileMaxSize)))),r.update()}),r.update()};a.prototype.getFile=function(){var t=this.$input.prop("files");return t&&t[0]},a.prototype.update=function(){var t=this,e=t.$,i=t.getFile(),o=!i;e.toggleClass("normal",!o).toggleClass("empty",o),i?(t.oldName=i.name,e.find(".file-title").text(i.name).attr("title",i.name),e.find(".file-size").text(n(i.size)),e.find(".file-editbox").val(i.name).attr("size",i.name.length),t.options.onSelect&&t.options.onSelect(i,t)):e.find(".file-editbox").val("")},a.DEFAULTS={fileMaxSize:0,fileSizeError:"无法上传大于 {0} 的文件。"},t.fn.fileInput=function(i){return this.each(function(){var n=t(this),o=n.data(e),s="object"==typeof i&&i;o||n.data(e,o=new a(this,s)),"string"==typeof i&&o[i]()})},a.NAME=e,t.fn.fileInput.Constructor=a,t(function(){t('[data-provide="fileInput"]').fileInput()});var s="zui.fileInputList",r=function(e,i){var n=this;n.name=s;var o=n.$=t(e);i=n.options=t.extend({},r.DEFAULTS,this.$.data(),i),n.$template=o.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(s),o="object"==typeof e&&e;n||i.data(s,n=new r(this,o)),"string"==typeof e&&n[e]()})},r.NAME=s,t.fn.fileInputList.Constructor=r,t(function(){t('[data-provide="fileInputList"]').fileInputList()})}(jQuery),function(t){window.config||(window.config={}),t.createLink=window.createLink=function(e,n,o,a,s,r,l){if("object"==typeof e)return t.createLink(e.moduleName,e.methodName,e.vars,e.viewType,e.isOnlyBody,e.hash,e.tid);if(t.tabSession&&!l&&(l=t.tabSession.getTid()),a||(a=config.defaultView),s||(s=!1),o)for("string"==typeof o&&(o=o.split("&")),i=0;i'+d+"")}}t.val()||(time=e(a.format("hh:mm")),time=time-time%10+10,t.val(n(time)))};t.fn.timeSpanControl=function(i){return this.each(function(){var s=t(this),r=t.extend({},i,s.data()),l=s.find('[name="begin"],.control-time-begin'),c=s.find('[name="end"],.control-time-end'),h=function(){var t=l.val();if(s.find(".hide-empty-begin").toggleClass("hide",!t),t){var i=n(e(t)+30);c.find('option[value="'+i+'"]').length&&c.val(i),r.onChange&&r.onChange(c,i)}};if(s.data("timeSpanControlInit")){if(r.begin){var d=o(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=o(r.end).format("hh:mm");c.find('option[value="'+u+'"]').length&&c.val(u),r.onChange&&r.onChange(c,u)}}else l.on("change",h),a(l,r.begin),a(c,r.end),s.data("timeSpanControlInit",!0);r.end||h()})},t.timeSpanControl={convertTimeToNum:e,convertNumToTime:n,initTimeSelect:a,createTime:o};var s=t.setSearchType=function(e,i){var n=t("#searchType");e||(e=n.val()),e=e||"bug",n.val(e);var o=t("#searchTypeMenu");o.find("li.selected").removeClass("selected");var a=o.find('a[data-value="'+e+'"]'),s=a.text();a.parent().addClass("selected"),t("#searchTypeName").text(s),i||t("#searchInput").focus()};t.gotoObject=function(e,i){if(e||(e=t("#searchType").val()),i||(i=t("#searchInput").val()),i&&e)if(i=i.replace(/[^\d]/g,"")){var n=e.split("-");e=n[0];var o=n.length>1?n[1]:"testsuite"===e?"library":"view",a=t.createLink(e,o,"id="+i);t.apps?t.apps.open(a):window.location.href=a}else{var s={zh_cn:"请输入数字ID进行搜索",zh_tw:"請輸入數值ID行搜索"};alert(lang.searchTip||s[t.zui.clientLang()]||"Please enter a numberic id to search")}t("#searchInput").val(i).focus()},t(function(){s(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(t){t?window.top.location.reload():window.location.reload()},t.selectLang=window.selectLang=function(e){t.cookie("lang",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectLang"),t.refreshPage(1)},t.selectTheme=window.selectTheme=function(e){t.cookie("theme",e,{expires:config.cookieLife,path:config.webRoot}),t.ajaxSendScore("selectTheme"),t.refreshPage(1)},t.zui.Picker&&(t.zui.Picker.DEFAULTS.optionRender=function(e,i,n){if("user"===n.options.type){var o=n.options.users;if(!o)return;var a=o[i.value];if(!a)return;if(e.find(".picker-option-text").text(a.realname||a.account),e.hasClass("picker-user-option"))return;return e.prepend(t('
').avatar({user:a})),a.deptName&&e.append(t('').text(a.deptName)),a.roleName&&e.append(t('').text(a.roleName)),e.addClass("picker-user-option")}},t.zui.setUserPickerInfos=function(e){t.zui.Picker.DEFAULTS.users=t.extend({},t.zui.Picker.DEFAULTS.users,e)},t(function(){t(".picker-select[data-pickertype!='remote']").picker({chosenMode:!0}),t("[data-pickertype='remote']").each(function(){var e=t(this).attr("data-pickerremote");t(this).picker({chosenMode:!0,remote:e})}),window.pickerUsers&&t.zui.setUserPickerInfos(window.pickerUsers),t(".user-picker").picker({type:"user"})})),t.chosenDefaultOptions={middle_highlight:!0,disable_search_threshold:1,compact_search:!0,allow_single_deselect:!0,placeholder_text_single:" ",placeholder_text_multiple:" ",search_contains:!0,max_drop_width:500,max_drop_height:245,no_wrap:!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;e.css("position","relative");var i="down",n=this.container.find(".chosen-drop"),o=this.container.position(),a=n.outerHeight();return o.top>=a&&o.top+31+a>e.outerHeight()&&(i="up"),this.drop_directionFixed=i,i}return"auto"}},t.chosenSimpleOptions=t.extend({},t.chosenDefaultOptions,{disable_search_threshold:6}),t.fn._chosen=t.fn.chosen,t.fn.chosen=function(e){return"string"==typeof e?this._chosen(e):this.each(function(){var i=t(this).addClass("chosen-controled");return i._chosen(t.extend({},i.hasClass("chosen-simple")?t.chosenSimpleOptions:t.chosenDefaultOptions,i.data(),e))})},t.fn.chosen.Constructor=t.fn._chosen.Constructor,t(function(){t(".chosen,.chosen-simple").each(function(){var e=t(this);e.closest(".template").length||e.chosen()})}),t.extend(t.fn.pager.Constructor.DEFAULTS,{maxNavCount:8,prevIcon:"icon-angle-left",nextIcon:"icon-angle-right",firstIcon:"icon-first-page",lastIcon:"icon-last-page",navEllipsisItem:"…",menuDirection:"dropup",pageSizeOptions:[5,10,15,20,25,30,35,40,45,50,100,200,500,1e3,2e3],elements:["total_text","size_menu","first_icon","prev_icon",'
{page}/{totalPage}
',"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.extend(!0,t.zui.Messager.DEFAULTS,{cssClass:"messagger-zt",icons:{success:"check-circle",info:"chat-line",warning:"exclamation-sign",danger:"exclamation-sign"}}),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);if(!n.data("historiesInited")){n.data("historiesInited",1),i=t.extend({},n.data(),i);var o=n.find(".histories-list"),a=!0,s=!1;n.on("click",".btn-reverse",function(){o.children("li").reverseOrder(),a=!a,t(this).find(".icon").toggleClass("icon-arrow-up",a).toggleClass("icon-arrow-down",!a);var e="#lastComment",i=t(e);i.length&&window.KindEditor&&(window.KindEditor.remove(e),i.kindeditor())}).on("click",".btn-expand-all",function(){var e=t(this).find(".icon");s=!s,e.toggleClass("icon-plus",!s).toggleClass("icon-minus",s),o.children("li").toggleClass("show-changes",s)}).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"),o=n.hasClass("icon-code");n.toggleClass("icon-code",!o).toggleClass("icon-text",o),e.attr("title",o?i.original:i.textdiff),e.closest("li").toggleClass("show-original",o)}),o.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,c=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(c,e);var o=i.children(".cell"),a={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&&(a={overflow:"hidden",maxHeight:t(window).height()-45})),o.css(a)}};var h=t.initSidebar=function(){var e=t("#sidebar");if(e.length){if(e.data("init"))return!0;c="sidebar:"+(e.data("id")||config.currentModule+"/"+config.currentMethod);var i=t("main");if(i.length){i.on("click",".sidebar-toggle",function(){t.toggleSidebar(i.hasClass("hide-sidebar"))});var n=t.zui.store.get(c,e.data("hide")!==!1);n===!1&&e.addClass("no-animate"),t.toggleSidebar(n),n===!1&&setTimeout(function(){e.removeClass("no-animate")},500);var o=e.find(".sidebar-toggle");if(o.length){var a=function(){var e=o[0].getBoundingClientRect(),i=t(window).height(),n=Math.max(0,Math.floor(Math.min(i-40,e.top+e.height)-Math.max(e.top,0))/2)+(e.top<0?0-e.top:0);o.removeClass("fade").find(".icon").css("top",n+(t.zui.browser.isIE()?(i-80)/2:0))};a(),e.data("init",1).on("sidebar.toggle",a);var s=t.zui.browser.isIE()?1500:0,r=0,l=null,h=function(){var t=Date.now();return l&&(clearTimeout(l),l=null),t-rtr 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"}),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.data()),e.modalTrigger(i)}})},t(function(){t("a.iframe,.export").initIframeModal()}),t.fixedTableHead=window.fixedTableHead=function(e,i){var n=t(e);if(n.is("table")||(n=n.find("table")),n.length){var o=t(i||window),a=null,s=function(){var e=n.children("thead"),i=e[0].getBoundingClientRect(),o=n.next(".fixed-head-table");if(i.top<0){var s=e.width();if(o.length){if(a!==s){a=s;var r=o.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())})}}else{var o=t("
").addClass(n.attr("class")),l=e.clone(),r=l.find("th");e.find("th").each(function(e){r.eq(e).width(t(this).width())}),o.append(l).insertAfter(n)}o.css({left:i.left,width:i.width}).show()}else o.hide()};o.on("scroll",s).on("resize",s),s()}},t(document).on("click","tr[data-url]",function(){var e=t(this),i=e.data("href")||e.data("url");i&&(window.location.href=i)}),"yes"===config.onlybody&&self===parent&&(window.location.href=window.location.href.replace("?onlybody=yes","").replace("&onlybody=yes","")),t(function(){t("body").addClass("m-{currentModule}-{currentMethod}".format(config))});var d,u,p,f,g,m=function(){d||(d=t("#subNavbar"),u=t("#pageNav"),p=t("#pageActions"),f=d.children(".nav"),g=f.outerWidth());var e=d.outerWidth(),i=u.outerWidth()||0,n=p.outerWidth()||0;if(i=i?i+15:0,n=n?n+15:0,!i&&!n)return void f.css({maxWidth:null,left:null,position:"static"});var o=Math.max(300,e-i-n),a=Math.min(o,g),s=(e-a)/2,r=i&&s.btn-toolbar");if(e.length){var i,n,o=e.children(),a=o.length,s=!1,r=null;if(a)for(o.each(function(e){i=t(this),n=i.is(".divider"),n&&!r&&i.hide(),s||n||(s=!0),r=n?null:i,!n||e!==a-1&&0!==e||i.hide()});i.length&&i.is(".divider");)i=i.hide().prev();s||e.hide()}};t(function(){t(".input-group,.btn-group").fixInputGroup(),x()}),window.holders&&t.each(window.holders,function(e){var i=t("#"+e);i.length&&i.is("input")&&i.attr("placeholder",window.holders[e])}),t(function(){var e=t(".table-responsive"),i=t.fixTableResponsive=function(){e.each(function(){this.scrollHeight-3<=this.clientHeight&&this.scrollWidth-3<=this.clientWidth?t(this).addClass("scroll-none").css("overflow","visible"):t(this).removeClass("scroll-none").css("overflow","auto")})};e.length&&(t(window).on("resize",i),setTimeout(i,100))});var C=function(){var e=this,i=t(e),n=i.closest("tr").find("textarea");if(n.length){var o=32;n.each(function(){var e=t(this).closest("td"),i=e.css("height");e.css("height",this.style.height),this.style.height="auto";var n=this.value?this.scrollHeight+2:32;o=Math.max(o,n),e.css("height",i)}),n.css("height",o)}else{e.style.height="auto";var a=e.value?e.scrollHeight+2:32;e.style.height=a+"px"}};t.autoResizeTextarea=function(e){t(e).each(C)},t(function(){t("textarea.autosize").each(C),t(document).on("input paste change","textarea.autosize",C)}),t(function(){var e=t("#dropMenu,.drop-menu");e.length&&e.on("click",".toggle-right-col",function(e){t(this).closest("#dropMenu,.drop-menu").toggleClass("show-right-col"),e.stopPropagation(),e.preventDefault()})});var _="undefined"!=typeof InstallTrigger;t.zui.browser.firefox=_,t("html").toggleClass("is-firefox",_).toggleClass("not-firefox",!_),t(function(){var e=t("#mainContent>.main-col"),i=e.children(".main-actions");if(i.length){var n=i.prev();if(i.length&&n.length){t('
').css("height",i.outerHeight()).insertAfter(i);var o=0,a=function(){var e=n[0].getBoundingClientRect(),s=e.top+e.height+120>t(window).height();if(t("body").toggleClass("main-actions-fixed",s),s){var r=n.width();r?i.width(r):o<10&&setTimeout(a,1e3)}o++};t.resetToolbarPosition=a,a(),t(window).on("resize scroll",a)}}}),t(document).on("show.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&t(e.target).is(".modal")&&window.parent.$("body").addClass("hide-modal-close")}).on("hidden.zui.modal",function(e){t("body.body-modal").length&&window.parent&&window.parent!==window&&window.parent.$("body").removeClass("hide-modal-close")}).on("loaded.zui.modal",function(e){t("body").removeClass("hide-modal-close")}),t(function(){var e=t(".dropdown-menu.with-search");e.length&&(e.find(".menu-search").on("click",function(t){return t.stopPropagation(),!1}),e.on("keyup change paste","input",function(){var e=t(this),i=e.closest(".dropdown-menu.with-search"),n=e.val().toLowerCase(),o=i.find(".option");""==n?o.removeClass("hide"):o.each(function(){var e=t(this);e.toggleClass("hide",e.text().toString().toLowerCase().indexOf(n)<0&&e.data("key").toString().toLowerCase().indexOf(n)<0)})}),e.parents(".dropdown-submenu").one("mouseenter",function(){var e=t(this).find(".dropdown-list")[0];e&&e.getBoundingClientRect&&setTimeout(function(){ +var i=270,n=e.getBoundingClientRect();n.top<0&&(i=Math.min(270,n.height)+n.top),e.style.maxHeight=Math.min(270,i,t(window).height()-28)+"px"},50)})),t(".dropdown-menu.with-search .menu-search").on("click",function(t){return t.stopPropagation(),!1})})}(jQuery),function(t){function e(){if(!config.skipRedirect&&!window.skipRedirect){var e=window.parent,i=config.currentModule,n=config.currentMethod,o="index"===i&&"index"===n,a="#_single"===location.hash||/(\?|\&)_single/.test(location.search)||o||!t("#mainHeader,#editorNav").length||"tutorial"===i||"install"===i||"upgrade"===i||"user"===i&&("login"===n||"deny"===n)||"my"===i&&"changepassword"===n||t("body").hasClass("allow-self-open"),s=location.href;if(e===window&&!a){var r=location.pathname+location.search+location.hash;return void(location.href=t.createLink("index","index","")+"#app="+encodeURIComponent(r))}if(e!==window&&e.$.apps){o&&e.location.reload();var l=window.name;if(0===l.indexOf("app-")){t.apps=window.apps=e.$.apps;var c=l.substring(4);t.appCode=c,t(document).on("click",function(t){var i=e.document.getElementById(window.name);if(i){var n=e.document.getElementById(i.name)||i;n&&n.dispatchEvent(new Event(t.type,{bubbles:!0}))}}).on("click","a,.open-in-app,.show-in-app",function(e){var i=t(this);if(!i.is("[data-modal],[data-toggle],[data-ride],[data-tab],.iframe,.not-in-app,[target]")&&!i.data("zui.modaltrigger")){var n=i.hasClass("show-in-app")?"":i.attr("href")||(i.is("a")?"":i.data("url")),o=i.data("app")||i.data("group");if(n){if(0===n.indexOf("javascript:")||"#"===n[0])return;var a=t.parseLink(n);if(a.external)return;if("index"===a.moduleName&&"index"===a.methodName)return window.location.reload(),void e.preventDefault()}else if(!o)return;o||(o=t.apps.getAppCode(n)),o&&("help"===o&&(t.apps.appsMap.help.text=i.text(),t.apps.appsMap.help.url||(t.apps.appsMap.help.url=n)),t.apps.open(n,o)&&e.preventDefault())}}),t.apps.updateUrl(c,s,document.title)}}}}function i(){var e=t("#navbar>.nav");if(e.length){var i=t("#heading"),n=+i.css("left").replace("px",""),o=i.outerWidth(),a=e.width(),s=t("#mainHeader>.container").width()-2*n,r=Math.floor((s-a)/2);e.css("marginLeft",r>>0;if(0===o)return!1;for(var a=0|e,s=Math.max(a>=0?a:o-Math.abs(a),0);s1&&("?"===e[0]&&(e=e.substr(1)),e.split("&").forEach(function(t){var e=t.split("=",2);if(e.length>1)try{i[e[0]]=decodeURIComponent(e[1])}catch(n){i[e[0]]=""}else i[e[0]]=""})),t?i[t]:i},t.parseLink=function(e){if(!e)return{};var i=0===e.indexOf("http:")||0===e.indexOf("https:");if(i){var n=window.location.origin;if(e.indexOf(n)<0)return{external:!0,url:e};e=e.substr((n+config.webRoot).length)}var o=e.split("#"),a=o[0].split("?"),s=a[1],r=s?t.getSearchParam("",s):{},l=a[0],c={url:e,isOnlyBody:"yes"===r.onlybody,vars:[],hash:o[1]||"",params:r,tid:r.tid||""};if("GET"===config.requestType){c.moduleName=r[config.moduleVar]||"index",c.methodName=r[config.methodVar]||"index",c.viewType=r[config.viewVar]||config.defaultView;for(var h in r)h!==config.moduleVar&&h!==config.methodVar&&h!==config.viewVar&&"onlybody"!==h&&"tid"!==h&&c.vars.push([h,r[h]])}else{var d=l.lastIndexOf("/");d===l.length-1&&(l=l.substr(0,d),d=l.lastIndexOf("/")),d>=0&&(l=l.substr(d+1));var u=l.lastIndexOf(".");u>=0?(c.viewType=l.substr(u+1),l=l.substr(0,u)):c.viewType=config.defaultView;var p=l.split(config.requestFix);if(c.moduleName=p[0]||"index",c.methodName=p[1]||"index",p.length>2)for(var f=2;f.nav>li").length>10&&(i(),t(window).on("resize",i)),setTimeout(n,1e3)})}(jQuery),function(t){"use strict";function e(e,i){"object"!=typeof i&&(i={user:i});var n=t(e);i=t.extend({},n.data(),i);var o=i.user;"string"==typeof o&&(o={account:o});var a={},s=i.size;s&&(a.width=s,a.height=s,a.lineHeight=s,Number.isNaN(+s)||n.addClass("size-"+s));var r=!!o.avatar;if(n.toggleClass("has-image",r).toggleClass("has-text",!r),n.empty(),r)n.append(t("").attr("src",o.avatar));else{var l=t.zui.strCode(o.account)*(i.hueDistance||43)%360;a.background="hsl("+l+","+(i.saturation||"40%")+","+(i.lightness||"60%")+")",Number.isNaN(+s)||(a.fontSize=Math.round(s/2)+"px");var c=o.name||o.realname||o.account;c=/^[\u4e00-\u9fa5\s]+$/.test(c)?c.length<=2?c:c.substring(c.length-2):/^[A-Za-z\d\s]+$/.test(c)?c[0].toUpperCase():c.length<=2?c:c.substring(0,2),n.append(t('').text(c))}return n.css(a)}t.fn.avatar=function(t){return this.each(function(){e(this,t)})}}(jQuery),$.zui.lang("de",{"zui.pager":{pageOfText:"Seite {0}",prev:"Zurück",next:"Nächste Seite",first:"Erste Seite",last:"Letzte Seite","goto":"Goto",pageOf:"Seite {page}",totalPage:"{totalPage} Seiten",totalCount:"Total: {recTotal} Artikel",pageSize:"{recPerPage} Artikel pro Seite",itemsRange:"Seiten {start} bis {end}",pageOfTotal:"Seite {page}/{totalPage}"},"zui.boards":{append2end:"Gehen Sie zum Ende"},"zui.browser":{tip:"Online. Sorgenfrei. Aktualisiere deinen Browser noch heute!"},"zui.calendar":{weekNames:["Son","Mon","Die","Mit","Don","Fri","Sam"],monthNames:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",year:"{0}Jahr",month:"{0}Monat",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Kein Icon]",commonIcons:"Gemeinsame Symbole",webIcons:"Web-Symbol",editorIcons:"Editor-Symbol",directionalIcons:"Pfeil Zusammenfluss",otherIcons:"Andere Symbole"},"zui.colorPicker":{errorTip:"Kein gültiger Farbwert"},"zui.datagrid":{errorCannotGetDataFromRemote:"Daten vom Remote-Server ({0}) können nicht abgerufen werden.",errorCannotHandleRemoteData:"Die vom Remote-Server zurückgegebenen Daten können nicht verarbeitet werden."},"zui.guideViewer":{prevStep:"Vorheriger Schritt",nextStep:"Nächster Schritt"},"zui.tabs":{reload:"Neu laden",close:"Schliessen",closeOthers:"Schließen Sie andere Registerkarten",closeRight:"Schließen Sie die rechte Registerkarte",reopenLast:"Letzten geschlossenen Tab wiederherstellen",errorCannotFetchFromRemote:"Inhalt kann nicht vom Remote-Server abgerufen werden ({0})."},"zui.uploader":{},datetimepicker:{days:["Sonntag","Montag","Diensteg","Mittwoch","Donnerstag","Freitag","Samstag"],daysShort:["Son","Mon","Die","Mit","Don","Fri","Sam"],daysMin:["Son","Mon","Die","Mit","Don","Fri","Sam"],months:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],monthsShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],today:"Heute",suffix:[],meridiem:[]},chosen:{no_results_text:"Nicht gefunden"},bootbox:{OK:"OK",CANCEL:"Stornieren",CONFIRM:"Bestätigen"}}),$.zui.lang("fr",{"zui.pager":{pageOfText:"Page {0}",prev:"Prev",next:"Suivant",first:"First",last:"Last","goto":"Goto",pageOf:"Page {page}",totalPage:"{totalPage} pages",totalCount:"Total: {recTotal} items",pageSize:"{recPerPage} per page",itemsRange:"De {start} à {end}",pageOfTotal:"Page {page} de {totalPage}"},"zui.boards":{append2end:"Aller jusqu'au bout"},"zui.browser":{tip:"Naviguez sans crainte sur Internet. Mettez votre navigateur à jour dès aujourd'hui!"},"zui.calendar":{weekNames:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],monthNames:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",year:"{0} Année",month:"{0} Mois",yearMonth:"{0}-{1}"},"zui.chosenIcons":{emptyIcon:"[Aucune icône]",commonIcons:"Icônes communes",webIcons:"Icône Web",editorIcons:"Icône de l'éditeur",directionalIcons:"Flèche confluence",otherIcons:"Autres icônes"},"zui.colorPicker":{errorTip:"Pas une valeur de couleur valide"},"zui.datagrid":{errorCannotGetDataFromRemote:"Impossible d'obtenir les données du serveur distant ({0}).",errorCannotHandleRemoteData:"Impossible de traiter les données renvoyées par le serveur distant."},"zui.guideViewer":{prevStep:"Étape précédente",nextStep:"Prochaine étape"},"zui.tabs":{reload:"Recharger",close:"Fermer",closeOthers:"Fermez les autres onglets",closeRight:"Fermer l'onglet de droite",reopenLast:"Restaurer le dernier onglet fermé",errorCannotFetchFromRemote:"Impossible d'obtenir le contenu du serveur distant ({0})."},"zui.uploader":{},datetimepicker:{days:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],daysShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],daysMin:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],months:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],monthsShort:["Jan","Fév","Mar","Avr","Mai","Juin","Juil","Août","Sep","Oct","Nov","Déc"],today:"Aujourd'hui",suffix:[],meridiem:[]},chosen:{no_results_text:"Pas trouvé"},bootbox:{OK:"D'accord",CANCEL:"Annuler",CONFIRM:"Confirmer"}}); \ No newline at end of file From 13d354ba8c9520234de2e90cf41fa04f7f7fb837 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Mon, 18 Apr 2022 11:35:36 +0800 Subject: [PATCH 07/42] * Fix bug #21518. --- lib/base/filter/filter.class.php | 19 +++++++++++++++++++ module/testcase/model.php | 12 ++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/base/filter/filter.class.php b/lib/base/filter/filter.class.php index 8db2523369..020f440076 100644 --- a/lib/base/filter/filter.class.php +++ b/lib/base/filter/filter.class.php @@ -1370,4 +1370,23 @@ class baseFixer foreach($fields as $key => $fieldName) if(!isset($this->data->$fieldName)) unset($fields[$key]); return $fields; } + + /** + * 过滤Emoji表情。 + * Filter Emoji. + * + * @param string $fieldName + * @access public + * @return object + */ + public function filterEmoji($fieldName){ + $fields = $this->processFields($fieldName); + foreach($fields as $fieldName) + { + $this->data->$fieldName = preg_replace_callback('/./u', function (array $match){ + return strlen($match[0]) >= 4 ? '' : $match[0]; + }, $this->data->$fieldName); + } + return $this; + } } diff --git a/module/testcase/model.php b/module/testcase/model.php index 1158b7b9b7..5a40c8347f 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -71,7 +71,9 @@ class testcaseModel extends model $this->loadModel('file')->saveUpload('testcase', $caseID); $parentStepID = 0; $this->loadModel('score')->create('testcase', 'create', $caseID); - foreach($this->post->steps as $stepID => $stepDesc) + + $data = fixer::input('post')->filterEmoji('steps,expects')->get(); + foreach($data->steps as $stepID => $stepDesc) { if(empty($stepDesc)) continue; $stepType = $this->post->stepType; @@ -81,7 +83,7 @@ class testcaseModel extends model $step->case = $caseID; $step->version = 1; $step->desc = htmlSpecialString($stepDesc); - $step->expect = $step->type == 'group' ? '' : htmlSpecialString($this->post->expects[$stepID]); + $step->expect = $step->type == 'group' ? '' : htmlSpecialString($data->expects[$stepID]); $this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec(); if($step->type == 'group') $parentStepID = $this->dao->lastInsertID(); if($step->type == 'step') $parentStepID = 0; @@ -741,7 +743,9 @@ class testcaseModel extends model /* Ignore steps when post has no steps. */ if($this->post->steps) { - foreach($this->post->steps as $stepID => $stepDesc) + $data = fixer::input('post')->filterEmoji('steps,expects')->get(); + + foreach($data->steps as $stepID => $stepDesc) { if(empty($stepDesc)) continue; $stepType = $this->post->stepType; @@ -751,7 +755,7 @@ class testcaseModel extends model $step->case = $caseID; $step->version = $version; $step->desc = htmlSpecialString($stepDesc); - $step->expect = $step->type == 'group' ? '' : htmlSpecialString($this->post->expects[$stepID]); + $step->expect = $step->type == 'group' ? '' : htmlSpecialString($data->expects[$stepID]); $this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec(); if($step->type == 'group') $parentStepID = $this->dao->lastInsertID(); if($step->type == 'step') $parentStepID = 0; From c5eddbe19b34835a2386e6e9ec81830f33a44b4a Mon Sep 17 00:00:00 2001 From: liyuchun Date: Mon, 18 Apr 2022 11:49:44 +0800 Subject: [PATCH 08/42] * Fix bug #21565. --- module/user/lang/de.php | 4 ++-- module/user/lang/en.php | 4 ++-- module/user/lang/fr.php | 4 ++-- module/user/lang/vi.php | 4 ++-- module/user/lang/zh-cn.php | 4 ++-- module/user/lang/zh-tw.php | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/module/user/lang/de.php b/module/user/lang/de.php index e1fac43bbf..5e3bf4ef5f 100644 --- a/module/user/lang/de.php +++ b/module/user/lang/de.php @@ -257,8 +257,8 @@ $lang->user->mkdirLinux = <<
不能创建临时目录,请确认目录%s是否存在并有操作权限。
-
命令为:chmod o=rwx -R %s。
+
命令为:chmod 777 -R %s。
Can't create tmp directory, make sure the directory %s exists and has permission to operate.
-
Commond: chmod o=rwx -R %s.
+
Commond: chmod 777 -R %s.
EOT; diff --git a/module/user/lang/en.php b/module/user/lang/en.php index 14d696b30b..fb5bde9f72 100644 --- a/module/user/lang/en.php +++ b/module/user/lang/en.php @@ -285,8 +285,8 @@ $lang->user->mkdirLinux = <<
不能创建临时目录,请确认目录%s是否存在并有操作权限。
-
命令为:chmod o=rwx -R %s。
+
命令为:chmod 777 -R %s。
A tmp directory cannot be created. Make sure the directory %s exists and you have the right permission.
-
Commond: chmod o=rwx -R %s.
+
Commond: chmod 777 -R %s.
EOT; diff --git a/module/user/lang/fr.php b/module/user/lang/fr.php index 4fee2d2e56..8d44bab0e2 100644 --- a/module/user/lang/fr.php +++ b/module/user/lang/fr.php @@ -257,8 +257,8 @@ $lang->user->mkdirLinux = <<
不能创建临时目录,请确认目录%s是否存在并有操作权限。
-
命令为:chmod o=rwx -R %s。
+
命令为:chmod 777 -R %s。
Can't create tmp directory, make sure the directory %s exists and has permission to operate.
-
Commond: chmod o=rwx -R %s.
+
Commond: chmod 777 -R %s.
EOT; diff --git a/module/user/lang/vi.php b/module/user/lang/vi.php index be2c0df758..e1758bcfa4 100644 --- a/module/user/lang/vi.php +++ b/module/user/lang/vi.php @@ -257,8 +257,8 @@ $lang->user->mkdirLinux = <<
不能创建临时目录,请确认目录%s是否存在并有操作权限。
-
命令为:chmod o=rwx -R %s。
+
命令为:chmod 777 -R %s。
Can't create tmp directory, make sure the directory %s exists and has permission to operate.
-
Commond: chmod o=rwx -R %s.
+
Commond: chmod 777 -R %s.
EOT; diff --git a/module/user/lang/zh-cn.php b/module/user/lang/zh-cn.php index 254ca75748..6eff61e61c 100644 --- a/module/user/lang/zh-cn.php +++ b/module/user/lang/zh-cn.php @@ -285,9 +285,9 @@ $lang->user->mkdirLinux = <<
不能创建临时目录,请确认目录%s是否存在并有操作权限。
-
命令为:chmod o=rwx -R %s。
+
命令为:chmod 777 -R %s。
Can't create tmp directory, make sure the directory %s exists and has permission to operate.
-
Commond: chmod o=rwx -R %s.
+
Commond: chmod 777 -R %s.
EOT; diff --git a/module/user/lang/zh-tw.php b/module/user/lang/zh-tw.php index c494bef9ef..4fb85233db 100644 --- a/module/user/lang/zh-tw.php +++ b/module/user/lang/zh-tw.php @@ -282,9 +282,9 @@ $lang->user->mkdirLinux = <<
不能創建臨時目錄,請確認目錄%s是否存在並有操作權限。
-
命令為:chmod o=rwx -R %s。
+
命令為:chmod 777 -R %s。
Can't create tmp directory, make sure the directory %s exists and has permission to operate.
-
Commond: chmod o=rwx -R %s.
+
Commond: chmod 777 -R %s.
EOT; From 8ce20cb7467b91465776cf918b64b107e56cd1fb Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 18 Apr 2022 13:45:46 +0800 Subject: [PATCH 09/42] * Fix bug#14454. --- module/block/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/block/control.php b/module/block/control.php index 2ed074a095..1b08f2b03c 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -1708,8 +1708,8 @@ class block extends control if(common::hasPriv('todo', 'view')) $hasViewPriv['todo'] = true; if(common::hasPriv('task', 'view')) $hasViewPriv['task'] = true; if(common::hasPriv('bug', 'view') and $this->config->vision != 'lite') $hasViewPriv['bug'] = true; - if(common::hasPriv('story', 'view') and $this->config->vision != 'lite') $hasViewPriv['story'] = true; if($this->config->URAndSR and common::hasPriv('story', 'view') and $this->config->vision != 'lite') $hasViewPriv['requirement'] = true; + if(common::hasPriv('story', 'view') and $this->config->vision != 'lite') $hasViewPriv['story'] = true; if(common::hasPriv('risk', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['risk'] = true; if(common::hasPriv('issue', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['issue'] = true; if(common::hasPriv('meeting', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['meeting'] = true; From 921b3e96ce6a8e67afae29bbd3cff26f62b6ac64 Mon Sep 17 00:00:00 2001 From: Zongjun Lan Date: Mon, 18 Apr 2022 14:08:02 +0800 Subject: [PATCH 10/42] * fix bug *12982 --- module/project/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 8b5db8db7e..e0c0e7ac61 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -906,8 +906,8 @@ class projectModel extends model $this->dao->insert(TABLE_PROJECT)->data($project) ->autoCheck() ->batchcheck($requiredFields, 'notempty') - ->checkIF(!empty($project->name), 'name', 'unique', "`type`='project' and `parent` = $project->parent") - ->checkIF(!empty($project->code), 'code', 'unique', "`type`='project'") + ->checkIF(!empty($project->name), 'name', 'unique', "`type`='project' and `parent` = $project->parent and `model` = '{$project->model}'") + ->checkIF(!empty($project->code), 'code', 'unique', "`type`='project' and `model` = '{$project->code}'") ->checkIF($project->end != '', 'end', 'gt', $project->begin) ->exec(); From cc140db6a11fe0f21b51026c89c52687e59e6847 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 18 Apr 2022 14:08:31 +0800 Subject: [PATCH 11/42] * Fix bug #11808. --- module/doc/js/view.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/module/doc/js/view.js b/module/doc/js/view.js index c4e9520f76..99bb339fee 100644 --- a/module/doc/js/view.js +++ b/module/doc/js/view.js @@ -1,12 +1,5 @@ $(function() { - if($('#urlIframe').size() > 0) - { - var defaultHeight = $.cookie('windowHeight') - $('#header').height() - $('#footer').height() - $('#mainMenu').height() - 50; - $('#urlIframe').height(defaultHeight); - setTimeout($.resetToolbarPosition, 50); - } - var isFullscreen = $.cookie('docFullscreen') == 'true'; $('body').toggleClass('doc-fullscreen', isFullscreen); $('.side-col').toggleClass('hidden', isFullscreen); @@ -33,6 +26,13 @@ $(function() $(this).find('a[onclick^=deleteFile]').remove(); }); } + + if($('#urlIframe').size() > 0) + { + var defaultHeight = $('#mainContent .main-col').height() - 50; + $('#urlIframe').height(defaultHeight); + setTimeout($.resetToolbarPosition, 50); + } }) function deleteFile(fileID) From efb1b2eee245840c0a0ea8c34bd5ddb4e29bbf51 Mon Sep 17 00:00:00 2001 From: sunjun Date: Mon, 18 Apr 2022 14:16:04 +0800 Subject: [PATCH 12/42] *Fixbug_sunjun_19262 --- module/todo/view/batchcreate.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/todo/view/batchcreate.html.php b/module/todo/view/batchcreate.html.php index 876c324fb9..bba5551e80 100755 --- a/module/todo/view/batchcreate.html.php +++ b/module/todo/view/batchcreate.html.php @@ -51,7 +51,7 @@ todo->name;?> '>todo->desc;?> '>todo->beginAndEnd;?> -
+
' style='overflow:visible'" id="select-all">
From 0aa9ee7db1bb173eae4649ba732adecca4a33f6e Mon Sep 17 00:00:00 2001 From: sunjun Date: Mon, 18 Apr 2022 14:21:57 +0800 Subject: [PATCH 13/42] *Fixbug_sunjun_19262 --- module/todo/view/batchcreate.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/todo/view/batchcreate.html.php b/module/todo/view/batchcreate.html.php index bba5551e80..6a16e94fb3 100755 --- a/module/todo/view/batchcreate.html.php +++ b/module/todo/view/batchcreate.html.php @@ -51,7 +51,7 @@ todo->name;?> '>todo->desc;?> '>todo->beginAndEnd;?> -
' style='overflow:visible'" id="select-all">
+
' style='overflow:visible' id="select-all">
From 9fc3f344779d3194a3b198b90d82bb099d42c617 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Mon, 18 Apr 2022 14:33:54 +0800 Subject: [PATCH 14/42] * Fix bug #21682. --- module/bug/control.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index 4decd84b84..f36b02d202 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -571,7 +571,7 @@ class bug extends control if($projectID) { $project = $this->loadModel('project')->getByID($projectID); - if(empty($bugID)) $projects = array($projectID => $project->name); + if(empty($bugID) or $this->app->tab != 'qa') $projects = array($projectID => $project->name); } } elseif($projectID) @@ -581,7 +581,7 @@ class bug extends control foreach($productList as $product) $products[$product->id] = $product->name; $project = $this->loadModel('project')->getByID($projectID); - if(empty($bugID)) $projects += array($projectID => $project->name); + if(empty($bugID) or $this->app->tab != 'qa') $projects += array($projectID => $project->name); /* Set project menu. */ if($this->app->tab == 'project') $this->project->setMenu($projectID); @@ -591,8 +591,8 @@ class bug extends control $projects += $this->product->getProjectPairsByProduct($productID, $branch); } - /* When copying bug, get all project linked to the product. */ - if(!empty($bugID)) $projects += $this->product->getProjectPairsByProduct($productID, $branch); + /* Link all projects to product when copying bug under qa.*/ + if(!empty($bugID) and $this->app->tab == 'qa') $projects += $this->product->getProjectPairsByProduct($productID, $branch); /* Get block id of assinge to me. */ $blockID = 0; From 81f91880b89c2e75aaafe226c59931f68c8453d7 Mon Sep 17 00:00:00 2001 From: denghongtao Date: Mon, 18 Apr 2022 14:35:11 +0800 Subject: [PATCH 15/42] add productsonplan.ymal and personnel|projectstory unittest --- test/class/personnel.class.php | 135 +++++++++++++++--- test/class/projectstory.class.php | 44 ++++++ test/data/productsonplan.yaml | 2 +- .../projectstory/getexecutionstories.php | 39 +++++ test/model/projectstory/setmenu.php | 19 +++ 5 files changed, 218 insertions(+), 21 deletions(-) create mode 100644 test/class/projectstory.class.php create mode 100755 test/model/projectstory/getexecutionstories.php create mode 100755 test/model/projectstory/setmenu.php diff --git a/test/class/personnel.class.php b/test/class/personnel.class.php index bab07168c7..3115b4c9fb 100644 --- a/test/class/personnel.class.php +++ b/test/class/personnel.class.php @@ -62,7 +62,8 @@ class personnelTest public function getRiskInvestTest($accounts, $projectID) { - $projects = $this->personnel->dao->select('*')->from(TABLE_PROJECT)->where('id')->in($projectID)->fetchAll('id'); + global $tester; + $projects = $tester->personnel->dao->select('*')->from(TABLE_PROJECT)->where('id')->in($projectID)->fetchAll('id'); $objects = $this->objectModel->getRiskInvest($accounts, $projects); if(dao::isError()) return dao::getError(); @@ -79,6 +80,14 @@ class personnelTest return $objects; } + /** + * Get bug and story invest test + * + * @param array mixed $accounts + * @param int mixed $programID + * @access public + * @return void + */ public function getBugAndStoryInvestTest($accounts, $programID) { $objects = $this->objectModel->getBugAndStoryInvest($accounts, $programID); @@ -90,7 +99,9 @@ class personnelTest public function getInvolvedProjectsTest($projects) { - $objects = $this->objectModel->getInvolvedProjects($projects); + global $tester; + $projectID = $tester->dao->select('id')->from(TABLE_PROJECT)->where('id')->in($projects)->fetchall('id'); + $objects = $this->objectModel->getInvolvedProjects($projectID); if(dao::isError()) return dao::getError(); @@ -102,31 +113,77 @@ class personnelTest * * @param array mixed $projectID * @access public - * @return void + * @return array */ public function getInvolvedExecutionsTest($projectID) { global $tester; - $project = $tester->dao->select('id')->from(TABLE_PROJECT)->where('project')->in($projectID)->fetchall('project'); + $project = $tester->dao->select('id')->from(TABLE_PROJECT)->where('id')->in($projectID)->fetchall('id'); $objects = $this->objectModel->getInvolvedExecutions($project); - a($objects); if(dao::isError()) return dao::getError(); return $objects; } - public function getProjectTaskInvestTest($projects, $accounts) + /** + * Get project task invest test + * + * @param array mixed $projects + * @param array mixed $accounts + * @access public + * @return void + */ + public function getProjectTaskInvestTest($projectID, $accounts) { - $objects = $this->objectModel->getProjectTaskInvest($projects, $accounts); + global $tester; + $project = $tester->dao->select('id')->from(TABLE_PROJECT)->where('id')->in($projectID)->fetchall('id'); + $objects = $this->objectModel->getProjectTaskInvest($project, $accounts); if(dao::isError()) return dao::getError(); return $objects; } - public function getUserEffortHoursTest($userTasks) + /** + * getUserEffortHoursTest + * + * @param mixed $projectID + * @access public + * @return void + */ + public function getUserEffortHoursTest($projectID) { + global $tester; + $projects = $tester->dao->select('id')->from(TABLE_PROJECT)->where('id')->in($projectID)->fetchall('id'); + $tasks = $tester->dao->select('id,status,openedBy,finishedBy,assignedTo,project')->from(TABLE_TASK) + ->where('project')->in(array_keys($projects)) + ->andWhere('deleted')->eq('0') + ->fetchAll('id'); + + $userTasks = array(); + + foreach($tasks as $task) + { + if($task->openedBy && isset($invest[$task->openedBy])) + { + $invest[$task->openedBy]['createdTask'] += 1; + $userTasks[$task->openedBy][$task->id] = $task->id; + } + + if($task->finishedBy && isset($invest[$task->finishedBy])) + { + $invest[$task->finishedBy]['finishedTask'] += 1; + $userTasks[$task->finishedBy][$task->id] = $task->id; + } + + if($task->assignedTo && $task->status == 'wait' && isset($invest[$task->assignedTo])) + { + $invest[$task->assignedTo]['pendingTask'] += 1; + $userTasks[$task->assignedTo][$task->id] = $task->id; + } + } + $objects = $this->objectModel->getUserEffortHours($userTasks); if(dao::isError()) return dao::getError(); @@ -152,6 +209,14 @@ class personnelTest return $objects; } + /** + * Get copied objects test + * + * @param int mixed $objectID + * @param string mixed $objectType + * @access public + * @return array + */ public function getCopiedObjectsTest($objectID, $objectType) { $objects = $this->objectModel->getCopiedObjects($objectID, $objectType); @@ -161,18 +226,36 @@ class personnelTest return $objects; } + /** + * Get whitelist test + * + * @param int $objectID + * @param string $objectType + * @param string $orderBy + * @param string $pager + * @access public + * @return array + */ public function getWhitelistTest($objectID = 0, $objectType = '', $orderBy = 'id_desc', $pager = '') { - $objects = $this->objectModel->getWhitelist($objectID = 0, $objectType = '', $orderBy = 'id_desc', $pager = ''); + $objects = $this->objectModel->getWhitelist($objectID, $objectType, $orderBy, $pager); if(dao::isError()) return dao::getError(); return $objects; } + /** + * Get whitelist account test + * + * @param int $objectID + * @param string $objectType + * @access public + * @return array + */ public function getWhitelistAccountTest($objectID = 0, $objectType = '') { - $objects = $this->objectModel->getWhitelistAccount($objectID = 0, $objectType = ''); + $objects = $this->objectModel->getWhitelistAccount($objectID, $objectType); if(dao::isError()) return dao::getError(); @@ -181,16 +264,28 @@ class personnelTest public function updateWhitelistTest($users = array(), $objectType = '', $objectID = 0, $type = 'whitelist', $source = 'add', $updateType = 'replace') { - $objects = $this->objectModel->updateWhitelist($users = array(), $objectType = '', $objectID = 0, $type = 'whitelist', $source = 'add', $updateType = 'replace'); + $objects = $this->objectModel->updateWhitelist($users, $objectType, $objectID, $type, $source, $updateType); if(dao::isError()) return dao::getError(); return $objects; } - public function addWhitelistTest($objectType = '', $objectID = 0) + /** + * Add whitelist test + * + * @param string $objectType + * @param int $objectID + * @param string mixed $user + * @access public + * @return void + */ + public function addWhitelistTest($objectType = '', $objectID = 0, $user) { - $objects = $this->objectModel->addWhitelist($objectType = '', $objectID = 0); + $users = array('accounts' => $user); + foreach($users as $key => $value) $_POST[$key] = $value; + + $objects = $this->objectModel->addWhitelist($objectType, $objectID); if(dao::isError()) return dao::getError(); @@ -199,7 +294,7 @@ class personnelTest public function deleteProductWhitelistTest($productID, $account = '') { - $objects = $this->objectModel->deleteProductWhitelist($productID, $account = ''); + $objects = $this->objectModel->deleteProductWhitelist($productID, $account); if(dao::isError()) return dao::getError(); @@ -208,7 +303,7 @@ class personnelTest public function deleteProgramWhitelistTest($programID = 0, $account = '') { - $objects = $this->objectModel->deleteProgramWhitelist($programID = 0, $account = ''); + $objects = $this->objectModel->deleteProgramWhitelist($programID, $account); if(dao::isError()) return dao::getError(); @@ -217,7 +312,7 @@ class personnelTest public function deleteProjectWhitelistTest($objectID = 0, $account = '') { - $objects = $this->objectModel->deleteProjectWhitelist($objectID = 0, $account = ''); + $objects = $this->objectModel->deleteProjectWhitelist($objectID, $account); if(dao::isError()) return dao::getError(); @@ -226,7 +321,7 @@ class personnelTest public function deleteExecutionWhitelistTest($executionID, $account = '') { - $objects = $this->objectModel->deleteExecutionWhitelist($executionID, $account = ''); + $objects = $this->objectModel->deleteExecutionWhitelist($executionID, $account); if(dao::isError()) return dao::getError(); @@ -235,7 +330,7 @@ class personnelTest public function deleteWhitelistTest($users = array(), $objectType = 'program', $objectID = 0, $groupID = 0) { - $objects = $this->objectModel->deleteWhitelist($users = array(), $objectType = 'program', $objectID = 0, $groupID = 0); + $objects = $this->objectModel->deleteWhitelist($users, $objectType, $objectID, $groupID); if(dao::isError()) return dao::getError(); @@ -244,7 +339,7 @@ class personnelTest public function createMemberLinkTest($dept = 0, $programID = 0) { - $objects = $this->objectModel->createMemberLink($dept = 0, $programID = 0); + $objects = $this->objectModel->createMemberLink($dept, $programID); if(dao::isError()) return dao::getError(); @@ -253,7 +348,7 @@ class personnelTest public function buildSearchFormTest($queryID = 0, $actionURL = '') { - $objects = $this->objectModel->buildSearchForm($queryID = 0, $actionURL = ''); + $objects = $this->objectModel->buildSearchForm($queryID, $actionURL); if(dao::isError()) return dao::getError(); diff --git a/test/class/projectstory.class.php b/test/class/projectstory.class.php new file mode 100644 index 0000000000..68c2881d6c --- /dev/null +++ b/test/class/projectstory.class.php @@ -0,0 +1,44 @@ +objectModel = $tester->loadModel('projectstory'); + } + + /** + * Set menu test + * + * @param array $products + * @param int $productID + * @param int $branch + * @access public + * @return xml + */ + public function setMenuTest($products = array(), $productID = 0, $branch = 0) + { + $objects = $this->objectModel->setMenu($products, $productID, $branch); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + /** + * Get execution stories test + * + * @param int mixed $projectID + * @param array $storyIdList + * @access public + * @return array + */ + public function getExecutionStoriesTest($projectID, $storyIdList = array()) + { + $objects = $this->objectModel->getExecutionStories($projectID, $storyIdList); + + if(dao::isError()) return dao::getError(); + + return $objects; + } +} diff --git a/test/data/productsonplan.yaml b/test/data/productsonplan.yaml index eb229e0995..152e269bed 100644 --- a/test/data/productsonplan.yaml +++ b/test/data/productsonplan.yaml @@ -8,7 +8,7 @@ fields: range: 100-10000 - field: product note: "所属产品" - range: 1-10 + range: 1-10{3} - field: branch note: "所属分支" range: 41-50 diff --git a/test/model/projectstory/getexecutionstories.php b/test/model/projectstory/getexecutionstories.php new file mode 100755 index 0000000000..780376149e --- /dev/null +++ b/test/model/projectstory/getexecutionstories.php @@ -0,0 +1,39 @@ +#!/usr/bin/env php +getExecutionStories(); +cid=1 +pid=1 + +这里取出了id13的项目下需求id10名称 >> 软件需求10 +这里取出了id13的项目下需求id12名称 >> 软件需求12 +这里取出了id14的项目下需求id14名称 >> 软件需求14 +这里取出了id14的项目下需求id16名称 >> 软件需求16 +当项目id不存在时 >> 0 +当需求id不存在时 >> 0 + +*/ + +$projectstory = new projectstoryTest(); + +$projectID = array(); +$projectID[0] = 13; +$projectID[1] = 14; +$projectID[2] = 1000; + +$storyID = array(); +$storyID[0] = array(10, 12); +$storyID[1] = array(14, 16); +$storyID[2] = array(1000, 1001); + +r($projectstory->getExecutionStoriesTest($projectID[0], $storyID[0])) && p('10:title') && e('软件需求10'); //这里取出了id13的项目下需求id10名称 +r($projectstory->getExecutionStoriesTest($projectID[0], $storyID[0])) && p('12:title') && e('软件需求12'); //这里取出了id13的项目下需求id12名称 +r($projectstory->getExecutionStoriesTest($projectID[1], $storyID[1])) && p('14:title') && e('软件需求14'); //这里取出了id14的项目下需求id14名称 +r($projectstory->getExecutionStoriesTest($projectID[1], $storyID[1])) && p('16:title') && e('软件需求16'); //这里取出了id14的项目下需求id16名称 +r($projectstory->getExecutionStoriesTest($projectID[2], $storyID[0])) && p('10:title') && e('0'); //当项目id不存在时 +r($projectstory->getExecutionStoriesTest($projectID[0], $storyID[2])) && p('1000:title') && e('0'); //当需求id不存在时 diff --git a/test/model/projectstory/setmenu.php b/test/model/projectstory/setmenu.php new file mode 100755 index 0000000000..6843f93984 --- /dev/null +++ b/test/model/projectstory/setmenu.php @@ -0,0 +1,19 @@ +#!/usr/bin/env php +setMenu(); +cid=1 +pid=1 + +这里返回一个页面,项目外的情况 >> 您无权访问该产品 + +*/ + +$projectstory = new projectstoryTest('admin'); + +r($projectstory->setMenuTest(array(3, 83))) && p() && e('您无权访问该产品'); //这里返回一个页面,项目外的情况 \ No newline at end of file From 281fa51fc1ff049f551d43eead33c4b3feb1a19c Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 18 Apr 2022 14:58:06 +0800 Subject: [PATCH 16/42] * Fix bug #21822. --- module/branch/control.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/module/branch/control.php b/module/branch/control.php index d68b02f74f..a903ef51d6 100644 --- a/module/branch/control.php +++ b/module/branch/control.php @@ -25,6 +25,9 @@ class branch extends control */ public function manage($productID, $browseType = 'active', $orderBy = 'order', $recTotal = 0, $recPerPage = 20, $pageID = 1) { + $product = $this->loadModel('product')->getById($productID); + if($product->type == 'normal') $this->locate($this->createLink('product', 'view', "productID=$productID")); + $this->loadModel('product')->setMenu($productID); $this->session->set('branchManage', $this->app->getURI(true), 'product'); $this->branch->changeBranchLanguage($productID); From ddb4ab243a76399a5399c6f878216716a7b28876 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 18 Apr 2022 15:00:51 +0800 Subject: [PATCH 17/42] * Remove the unused code. --- module/branch/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/branch/control.php b/module/branch/control.php index a903ef51d6..97304eba34 100644 --- a/module/branch/control.php +++ b/module/branch/control.php @@ -28,7 +28,7 @@ class branch extends control $product = $this->loadModel('product')->getById($productID); if($product->type == 'normal') $this->locate($this->createLink('product', 'view', "productID=$productID")); - $this->loadModel('product')->setMenu($productID); + $this->product->setMenu($productID); $this->session->set('branchManage', $this->app->getURI(true), 'product'); $this->branch->changeBranchLanguage($productID); From 205e3126ad6b5ddc9d320f4e8f20658fe05a8d23 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Mon, 18 Apr 2022 15:09:49 +0800 Subject: [PATCH 18/42] * Fix bug#19379. --- db/endemo.sql | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/db/endemo.sql b/db/endemo.sql index 598d75acd9..d2d0550d63 100644 --- a/db/endemo.sql +++ b/db/endemo.sql @@ -244,8 +244,8 @@ INSERT INTO `zt_dept` (`id`, `name`, `parent`, `path`, `grade`, `order`, `positi INSERT INTO `zt_doclib` (`id`, `type`, `product`, `project`, `execution`, `name`, `acl`, `groups`, `users`, `main`, `collector`, `order`, `deleted`) VALUES (1, 'product', 1, 0, 0, '产品库', 'default', '', '', '1', '', 0, '0'), (2, 'product', 2, 0, 0, '产品库', 'default', '', '', '1', '', 0, '0'), -(3, 'project', 0, 0, 1, '项目库', 'default', '', '', '1', '', 0, '0'), -(4, 'project', 0, 0, 2, '项目库', 'default', '', '', '1', '', 0, '0'), +(3, 'execution', 0, 0, 1, '项目库', 'default', '', '', '1', '', 0, '0'), +(4, 'execution', 0, 0, 2, '项目库', 'default', '', '', '1', '', 0, '0'), (5, 'project', 0, 7, 0, '项目主库', 'default', '', '', '1', '', 0, '0'); INSERT INTO `zt_history` (`id`, `action`, `field`, `old`, `new`, `diff`) VALUES (1, 14, 'version', '1', '2', ''), @@ -382,11 +382,11 @@ INSERT INTO `zt_product` (`id`, `program`, `name`, `code`, `bind`, `line`, `type (2, 6, '企业内部工时管理系统', 'workhourManage', '0', 0, 'normal', 'normal', '', '', 'productManager', 'testManager', 'productManager', 'open', '', 'productManager', '2012-06-05 11:15:20', '5.2.1', 10, '0'); INSERT INTO `zt_productplan` (`id`, `product`, `branch`, `parent`, `title`, `desc`, `begin`, `end`, `order`, `deleted`) VALUES (1, 1, 0, 0, '1.0版本', '开发出企业网站1.0版本。
', '2020-06-05', '2021-06-04', '', '0'); -INSERT INTO `zt_project` (`id`, `project`, `model`, `type`, `product`, `lifetime`, `budget`, `budgetUnit`, `attribute`, `percent`, `milestone`, `output`, `auth`, `parent`, `path`, `grade`, `name`, `code`, `begin`, `end`, `realBegan`, `realEnd`, `days`, `status`, `subStatus`, `statge`, `pri`, `desc`, `version`, `parentVersion`, `planDuration`, `realDuration`, `openedBy`, `openedDate`, `openedVersion`, `lastEditedBy`, `lastEditedDate`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`) VALUES -(1, 7, '', 'sprint', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,1,', 1, '企业网站第一期', 'coWeb1', '2020-06-05', '2021-12-04', '0000-00-00', '0000-00-00', 391, 'doing', '', '1', '1', '开发企业网站的基本雏形。
', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 5, '0'), -(2, 7, '', 'sprint', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,2,', 1, '企业网站第二期', 'coWebsite2', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 260, 'wait', '', '1', '1', '', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 10, '0'), -(7, 0, 'scrum', 'project', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', 'extend', 6, ',6,7,', 2, '企业管理系统', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', 'admin', '2021-04-28 11:22:04', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'projectManager', '', '', '', 'open', ',tester3,admin', 35, '0'), -(6, 0, '', 'program', 'single', 'sprint', '0', 'CNY', '', 0, '0', '', '', 0, ',6,', 1, '企业管理', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '', '', '', 'open', '', 30, '0'); +INSERT INTO `zt_project` (`id`, `project`, `model`, `type`, `lifetime`, `budget`, `budgetUnit`, `attribute`, `percent`, `milestone`, `output`, `auth`, `parent`, `path`, `grade`, `name`, `code`, `begin`, `end`, `realBegan`, `realEnd`, `days`, `status`, `subStatus`, `pri`, `desc`, `version`, `parentVersion`, `planDuration`, `realDuration`, `openedBy`, `openedDate`, `openedVersion`, `lastEditedBy`, `lastEditedDate`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`) VALUES +(1, 7, '', 'sprint', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,1,', 1, '企业网站第一期', 'coWeb1', '2020-06-05', '2021-12-04', '0000-00-00', '0000-00-00', 391, 'doing', '', '1', '开发企业网站的基本雏形。
', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 5, '0'), +(2, 7, '', 'sprint', 'sprint', '0', 'CNY', '', 0, '0', '', '', 7, ',7,2,', 1, '企业网站第二期', 'coWebsite2', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 260, 'wait', '', '1', '', 0, 0, 0, 0, '', '0000-00-00 00:00:00', '', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', 10, '0'), +(7, 0, 'scrum', 'project', 'sprint', '0', 'CNY', '', 0, '0', '', 'extend', 6, ',6,7,', 2, '企业管理系统', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', 'admin', '2021-04-28 11:22:04', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 'projectManager', '', '', '', 'open', ',tester3,admin', 35, '0'), +(6, 0, '', 'program', 'sprint', '0', 'CNY', '', 0, '0', '', '', 0, ',6,', 1, '企业管理', '', '2021-06-05', '2022-06-04', '0000-00-00', '0000-00-00', 0, 'doing', '', '1', '', 0, 0, 0, 0, 'admin', '2021-04-28 11:22:04', '15.0.rc3', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '', '', '', '', 'open', '', 30, '0'); INSERT INTO `zt_projectcase` (`project`, `product`, `case`, `count`, `version`, `order`) VALUES (1, 1, 2, 1, 1, 4), (7, 1, 1, 1, 1, 5), From 1c8c50724dac2507dfa275c87cf0c24203767fe0 Mon Sep 17 00:00:00 2001 From: zenggang Date: Mon, 18 Apr 2022 07:25:46 +0000 Subject: [PATCH 19/42] * Fix bug#18642,21572 --- module/common/model.php | 1 + module/search/model.php | 1 - module/search/view/buildform.html.php | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/module/common/model.php b/module/common/model.php index bd0356c27a..65de33a5fa 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2332,6 +2332,7 @@ EOD; if(empty($acls['views'])) return true; $menu = isset($lang->navGroup->$module) ? $lang->navGroup->$module : $module; + if($menu == 'my' && $method == 'team') $menu = 'system'; // Fix bug #18642. $menu = strtolower($menu); if($menu != 'qa' and !isset($lang->$menu->menu)) return true; if(($menu == 'my' && $method != 'team')or $menu == 'index' or $module == 'tree') return true; diff --git a/module/search/model.php b/module/search/model.php index 09aff5165d..770c90cc3f 100644 --- a/module/search/model.php +++ b/module/search/model.php @@ -399,7 +399,6 @@ class searchModel extends model public function deleteQuery($queryID) { $this->dao->delete()->from(TABLE_USERQUERY)->where('id')->eq($queryID)->andWhere('account')->eq($this->app->user->account)->exec(); - echo 'success'; } /** diff --git a/module/search/view/buildform.html.php b/module/search/view/buildform.html.php index 4b1efa682f..7af76e8e24 100644 --- a/module/search/view/buildform.html.php +++ b/module/search/view/buildform.html.php @@ -546,6 +546,7 @@ $(function() if($('#formType').val() == 'more') expandForm(true); $searchForm.on('click', '.user-query .icon-close', function(e) { + e.preventDefault(); // Fix bug #21572. var $query = $(this).closest('.user-query'); var queryId = $query.data('queryId'); var deleteQueryLink = $.createLink('search', 'deleteQuery', 'queryID=' + queryId); From 89bfe585c8128acecc31b6bf8da2fd5523d68585 Mon Sep 17 00:00:00 2001 From: zhouxudong Date: Mon, 18 Apr 2022 15:31:00 +0800 Subject: [PATCH 20/42] * Fix bug #20867. --- module/execution/js/kanban.js | 2 +- module/execution/js/taskkanban.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js index 8cb29abfe6..ff3a64f56c 100644 --- a/module/execution/js/kanban.js +++ b/module/execution/js/kanban.js @@ -295,7 +295,7 @@ function createColumnCreateMenu(options) { if(priv.canCreateTask) items.push({label: taskLang.create, url: $.createLink('task', 'create', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&todoID=0&extra=regionID=" + regionID + ",laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&iframe=0&extra=regionID=" + regionID + ",laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); - if(priv.canImportBug && vision == 'rnd') items.push({label: executionLang.importBug, url: $.createLink('execution', 'importBug', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&todoID=0&extra=laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}}); + if(priv.canImportBug && vision == 'rnd') items.push({label: executionLang.importBug, url: $.createLink('execution', 'importBug', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&todoID=0&extra=laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '90%'}}); } return items; } diff --git a/module/execution/js/taskkanban.js b/module/execution/js/taskkanban.js index 8d7ee93d06..8df8beb996 100644 --- a/module/execution/js/taskkanban.js +++ b/module/execution/js/taskkanban.js @@ -836,7 +836,7 @@ function createColumnCreateMenu(options) { if(priv.canCreateTask) items.push({label: taskLang.create, url: $.createLink('task', 'create', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '80%'}}); if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '80%'}}); - if(priv.canImportBug) items.push({label: executionLang.importBug, url: $.createLink('execution', 'importBug', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '80%'}}); + if(priv.canImportBug) items.push({label: executionLang.importBug, url: $.createLink('execution', 'importBug', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '90%'}}); } return items; } From 561ced08195be767920c9263df26c2ce2619ba40 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Mon, 18 Apr 2022 15:51:15 +0800 Subject: [PATCH 21/42] * Fix bug #16738. --- module/extension/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/extension/model.php b/module/extension/model.php index d1389dddec..29de175bba 100644 --- a/module/extension/model.php +++ b/module/extension/model.php @@ -617,7 +617,7 @@ class extensionModel extends model foreach($dirs as $dir) { if(!is_dir($appRoot . $dir)) continue; - if(!rmdir($appRoot . $dir)) $removeCommands[] = "rmdir $appRoot$dir"; // fix bug #2965 + if(!rmdir($appRoot . $dir)) $removeCommands[] = PHP_OS == 'Linux' ? "rm -fr $appRoot$dir" : "rmdir $appRoot$dir /s /q"; } } From b19b84e0c5e328cb5cbd3b229f8dee8734b361b0 Mon Sep 17 00:00:00 2001 From: zenggang Date: Mon, 18 Apr 2022 07:52:10 +0000 Subject: [PATCH 22/42] * Adjust code --- module/common/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/common/model.php b/module/common/model.php index 65de33a5fa..326a822199 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -2332,7 +2332,7 @@ EOD; if(empty($acls['views'])) return true; $menu = isset($lang->navGroup->$module) ? $lang->navGroup->$module : $module; - if($menu == 'my' && $method == 'team') $menu = 'system'; // Fix bug #18642. + if($module == 'my' && $method == 'team') $menu = 'system'; // Fix bug #18642. $menu = strtolower($menu); if($menu != 'qa' and !isset($lang->$menu->menu)) return true; if(($menu == 'my' && $method != 'team')or $menu == 'index' or $module == 'tree') return true; From 6ce3a616db3a0ca12381f98276a848c9141c0a70 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Mon, 18 Apr 2022 15:56:26 +0800 Subject: [PATCH 23/42] * Fix bug #20852. --- module/repo/model.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/module/repo/model.php b/module/repo/model.php index bb0b28c688..2a54926e2e 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -200,6 +200,12 @@ class repoModel extends model if(!$this->checkClient()) return false; if(!$this->checkConnection()) return false; + if($this->post->SCM == 'Gitlab') + { + if($this->post->gitlabHost == '') dao::$errors['gitlabHost'] = sprintf($this->lang->error->notempty, $this->lang->repo->gitlabHost); + if($this->post->gitlabProject == '') dao::$errors['gitlabProject'] = sprintf($this->lang->error->notempty, $this->lang->repo->gitlabProject); + } + $data = fixer::input('post') ->setIf($this->post->SCM == 'Gitlab', 'password', $this->post->gitlabToken) ->setIf($this->post->SCM == 'Gitlab', 'path', $this->post->gitlabProject) @@ -262,6 +268,12 @@ class repoModel extends model { $repo = $this->getRepoByID($id); + if($this->post->SCM == 'Gitlab') + { + if($this->post->gitlabHost == '') dao::$errors['gitlabHost'] = sprintf($this->lang->error->notempty, $this->lang->repo->gitlabHost); + if($this->post->gitlabProject == '') dao::$errors['gitlabProject'] = sprintf($this->lang->error->notempty, $this->lang->repo->gitlabProject); + } + $data = fixer::input('post') ->setIf($this->post->SCM == 'Gitlab', 'password', $this->post->gitlabToken) ->setIf($this->post->SCM == 'Gitlab', 'path', $this->post->gitlabProject) @@ -1149,7 +1161,12 @@ class repoModel extends model { if($this->post->SCM == 'Gitlab') return true; if(!$this->config->features->checkClient) return true; - if(!$this->post->client) return true; + + if(!$this->post->client) + { + dao::$errors['client'] = sprintf($this->lang->error->notempty, $this->lang->repo->client); + return false; + } if(strpos($this->post->client, ' ')) { From bdc7323b19c43f83183537a5b547d16c3e0815d2 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 18 Apr 2022 16:32:30 +0800 Subject: [PATCH 24/42] * Fix bug #21829. --- module/doc/model.php | 5 ++--- module/doc/view/index.html.php | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/module/doc/model.php b/module/doc/model.php index b7890c1816..ff8550313e 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -1826,9 +1826,8 @@ class docModel extends model */ public function getStatisticInfo() { - $libIdList = array(); - $libIdList = $this->getLibIdListByProject($this->session->project); - $docIdList = $this->getPrivDocs($libIdList); + $allLibs = array_keys($this->getLibs('all')); + $docIdList = $this->getPrivDocs($allLibs); $today = date('Y-m-d'); $lately = date('Y-m-d', strtotime('-3 day')); diff --git a/module/doc/view/index.html.php b/module/doc/view/index.html.php index 76807bdacd..f3861e2316 100644 --- a/module/doc/view/index.html.php +++ b/module/doc/view/index.html.php @@ -135,7 +135,7 @@
  • createLink('doc', 'browse', "browseType=openedbyme"), '', '', "title='{$lang->more}'");?>
  • - +

    doc->noDoc;?>

    From 6097b535149fe0b5b1619c48676c29555b2d3ddd Mon Sep 17 00:00:00 2001 From: zhouxin Date: Mon, 18 Apr 2022 08:35:55 +0000 Subject: [PATCH 25/42] * Fix bug. --- module/testcase/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/testcase/control.php b/module/testcase/control.php index 3809d8dbec..85bda938e8 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -216,7 +216,7 @@ class testcase extends control $this->view->browseType = $browseType; $this->view->param = $param; $this->view->cases = $cases; - $this->view->branch = !empty($product) and $product->type != 'normal' ? $branch : 0; + $this->view->branch = (!empty($product) and $product->type != 'normal') ? $branch : 0; $this->view->branchOption = $branchOption; $this->view->branchTagOption = $branchTagOption; $this->view->suiteList = $this->loadModel('testsuite')->getSuites($productID); From b3c2d454b3104682af858fa0e0433222fa951c67 Mon Sep 17 00:00:00 2001 From: Zongjun Lan Date: Mon, 18 Apr 2022 16:42:57 +0800 Subject: [PATCH 26/42] * fix bug *12982 --- module/project/model.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index e0c0e7ac61..9076a4abde 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -907,7 +907,7 @@ class projectModel extends model ->autoCheck() ->batchcheck($requiredFields, 'notempty') ->checkIF(!empty($project->name), 'name', 'unique', "`type`='project' and `parent` = $project->parent and `model` = '{$project->model}'") - ->checkIF(!empty($project->code), 'code', 'unique', "`type`='project' and `model` = '{$project->code}'") + ->checkIF(!empty($project->code), 'code', 'unique', "`type`='project' and `model` = '{$project->model}'") ->checkIF($project->end != '', 'end', 'gt', $project->begin) ->exec(); @@ -1139,8 +1139,8 @@ class projectModel extends model ->checkIF($project->begin != '', 'begin', 'date') ->checkIF($project->end != '', 'end', 'date') ->checkIF($project->end != '', 'end', 'gt', $project->begin) - ->checkIF(!empty($project->name), 'name', 'unique', "id != $projectID and `type` = 'project' and `parent` = $project->parent") - ->checkIF(!empty($project->code), 'code', 'unique', "id != $projectID and `type` = 'project'") + ->checkIF(!empty($project->name), 'name', 'unique', "id != $projectID and `type` = 'project' and `parent` = $project->parent and `model` = '{$project->model}'") + ->checkIF(!empty($project->code), 'code', 'unique', "id != $projectID and `type` = 'project' and `model` = '{$project->model}'") ->where('id')->eq($projectID) ->exec(); @@ -1280,8 +1280,8 @@ class projectModel extends model ->checkIF($project->begin != '', 'begin', 'date') ->checkIF($project->end != '', 'end', 'date') ->checkIF($project->end != '', 'end', 'gt', $project->begin) - ->checkIF(!empty($project->name), 'name', 'unique', "id != $projectID and `type`='project' and `parent` = $parentID") - ->checkIF(!empty($project->code), 'code', 'unique', "id != $projectID and `type`='project'") + ->checkIF(!empty($project->name), 'name', 'unique', "id != $projectID and `type`='project' and `parent` = $parentID and `model` = '{$project->model}'") + ->checkIF(!empty($project->code), 'code', 'unique', "id != $projectID and `type`='project' and `model` = '{$project->model}'") ->where('id')->eq($projectID) ->exec(); From bc381ede7dc757e442099c74b1969ed1911732a5 Mon Sep 17 00:00:00 2001 From: hufangzhou Date: Mon, 18 Apr 2022 16:45:12 +0800 Subject: [PATCH 27/42] * Fix bug #21833. --- module/doc/model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/doc/model.php b/module/doc/model.php index b7890c1816..833de11ba0 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -2672,6 +2672,7 @@ EOT; $autoloadPage = true; if(!empty($doc) and $doc->type == 'url') { + if(!preg_match('/^https?:\/\//', $doc->content)) $doc->content = 'http://' . $doc->content; $parsedUrl = parse_url($doc->content); $urlPort = isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : ''; $urlDomain = $parsedUrl['host'] . $urlPort; From bdbf43362d79949290e48dde14d71ed736e30a6e Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 18 Apr 2022 17:00:06 +0800 Subject: [PATCH 28/42] * Add unit test of branch. --- module/branch/model.php | 1 - test/class/branch.class.php | 405 +++++++++++++++++++++ test/data/branch.yaml | 2 +- test/model/branch/activate.php | 24 ++ test/model/branch/batchupdate.php | 24 ++ test/model/branch/changebranchlanguage.php | 21 ++ test/model/branch/checkbranchdata.php | 24 ++ test/model/branch/close.php | 25 ++ test/model/branch/create.php | 30 ++ test/model/branch/getallpairs.php | 19 + test/model/branch/getbyid.php | 35 ++ test/model/branch/getbyproducts.php | 35 ++ test/model/branch/getlist.php | 41 +++ test/model/branch/getpairs.php | 41 +++ test/model/branch/getproducttype.php | 23 ++ test/model/branch/mergebranch.php | 39 ++ test/model/branch/setdefault.php | 17 + test/model/branch/showbranch.php | 31 ++ test/model/branch/sort.php | 27 ++ test/model/branch/update.php | 27 ++ test/ztest | 2 + 21 files changed, 891 insertions(+), 2 deletions(-) create mode 100644 test/class/branch.class.php create mode 100755 test/model/branch/activate.php create mode 100755 test/model/branch/batchupdate.php create mode 100755 test/model/branch/changebranchlanguage.php create mode 100755 test/model/branch/checkbranchdata.php create mode 100755 test/model/branch/close.php create mode 100755 test/model/branch/create.php create mode 100755 test/model/branch/getallpairs.php create mode 100755 test/model/branch/getbyid.php create mode 100755 test/model/branch/getbyproducts.php create mode 100755 test/model/branch/getlist.php create mode 100755 test/model/branch/getpairs.php create mode 100755 test/model/branch/getproducttype.php create mode 100755 test/model/branch/mergebranch.php create mode 100755 test/model/branch/setdefault.php create mode 100755 test/model/branch/showbranch.php create mode 100755 test/model/branch/sort.php create mode 100755 test/model/branch/update.php diff --git a/module/branch/model.php b/module/branch/model.php index 5ea7207c1f..ff54cb859b 100644 --- a/module/branch/model.php +++ b/module/branch/model.php @@ -504,7 +504,6 @@ class branchModel extends model } else { - $branchGroups[$branch->product][0] = $this->lang->branch->main; $branchGroups[$branch->product][$branch->id] = htmlspecialchars_decode($branch->name); } } diff --git a/test/class/branch.class.php b/test/class/branch.class.php new file mode 100644 index 0000000000..ef719e8bf7 --- /dev/null +++ b/test/class/branch.class.php @@ -0,0 +1,405 @@ +objectModel = $tester->loadModel('branch'); + } + + /** + * Test get name by id. + * + * @param int $branchID + * @param int $productID + * @param string $field + * @access public + * @return object + */ + public function getByIdTest($branchID, $productID = 0, $field = 'name') + { + $object = $this->objectModel->getById($branchID, $productID, $field); + + if(dao::isError()) return dao::getError(); + + return $object; + } + + /** + * Test get branch list. + * + * @param int $productID + * @param int $executionID + * @param string $browseType + * @param bool $withMainBranch + * @access public + * @return string + */ + public function getListTest($productID, $executionID = 0, $browseType = 'active', $withMainBranch = true) + { + $objects = $this->objectModel->getList($productID, $executionID, $browseType, 'order', null, $withMainBranch); + + if(dao::isError()) return dao::getError(); + + $ids = ''; + foreach($objects as $object) $ids .= ',' . $object->id; + return $ids; + } + + /** + * Test get pairs. + * + * @param int $productID + * @param string $params + * @param int $executionID + * @param string $mergedBranches + * @access public + * @return string + */ + public function getPairsTest($productID, $params = '', $executionID = 0, $mergedBranches = '') + { + $objects = $this->objectModel->getPairs($productID, $params, $executionID, $mergedBranches); + + if(dao::isError()) return dao::getError(); + + $ids = ''; + foreach($objects as $id => $object) $ids .= ',' . $id; + return $ids; + } + + /** + * Test get all pairs. + * + * @param string $params + * @access public + * @return int + */ + public function getAllPairsTest($params = '') + { + $objects = $this->objectModel->getAllPairs($params); + + if(dao::isError()) return dao::getError(); + + return count($objects); + } + + /** + * Test create a branch. + * + * @param int $productID + * @param array $param + * @access public + * @return object + */ + public function createTest($productID, $param = array()) + { + foreach($param as $key => $value) $_POST[$key] = $value; + + $objectID = $this->objectModel->create($productID, $withMerge = false); + + unset($_POST); + + if(dao::isError()) return dao::getError()['name'][0]; + + global $tester; + $object = $tester->dao->select('*')->from(TABLE_BRANCH)->where('id')->eq($objectID)->fetch(); + return $object; + } + + /** + * Test update branch. + * + * @param array $param + * @access public + * @return array + */ + public function updateTest($param) + { + $branchID = 1; + + $branch = $this->objectModel->getByID($branchID, 0, ''); + + $_POST['name'] = $branch->name; + $_POST['status'] = $branch->status; + $_POST['desc'] = $branch->desc; + + foreach($param as $key => $value) $_POST[$key] = $value; + + $objects = $this->objectModel->update($branchID); + + unset($_POST); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + /** + * Test batch update branch. + * + * @param array $param + * @access public + * @return object + */ + public function batchUpdateTest($param = array()) + { + global $tester; + + $productID = 45; + $branches = $tester->dao->select('*')->from(TABLE_BRANCH)->where('product')->eq($productID)->fetchAll('id'); + + $_POST['IDList'] = array('0' => 0, '9' => 9, '10' => 10); + $_POST['default'] = 0; + $_POST['name'] = array('9' => $branches['9']->name, '10' => $branches['10']->name); + $_POST['desc'] = array('9' => $branches['9']->desc, '10' => $branches['10']->desc); + $_POST['status'] = array('9' => $branches['9']->status, '10' => $branches['10']->status); + + foreach($param as $key => $value) $_POST[$key] = $value; + + $objects = $this->objectModel->batchUpdate($productID); + + unset($_POST); + + if(dao::isError()) return dao::getError(); + + return $objects[9][0]; + } + + /** + * Test close a branch. + * + * @param int $branchID + * @access public + * @return object + */ + public function closeTest($branchID) + { + $this->objectModel->close($branchID); + + if(dao::isError()) return dao::getError(); + + global $tester; + $object = $tester->dao->select('*')->from(TABLE_BRANCH)->where('id')->eq($branchID)->fetch(); + return $object; + } + + /** + * Test activate a branch. + * + * @param int $branchID + * @access public + * @return object + */ + public function activateTest($branchID) + { + $this->objectModel->activate($branchID); + + if(dao::isError()) return dao::getError(); + + global $tester; + $object = $tester->dao->select('*')->from(TABLE_BRANCH)->where('id')->eq($branchID)->fetch(); + return $object; + } + + public function manageTest($productID) + { + $objects = $this->objectModel->manage($productID); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function unlinkBranch4ProjectTest($productIDList) + { + $objects = $this->objectModel->unlinkBranch4Project($productIDList); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function linkBranch4ProjectTest($productID) + { + $this->objectModel->unlinkBranch4Project($productID); + + $objects = $this->objectModel->linkBranch4Project($productID); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + /** + * Test get branch group by products. + * + * @param int $products + * @param string $params + * @param string $appendBranch + * @access public + * @return string + */ + public function getByProductsTest($products, $params = '', $appendBranch = '') + { + $objects = $this->objectModel->getByProducts($products, $params, $appendBranch); + + if(dao::isError()) return dao::getError(); + + $ids = ''; + foreach($objects as $productID => $branches) + { + $ids .= "$productID:"; + foreach($branches as $branchID => $branchName) $ids .= ",$branchID"; + $ids .= ';'; + } + return $ids; + } + + /** + * Test get product bype by branch. + * + * @param int $branchID + * @access public + * @return string + */ + public function getProductTypeTest($branchID) + { + $type = $this->objectModel->getProductType($branchID); + + if(dao::isError()) return dao::getError(); + + return $type; + } + + /** + * Test sort branch. + * + * @param string $branches + * @param string $order + * @access public + * @return string + */ + public function sortTest($branches, $order = '') + { + $_POST['orderBy'] = $order; + $_POST['branches'] = $branches; + + $this->objectModel->sort(); + + unset($_POST); + + if(dao::isError()) return dao::getError(); + + global $tester; + $objects = $tester->dao->select('*')->from(TABLE_BRANCH)->where('id')->in($branches)->orderBy('order asc')->fetchAll('id'); + return implode(',', array_keys($objects)); + } + + /** + * Test check branch data. + * + * @param int $branchID + * @access public + * @return int + */ + public function checkBranchDataTest($branchID) + { + $objects = $this->objectModel->checkBranchData($branchID); + + if(dao::isError()) return dao::getError(); + + return $objects ? 1 : 2; + } + + public function setParamsForLinkTest($module, $link, $projectID, $productID, $branch) + { + $objects = $this->objectModel->setParamsForLink($module, $link, $projectID, $productID, $branch); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function setDefaultTest($productID, $branchID) + { + $objects = $this->objectModel->setDefault($productID, $branchID); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + public function getPairsByProjectProductTest($projectID, $productID) + { + $objects = $this->objectModel->getPairsByProjectProduct($projectID, $productID); + + if(dao::isError()) return dao::getError(); + + return $objects; + } + + /** + * Test display of branch label. + * + * @param int $productID + * @param int $moduleID + * @param int $executionID + * @access public + * @return int + */ + public function showBranchTest($productID, $moduleID = 0, $executionID = 0) + { + $show = $this->objectModel->showBranch($productID, $moduleID = 0, $executionID = 0); + + if(dao::isError()) return dao::getError(); + + return $show ? 1 : 2; + } + + /** + * Test change branch language. + * + * @param int $productID + * @access public + * @return string + */ + public function changeBranchLanguageTest($productID) + { + global $tester; + global $lang; + + $filePath = dirname(dirname(dirname(__FILE__))) . DS . 'module' . DS . 'branch' . DS . 'lang' . DS . 'zh-cn.php'; + include $filePath; + + $this->objectModel->changeBranchLanguage($productID); + + $createLang = $tester->lang->branch->create; + + if(dao::isError()) return dao::getError(); + + return $createLang; + } + + /** + * Test merge multiple branches into one branch. + * + * @param int $productID + * @param string $mergedBranches + * @access public + * @return int + */ + public function mergeBranchTest($productID, $mergedBranches, $param) + { + foreach($param as $key => $value) $_POST[$key] = $value; + + $objectID = $this->objectModel->mergeBranch($productID, $mergedBranches); + + unset($_POST); + + if(dao::isError()) return dao::getError(); + + global $tester; + $modules = $tester->dao->select('*')->from(TABLE_MODULE)->where('branch')->eq($objectID)->andWhere('root')->eq($productID)->andWhere('type')->eq('story')->fetchAll(); + return count($modules); + } +} diff --git a/test/data/branch.yaml b/test/data/branch.yaml index b41657f7ef..6617f10ca2 100644 --- a/test/data/branch.yaml +++ b/test/data/branch.yaml @@ -8,7 +8,7 @@ fields: range: 1-10000 - field: product note: "所属产品" - range: 41-120{2},141-180{2} + range: 41-120{2},1-3{2}, 141-180{2} - field: name note: "名称" fields: diff --git a/test/model/branch/activate.php b/test/model/branch/activate.php new file mode 100755 index 0000000000..ddb55ee377 --- /dev/null +++ b/test/model/branch/activate.php @@ -0,0 +1,24 @@ +#!/usr/bin/env php +activate(); +cid=1 +pid=1 + +*/ + +$branchID = array(2, 4, 6, 8, 10, 1); + +$branch = new branchTest(); + +r($branch->activateTest($branchID[0])) && p('id,status') && e('2,active'); // 测试激活分支 2 +r($branch->activateTest($branchID[1])) && p('id,status') && e('4,active'); // 测试激活分支 4 +r($branch->activateTest($branchID[2])) && p('id,status') && e('6,active'); // 测试激活分支 6 +r($branch->activateTest($branchID[3])) && p('id,status') && e('8,active'); // 测试激活分支 8 +r($branch->activateTest($branchID[4])) && p('id,status') && e('10,active'); // 测试激活分支 10 +r($branch->activateTest($branchID[5])) && p('id,status') && e('1,active'); // 测试激活分支 1 diff --git a/test/model/branch/batchupdate.php b/test/model/branch/batchupdate.php new file mode 100755 index 0000000000..9802c1f9f1 --- /dev/null +++ b/test/model/branch/batchupdate.php @@ -0,0 +1,24 @@ +#!/usr/bin/env php +batchUpdate(); +cid=1 +pid=1 + +*/ + +$changeName = array('name' => array('9' => '修改分支9的名称', '10' => '修改后的分支10名称')); +$changeDesc = array('desc' => array('9' => '修改分支9的描述', '10' => '修改后的分支10描述')); +$changeStatus = array('status' => array('9' => 'closed', '10' => 'closed')); + +$branch = new branchTest(); + +r($branch->batchUpdateTest($changeName)) && p('field,old,new') && e('name,分支9,修改分支9的名称'); // 测试批量更新名称 +r($branch->batchUpdateTest($changeDesc)) && p('field,old,new') && e('desc,,修改分支9的描述'); // 测试批量更新描述 +r($branch->batchUpdateTest($changeStatus)) && p('field,old,new') && e('status,active,closed'); // 测试批量更新状态 +system("./ztest init"); diff --git a/test/model/branch/changebranchlanguage.php b/test/model/branch/changebranchlanguage.php new file mode 100755 index 0000000000..046326d015 --- /dev/null +++ b/test/model/branch/changebranchlanguage.php @@ -0,0 +1,21 @@ +#!/usr/bin/env php +changeBranchLanguage(); +cid=1 +pid=1 + +*/ +$productID = array(1, 41, 81, 42); + +$branch = new branchTest(); + +r($branch->changeBranchLanguageTest($productID[0])) && p() && e('新建%s'); // 测试修改productID 1 的分支语言项 +r($branch->changeBranchLanguageTest($productID[1])) && p() && e('新建分支'); // 测试修改productID 41 的分支语言项 +r($branch->changeBranchLanguageTest($productID[2])) && p() && e('新建平台'); // 测试修改productID 81 的分支语言项 +r($branch->changeBranchLanguageTest($productID[3])) && p() && e('新建分支'); // 测试修改productID 42 的分支语言项 diff --git a/test/model/branch/checkbranchdata.php b/test/model/branch/checkbranchdata.php new file mode 100755 index 0000000000..8cfffcc98b --- /dev/null +++ b/test/model/branch/checkbranchdata.php @@ -0,0 +1,24 @@ +#!/usr/bin/env php +checkBranchData(); +cid=1 +pid=1 + +*/ +$branchID = array(1, 2, 3, 4, 5, 6, 1000001); + +$branch = new branchTest(); + +r($branch->checkBranchDataTest($branchID[0])) && p() && e('2'); // 测试验证branchID 1 的数据 +r($branch->checkBranchDataTest($branchID[1])) && p() && e('2'); // 测试验证branchID 2 的数据 +r($branch->checkBranchDataTest($branchID[2])) && p() && e('2'); // 测试验证branchID 3 的数据 +r($branch->checkBranchDataTest($branchID[3])) && p() && e('2'); // 测试验证branchID 4 的数据 +r($branch->checkBranchDataTest($branchID[4])) && p() && e('2'); // 测试验证branchID 5 的数据 +r($branch->checkBranchDataTest($branchID[5])) && p() && e('2'); // 测试验证branchID 6 的数据 +r($branch->checkBranchDataTest($branchID[6])) && p() && e('1'); // 测试验证branchID 1000001 的数据 diff --git a/test/model/branch/close.php b/test/model/branch/close.php new file mode 100755 index 0000000000..5042d0d9ca --- /dev/null +++ b/test/model/branch/close.php @@ -0,0 +1,25 @@ +#!/usr/bin/env php +close(); +cid=1 +pid=1 + +*/ +$branchID = array(1, 2, 3, 4, 5, 6); + +$branch = new branchTest(); + +r($branch->closeTest($branchID[0])) && p('id,status') && e('1,closed'); // 测试关闭branchID 1 +r($branch->closeTest($branchID[1])) && p('id,status') && e('2,closed'); // 测试关闭branchID 2 +r($branch->closeTest($branchID[2])) && p('id,status') && e('3,closed'); // 测试关闭branchID 3 +r($branch->closeTest($branchID[3])) && p('id,status') && e('4,closed'); // 测试关闭branchID 4 +r($branch->closeTest($branchID[4])) && p('id,status') && e('5,closed'); // 测试关闭branchID 5 +r($branch->closeTest($branchID[5])) && p('id,status') && e('6,closed'); // 测试关闭branchID 6 +r($branch->closeTest($branchID[0])) && p('id,status') && e('1,closed'); // 测试重复关闭branchID 1 +system("./ztest init"); diff --git a/test/model/branch/create.php b/test/model/branch/create.php new file mode 100755 index 0000000000..eeaabdfdba --- /dev/null +++ b/test/model/branch/create.php @@ -0,0 +1,30 @@ +#!/usr/bin/env php +create(); +cid=1 +pid=1 + +*/ +$productID = 41; + +$branch1 = array('name' => '新建分支1', 'desc' => '新建分支1的描述'); +$branch2 = array('name' => '新建分支2', 'desc' => '新建分支2的描述'); + +$repeatName1 = array('name' => '新建分支1', 'desc' => '重名新建分支1的描述'); +$repeatName2 = array('name' => '分支1', 'desc' => '重名分支1的描述'); +$emptyName = array('name' => '', 'desc' => '分支名为空的分支描述'); + +$branch = new branchTest(); + +r($branch->createTest($productID, $branch1)) && p('name,desc') && e('新建分支1,新建分支1的描述'); // 测试新建分支1 +r($branch->createTest($productID, $branch2)) && p('name,desc') && e('新建分支2,新建分支2的描述'); // 测试新建分支2 +r($branch->createTest($productID, $repeatName1)) && p() && e('分支名称已存在'); // 测试新建 重名新建分支1 +r($branch->createTest($productID, $repeatName2)) && p() && e('分支名称已存在'); // 测试新建 重名分支1 +r($branch->createTest($productID, $emptyName)) && p() && e('『名称』不能为空。'); // 测试新建 名称为空的分支 +system("./ztest init"); diff --git a/test/model/branch/getallpairs.php b/test/model/branch/getallpairs.php new file mode 100755 index 0000000000..143388707e --- /dev/null +++ b/test/model/branch/getallpairs.php @@ -0,0 +1,19 @@ +#!/usr/bin/env php +getAllPairs(); +cid=1 +pid=1 + +*/ +$params = 'noempty'; + +$branch = new branchTest(); + +r($branch->getAllPairsTest()) && p() && e('167'); // 测试获取全部分支名 +r($branch->getAllPairsTest($params)) && p() && e('166'); // 测试获取全部分支名 diff --git a/test/model/branch/getbyid.php b/test/model/branch/getbyid.php new file mode 100755 index 0000000000..2bec1caf47 --- /dev/null +++ b/test/model/branch/getbyid.php @@ -0,0 +1,35 @@ +#!/usr/bin/env php +getById(); +cid=1 +pid=1 + +*/ +$branchID = array(1, 2, 3, ''); +$productID = array(41, 81, 1); +$field = ''; + +$branch = new branchTest(); + +r($branch->getByIdTest($branchID[0])) && p() && e('分支1'); // 测试获取 branchID 1 的分支信息 +r($branch->getByIdTest($branchID[0], $productID[0])) && p() && e('分支1'); // 测试获取 branchID 1 productID 41 的分支信息 +r($branch->getByIdTest($branchID[0], $productID[0], $field)) && p('name') && e('分支1'); // 测试获取 branchID 1 productID 41 field 空 的分支信息 +r($branch->getByIdTest($branchID[1])) && p() && e('分支2'); // 测试获取 branchID 2 的分支信息 +r($branch->getByIdTest($branchID[1], $productID[0])) && p() && e('分支2'); // 测试获取 branchID 2 productID 41 的分支信息 +r($branch->getByIdTest($branchID[1], $productID[0], $field)) && p('name') && e('分支2'); // 测试获取 branchID 2 productID 41 field 空 的分支信息 +r($branch->getByIdTest($branchID[2])) && p() && e('分支3'); // 测试获取 branchID 3 的分支信息 +r($branch->getByIdTest($branchID[2], $productID[0])) && p() && e('分支3'); // 测试获取 branchID 3 productID 41 的分支信息 +r($branch->getByIdTest($branchID[2], $productID[0], $field)) && p('name') && e('分支3'); // 测试获取 branchID 3 productID 41 field 空 的分支信息 +r($branch->getByIdTest($branchID[3])) && p() && e('0'); // 测试获取 branchID 空 的分支信息 +r($branch->getByIdTest($branchID[3], $productID[0])) && p() && e('主干'); // 测试获取 branchID 空 productID 41 的分支信息 +r($branch->getByIdTest($branchID[3], $productID[1])) && p() && e('主干'); // 测试获取 branchID 空 productID 81 的分支信息 +r($branch->getByIdTest($branchID[3], $productID[2])) && p() && e('主干'); // 测试获取 branchID 空 productID 1 的分支信息 +r($branch->getByIdTest($branchID[3], $productID[0], $field)) && p('name') && e('主干'); // 测试获取 branchID 空 productID 41 field 空 的分支信息 +r($branch->getByIdTest($branchID[3], $productID[1], $field)) && p('name') && e('主干'); // 测试获取 branchID 空 productID 81 field 空 的分支信息 +r($branch->getByIdTest($branchID[3], $productID[2], $field)) && p('name') && e('主干'); // 测试获取 branchID 空 productID 1 field 空 的分支信息 diff --git a/test/model/branch/getbyproducts.php b/test/model/branch/getbyproducts.php new file mode 100755 index 0000000000..efde1efa14 --- /dev/null +++ b/test/model/branch/getbyproducts.php @@ -0,0 +1,35 @@ +#!/usr/bin/env php +getByProducts(); +cid=1 +pid=1 + +*/ + +$products = array('1,41,42', '2,81,82', '43,83'); +$params = array('', 'noclosed', 'ignoreNormal', 'noempty', 'noclosed,ignoreNormal', 'ignoreNormal,noempty'); +$appendBranch = ''; + +$branch = new branchTest(); + +r($branch->getByProductsTest($products[0])) && p() && e('1:,0;41:,0,1,2;42:,0,3,4;'); // 测试获取产品 41 42 的分支信息 +r($branch->getByProductsTest($products[0], $params[0])) && p() && e('1:,0;41:,0,1,2;42:,0,3,4;'); // 测试获取产品 41 42 的分支信息 +r($branch->getByProductsTest($products[0], $params[1])) && p() && e('1:,0;41:,0,1;42:,0,3;'); // 测试获取产品 41 42 的分支信息 +r($branch->getByProductsTest($products[0], $params[2])) && p() && e('41:,0,1,2;42:,0,3,4;'); // 测试获取产品 41 42 的分支信息 +r($branch->getByProductsTest($products[0], $params[3])) && p() && e('1:,0;41:,1,2;42:,3,4;'); // 测试获取产品 41 42 的分支信息 +r($branch->getByProductsTest($products[0], $params[4])) && p() && e('41:,0,1;42:,0,3;'); // 测试获取产品 41 42 的分支信息 +r($branch->getByProductsTest($products[0], $params[5])) && p() && e('41:,1,2;42:,3,4;'); // 测试获取产品 41 42 的分支信息 +r($branch->getByProductsTest($products[0], $params[0], $appendBranch)) && p() && e('1:,0;41:,0,1,2;42:,0,3,4;'); // 测试获取产品 41 42 追加branch20 21 的分支信息 +r($branch->getByProductsTest($products[0], $params[1], $appendBranch)) && p() && e('1:,0;41:,0,1;42:,0,3;'); // 测试获取产品 41 42 noclosed 追加branch20 21 的分支信息 +r($branch->getByProductsTest($products[0], $params[2], $appendBranch)) && p() && e('41:,0,1,2;42:,0,3,4;'); // 测试获取产品 41 42 ignoreNormal 追加branch20 21 的分支信息 +r($branch->getByProductsTest($products[0], $params[3], $appendBranch)) && p() && e('1:,0;41:,1,2;42:,3,4;'); // 测试获取产品 41 42 noempty 追加branch20 21 的分支信息 +r($branch->getByProductsTest($products[0], $params[4], $appendBranch)) && p() && e('41:,0,1;42:,0,3;'); // 测试获取产品 41 42 noclosed,ignoreNormal 追加branch20 21 的分支信息 +r($branch->getByProductsTest($products[0], $params[5], $appendBranch)) && p() && e('41:,1,2;42:,3,4;'); // 测试获取产品 41 42 ignoreNormal,noempty 追加branch20 21 的分支信息 +r($branch->getByProductsTest($products[1])) && p() && e('2:,0;81:,0,81,82;82:,0,83,84;'); // 测试获取产品 81 82 的分支信息 +r($branch->getByProductsTest($products[2])) && p() && e('43:,0,5,6;83:,0,85,86;'); // 测试获取产品 43 83 的分支信息 diff --git a/test/model/branch/getlist.php b/test/model/branch/getlist.php new file mode 100755 index 0000000000..c962a92b06 --- /dev/null +++ b/test/model/branch/getlist.php @@ -0,0 +1,41 @@ +#!/usr/bin/env php +getList(); +cid=1 +pid=1 + +*/ +$productID = array(41, 42, 43); +$executionID = array(141, 142, 143, null); +$browseType = array('all', 'closed', 'active'); +$mainBranch = false; + +$branch = new branchTest(); + +r($branch->getListTest($productID[0])) && p() && e(',0,1'); // 测试获取产品 41的分支信息 +r($branch->getListTest($productID[0], $executionID[0])) && p() && e(',0'); // 测试获取产品 41 执行 141的分支信息 +r($branch->getListTest($productID[0], $executionID[0], $browseType[0])) && p() && e(',0'); // 测试获取产品 41 执行 141 all 没有主干 的分支信息 +r($branch->getListTest($productID[0], $executionID[3], $browseType[0])) && p() && e(',0,1,2'); // 测试获取产品 41 all 没有主干 的分支信息 +r($branch->getListTest($productID[0], $executionID[3], $browseType[1])) && p() && e(',2'); // 测试获取产品 41 执行 141 closed 没有主干 的分支信息 +r($branch->getListTest($productID[0], $executionID[3], $browseType[2])) && p() && e(',0,1'); // 测试获取产品 41 执行 141 active 没有主干 的分支信息 +r($branch->getListTest($productID[0], $executionID[3], $browseType[0], $mainBranch)) && p() && e(',1,2'); // 测试获取产品 41 执行 141 all 没有主干 的分支信息 +r($branch->getListTest($productID[1])) && p() && e(',0,3'); // 测试获取产品 42的分支信息 +r($branch->getListTest($productID[1], $executionID[1])) && p() && e(',0'); // 测试获取产品 42 执行 142的分支信息 +r($branch->getListTest($productID[1], $executionID[1], $browseType[0])) && p() && e(',0'); // 测试获取产品 42 执行 142 all 没有主干 的分支信息 +r($branch->getListTest($productID[1], $executionID[3], $browseType[0])) && p() && e(',0,3,4'); // 测试获取产品 42 all 没有主干 的分支信息 +r($branch->getListTest($productID[1], $executionID[3], $browseType[1])) && p() && e(',4'); // 测试获取产品 42 执行 142 closed 没有主干 的分支信息 +r($branch->getListTest($productID[1], $executionID[3], $browseType[2])) && p() && e(',0,3'); // 测试获取产品 42 执行 142 active 没有主干 的分支信息 +r($branch->getListTest($productID[1], $executionID[3], $browseType[0], $mainBranch)) && p() && e(',3,4'); // 测试获取产品 42 执行 142 all 没有主干 的分支信息 +r($branch->getListTest($productID[2])) && p() && e(',0,5'); // 测试获取产品 43的分支信息 +r($branch->getListTest($productID[2], $executionID[2])) && p() && e(',0'); // 测试获取产品 43 执行 143的分支信息 +r($branch->getListTest($productID[2], $executionID[2], $browseType[0])) && p() && e(',0'); // 测试获取产品 43 执行 143 all 没有主干 的分支信息 +r($branch->getListTest($productID[2], $executionID[3], $browseType[0])) && p() && e(',0,5,6'); // 测试获取产品 43 all 没有主干 的分支信息 +r($branch->getListTest($productID[2], $executionID[3], $browseType[1])) && p() && e(',6'); // 测试获取产品 43 执行 143 closed 没有主干 的分支信息 +r($branch->getListTest($productID[2], $executionID[3], $browseType[2])) && p() && e(',0,5'); // 测试获取产品 43 执行 143 active 没有主干 的分支信息 +r($branch->getListTest($productID[2], $executionID[3], $browseType[0], $mainBranch)) && p() && e(',5,6'); // 测试获取产品 43 执行 143 all 没有主干 的分支信息 diff --git a/test/model/branch/getpairs.php b/test/model/branch/getpairs.php new file mode 100755 index 0000000000..6e5785fca6 --- /dev/null +++ b/test/model/branch/getpairs.php @@ -0,0 +1,41 @@ +#!/usr/bin/env php +getPairs(); +cid=1 +pid=1 + +*/ +$productID = array(41, 42, 43); +$param = array('active', 'noempty', 'all', 'withClosed'); +$executionID = array(141, 142, 143, null); +$mergedBranches = '1,4'; + +$branch = new branchTest(); + +r($branch->getPairsTest($productID[0])) && p() && e(',0,1,2'); // 测试获取 产品41 的分支信息对 +r($branch->getPairsTest($productID[0], $param[0])) && p() && e(',0,1'); // 测试获取 产品41 active 的分支信息对 +r($branch->getPairsTest($productID[0], $param[1])) && p() && e(',1,2'); // 测试获取 产品41 noempty 的分支信息对 +r($branch->getPairsTest($productID[0], $param[2])) && p() && e(',all,0,1,2'); // 测试获取 产品41 all 的分支信息对 +r($branch->getPairsTest($productID[0], $param[3])) && p() && e(',0,1,2'); // 测试获取 产品41 withClosed 的分支信息对 +r($branch->getPairsTest($productID[0], $param[0], $executionID[0])) && p() && e(',0'); // 测试获取 产品41 active 执行141 的分支信息对 +r($branch->getPairsTest($productID[0], $param[0], $executionID[0], $mergedBranches)) && p() && e(',0'); // 测试获取 产品41 active 执行141 合并分支1 4 的分支信息对 +r($branch->getPairsTest($productID[1])) && p() && e(',0,3,4'); // 测试获取 产品41 的分支信息对 +r($branch->getPairsTest($productID[1], $param[0])) && p() && e(',0,3'); // 测试获取 产品41 active 的分支信息对 +r($branch->getPairsTest($productID[1], $param[1])) && p() && e(',3,4'); // 测试获取 产品41 noempty 的分支信息对 +r($branch->getPairsTest($productID[1], $param[2])) && p() && e(',all,0,3,4'); // 测试获取 产品41 all 的分支信息对 +r($branch->getPairsTest($productID[1], $param[3])) && p() && e(',0,3,4'); // 测试获取 产品41 withClosed 的分支信息对 +r($branch->getPairsTest($productID[1], $param[0], $executionID[0])) && p() && e('0'); // 测试获取 产品41 active 执行141 的分支信息对 +r($branch->getPairsTest($productID[1], $param[0], $executionID[0], $mergedBranches)) && p() && e('0'); // 测试获取 产品41 active 执行141 合并分支1 4 的分支信息对 +r($branch->getPairsTest($productID[2])) && p() && e(',0,5,6'); // 测试获取 产品41 的分支信息对 +r($branch->getPairsTest($productID[2], $param[0])) && p() && e(',0,5'); // 测试获取 产品41 active 的分支信息对 +r($branch->getPairsTest($productID[2], $param[1])) && p() && e(',5,6'); // 测试获取 产品41 noempty 的分支信息对 +r($branch->getPairsTest($productID[2], $param[2])) && p() && e(',all,0,5,6'); // 测试获取 产品41 all 的分支信息对 +r($branch->getPairsTest($productID[2], $param[3])) && p() && e(',0,5,6'); // 测试获取 产品41 withClosed 的分支信息对 +r($branch->getPairsTest($productID[2], $param[0], $executionID[0])) && p() && e('0'); // 测试获取 产品41 active 执行141 的分支信息对 +r($branch->getPairsTest($productID[2], $param[0], $executionID[0], $mergedBranches)) && p() && e('0'); // 测试获取 产品41 active 执行141 合并分支1 4 的分支信息对 diff --git a/test/model/branch/getproducttype.php b/test/model/branch/getproducttype.php new file mode 100755 index 0000000000..8adbeb24a7 --- /dev/null +++ b/test/model/branch/getproducttype.php @@ -0,0 +1,23 @@ +#!/usr/bin/env php +getProductType(); +cid=1 +pid=1 + +*/ +$branchID = array(1, 3, 81, 83, 161, 163); + +$branch = new branchTest(); + +r($branch->getProductTypeTest($branchID[0])) && p() && e('branch'); // 测试获取分支 1 的项目类型 +r($branch->getProductTypeTest($branchID[1])) && p() && e('branch'); // 测试获取分支 3 的项目类型 +r($branch->getProductTypeTest($branchID[2])) && p() && e('platform'); // 测试获取分支 81 的项目类型 +r($branch->getProductTypeTest($branchID[3])) && p() && e('platform'); // 测试获取分支 83 的项目类型 +r($branch->getProductTypeTest($branchID[4])) && p() && e('normal'); // 测试获取分支 161 的项目类型 +r($branch->getProductTypeTest($branchID[5])) && p() && e('normal'); // 测试获取分支 163 的项目类型 diff --git a/test/model/branch/mergebranch.php b/test/model/branch/mergebranch.php new file mode 100755 index 0000000000..762883fb40 --- /dev/null +++ b/test/model/branch/mergebranch.php @@ -0,0 +1,39 @@ +#!/usr/bin/env php +mergeBranch(); +cid=1 +pid=1 + +*/ +$productID = array(41, 42); +$mergedBranches = array('1', '2', '3,4'); + +$mergeBranch1 = new stdclass(); +$mergeBranch1->createBranch = 0; +$mergeBranch1->mergedBranchIDList = array(1); +$mergeBranch1->targetBranch = 2; + +$mergeBranch2 = new stdclass(); +$mergeBranch2->name = '新建合并的分支'; +$mergeBranch2->desc = '合并分支的描述'; +$mergeBranch2->createBranch = 1; +$mergeBranch2->mergedBranchIDList = array(2); +$mergeBranch2->targetBranch = 0; + +$mergeBranch3 = new stdclass(); +$mergeBranch3->createBranch = 0; +$mergeBranch3->mergedBranchIDList = array(3, 4); +$mergeBranch3->targetBranch = 0; + +$branch = new branchTest(); + +r($branch->mergeBranchTest($productID[0], $mergedBranches[0], $mergeBranch1)) && p() && e('2'); // 测试合并分支 1 到 分支 2 +r($branch->mergeBranchTest($productID[0], $mergedBranches[1], $mergeBranch2)) && p() && e('2'); // 测试合并分支 2 到 新建分支 +r($branch->mergeBranchTest($productID[1], $mergedBranches[2], $mergeBranch3)) && p() && e('12'); // 测试合并分支 3 4 到 主干 +system("./ztest init"); diff --git a/test/model/branch/setdefault.php b/test/model/branch/setdefault.php new file mode 100755 index 0000000000..77cf523450 --- /dev/null +++ b/test/model/branch/setdefault.php @@ -0,0 +1,17 @@ +#!/usr/bin/env php +setDefault(); +cid=1 +pid=1 + +*/ + +$branch = new branchTest(); + +r($branch->setDefaultTest()) && p() && e(); diff --git a/test/model/branch/showbranch.php b/test/model/branch/showbranch.php new file mode 100755 index 0000000000..1ef79fa851 --- /dev/null +++ b/test/model/branch/showbranch.php @@ -0,0 +1,31 @@ +#!/usr/bin/env php +showBranch(); +cid=1 +pid=1 + +*/ +$productID = array(1, 41, 81); +$moduleID = array(0, 1821, 1981, 2141); +$executionID = array(0, 101, 231, 181); + +$branch = new branchTest(); + +r($branch->showBranchTest($productID[0])) && p() && e('2'); // 测试验证产品 1 是否显示分支标签 +r($branch->showBranchTest($productID[0], $moduleID[1])) && p() && e('2'); // 测试验证产品 1 模块 1821 是否显示分支标签 +r($branch->showBranchTest($productID[0], $moduleID[0], $executionID[1])) && p() && e('2'); // 测试验证产品 1 执行 101 是否显示分支标签 +r($branch->showBranchTest($productID[0], $moduleID[1], $executionID[1])) && p() && e('2'); // 测试验证产品 1 模块 1821 执行 101 是否显示分支标签 +r($branch->showBranchTest($productID[1])) && p() && e('1'); // 测试验证产品 41 是否显示分支标签 +r($branch->showBranchTest($productID[1], $moduleID[2])) && p() && e('1'); // 测试验证产品 41 模块 1981 是否显示分支标签 +r($branch->showBranchTest($productID[1], $moduleID[0], $executionID[2])) && p() && e('1'); // 测试验证产品 41 执行 231 是否显示分支标签 +r($branch->showBranchTest($productID[1], $moduleID[2], $executionID[2])) && p() && e('1'); // 测试验证产品 41 模块 1981 执行 231 是否显示分支标签 +r($branch->showBranchTest($productID[2])) && p() && e('1'); // 测试验证产品 81 是否显示分支标签 +r($branch->showBranchTest($productID[2], $moduleID[3])) && p() && e('1'); // 测试验证产品 81 模块 2141 是否显示分支标签 +r($branch->showBranchTest($productID[2], $moduleID[0], $executionID[3])) && p() && e('1'); // 测试验证产品 81 执行 181 是否显示分支标签 +r($branch->showBranchTest($productID[2], $moduleID[3], $executionID[3])) && p() && e('1'); // 测试验证产品 81 模块 2141 执行 181 是否显示分支标签 diff --git a/test/model/branch/sort.php b/test/model/branch/sort.php new file mode 100755 index 0000000000..d38b96e080 --- /dev/null +++ b/test/model/branch/sort.php @@ -0,0 +1,27 @@ +#!/usr/bin/env php +sort(); +cid=1 +pid=1 + +*/ +$branches = array('0,2,1', '0,4,3', '0,6,5', '0,8,7'); +$order = 'order'; + +$branch = new branchTest(); + +r($branch->sortTest($branches[0])) && p() && e('1,2'); // 测试产品 41 排序 +r($branch->sortTest($branches[1])) && p() && e('3,4'); // 测试产品 42 排序 +r($branch->sortTest($branches[2])) && p() && e('5,6'); // 测试产品 43 排序 +r($branch->sortTest($branches[3])) && p() && e('7,8'); // 测试产品 44 排序 +r($branch->sortTest($branches[0], $order)) && p() && e('2,1'); // 测试产品 41 order 排序 +r($branch->sortTest($branches[1], $order)) && p() && e('4,3'); // 测试产品 42 order 排序 +r($branch->sortTest($branches[2], $order)) && p() && e('6,5'); // 测试产品 43 order 排序 +r($branch->sortTest($branches[3], $order)) && p() && e('8,7'); // 测试产品 44 order 排序 +system("./ztest init"); diff --git a/test/model/branch/update.php b/test/model/branch/update.php new file mode 100755 index 0000000000..63854ed9d0 --- /dev/null +++ b/test/model/branch/update.php @@ -0,0 +1,27 @@ +#!/usr/bin/env php +update(); +cid=1 +pid=1 + +*/ +$changeName = array('name' => '修改后的分支1'); +$changeStatus = array('status' => 'closed'); +$changeDesc = array('desc' => '修改后的分支1描述'); +$emptyName = array('name' => ''); +$repeatName = array('name' => '分支2'); + +$branch = new branchTest(); + +r($branch->updateTest($changeName)) && p('0:field,old,new') && e('name,分支1,修改后的分支1'); // 测试修改分支名称 +r($branch->updateTest($changeStatus)) && p('0:field,old,new') && e('status,active,closed'); // 测试修改分支状态 +r($branch->updateTest($changeDesc)) && p('0:field,old,new') && e('desc,,修改后的分支1描述'); // 测试修改分支描述 +r($branch->updateTest($emptyName)) && p('name:0') && e('『名称』不能为空。'); // 测试修改分支名称 +r($branch->updateTest($repeatName)) && p('name:0') && e('分支名称已存在'); // 测试修改分支名称 +system("./ztest init"); diff --git a/test/ztest b/test/ztest index eee1fa34c2..a96dbf1b53 100755 --- a/test/ztest +++ b/test/ztest @@ -79,6 +79,8 @@ switch($argv[1]) case 'stage': ztfRun('model/stage'); break; + case 'branch': + ztfRun('model/branch'); case 'tree': ztfRun('model/tree'); break; From 6466b9dd0f2713f6f06b9b7f2e0160ff1e8966e3 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Mon, 18 Apr 2022 17:05:49 +0800 Subject: [PATCH 29/42] * Modify unit test of branch. --- test/class/branch.class.php | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/test/class/branch.class.php b/test/class/branch.class.php index ef719e8bf7..713abbfaed 100644 --- a/test/class/branch.class.php +++ b/test/class/branch.class.php @@ -201,15 +201,6 @@ class branchTest return $object; } - public function manageTest($productID) - { - $objects = $this->objectModel->manage($productID); - - if(dao::isError()) return dao::getError(); - - return $objects; - } - public function unlinkBranch4ProjectTest($productIDList) { $objects = $this->objectModel->unlinkBranch4Project($productIDList); @@ -311,24 +302,6 @@ class branchTest return $objects ? 1 : 2; } - public function setParamsForLinkTest($module, $link, $projectID, $productID, $branch) - { - $objects = $this->objectModel->setParamsForLink($module, $link, $projectID, $productID, $branch); - - if(dao::isError()) return dao::getError(); - - return $objects; - } - - public function setDefaultTest($productID, $branchID) - { - $objects = $this->objectModel->setDefault($productID, $branchID); - - if(dao::isError()) return dao::getError(); - - return $objects; - } - public function getPairsByProjectProductTest($projectID, $productID) { $objects = $this->objectModel->getPairsByProjectProduct($projectID, $productID); From caacc3811c22aea5ed994281f4efd311ed9f0d7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Mon, 18 Apr 2022 17:15:27 +0800 Subject: [PATCH 30/42] * Fix bug #21824. --- module/story/view/view.html.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index 9d43318036..5ba7ca2060 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -307,6 +307,7 @@ type != 'requirement'):?> + parent != -1):?> story->plan;?> + From 9b66c7a4582d0fc98fa17c09dc5fe88c0a0045fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=8D=8E=E4=BC=9F?= Date: Mon, 18 Apr 2022 17:20:45 +0800 Subject: [PATCH 31/42] *Optimize the code. --- module/story/view/view.html.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php index 5ba7ca2060..f0c8895767 100644 --- a/module/story/view/view.html.php +++ b/module/story/view/view.html.php @@ -305,9 +305,8 @@ ?> - type != 'requirement'):?> + type != 'requirement' and $story->parent != -1):?> - parent != -1):?> story->plan;?> - From b411c07de89ba08c0b987623181b0a3d7c1aff5d Mon Sep 17 00:00:00 2001 From: Hao Sun Date: Mon, 18 Apr 2022 17:34:44 +0800 Subject: [PATCH 32/42] * bug #19078, hide scrollbar on dragging card in ".kanban". --- module/execution/css/kanban.css | 1 + module/kanban/css/view.css | 1 + 2 files changed, 2 insertions(+) diff --git a/module/execution/css/kanban.css b/module/execution/css/kanban.css index 00a13ba1a2..86fdfcfac8 100644 --- a/module/execution/css/kanban.css +++ b/module/execution/css/kanban.css @@ -43,6 +43,7 @@ .region .kanban-header-col > .actions {position: relative; right: 5px;} .region .kanban-header-parent-col > .actions {position: absolute; right: 0px;} .region .kanban-header-sub-cols .actions {position: absolute; right: 0px;} +.region .kanban.kanban-dragging {overflow: hidden;} .region .kanban-lane {position: relative; border-bottom: none!important; min-height: 200px !important} diff --git a/module/kanban/css/view.css b/module/kanban/css/view.css index 8a8496bca6..52ff8d0e5b 100644 --- a/module/kanban/css/view.css +++ b/module/kanban/css/view.css @@ -23,6 +23,7 @@ .region .kanban-header-sub-cols {margin-left:0;} .region .kanban-header-sub-cols .kanban-header-col > .title {max-width: 100% !important;min-width:240px;} .region .sort .region-header {cursor: move;} +.region .kanban.kanban-dragging {overflow: hidden;} .region .kanban {padding: 0px 5px 10px 10px; min-height: unset; overflow:auto; width: 100%} .region .kanban .form-actions {margin: 0;} From 25eb24fe7da1474677ff467dcfa798aeb4b61e99 Mon Sep 17 00:00:00 2001 From: zhujinyong Date: Tue, 19 Apr 2022 08:23:15 +0800 Subject: [PATCH 33/42] - Remove submodule. --- .gitmodules | 3 --- extension/qucheng | 1 - 2 files changed, 4 deletions(-) delete mode 100644 .gitmodules delete mode 160000 extension/qucheng diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 957236940c..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "extension/qucheng"] - path = extension/qucheng - url = https://gitlab.zcorp.cc/easycorp/qucheng.git diff --git a/extension/qucheng b/extension/qucheng deleted file mode 160000 index 07c7110f65..0000000000 --- a/extension/qucheng +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 07c7110f65598d1e660d2f22e8965d42583b1abe From 2f3f35679087f332d0ddf4656684f3acdb849757 Mon Sep 17 00:00:00 2001 From: zhujinyong Date: Tue, 19 Apr 2022 08:36:02 +0800 Subject: [PATCH 34/42] * Fix product param. --- api/v1/entries/testtasks.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v1/entries/testtasks.php b/api/v1/entries/testtasks.php index 8dcabc1b3d..cc34ac7e28 100644 --- a/api/v1/entries/testtasks.php +++ b/api/v1/entries/testtasks.php @@ -24,7 +24,7 @@ class testtasksEntry extends entry /* Get all testtasks. */ $control = $this->loadController('testtask', 'browse'); - $productID = $this->param('productID', 0); + $productID = $this->param('product', 0); $control->browse($productID, $this->param('branch', ''), ($productID > 0 ? 'local' : 'all') . ',' . $this->param('status', 'totalStatus'), $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 20), $this->param('page', 1), $this->param('begin', ''), $this->param('end', '')); $data = $this->getData(); From b0c7bfba863d3e4d28229eb837ced95bc82ec736 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 19 Apr 2022 09:08:52 +0800 Subject: [PATCH 35/42] * Add unit test of branch. --- test/class/branch.class.php | 40 +++++++++++++++---- test/data/bug.yaml | 2 +- test/data/projectproduct.yaml | 2 +- test/model/branch/activate.php | 1 + .../model/branch/getpairsbyprojectproduct.php | 23 +++++++++++ test/model/branch/linkbranch4project.php | 25 ++++++++++++ test/model/branch/setdefault.php | 17 -------- test/model/branch/unlinkbranch4project.php | 22 ++++++++++ test/ztest | 1 + 9 files changed, 107 insertions(+), 26 deletions(-) create mode 100755 test/model/branch/getpairsbyprojectproduct.php create mode 100755 test/model/branch/linkbranch4project.php delete mode 100755 test/model/branch/setdefault.php create mode 100755 test/model/branch/unlinkbranch4project.php diff --git a/test/class/branch.class.php b/test/class/branch.class.php index 713abbfaed..2c12d9c7cd 100644 --- a/test/class/branch.class.php +++ b/test/class/branch.class.php @@ -201,24 +201,40 @@ class branchTest return $object; } + /** + * Test unlink branches for projects when product type is normal. + * + * @param string $productIDList + * @access public + * @return int + */ public function unlinkBranch4ProjectTest($productIDList) { - $objects = $this->objectModel->unlinkBranch4Project($productIDList); + $this->objectModel->unlinkBranch4Project($productIDList); if(dao::isError()) return dao::getError(); - return $objects; + global $tester; + $objects = $tester->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('product')->in($productIDList)->andWhere('branch')->gt(0)->fetchAll(); + return count($objects); } + /** + * Test link branches for projects when product type is not normal. + * + * @param int $productID + * @access public + * @return int + */ public function linkBranch4ProjectTest($productID) { - $this->objectModel->unlinkBranch4Project($productID); - - $objects = $this->objectModel->linkBranch4Project($productID); + $this->objectModel->linkBranch4Project($productID); if(dao::isError()) return dao::getError(); - return $objects; + global $tester; + $objects = $tester->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('product')->eq($productID)->andWhere('branch')->gt(0)->fetchAll(); + return count($objects); } /** @@ -302,13 +318,23 @@ class branchTest return $objects ? 1 : 2; } + /** + * Test get branches of product which linked project. + * + * @param int $projectID + * @param int $productID + * @access public + * @return string + */ public function getPairsByProjectProductTest($projectID, $productID) { $objects = $this->objectModel->getPairsByProjectProduct($projectID, $productID); if(dao::isError()) return dao::getError(); - return $objects; + $names = ''; + foreach($objects as $id => $name) $names .= "$id:$name;"; + return $names; } /** diff --git a/test/data/bug.yaml b/test/data/bug.yaml index dfacec31d1..2628756984 100644 --- a/test/data/bug.yaml +++ b/test/data/bug.yaml @@ -9,7 +9,7 @@ fields: - field: product range: 1-100{3} - field: branch - range: 0 + range: 0{120},0-2,0,3-4,0,5-6,0,7-8,0,9-10,0{100000000} - field: module range: 1821-1823,1825-1827,1831-1833,0{1000000} - field: execution diff --git a/test/data/projectproduct.yaml b/test/data/projectproduct.yaml index 7d5dd08a45..b2f0d8234e 100644 --- a/test/data/projectproduct.yaml +++ b/test/data/projectproduct.yaml @@ -7,6 +7,6 @@ fields: - field: product range: 1-100 - field: branch - range: 0{30},1-10:2,0{165} + range: 0{40},1-10:2,0{155} - field: plan range: 1-360:3 diff --git a/test/model/branch/activate.php b/test/model/branch/activate.php index ddb55ee377..057d5e89d7 100755 --- a/test/model/branch/activate.php +++ b/test/model/branch/activate.php @@ -22,3 +22,4 @@ r($branch->activateTest($branchID[2])) && p('id,status') && e('6,active'); // r($branch->activateTest($branchID[3])) && p('id,status') && e('8,active'); // 测试激活分支 8 r($branch->activateTest($branchID[4])) && p('id,status') && e('10,active'); // 测试激活分支 10 r($branch->activateTest($branchID[5])) && p('id,status') && e('1,active'); // 测试激活分支 1 +system("./ztest init"); diff --git a/test/model/branch/getpairsbyprojectproduct.php b/test/model/branch/getpairsbyprojectproduct.php new file mode 100755 index 0000000000..1ace2929f0 --- /dev/null +++ b/test/model/branch/getpairsbyprojectproduct.php @@ -0,0 +1,23 @@ +#!/usr/bin/env php +getPairsByProjectProduct(); +cid=1 +pid=1 + +*/ +$projectID = array(51, 52, 53, 54, 55); +$productID = array(41, 42, 43, 44, 45); + +$branch = new branchTest(); + +r($branch->getPairsByProjectProductTest($projectID[0], $productID[0])) && p() && e('1:分支1;'); // 测试获取 项目 51 产品 41 的关联分支 +r($branch->getPairsByProjectProductTest($projectID[1], $productID[1])) && p() && e('3:分支3;'); // 测试获取 项目 52 产品 42 的关联分支 +r($branch->getPairsByProjectProductTest($projectID[2], $productID[2])) && p() && e('5:分支5;'); // 测试获取 项目 53 产品 43 的关联分支 +r($branch->getPairsByProjectProductTest($projectID[3], $productID[3])) && p() && e('7:分支7;'); // 测试获取 项目 54 产品 44 的关联分支 +r($branch->getPairsByProjectProductTest($projectID[4], $productID[4])) && p() && e('9:分支9;'); // 测试获取 项目 55 产品 45 的关联分支 diff --git a/test/model/branch/linkbranch4project.php b/test/model/branch/linkbranch4project.php new file mode 100755 index 0000000000..b13c90b597 --- /dev/null +++ b/test/model/branch/linkbranch4project.php @@ -0,0 +1,25 @@ +#!/usr/bin/env php +linkBranch4Project(); +cid=1 +pid=1 + +*/ + +$productID = array(41, 42, 43, 44, 45); + + +$branch = new branchTest(); + +r($branch->linkBranch4ProjectTest($productID[0])) && p() && e('4'); // 测试关联产品 41 的分支到项目 +r($branch->linkBranch4ProjectTest($productID[1])) && p() && e('4'); // 测试关联产品 42 的分支到项目 +r($branch->linkBranch4ProjectTest($productID[2])) && p() && e('4'); // 测试关联产品 43 的分支到项目 +r($branch->linkBranch4ProjectTest($productID[3])) && p() && e('4'); // 测试关联产品 44 的分支到项目 +r($branch->linkBranch4ProjectTest($productID[4])) && p() && e('4'); // 测试关联产品 45 的分支到项目 +system("./ztest init"); diff --git a/test/model/branch/setdefault.php b/test/model/branch/setdefault.php deleted file mode 100755 index 77cf523450..0000000000 --- a/test/model/branch/setdefault.php +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env php -setDefault(); -cid=1 -pid=1 - -*/ - -$branch = new branchTest(); - -r($branch->setDefaultTest()) && p() && e(); diff --git a/test/model/branch/unlinkbranch4project.php b/test/model/branch/unlinkbranch4project.php new file mode 100755 index 0000000000..a872f9bd25 --- /dev/null +++ b/test/model/branch/unlinkbranch4project.php @@ -0,0 +1,22 @@ +#!/usr/bin/env php +unlinkBranch4Project(); +cid=1 +pid=1 + +*/ +$productIDList = array('41', '42', '43', '44,45'); + +$branch = new branchTest(); + +r($branch->unlinkBranch4ProjectTest($productIDList[0])) && p() && e('0'); // 测试产品 41 转为普通产品接触分支关联 +r($branch->unlinkBranch4ProjectTest($productIDList[1])) && p() && e('0'); // 测试产品 42 转为普通产品接触分支关联 +r($branch->unlinkBranch4ProjectTest($productIDList[2])) && p() && e('0'); // 测试产品 43 转为普通产品接触分支关联 +r($branch->unlinkBranch4ProjectTest($productIDList[3])) && p() && e('0'); // 测试产品 44 45 转为普通产品接触分支关联 +system("./ztest init"); diff --git a/test/ztest b/test/ztest index ec20e69d85..32052a1b45 100755 --- a/test/ztest +++ b/test/ztest @@ -81,6 +81,7 @@ switch($argv[1]) break; case 'branch': ztfRun('model/branch'); + break; case 'tree': ztfRun('model/tree'); break; From b8782ba1ecd7c1134043ec0a0b0c7bc8f0f4125f Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 19 Apr 2022 09:11:47 +0800 Subject: [PATCH 36/42] * Add unit test of branch. --- test/model/branch/activate.php | 9 ++++++- test/model/branch/batchupdate.php | 6 ++++- test/model/branch/changebranchlanguage.php | 7 +++++- test/model/branch/checkbranchdata.php | 10 +++++++- test/model/branch/close.php | 10 +++++++- test/model/branch/create.php | 8 ++++++- test/model/branch/getallpairs.php | 5 +++- test/model/branch/getbyid.php | 19 ++++++++++++++- test/model/branch/getbyproducts.php | 18 +++++++++++++- test/model/branch/getlist.php | 24 ++++++++++++++++++- test/model/branch/getpairs.php | 24 ++++++++++++++++++- .../model/branch/getpairsbyprojectproduct.php | 8 ++++++- test/model/branch/getproducttype.php | 9 ++++++- test/model/branch/linkbranch4project.php | 9 +++++-- test/model/branch/mergebranch.php | 6 ++++- test/model/branch/showbranch.php | 15 +++++++++++- test/model/branch/sort.php | 11 ++++++++- test/model/branch/unlinkbranch4project.php | 7 +++++- test/model/branch/update.php | 8 ++++++- 19 files changed, 193 insertions(+), 20 deletions(-) diff --git a/test/model/branch/activate.php b/test/model/branch/activate.php index 057d5e89d7..d6712b8da1 100755 --- a/test/model/branch/activate.php +++ b/test/model/branch/activate.php @@ -10,6 +10,13 @@ title=测试 branchModel->activate(); cid=1 pid=1 +测试激活分支 2 >> 2,active +测试激活分支 4 >> 4,active +测试激活分支 6 >> 6,active +测试激活分支 8 >> 8,active +测试激活分支 10 >> 10,active +测试激活分支 1 >> 1,active + */ $branchID = array(2, 4, 6, 8, 10, 1); @@ -22,4 +29,4 @@ r($branch->activateTest($branchID[2])) && p('id,status') && e('6,active'); // r($branch->activateTest($branchID[3])) && p('id,status') && e('8,active'); // 测试激活分支 8 r($branch->activateTest($branchID[4])) && p('id,status') && e('10,active'); // 测试激活分支 10 r($branch->activateTest($branchID[5])) && p('id,status') && e('1,active'); // 测试激活分支 1 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/branch/batchupdate.php b/test/model/branch/batchupdate.php index 9802c1f9f1..f24301e10d 100755 --- a/test/model/branch/batchupdate.php +++ b/test/model/branch/batchupdate.php @@ -10,6 +10,10 @@ title=测试 branchModel->batchUpdate(); cid=1 pid=1 +测试批量更新名称 >> name,分支9,修改分支9的名称 +测试批量更新描述 >> desc,,修改分支9的描述 +测试批量更新状态 >> status,active,closed + */ $changeName = array('name' => array('9' => '修改分支9的名称', '10' => '修改后的分支10名称')); @@ -21,4 +25,4 @@ $branch = new branchTest(); r($branch->batchUpdateTest($changeName)) && p('field,old,new') && e('name,分支9,修改分支9的名称'); // 测试批量更新名称 r($branch->batchUpdateTest($changeDesc)) && p('field,old,new') && e('desc,,修改分支9的描述'); // 测试批量更新描述 r($branch->batchUpdateTest($changeStatus)) && p('field,old,new') && e('status,active,closed'); // 测试批量更新状态 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/branch/changebranchlanguage.php b/test/model/branch/changebranchlanguage.php index 046326d015..93e60f31ae 100755 --- a/test/model/branch/changebranchlanguage.php +++ b/test/model/branch/changebranchlanguage.php @@ -10,6 +10,11 @@ title=测试 branchModel->changeBranchLanguage(); cid=1 pid=1 +测试修改productID 1 的分支语言项 >> 新建%s +测试修改productID 41 的分支语言项 >> 新建分支 +测试修改productID 81 的分支语言项 >> 新建平台 +测试修改productID 42 的分支语言项 >> 新建分支 + */ $productID = array(1, 41, 81, 42); @@ -18,4 +23,4 @@ $branch = new branchTest(); r($branch->changeBranchLanguageTest($productID[0])) && p() && e('新建%s'); // 测试修改productID 1 的分支语言项 r($branch->changeBranchLanguageTest($productID[1])) && p() && e('新建分支'); // 测试修改productID 41 的分支语言项 r($branch->changeBranchLanguageTest($productID[2])) && p() && e('新建平台'); // 测试修改productID 81 的分支语言项 -r($branch->changeBranchLanguageTest($productID[3])) && p() && e('新建分支'); // 测试修改productID 42 的分支语言项 +r($branch->changeBranchLanguageTest($productID[3])) && p() && e('新建分支'); // 测试修改productID 42 的分支语言项 \ No newline at end of file diff --git a/test/model/branch/checkbranchdata.php b/test/model/branch/checkbranchdata.php index 8cfffcc98b..ed83ef7735 100755 --- a/test/model/branch/checkbranchdata.php +++ b/test/model/branch/checkbranchdata.php @@ -10,6 +10,14 @@ title=测试 branchModel->checkBranchData(); cid=1 pid=1 +测试验证branchID 1 的数据 >> 2 +测试验证branchID 2 的数据 >> 2 +测试验证branchID 3 的数据 >> 2 +测试验证branchID 4 的数据 >> 2 +测试验证branchID 5 的数据 >> 2 +测试验证branchID 6 的数据 >> 2 +测试验证branchID 1000001 的数据 >> 1 + */ $branchID = array(1, 2, 3, 4, 5, 6, 1000001); @@ -21,4 +29,4 @@ r($branch->checkBranchDataTest($branchID[2])) && p() && e('2'); // 测试验证b r($branch->checkBranchDataTest($branchID[3])) && p() && e('2'); // 测试验证branchID 4 的数据 r($branch->checkBranchDataTest($branchID[4])) && p() && e('2'); // 测试验证branchID 5 的数据 r($branch->checkBranchDataTest($branchID[5])) && p() && e('2'); // 测试验证branchID 6 的数据 -r($branch->checkBranchDataTest($branchID[6])) && p() && e('1'); // 测试验证branchID 1000001 的数据 +r($branch->checkBranchDataTest($branchID[6])) && p() && e('1'); // 测试验证branchID 1000001 的数据 \ No newline at end of file diff --git a/test/model/branch/close.php b/test/model/branch/close.php index 5042d0d9ca..cf8da369d5 100755 --- a/test/model/branch/close.php +++ b/test/model/branch/close.php @@ -10,6 +10,14 @@ title=测试 branchModel->close(); cid=1 pid=1 +测试关闭branchID 1 >> 1,closed +测试关闭branchID 2 >> 2,closed +测试关闭branchID 3 >> 3,closed +测试关闭branchID 4 >> 4,closed +测试关闭branchID 5 >> 5,closed +测试关闭branchID 6 >> 6,closed +测试重复关闭branchID 1 >> 1,closed + */ $branchID = array(1, 2, 3, 4, 5, 6); @@ -22,4 +30,4 @@ r($branch->closeTest($branchID[3])) && p('id,status') && e('4,closed'); // 测 r($branch->closeTest($branchID[4])) && p('id,status') && e('5,closed'); // 测试关闭branchID 5 r($branch->closeTest($branchID[5])) && p('id,status') && e('6,closed'); // 测试关闭branchID 6 r($branch->closeTest($branchID[0])) && p('id,status') && e('1,closed'); // 测试重复关闭branchID 1 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/branch/create.php b/test/model/branch/create.php index eeaabdfdba..a36859b70d 100755 --- a/test/model/branch/create.php +++ b/test/model/branch/create.php @@ -10,6 +10,12 @@ title=测试 branchModel->create(); cid=1 pid=1 +测试新建分支1 >> 新建分支1,新建分支1的描述 +测试新建分支2 >> 新建分支2,新建分支2的描述 +测试新建 重名新建分支1 >> 分支名称已存在 +测试新建 重名分支1 >> 分支名称已存在 +测试新建 名称为空的分支 >> 『名称』不能为空。 + */ $productID = 41; @@ -27,4 +33,4 @@ r($branch->createTest($productID, $branch2)) && p('name,desc') && e('新建 r($branch->createTest($productID, $repeatName1)) && p() && e('分支名称已存在'); // 测试新建 重名新建分支1 r($branch->createTest($productID, $repeatName2)) && p() && e('分支名称已存在'); // 测试新建 重名分支1 r($branch->createTest($productID, $emptyName)) && p() && e('『名称』不能为空。'); // 测试新建 名称为空的分支 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/branch/getallpairs.php b/test/model/branch/getallpairs.php index 143388707e..4a428aad70 100755 --- a/test/model/branch/getallpairs.php +++ b/test/model/branch/getallpairs.php @@ -10,10 +10,13 @@ title=测试 branchModel->getAllPairs(); cid=1 pid=1 +测试获取全部分支名 >> 167 +测试获取全部分支名 >> 166 + */ $params = 'noempty'; $branch = new branchTest(); r($branch->getAllPairsTest()) && p() && e('167'); // 测试获取全部分支名 -r($branch->getAllPairsTest($params)) && p() && e('166'); // 测试获取全部分支名 +r($branch->getAllPairsTest($params)) && p() && e('166'); // 测试获取全部分支名 \ No newline at end of file diff --git a/test/model/branch/getbyid.php b/test/model/branch/getbyid.php index 2bec1caf47..e45103d112 100755 --- a/test/model/branch/getbyid.php +++ b/test/model/branch/getbyid.php @@ -10,6 +10,23 @@ title=测试 branchModel->getById(); cid=1 pid=1 +测试获取 branchID 1 的分支信息 >> 分支1 +测试获取 branchID 1 productID 41 的分支信息 >> 分支1 +测试获取 branchID 1 productID 41 field 空 的分支信息 >> 分支1 +测试获取 branchID 2 的分支信息 >> 分支2 +测试获取 branchID 2 productID 41 的分支信息 >> 分支2 +测试获取 branchID 2 productID 41 field 空 的分支信息 >> 分支2 +测试获取 branchID 3 的分支信息 >> 分支3 +测试获取 branchID 3 productID 41 的分支信息 >> 分支3 +测试获取 branchID 3 productID 41 field 空 的分支信息 >> 分支3 +测试获取 branchID 空 的分支信息 >> 0 +测试获取 branchID 空 productID 41 的分支信息 >> 主干 +测试获取 branchID 空 productID 81 的分支信息 >> 主干 +测试获取 branchID 空 productID 1 的分支信息 >> 主干 +测试获取 branchID 空 productID 41 field 空 的分支信息 >> 主干 +测试获取 branchID 空 productID 81 field 空 的分支信息 >> 主干 +测试获取 branchID 空 productID 1 field 空 的分支信息 >> 主干 + */ $branchID = array(1, 2, 3, ''); $productID = array(41, 81, 1); @@ -32,4 +49,4 @@ r($branch->getByIdTest($branchID[3], $productID[1])) && p() && e(' r($branch->getByIdTest($branchID[3], $productID[2])) && p() && e('主干'); // 测试获取 branchID 空 productID 1 的分支信息 r($branch->getByIdTest($branchID[3], $productID[0], $field)) && p('name') && e('主干'); // 测试获取 branchID 空 productID 41 field 空 的分支信息 r($branch->getByIdTest($branchID[3], $productID[1], $field)) && p('name') && e('主干'); // 测试获取 branchID 空 productID 81 field 空 的分支信息 -r($branch->getByIdTest($branchID[3], $productID[2], $field)) && p('name') && e('主干'); // 测试获取 branchID 空 productID 1 field 空 的分支信息 +r($branch->getByIdTest($branchID[3], $productID[2], $field)) && p('name') && e('主干'); // 测试获取 branchID 空 productID 1 field 空 的分支信息 \ No newline at end of file diff --git a/test/model/branch/getbyproducts.php b/test/model/branch/getbyproducts.php index efde1efa14..9a562396b3 100755 --- a/test/model/branch/getbyproducts.php +++ b/test/model/branch/getbyproducts.php @@ -10,6 +10,22 @@ title=测试 branchModel->getByProducts(); cid=1 pid=1 +测试获取产品 41 42 的分支信息 >> 1:,0;41:,0,1,2;42:,0,3,4; +测试获取产品 41 42 的分支信息 >> 1:,0;41:,0,1,2;42:,0,3,4; +测试获取产品 41 42 的分支信息 >> 1:,0;41:,0,1;42:,0,3; +测试获取产品 41 42 的分支信息 >> 41:,0,1,2;42:,0,3,4; +测试获取产品 41 42 的分支信息 >> 1:,0;41:,1,2;42:,3,4; +测试获取产品 41 42 的分支信息 >> 41:,0,1;42:,0,3; +测试获取产品 41 42 的分支信息 >> 41:,1,2;42:,3,4; +测试获取产品 41 42 追加branch20 21 的分支信息 >> 1:,0;41:,0,1,2;42:,0,3,4; +测试获取产品 41 42 noclosed 追加branch20 21 的分支信息 >> 1:,0;41:,0,1;42:,0,3; +测试获取产品 41 42 ignoreNormal 追加branch20 21 的分支信息 >> 41:,0,1,2;42:,0,3,4; +测试获取产品 41 42 noempty 追加branch20 21 的分支信息 >> 1:,0;41:,1,2;42:,3,4; +测试获取产品 41 42 noclosed,ignoreNormal 追加branch20 21 的分支信息 >> 41:,0,1;42:,0,3; +测试获取产品 41 42 ignoreNormal,noempty 追加branch20 21 的分支信息 >> 41:,1,2;42:,3,4; +测试获取产品 81 82 的分支信息 >> 2:,0;81:,0,81,82;82:,0,83,84; +测试获取产品 43 83 的分支信息 >> 43:,0,5,6;83:,0,85,86; + */ $products = array('1,41,42', '2,81,82', '43,83'); @@ -32,4 +48,4 @@ r($branch->getByProductsTest($products[0], $params[3], $appendBranch)) && p() && r($branch->getByProductsTest($products[0], $params[4], $appendBranch)) && p() && e('41:,0,1;42:,0,3;'); // 测试获取产品 41 42 noclosed,ignoreNormal 追加branch20 21 的分支信息 r($branch->getByProductsTest($products[0], $params[5], $appendBranch)) && p() && e('41:,1,2;42:,3,4;'); // 测试获取产品 41 42 ignoreNormal,noempty 追加branch20 21 的分支信息 r($branch->getByProductsTest($products[1])) && p() && e('2:,0;81:,0,81,82;82:,0,83,84;'); // 测试获取产品 81 82 的分支信息 -r($branch->getByProductsTest($products[2])) && p() && e('43:,0,5,6;83:,0,85,86;'); // 测试获取产品 43 83 的分支信息 +r($branch->getByProductsTest($products[2])) && p() && e('43:,0,5,6;83:,0,85,86;'); // 测试获取产品 43 83 的分支信息 \ No newline at end of file diff --git a/test/model/branch/getlist.php b/test/model/branch/getlist.php index c962a92b06..db2abe7e15 100755 --- a/test/model/branch/getlist.php +++ b/test/model/branch/getlist.php @@ -10,6 +10,28 @@ title=测试 branchModel->getList(); cid=1 pid=1 +测试获取产品 41的分支信息 >> ,0,1 +测试获取产品 41 执行 141的分支信息 >> ,0 +测试获取产品 41 执行 141 all 没有主干 的分支信息 >> ,0 +测试获取产品 41 all 没有主干 的分支信息 >> ,0,1,2 +测试获取产品 41 执行 141 closed 没有主干 的分支信息 >> ,2 +测试获取产品 41 执行 141 active 没有主干 的分支信息 >> ,0,1 +测试获取产品 41 执行 141 all 没有主干 的分支信息 >> ,1,2 +测试获取产品 42的分支信息 >> ,0,3 +测试获取产品 42 执行 142的分支信息 >> ,0 +测试获取产品 42 执行 142 all 没有主干 的分支信息 >> ,0 +测试获取产品 42 all 没有主干 的分支信息 >> ,0,3,4 +测试获取产品 42 执行 142 closed 没有主干 的分支信息 >> ,4 +测试获取产品 42 执行 142 active 没有主干 的分支信息 >> ,0,3 +测试获取产品 42 执行 142 all 没有主干 的分支信息 >> ,3,4 +测试获取产品 43的分支信息 >> ,0,5 +测试获取产品 43 执行 143的分支信息 >> ,0 +测试获取产品 43 执行 143 all 没有主干 的分支信息 >> ,0 +测试获取产品 43 all 没有主干 的分支信息 >> ,0,5,6 +测试获取产品 43 执行 143 closed 没有主干 的分支信息 >> ,6 +测试获取产品 43 执行 143 active 没有主干 的分支信息 >> ,0,5 +测试获取产品 43 执行 143 all 没有主干 的分支信息 >> ,5,6 + */ $productID = array(41, 42, 43); $executionID = array(141, 142, 143, null); @@ -38,4 +60,4 @@ r($branch->getListTest($productID[2], $executionID[2], $browseType[0])) r($branch->getListTest($productID[2], $executionID[3], $browseType[0])) && p() && e(',0,5,6'); // 测试获取产品 43 all 没有主干 的分支信息 r($branch->getListTest($productID[2], $executionID[3], $browseType[1])) && p() && e(',6'); // 测试获取产品 43 执行 143 closed 没有主干 的分支信息 r($branch->getListTest($productID[2], $executionID[3], $browseType[2])) && p() && e(',0,5'); // 测试获取产品 43 执行 143 active 没有主干 的分支信息 -r($branch->getListTest($productID[2], $executionID[3], $browseType[0], $mainBranch)) && p() && e(',5,6'); // 测试获取产品 43 执行 143 all 没有主干 的分支信息 +r($branch->getListTest($productID[2], $executionID[3], $browseType[0], $mainBranch)) && p() && e(',5,6'); // 测试获取产品 43 执行 143 all 没有主干 的分支信息 \ No newline at end of file diff --git a/test/model/branch/getpairs.php b/test/model/branch/getpairs.php index 6e5785fca6..f260375ac0 100755 --- a/test/model/branch/getpairs.php +++ b/test/model/branch/getpairs.php @@ -10,6 +10,28 @@ title=测试 branchModel->getPairs(); cid=1 pid=1 +测试获取 产品41 的分支信息对 >> ,0,1,2 +测试获取 产品41 active 的分支信息对 >> ,0,1 +测试获取 产品41 noempty 的分支信息对 >> ,1,2 +测试获取 产品41 all 的分支信息对 >> ,all,0,1,2 +测试获取 产品41 withClosed 的分支信息对 >> ,0,1,2 +测试获取 产品41 active 执行141 的分支信息对 >> ,0 +测试获取 产品41 active 执行141 合并分支1 4 的分支信息对 >> ,0 +测试获取 产品41 的分支信息对 >> ,0,3,4 +测试获取 产品41 active 的分支信息对 >> ,0,3 +测试获取 产品41 noempty 的分支信息对 >> ,3,4 +测试获取 产品41 all 的分支信息对 >> ,all,0,3,4 +测试获取 产品41 withClosed 的分支信息对 >> ,0,3,4 +测试获取 产品41 active 执行141 的分支信息对 >> 0 +测试获取 产品41 active 执行141 合并分支1 4 的分支信息对 >> 0 +测试获取 产品41 的分支信息对 >> ,0,5,6 +测试获取 产品41 active 的分支信息对 >> ,0,5 +测试获取 产品41 noempty 的分支信息对 >> ,5,6 +测试获取 产品41 all 的分支信息对 >> ,all,0,5,6 +测试获取 产品41 withClosed 的分支信息对 >> ,0,5,6 +测试获取 产品41 active 执行141 的分支信息对 >> 0 +测试获取 产品41 active 执行141 合并分支1 4 的分支信息对 >> 0 + */ $productID = array(41, 42, 43); $param = array('active', 'noempty', 'all', 'withClosed'); @@ -38,4 +60,4 @@ r($branch->getPairsTest($productID[2], $param[1])) r($branch->getPairsTest($productID[2], $param[2])) && p() && e(',all,0,5,6'); // 测试获取 产品41 all 的分支信息对 r($branch->getPairsTest($productID[2], $param[3])) && p() && e(',0,5,6'); // 测试获取 产品41 withClosed 的分支信息对 r($branch->getPairsTest($productID[2], $param[0], $executionID[0])) && p() && e('0'); // 测试获取 产品41 active 执行141 的分支信息对 -r($branch->getPairsTest($productID[2], $param[0], $executionID[0], $mergedBranches)) && p() && e('0'); // 测试获取 产品41 active 执行141 合并分支1 4 的分支信息对 +r($branch->getPairsTest($productID[2], $param[0], $executionID[0], $mergedBranches)) && p() && e('0'); // 测试获取 产品41 active 执行141 合并分支1 4 的分支信息对 \ No newline at end of file diff --git a/test/model/branch/getpairsbyprojectproduct.php b/test/model/branch/getpairsbyprojectproduct.php index 1ace2929f0..d1fa1d570f 100755 --- a/test/model/branch/getpairsbyprojectproduct.php +++ b/test/model/branch/getpairsbyprojectproduct.php @@ -10,6 +10,12 @@ title=测试 branchModel->getPairsByProjectProduct(); cid=1 pid=1 +测试获取 项目 51 产品 41 的关联分支 >> 1:分支1; +测试获取 项目 52 产品 42 的关联分支 >> 3:分支3; +测试获取 项目 53 产品 43 的关联分支 >> 5:分支5; +测试获取 项目 54 产品 44 的关联分支 >> 7:分支7; +测试获取 项目 55 产品 45 的关联分支 >> 9:分支9; + */ $projectID = array(51, 52, 53, 54, 55); $productID = array(41, 42, 43, 44, 45); @@ -20,4 +26,4 @@ r($branch->getPairsByProjectProductTest($projectID[0], $productID[0])) && p() && r($branch->getPairsByProjectProductTest($projectID[1], $productID[1])) && p() && e('3:分支3;'); // 测试获取 项目 52 产品 42 的关联分支 r($branch->getPairsByProjectProductTest($projectID[2], $productID[2])) && p() && e('5:分支5;'); // 测试获取 项目 53 产品 43 的关联分支 r($branch->getPairsByProjectProductTest($projectID[3], $productID[3])) && p() && e('7:分支7;'); // 测试获取 项目 54 产品 44 的关联分支 -r($branch->getPairsByProjectProductTest($projectID[4], $productID[4])) && p() && e('9:分支9;'); // 测试获取 项目 55 产品 45 的关联分支 +r($branch->getPairsByProjectProductTest($projectID[4], $productID[4])) && p() && e('9:分支9;'); // 测试获取 项目 55 产品 45 的关联分支 \ No newline at end of file diff --git a/test/model/branch/getproducttype.php b/test/model/branch/getproducttype.php index 8adbeb24a7..947e2e9b88 100755 --- a/test/model/branch/getproducttype.php +++ b/test/model/branch/getproducttype.php @@ -10,6 +10,13 @@ title=测试 branchModel->getProductType(); cid=1 pid=1 +测试获取分支 1 的项目类型 >> branch +测试获取分支 3 的项目类型 >> branch +测试获取分支 81 的项目类型 >> platform +测试获取分支 83 的项目类型 >> platform +测试获取分支 161 的项目类型 >> normal +测试获取分支 163 的项目类型 >> normal + */ $branchID = array(1, 3, 81, 83, 161, 163); @@ -20,4 +27,4 @@ r($branch->getProductTypeTest($branchID[1])) && p() && e('branch'); // 测试 r($branch->getProductTypeTest($branchID[2])) && p() && e('platform'); // 测试获取分支 81 的项目类型 r($branch->getProductTypeTest($branchID[3])) && p() && e('platform'); // 测试获取分支 83 的项目类型 r($branch->getProductTypeTest($branchID[4])) && p() && e('normal'); // 测试获取分支 161 的项目类型 -r($branch->getProductTypeTest($branchID[5])) && p() && e('normal'); // 测试获取分支 163 的项目类型 +r($branch->getProductTypeTest($branchID[5])) && p() && e('normal'); // 测试获取分支 163 的项目类型 \ No newline at end of file diff --git a/test/model/branch/linkbranch4project.php b/test/model/branch/linkbranch4project.php index b13c90b597..bef7c4a536 100755 --- a/test/model/branch/linkbranch4project.php +++ b/test/model/branch/linkbranch4project.php @@ -10,11 +10,16 @@ title=测试 branchModel->linkBranch4Project(); cid=1 pid=1 +测试关联产品 41 的分支到项目 >> 4 +测试关联产品 42 的分支到项目 >> 4 +测试关联产品 43 的分支到项目 >> 4 +测试关联产品 44 的分支到项目 >> 4 +测试关联产品 45 的分支到项目 >> 4 + */ $productID = array(41, 42, 43, 44, 45); - $branch = new branchTest(); r($branch->linkBranch4ProjectTest($productID[0])) && p() && e('4'); // 测试关联产品 41 的分支到项目 @@ -22,4 +27,4 @@ r($branch->linkBranch4ProjectTest($productID[1])) && p() && e('4'); // 测试关 r($branch->linkBranch4ProjectTest($productID[2])) && p() && e('4'); // 测试关联产品 43 的分支到项目 r($branch->linkBranch4ProjectTest($productID[3])) && p() && e('4'); // 测试关联产品 44 的分支到项目 r($branch->linkBranch4ProjectTest($productID[4])) && p() && e('4'); // 测试关联产品 45 的分支到项目 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/branch/mergebranch.php b/test/model/branch/mergebranch.php index 762883fb40..b51bcfa669 100755 --- a/test/model/branch/mergebranch.php +++ b/test/model/branch/mergebranch.php @@ -10,6 +10,10 @@ title=测试 branchModel->mergeBranch(); cid=1 pid=1 +测试合并分支 1 到 分支 2 >> 2 +测试合并分支 2 到 新建分支 >> 2 +测试合并分支 3 4 到 主干 >> 12 + */ $productID = array(41, 42); $mergedBranches = array('1', '2', '3,4'); @@ -36,4 +40,4 @@ $branch = new branchTest(); r($branch->mergeBranchTest($productID[0], $mergedBranches[0], $mergeBranch1)) && p() && e('2'); // 测试合并分支 1 到 分支 2 r($branch->mergeBranchTest($productID[0], $mergedBranches[1], $mergeBranch2)) && p() && e('2'); // 测试合并分支 2 到 新建分支 r($branch->mergeBranchTest($productID[1], $mergedBranches[2], $mergeBranch3)) && p() && e('12'); // 测试合并分支 3 4 到 主干 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/branch/showbranch.php b/test/model/branch/showbranch.php index 1ef79fa851..91e225824c 100755 --- a/test/model/branch/showbranch.php +++ b/test/model/branch/showbranch.php @@ -10,6 +10,19 @@ title=测试 branchModel->showBranch(); cid=1 pid=1 +测试验证产品 1 是否显示分支标签 >> 2 +测试验证产品 1 模块 1821 是否显示分支标签 >> 2 +测试验证产品 1 执行 101 是否显示分支标签 >> 2 +测试验证产品 1 模块 1821 执行 101 是否显示分支标签 >> 2 +测试验证产品 41 是否显示分支标签 >> 1 +测试验证产品 41 模块 1981 是否显示分支标签 >> 1 +测试验证产品 41 执行 231 是否显示分支标签 >> 1 +测试验证产品 41 模块 1981 执行 231 是否显示分支标签 >> 1 +测试验证产品 81 是否显示分支标签 >> 1 +测试验证产品 81 模块 2141 是否显示分支标签 >> 1 +测试验证产品 81 执行 181 是否显示分支标签 >> 1 +测试验证产品 81 模块 2141 执行 181 是否显示分支标签 >> 1 + */ $productID = array(1, 41, 81); $moduleID = array(0, 1821, 1981, 2141); @@ -28,4 +41,4 @@ r($branch->showBranchTest($productID[1], $moduleID[2], $executionID[2])) && p() r($branch->showBranchTest($productID[2])) && p() && e('1'); // 测试验证产品 81 是否显示分支标签 r($branch->showBranchTest($productID[2], $moduleID[3])) && p() && e('1'); // 测试验证产品 81 模块 2141 是否显示分支标签 r($branch->showBranchTest($productID[2], $moduleID[0], $executionID[3])) && p() && e('1'); // 测试验证产品 81 执行 181 是否显示分支标签 -r($branch->showBranchTest($productID[2], $moduleID[3], $executionID[3])) && p() && e('1'); // 测试验证产品 81 模块 2141 执行 181 是否显示分支标签 +r($branch->showBranchTest($productID[2], $moduleID[3], $executionID[3])) && p() && e('1'); // 测试验证产品 81 模块 2141 执行 181 是否显示分支标签 \ No newline at end of file diff --git a/test/model/branch/sort.php b/test/model/branch/sort.php index d38b96e080..d5af203c7c 100755 --- a/test/model/branch/sort.php +++ b/test/model/branch/sort.php @@ -10,6 +10,15 @@ title=测试 branchModel->sort(); cid=1 pid=1 +测试产品 41 排序 >> 1,2 +测试产品 42 排序 >> 3,4 +测试产品 43 排序 >> 5,6 +测试产品 44 排序 >> 7,8 +测试产品 41 order 排序 >> 2,1 +测试产品 42 order 排序 >> 4,3 +测试产品 43 order 排序 >> 6,5 +测试产品 44 order 排序 >> 8,7 + */ $branches = array('0,2,1', '0,4,3', '0,6,5', '0,8,7'); $order = 'order'; @@ -24,4 +33,4 @@ r($branch->sortTest($branches[0], $order)) && p() && e('2,1'); // 测试产品 4 r($branch->sortTest($branches[1], $order)) && p() && e('4,3'); // 测试产品 42 order 排序 r($branch->sortTest($branches[2], $order)) && p() && e('6,5'); // 测试产品 43 order 排序 r($branch->sortTest($branches[3], $order)) && p() && e('8,7'); // 测试产品 44 order 排序 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/branch/unlinkbranch4project.php b/test/model/branch/unlinkbranch4project.php index a872f9bd25..dba58b6b02 100755 --- a/test/model/branch/unlinkbranch4project.php +++ b/test/model/branch/unlinkbranch4project.php @@ -10,6 +10,11 @@ title=测试 branchModel->unlinkBranch4Project(); cid=1 pid=1 +测试产品 41 转为普通产品接触分支关联 >> 0 +测试产品 42 转为普通产品接触分支关联 >> 0 +测试产品 43 转为普通产品接触分支关联 >> 0 +测试产品 44 45 转为普通产品接触分支关联 >> 0 + */ $productIDList = array('41', '42', '43', '44,45'); @@ -19,4 +24,4 @@ r($branch->unlinkBranch4ProjectTest($productIDList[0])) && p() && e('0'); // 测 r($branch->unlinkBranch4ProjectTest($productIDList[1])) && p() && e('0'); // 测试产品 42 转为普通产品接触分支关联 r($branch->unlinkBranch4ProjectTest($productIDList[2])) && p() && e('0'); // 测试产品 43 转为普通产品接触分支关联 r($branch->unlinkBranch4ProjectTest($productIDList[3])) && p() && e('0'); // 测试产品 44 45 转为普通产品接触分支关联 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/branch/update.php b/test/model/branch/update.php index 63854ed9d0..e75ab4056b 100755 --- a/test/model/branch/update.php +++ b/test/model/branch/update.php @@ -10,6 +10,12 @@ title=测试 branchModel->update(); cid=1 pid=1 +测试修改分支名称 >> name,分支1,修改后的分支1 +测试修改分支状态 >> status,active,closed +测试修改分支描述 >> desc,,修改后的分支1描述 +测试修改分支名称 >> 『名称』不能为空。 +测试修改分支名称 >> 分支名称已存在 + */ $changeName = array('name' => '修改后的分支1'); $changeStatus = array('status' => 'closed'); @@ -24,4 +30,4 @@ r($branch->updateTest($changeStatus)) && p('0:field,old,new') && e('status,activ r($branch->updateTest($changeDesc)) && p('0:field,old,new') && e('desc,,修改后的分支1描述'); // 测试修改分支描述 r($branch->updateTest($emptyName)) && p('name:0') && e('『名称』不能为空。'); // 测试修改分支名称 r($branch->updateTest($repeatName)) && p('name:0') && e('分支名称已存在'); // 测试修改分支名称 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file From ade40aaa7581b019bc5cb09962b54ccccbbf6d41 Mon Sep 17 00:00:00 2001 From: liyuchun Date: Tue, 19 Apr 2022 09:26:41 +0800 Subject: [PATCH 37/42] * Fix bug #12931. --- module/group/view/browse.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/group/view/browse.html.php b/module/group/view/browse.html.php index 39ea964236..6fc067639f 100644 --- a/module/group/view/browse.html.php +++ b/module/group/view/browse.html.php @@ -45,8 +45,8 @@ role == 'projectAdmin';?> group->managepriv = $lang->group->managePrivByGroup;?> - id", $group, 'list', 'eye', '', "$disabled");?> - id", $group, 'list', 'lock');?> + id", $group, 'list', 'eye', '', $disabled);?> + id", $group, 'list', 'lock', '', $disabled);?> group->managemember = $lang->group->manageMember;?> id", $group, 'list', 'persons');?> From 66627be55e3929965f5d8a50c888eb0e49aa8123 Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 19 Apr 2022 09:46:55 +0800 Subject: [PATCH 38/42] * Add annotation of unit test. --- test/class/programplan.class.php | 1 + test/model/programplan/create.php | 15 +++++++-- test/model/programplan/getbyid.php | 8 ++++- test/model/programplan/getbylist.php | 8 ++++- test/model/programplan/getduration.php | 8 ++++- .../programplan/getmilestonebyproduct.php | 8 ++++- test/model/programplan/getmilestones.php | 8 ++++- test/model/programplan/getpairs.php | 8 ++++- test/model/programplan/getparentstagelist.php | 8 ++++- test/model/programplan/getplans.php | 8 ++++- test/model/programplan/getstage.php | 14 +++++++- test/model/programplan/gettotalpercent.php | 9 ++++- test/model/programplan/iscreatetask.php | 8 ++++- test/model/programplan/processplan.php | 8 ++++- test/model/programplan/processplans.php | 8 ++++- test/model/programplan/settreepath.php | 8 ++++- test/model/programplan/update.php | 10 +++++- test/model/stage/batchcreate.php | 7 +++- test/model/stage/create.php | 10 +++++- test/model/stage/getbyid.php | 9 ++++- test/model/stage/getpairs.php | 9 ++++- test/model/stage/getstages.php | 9 ++++- test/model/stage/update.php | 7 ++-- test/model/testcase/appenddata.php | 8 ++++- test/model/testcase/batchcasetypechange.php | 10 +++++- test/model/testcase/batchchangebranch.php | 10 +++++- test/model/testcase/batchchangemodule.php | 10 +++++- test/model/testcase/batchcreate.php | 10 ++++-- test/model/testcase/batchreview.php | 13 +++++++- test/model/testcase/batchupdate.php | 13 ++++++-- test/model/testcase/create.php | 11 +++++-- test/model/testcase/createfromimport.php | 6 +++- test/model/testcase/forcenotreview.php | 4 ++- test/model/testcase/getbyassignedto.php | 7 +++- test/model/testcase/getbyid.php | 8 ++++- test/model/testcase/getbylist.php | 8 ++++- test/model/testcase/getbyopenedby.php | 8 ++++- test/model/testcase/getbystatus.php | 19 ++++++++++- test/model/testcase/getbysuite.php | 8 ++++- test/model/testcase/getexecutioncases.php | 33 ++++++++++++++++++- test/model/testcase/getimportfields.php | 8 ++++- test/model/testcase/getmodulecases.php | 13 +++++++- test/model/testcase/getmoduleprojectcases.php | 13 +++++++- test/model/testcase/getstatus.php | 8 ++++- test/model/testcase/getstorycasecounts.php | 8 ++++- test/model/testcase/getstorycases.php | 9 ++++- test/model/testcase/gettestcases.php | 28 +++++++++++++++- test/model/testcase/importfromlib.php | 8 ++++- test/model/testcase/joinstep.php | 8 ++++- test/model/testcase/review.php | 8 ++++- test/model/testcase/synccase2project.php | 8 ++++- test/model/testcase/update.php | 8 ++++- test/model/testcase/updatecase2project.php | 13 +++++++- test/model/tree/buildmenuquery.php | 14 +++++++- test/model/tree/buildtreearray.php | 15 ++++++++- test/model/tree/changeroot.php | 15 ++++++++- test/model/tree/checkunique.php | 18 +++++++++- test/model/tree/createbuglink.php | 11 ++++++- test/model/tree/createcaseliblink.php | 11 ++++++- test/model/tree/createcaselink.php | 15 ++++++++- test/model/tree/createfeedbacklink.php | 11 ++++++- test/model/tree/createmanagelink.php | 15 ++++++++- test/model/tree/createrequirementlink.php | 11 ++++++- test/model/tree/createstorylink.php | 12 ++++++- test/model/tree/createtasklink.php | 19 ++++++++++- test/model/tree/createtaskmanagelink.php | 27 ++++++++++++++- test/model/tree/createtesttasklink.php | 11 ++++++- test/model/tree/delete.php | 11 ++++++- test/model/tree/fixmodulepath.php | 12 ++++++- test/model/tree/getallchildid.php | 15 ++++++++- test/model/tree/getallmodulepairs.php | 7 +++- test/model/tree/getbyid.php | 11 ++++++- test/model/tree/getdatastructure.php | 12 ++++++- test/model/tree/getdocstructure.php | 4 ++- test/model/tree/getmodulepairs.php | 12 ++++++- test/model/tree/getmodulesname.php | 7 +++- test/model/tree/getoptionmenu.php | 11 ++++++- test/model/tree/getparents.php | 13 +++++++- test/model/tree/getproduct.php | 13 +++++++- test/model/tree/getproductstructure.php | 15 ++++++++- test/model/tree/getprojectmodule.php | 9 ++++- test/model/tree/getsons.php | 21 +++++++++++- test/model/tree/getstorymodule.php | 11 ++++++- test/model/tree/gettaskoptionmenu.php | 15 ++++++++- test/model/tree/gettasksons.php | 27 ++++++++++++++- test/model/tree/gettaskstructure.php | 9 ++++- test/model/tree/gettasktreemodules.php | 19 ++++++++++- test/model/tree/gettreestructure.php | 18 +++++++++- test/model/tree/ismergemodule.php | 12 ++++++- test/model/tree/managechild.php | 9 +++-- test/model/tree/update.php | 8 ++++- test/model/tree/updateorder.php | 7 +++- 92 files changed, 937 insertions(+), 98 deletions(-) diff --git a/test/class/programplan.class.php b/test/class/programplan.class.php index 93cc06401d..71cf840caa 100644 --- a/test/class/programplan.class.php +++ b/test/class/programplan.class.php @@ -5,6 +5,7 @@ class programplanTest { global $tester; $this->objectModel = $tester->loadModel('programplan'); + $tester->dao->delete()->from(TABLE_PROJECTSPEC)->exec(); } /** diff --git a/test/model/programplan/create.php b/test/model/programplan/create.php index 470f8156d4..88dd944e42 100755 --- a/test/model/programplan/create.php +++ b/test/model/programplan/create.php @@ -10,6 +10,18 @@ title=测试 programplanModel->create(); cid=1 pid=1 +测试创建用例 工作量占比非数字 >> "工作量比例"必须为数字 +测试创建用例 计划开始为空 >> 『计划开始』日期不能为空 +测试创建用例 计划开始非日期 >> 『计划开始』应当为合法的日期 +测试创建用例 计划完成为空 >> 『计划完成』日期不能为空 +测试创建用例 计划完成非日期 >> 『计划完成』应当为合法的日期 +测试创建用例 计划完成小于计划开始 >> "计划完成时间"必须大于"计划开始时间" +测试创建用例 计划开始小于项目开始日期 >> 阶段的开始时间不能小于所属项目的开始时间 +测试创建用例 计划完成大于项目计划完成 >> 阶段的结束时间不能大于所属项目的结束时间 +测试创建用例 工作量占比之和大于100 >> 工作量占比累计不应当超过100% +测试正常更新阶段信息 获取阶段数量 >> 7 +测试正常创建一条阶段信息 获取阶段数量 >> 8 + */ $percentNumber = array('percents' => array('a', '0', '0', '0', '0', '0', '0', '', '', '', '', '')); @@ -28,7 +40,6 @@ $begin = array(); $end = array(); $create = array('names' => $names, 'percents' => $percents, 'begin' => $begin, 'end' => $end); - $programplan = new programplanTest(); r($programplan->createTest($percentNumber)) && p() && e('"工作量比例"必须为数字'); // 测试创建用例 工作量占比非数字 @@ -42,4 +53,4 @@ r($programplan->createTest($errorEnd)) && p() && e("阶段的结束时间 r($programplan->createTest($percentOver)) && p() && e('工作量占比累计不应当超过100%'); // 测试创建用例 工作量占比之和大于100 r($programplan->createTest()) && p() && e('7'); // 测试正常更新阶段信息 获取阶段数量 r($programplan->createTest($create)) && p() && e('8'); // 测试正常创建一条阶段信息 获取阶段数量 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/programplan/getbyid.php b/test/model/programplan/getbyid.php index b8980fc33f..26a0554a3c 100755 --- a/test/model/programplan/getbyid.php +++ b/test/model/programplan/getbyid.php @@ -10,6 +10,12 @@ title=测试 programplanModel->getByID(); cid=1 pid=1 +获取阶段131 >> 阶段31,project31 +获取阶段132 >> 阶段32,project32 +获取阶段133 >> 阶段33,project33 +获取阶段134 >> 阶段34,project34 +获取阶段135 >> 阶段35,project35 + */ $planIDList = array('131', '132', '133', '134', '135'); @@ -20,4 +26,4 @@ r($programplan->getByIDTest($planIDList[0])) && p('name,code') && e('阶段31,pr r($programplan->getByIDTest($planIDList[1])) && p('name,code') && e('阶段32,project32'); // 获取阶段132 r($programplan->getByIDTest($planIDList[2])) && p('name,code') && e('阶段33,project33'); // 获取阶段133 r($programplan->getByIDTest($planIDList[3])) && p('name,code') && e('阶段34,project34'); // 获取阶段134 -r($programplan->getByIDTest($planIDList[4])) && p('name,code') && e('阶段35,project35'); // 获取阶段135 +r($programplan->getByIDTest($planIDList[4])) && p('name,code') && e('阶段35,project35'); // 获取阶段135 \ No newline at end of file diff --git a/test/model/programplan/getbylist.php b/test/model/programplan/getbylist.php index e0229ffee1..1ae7f9f2f0 100755 --- a/test/model/programplan/getbylist.php +++ b/test/model/programplan/getbylist.php @@ -10,6 +10,12 @@ title=测试 programplanModel->getByList(); cid=1 pid=1 +测试获取项目11 12的信息 >> 项目1;项目2 +测试获取项目13 14的信息 >> 项目3;项目4 +测试获取项目15 16 17的信息 >> 项目5;项目6;项目7 +测试获取项目18 19 20的信息 >> 项目8;项目9;项目10 +测试获取项目21 22 23 24的信息 >> 项目11;项目12;项目13;项目14 + */ $planIDList = array(array(11, 12), array(13, 14), array(15, 16, 17), array(18, 19, 20), array(21, 22, 23, 24)); @@ -20,4 +26,4 @@ r($programplan->getByListTest($planIDList[0])) && p('11:name;12:name') r($programplan->getByListTest($planIDList[1])) && p('13:name;14:name') && e('项目3;项目4'); // 测试获取项目13 14的信息 r($programplan->getByListTest($planIDList[2])) && p('15:name;16:name;17:name') && e('项目5;项目6;项目7'); // 测试获取项目15 16 17的信息 r($programplan->getByListTest($planIDList[3])) && p('18:name;19:name;20:name') && e('项目8;项目9;项目10'); // 测试获取项目18 19 20的信息 -r($programplan->getByListTest($planIDList[4])) && p('21:name;22:name;23:name;24:name') && e('项目11;项目12;项目13;项目14'); // 测试获取项目21 22 23 24的信息 +r($programplan->getByListTest($planIDList[4])) && p('21:name;22:name;23:name;24:name') && e('项目11;项目12;项目13;项目14'); // 测试获取项目21 22 23 24的信息 \ No newline at end of file diff --git a/test/model/programplan/getduration.php b/test/model/programplan/getduration.php index cc539c6ce0..e11225213c 100755 --- a/test/model/programplan/getduration.php +++ b/test/model/programplan/getduration.php @@ -10,6 +10,12 @@ title=测试 programplanModel->getDuration(); cid=1 pid=1 +测试获取2022-04-01 ~ 2022-05-01持续时间 >> 21 +测试获取2022-04-02 ~ 2022-05-06持续时间 >> 25 +测试获取2022-04-03 ~ 2022-05-11持续时间 >> 28 +测试获取2022-04-04 ~ 2022-05-16持续时间 >> 31 +测试获取2022-04-05 ~ 2022-05-21持续时间 >> 34 + */ $beginList = array('2022-04-01', '2022-04-02', '2022-04-03', '2022-04-04', '2022-04-05'); @@ -21,4 +27,4 @@ r($programplan->getDurationTest($beginList[0], $endList[0])) && p() && e('21'); r($programplan->getDurationTest($beginList[1], $endList[1])) && p() && e('25'); // 测试获取2022-04-02 ~ 2022-05-06持续时间 r($programplan->getDurationTest($beginList[2], $endList[2])) && p() && e('28'); // 测试获取2022-04-03 ~ 2022-05-11持续时间 r($programplan->getDurationTest($beginList[3], $endList[3])) && p() && e('31'); // 测试获取2022-04-04 ~ 2022-05-16持续时间 -r($programplan->getDurationTest($beginList[4], $endList[4])) && p() && e('34'); // 测试获取2022-04-05 ~ 2022-05-21持续时间 +r($programplan->getDurationTest($beginList[4], $endList[4])) && p() && e('34'); // 测试获取2022-04-05 ~ 2022-05-21持续时间 \ No newline at end of file diff --git a/test/model/programplan/getmilestonebyproduct.php b/test/model/programplan/getmilestonebyproduct.php index 0ef6126ebc..ad0efe32d0 100755 --- a/test/model/programplan/getmilestonebyproduct.php +++ b/test/model/programplan/getmilestonebyproduct.php @@ -10,6 +10,12 @@ title=测试 programplanModel->getMilestoneByProduct(); cid=1 pid=1 +测试获取产品21 项目41的里程碑 >> 阶段121,阶段301,阶段481,阶段31,阶段211,阶段391,阶段571 +测试获取产品32 项目52的里程碑 >> 0 +测试获取产品23 项目43的里程碑 >> 阶段123,阶段303,阶段483,阶段33,阶段213,阶段393,阶段573 +测试获取产品34 项目54的里程碑 >> 0 +测试获取产品25 项目45的里程碑 >> 阶段125,阶段305,阶段485,阶段35,阶段215,阶段395,阶段575 + */ $projectIDList = array(41, 52, 43, 54, 45); $productIDList = array(21, 32, 23, 34, 25); @@ -20,4 +26,4 @@ r($programplan->getMilestoneByProductTest($productIDList[0], $projectIDList[0])) r($programplan->getMilestoneByProductTest($productIDList[1], $projectIDList[1])) && p() && e('0'); // 测试获取产品32 项目52的里程碑 r($programplan->getMilestoneByProductTest($productIDList[2], $projectIDList[2])) && p() && e('阶段123,阶段303,阶段483,阶段33,阶段213,阶段393,阶段573'); // 测试获取产品23 项目43的里程碑 r($programplan->getMilestoneByProductTest($productIDList[3], $projectIDList[3])) && p() && e('0'); // 测试获取产品34 项目54的里程碑 -r($programplan->getMilestoneByProductTest($productIDList[4], $projectIDList[4])) && p() && e('阶段125,阶段305,阶段485,阶段35,阶段215,阶段395,阶段575'); // 测试获取产品25 项目45的里程碑 +r($programplan->getMilestoneByProductTest($productIDList[4], $projectIDList[4])) && p() && e('阶段125,阶段305,阶段485,阶段35,阶段215,阶段395,阶段575'); // 测试获取产品25 项目45的里程碑 \ No newline at end of file diff --git a/test/model/programplan/getmilestones.php b/test/model/programplan/getmilestones.php index f070c3b6cc..1be9d42412 100755 --- a/test/model/programplan/getmilestones.php +++ b/test/model/programplan/getmilestones.php @@ -10,6 +10,12 @@ title=测试 programplanModel->getMilestones(); cid=1 pid=1 +测试获取项目41的里程碑 >> 阶段571,阶段481,阶段391,阶段301,阶段211 +测试获取项目52的里程碑 >> 0 +测试获取项目43的里程碑 >> 阶段573,阶段483,阶段393,阶段303,阶段213,阶段123,阶段33 +测试获取项目54的里程碑 >> 0 +测试获取项目45的里程碑 >> 阶段575,阶段485,阶段395,阶段305,阶段215,阶段125,阶段35 + */ $projectIDList = array(41, 52, 43, 54, 45); @@ -19,4 +25,4 @@ r($programplan->getMilestonesTest($projectIDList[0])) && p() && e('阶段571,阶 r($programplan->getMilestonesTest($projectIDList[1])) && p() && e('0'); // 测试获取项目52的里程碑 r($programplan->getMilestonesTest($projectIDList[2])) && p() && e('阶段573,阶段483,阶段393,阶段303,阶段213,阶段123,阶段33'); // 测试获取项目43的里程碑 r($programplan->getMilestonesTest($projectIDList[3])) && p() && e('0'); // 测试获取项目54的里程碑 -r($programplan->getMilestonesTest($projectIDList[4])) && p() && e('阶段575,阶段485,阶段395,阶段305,阶段215,阶段125,阶段35'); // 测试获取项目45的里程碑 +r($programplan->getMilestonesTest($projectIDList[4])) && p() && e('阶段575,阶段485,阶段395,阶段305,阶段215,阶段125,阶段35'); // 测试获取项目45的里程碑 \ No newline at end of file diff --git a/test/model/programplan/getpairs.php b/test/model/programplan/getpairs.php index 3feaa421db..1b80be8531 100755 --- a/test/model/programplan/getpairs.php +++ b/test/model/programplan/getpairs.php @@ -10,6 +10,12 @@ title=测试 programplanModel->getPairs(); cid=1 pid=1 +测试获取执行41 产品21的计划键值对 >> ,阶段31,阶段31/子阶段1,阶段121,阶段211,阶段301,阶段391,阶段481,阶段571 +测试获取执行42 产品22的计划键值对 >> ,阶段32,阶段32/子阶段2,阶段122,阶段212,阶段302,阶段392,阶段482,阶段572 +测试获取执行43 产品23的计划键值对 >> ,阶段33,阶段33/子阶段3,阶段123,阶段213,阶段303,阶段393,阶段483,阶段573 +测试获取执行44 产品24的计划键值对 >> ,阶段34,阶段34/子阶段4,阶段124,阶段214,阶段304,阶段394,阶段484,阶段574 +测试获取执行45 产品25的计划键值对 >> ,阶段35,阶段35/子阶段5,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575 + */ $executionIDList = array(41, 42, 43, 44, 45); $productIDList = array(21, 22, 23, 24, 25); @@ -20,4 +26,4 @@ r($programplan->getPairsTest($executionIDList[0], $productIDList[0])) && p() && r($programplan->getPairsTest($executionIDList[1], $productIDList[1])) && p() && e(',阶段32,阶段32/子阶段2,阶段122,阶段212,阶段302,阶段392,阶段482,阶段572'); // 测试获取执行42 产品22的计划键值对 r($programplan->getPairsTest($executionIDList[2], $productIDList[2])) && p() && e(',阶段33,阶段33/子阶段3,阶段123,阶段213,阶段303,阶段393,阶段483,阶段573'); // 测试获取执行43 产品23的计划键值对 r($programplan->getPairsTest($executionIDList[3], $productIDList[3])) && p() && e(',阶段34,阶段34/子阶段4,阶段124,阶段214,阶段304,阶段394,阶段484,阶段574'); // 测试获取执行44 产品24的计划键值对 -r($programplan->getPairsTest($executionIDList[4], $productIDList[4])) && p() && e(',阶段35,阶段35/子阶段5,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575'); // 测试获取执行45 产品25的计划键值对 +r($programplan->getPairsTest($executionIDList[4], $productIDList[4])) && p() && e(',阶段35,阶段35/子阶段5,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575'); // 测试获取执行45 产品25的计划键值对 \ No newline at end of file diff --git a/test/model/programplan/getparentstagelist.php b/test/model/programplan/getparentstagelist.php index 6e20a1426b..06bee7f0b2 100755 --- a/test/model/programplan/getparentstagelist.php +++ b/test/model/programplan/getparentstagelist.php @@ -10,6 +10,12 @@ title=测试 programplanModel->getParentStageList(); cid=1 pid=1 +测试查询项目41 计划701 产品21的父阶段信息 >> 无,阶段31 +测试查询项目42 计划702 产品22的父阶段信息 >> 无,阶段32 +测试查询项目43 计划703 产品23的父阶段信息 >> 无,阶段33 +测试查询项目44 计划704 产品24的父阶段信息 >> 无,阶段34 +测试查询项目45 计划705 产品25的父阶段信息 >> 无,阶段35 + */ $projectIDList = array(41, 42, 43, 44, 45); $planIDList = array(701, 702, 703, 704, 705); @@ -21,4 +27,4 @@ r($programplan->getParentStageListTest($projectIDList[0], $planIDList[0], $produ r($programplan->getParentStageListTest($projectIDList[1], $planIDList[1], $productIDList[1])) && p() && e('无,阶段32'); // 测试查询项目42 计划702 产品22的父阶段信息 r($programplan->getParentStageListTest($projectIDList[2], $planIDList[2], $productIDList[2])) && p() && e('无,阶段33'); // 测试查询项目43 计划703 产品23的父阶段信息 r($programplan->getParentStageListTest($projectIDList[3], $planIDList[3], $productIDList[3])) && p() && e('无,阶段34'); // 测试查询项目44 计划704 产品24的父阶段信息 -r($programplan->getParentStageListTest($projectIDList[4], $planIDList[4], $productIDList[4])) && p() && e('无,阶段35'); // 测试查询项目45 计划705 产品25的父阶段信息 +r($programplan->getParentStageListTest($projectIDList[4], $planIDList[4], $productIDList[4])) && p() && e('无,阶段35'); // 测试查询项目45 计划705 产品25的父阶段信息 \ No newline at end of file diff --git a/test/model/programplan/getplans.php b/test/model/programplan/getplans.php index 5c2a6626e5..4255e304c7 100755 --- a/test/model/programplan/getplans.php +++ b/test/model/programplan/getplans.php @@ -10,6 +10,12 @@ title=测试 programplanModel->getPlans(); cid=1 pid=1 +测试获取执行41 产品21的计划键值对 >> ,阶段31,阶段121,阶段211,阶段301,阶段391,阶段481,阶段571 +测试获取执行42 产品22的计划键值对 >> ,阶段32,阶段122,阶段212,阶段302,阶段392,阶段482,阶段572 +测试获取执行43 产品23的计划键值对 >> ,阶段33,阶段123,阶段213,阶段303,阶段393,阶段483,阶段573 +测试获取执行44 产品24的计划键值对 >> ,阶段34,阶段124,阶段214,阶段304,阶段394,阶段484,阶段574 +测试获取执行45 产品25的计划键值对 >> ,阶段35,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575 + */ $executionIDList = array(41, 42, 43, 44, 45); $productIDList = array(21, 22, 23, 24, 25); @@ -20,4 +26,4 @@ r($programplan->getPlansTest($executionIDList[0], $productIDList[0])) && p() && r($programplan->getPlansTest($executionIDList[1], $productIDList[1])) && p() && e(',阶段32,阶段122,阶段212,阶段302,阶段392,阶段482,阶段572'); // 测试获取执行42 产品22的计划键值对 r($programplan->getPlansTest($executionIDList[2], $productIDList[2])) && p() && e(',阶段33,阶段123,阶段213,阶段303,阶段393,阶段483,阶段573'); // 测试获取执行43 产品23的计划键值对 r($programplan->getPlansTest($executionIDList[3], $productIDList[3])) && p() && e(',阶段34,阶段124,阶段214,阶段304,阶段394,阶段484,阶段574'); // 测试获取执行44 产品24的计划键值对 -r($programplan->getPlansTest($executionIDList[4], $productIDList[4])) && p() && e(',阶段35,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575'); // 测试获取执行45 产品25的计划键值对 +r($programplan->getPlansTest($executionIDList[4], $productIDList[4])) && p() && e(',阶段35,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575'); // 测试获取执行45 产品25的计划键值对 \ No newline at end of file diff --git a/test/model/programplan/getstage.php b/test/model/programplan/getstage.php index 2e2f761e16..c90f5fc2bb 100755 --- a/test/model/programplan/getstage.php +++ b/test/model/programplan/getstage.php @@ -10,6 +10,18 @@ title=测试 programplanModel->getStage(); cid=1 pid=1 +测试获取执行41 产品21 browse all的计划键值对 >> ,阶段31,阶段121,阶段211,阶段301,阶段391,阶段481,阶段571,子阶段1 +测试获取执行41 产品21 browse parent的计划键值对 >> ,阶段31,阶段121,阶段211,阶段301,阶段391,阶段481,阶段571 +测试获取执行41 产品21 browse all id desc的计划键值对 >> ,子阶段1,阶段571,阶段481,阶段391,阶段301,阶段211,阶段121,阶段31 +测试获取执行42 产品22 browse all的计划键值对 >> ,阶段32,阶段122,阶段212,阶段302,阶段392,阶段482,阶段572,子阶段2 +测试获取执行42 产品22 browse parent的计划键值对 >> ,阶段32,阶段122,阶段212,阶段302,阶段392,阶段482,阶段572 +测试获取执行43 产品23 browse all的计划键值对 >> ,阶段33,阶段123,阶段213,阶段303,阶段393,阶段483,阶段573,子阶段3 +测试获取执行43 产品23 browse parent的计划键值对 >> ,阶段33,阶段123,阶段213,阶段303,阶段393,阶段483,阶段573 +测试获取执行44 产品24 browse all的计划键值对 >> ,阶段34,阶段124,阶段214,阶段304,阶段394,阶段484,阶段574,子阶段4 +测试获取执行44 产品24 browse parent的计划键值对 >> ,阶段34,阶段124,阶段214,阶段304,阶段394,阶段484,阶段574 +测试获取执行45 产品25 browse all的计划键值对 >> ,阶段35,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575,子阶段5 +测试获取执行45 产品25 browse parent的计划键值对 >> ,阶段35,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575 + */ $executionIDList = array(41, 42, 43, 44, 45); $productIDList = array(21, 22, 23, 24, 25); @@ -28,4 +40,4 @@ r($programplan->getStageTest($executionIDList[2], $productIDList[2], $browseType r($programplan->getStageTest($executionIDList[3], $productIDList[3], $browseTypeList[0])) && p() && e(',阶段34,阶段124,阶段214,阶段304,阶段394,阶段484,阶段574,子阶段4'); // 测试获取执行44 产品24 browse all的计划键值对 r($programplan->getStageTest($executionIDList[3], $productIDList[3], $browseTypeList[1])) && p() && e(',阶段34,阶段124,阶段214,阶段304,阶段394,阶段484,阶段574'); // 测试获取执行44 产品24 browse parent的计划键值对 r($programplan->getStageTest($executionIDList[4], $productIDList[4], $browseTypeList[0])) && p() && e(',阶段35,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575,子阶段5'); // 测试获取执行45 产品25 browse all的计划键值对 -r($programplan->getStageTest($executionIDList[4], $productIDList[4], $browseTypeList[1])) && p() && e(',阶段35,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575'); // 测试获取执行45 产品25 browse parent的计划键值对 +r($programplan->getStageTest($executionIDList[4], $productIDList[4], $browseTypeList[1])) && p() && e(',阶段35,阶段125,阶段215,阶段305,阶段395,阶段485,阶段575'); // 测试获取执行45 产品25 browse parent的计划键值对 \ No newline at end of file diff --git a/test/model/programplan/gettotalpercent.php b/test/model/programplan/gettotalpercent.php index 0b5f8d1ca7..e579182a46 100755 --- a/test/model/programplan/gettotalpercent.php +++ b/test/model/programplan/gettotalpercent.php @@ -10,6 +10,13 @@ title=测试 programplanModel->getTotalPercent(); cid=1 pid=1 +测试获取阶段131的总进度 >> 60 +测试获取阶段131是父阶段的总进度 >> 0 +测试获取阶段132的总进度 >> 60 +测试获取阶段133的总进度 >> 60 +测试获取阶段134的总进度 >> 60 +测试获取阶段135的总进度 >> 60 + */ $stageIDList = array(131, 132, 133, 134, 135); @@ -21,4 +28,4 @@ r($programplan->getTotalPercentTest($stageIDList[0], true)) && p() && e('0'); / r($programplan->getTotalPercentTest($stageIDList[1])) && p() && e('60'); // 测试获取阶段132的总进度 r($programplan->getTotalPercentTest($stageIDList[2])) && p() && e('60'); // 测试获取阶段133的总进度 r($programplan->getTotalPercentTest($stageIDList[3])) && p() && e('60'); // 测试获取阶段134的总进度 -r($programplan->getTotalPercentTest($stageIDList[4])) && p() && e('60'); // 测试获取阶段135的总进度 +r($programplan->getTotalPercentTest($stageIDList[4])) && p() && e('60'); // 测试获取阶段135的总进度 \ No newline at end of file diff --git a/test/model/programplan/iscreatetask.php b/test/model/programplan/iscreatetask.php index ff13b8cf8a..cf26dc1086 100755 --- a/test/model/programplan/iscreatetask.php +++ b/test/model/programplan/iscreatetask.php @@ -10,6 +10,12 @@ title=测试 programplanModel->isCreateTask(); cid=1 pid=1 +测试阶段131下有没有任务 >> 1 +测试阶段132下有没有任务 >> 1 +测试阶段133下有没有任务 >> 1 +测试阶段134下有没有任务 >> 1 +测试阶段135下有没有任务 >> 1 + */ $stageIDList = array(131, 132, 133, 134, 135); @@ -19,4 +25,4 @@ r($programplan->isCreateTaskTest($stageIDList[0])) && p() && e('1'); // 测试 r($programplan->isCreateTaskTest($stageIDList[1])) && p() && e('1'); // 测试阶段132下有没有任务 r($programplan->isCreateTaskTest($stageIDList[2])) && p() && e('1'); // 测试阶段133下有没有任务 r($programplan->isCreateTaskTest($stageIDList[3])) && p() && e('1'); // 测试阶段134下有没有任务 -r($programplan->isCreateTaskTest($stageIDList[4])) && p() && e('1'); // 测试阶段135下有没有任务 +r($programplan->isCreateTaskTest($stageIDList[4])) && p() && e('1'); // 测试阶段135下有没有任务 \ No newline at end of file diff --git a/test/model/programplan/processplan.php b/test/model/programplan/processplan.php index 12b020bd7b..7dc6fe5348 100755 --- a/test/model/programplan/processplan.php +++ b/test/model/programplan/processplan.php @@ -10,6 +10,12 @@ title=测试 programplanModel->processPlan(); cid=1 pid=1 +测试计算计划131 >> 131,阶段31,已关闭的正常产品21 +测试计算计划132 >> 132,阶段32,已关闭的正常产品22 +测试计算计划133 >> 133,阶段33,已关闭的正常产品23 +测试计算计划134 >> 134,阶段34,已关闭的正常产品24 +测试计算计划135 >> 135,阶段35,已关闭的正常产品25 + */ $planIDList = array(131, 132, 133, 134, 135); @@ -19,4 +25,4 @@ r($programplan->processPlanTest($planIDList[0])) && p('id,name,productName') && r($programplan->processPlanTest($planIDList[1])) && p('id,name,productName') && e('132,阶段32,已关闭的正常产品22'); // 测试计算计划132 r($programplan->processPlanTest($planIDList[2])) && p('id,name,productName') && e('133,阶段33,已关闭的正常产品23'); // 测试计算计划133 r($programplan->processPlanTest($planIDList[3])) && p('id,name,productName') && e('134,阶段34,已关闭的正常产品24'); // 测试计算计划134 -r($programplan->processPlanTest($planIDList[4])) && p('id,name,productName') && e('135,阶段35,已关闭的正常产品25'); // 测试计算计划135 +r($programplan->processPlanTest($planIDList[4])) && p('id,name,productName') && e('135,阶段35,已关闭的正常产品25'); // 测试计算计划135 \ No newline at end of file diff --git a/test/model/programplan/processplans.php b/test/model/programplan/processplans.php index 1d8448c233..ea8a97c1b9 100755 --- a/test/model/programplan/processplans.php +++ b/test/model/programplan/processplans.php @@ -10,6 +10,12 @@ title=测试 programplanModel->processPlans(); cid=1 pid=1 +测试获取计划 11 12的信息 >> 项目1,正常产品1;项目2,正常产品2 +测试获取计划 13 14的信息 >> 项目3,正常产品3;项目4,正常产品4 +测试获取计划 15 16 17的信息 >> 项目5,正常产品5;项目6,正常产品6;项目7,正常产品7 +测试获取计划 18 19 20的信息 >> 项目8,正常产品8;项目9,正常产品9;项目10,正常产品10 +测试获取计划 21 22 23 24的信息 >> 项目11,正常产品1;项目12,正常产品2;项目13,正常产品3;项目14,正常产品4 + */ $planIDList = array(array(11, 12), array(13, 14), array(15, 16, 17), array(18, 19, 20), array(21, 22, 23, 24)); @@ -19,4 +25,4 @@ r($programplan->processPlansTest($planIDList[0])) && p('11:name,productName;12:n r($programplan->processPlansTest($planIDList[1])) && p('13:name,productName;14:name,productName') && e('项目3,正常产品3;项目4,正常产品4'); // 测试获取计划 13 14的信息 r($programplan->processPlansTest($planIDList[2])) && p('15:name,productName;16:name,productName;17:name,productName') && e('项目5,正常产品5;项目6,正常产品6;项目7,正常产品7'); // 测试获取计划 15 16 17的信息 r($programplan->processPlansTest($planIDList[3])) && p('18:name,productName;19:name,productName;20:name,productName') && e('项目8,正常产品8;项目9,正常产品9;项目10,正常产品10'); // 测试获取计划 18 19 20的信息 -r($programplan->processPlansTest($planIDList[4])) && p('21:name,productName;22:name,productName;23:name,productName;24:name,productName') && e('项目11,正常产品1;项目12,正常产品2;项目13,正常产品3;项目14,正常产品4'); // 测试获取计划 21 22 23 24的信息 +r($programplan->processPlansTest($planIDList[4])) && p('21:name,productName;22:name,productName;23:name,productName;24:name,productName') && e('项目11,正常产品1;项目12,正常产品2;项目13,正常产品3;项目14,正常产品4'); // 测试获取计划 21 22 23 24的信息 \ No newline at end of file diff --git a/test/model/programplan/settreepath.php b/test/model/programplan/settreepath.php index d9e4892a30..d546d4dc4a 100755 --- a/test/model/programplan/settreepath.php +++ b/test/model/programplan/settreepath.php @@ -10,6 +10,12 @@ title=测试 programplanModel->setTreePath(); cid=1 pid=1 +测试更新计划131的路径 >> 阶段31;,41,131, +测试更新计划132的路径 >> 阶段32;,42,132, +测试更新计划133的路径 >> 阶段33;,43,133, +测试更新计划134的路径 >> 阶段34;,44,134, +测试更新计划135的路径 >> 阶段35;,45,135, + */ $planIDList = array(131, 132, 133, 134, 135); @@ -19,4 +25,4 @@ r($programplan->setTreePathTest($planIDList[0])) && p('name;path') && e('阶段3 r($programplan->setTreePathTest($planIDList[1])) && p('name;path') && e('阶段32;,42,132,'); // 测试更新计划132的路径 r($programplan->setTreePathTest($planIDList[2])) && p('name;path') && e('阶段33;,43,133,'); // 测试更新计划133的路径 r($programplan->setTreePathTest($planIDList[3])) && p('name;path') && e('阶段34;,44,134,'); // 测试更新计划134的路径 -r($programplan->setTreePathTest($planIDList[4])) && p('name;path') && e('阶段35;,45,135,'); // 测试更新计划135的路径 +r($programplan->setTreePathTest($planIDList[4])) && p('name;path') && e('阶段35;,45,135,'); // 测试更新计划135的路径 \ No newline at end of file diff --git a/test/model/programplan/update.php b/test/model/programplan/update.php index 7312bd196a..4530074a62 100755 --- a/test/model/programplan/update.php +++ b/test/model/programplan/update.php @@ -10,6 +10,14 @@ title=测试 programplanModel->update(); cid=1 pid=1 +测试修改plan的 percent 值 工作占比和超过100 >> 工作量占比累计不应当超过100% +测试修改plan的 end 值 计划完成小于计划开始 >> 『end』应当不小于。 +测试修改plan的 name 值 名称为空 >> 『name』不能为空。 +测试修改plan的 name 值 >> name,修改后的阶段 +测试修改plan的 percent 值 >> percent,15 +测试修改plan的 begin 值 >> begin,2022-04-01 +测试修改plan的 end 值 >> end,2022-04-30 + */ $planID = 131; $projectID = 41; @@ -35,4 +43,4 @@ r($programplan->updateTest($planID, $projectID, $changeName)) && p(' r($programplan->updateTest($planID, $projectID, $changePercent)) && p('0:field,new') && e('percent,15'); // 测试修改plan的 percent 值 r($programplan->updateTest($planID, $projectID, $changeBegin)) && p('0:field,new') && e('begin,2022-04-01'); // 测试修改plan的 begin 值 r($programplan->updateTest($planID, $projectID, $changeEnd)) && p('0:field,new') && e('end,2022-04-30'); // 测试修改plan的 end 值 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/stage/batchcreate.php b/test/model/stage/batchcreate.php index cfe58e2b5f..b00916db31 100755 --- a/test/model/stage/batchcreate.php +++ b/test/model/stage/batchcreate.php @@ -10,6 +10,11 @@ title=测试 stageModel->batchCreate(); cid=1 pid=1 +测试批量创建阶段 1 >> 8 +测试批量创建阶段 2 >> 10 +测试批量创建阶段 3 >> 12 +测试批量创建阶段 4 >> 13 + */ $name1 = array('1' => '批量创建的需求', '2' => '批量创建的设计', '3' => '', '4' => '', '5' => '', '6' => '', '7' => '', '8' => '', '9' => '', '10' => ''); $percent1 = array('1' => '1', '2' => '2', '3' => '', '4' => '', '5' => '', '6' => '', '7' => '', '8' => '', '9' => '', '10' => ''); @@ -38,4 +43,4 @@ r($stage->batchCreateTest($param1)) && p() && e('8'); // 测试批量创建阶 r($stage->batchCreateTest($param2)) && p() && e('10'); // 测试批量创建阶段 2 r($stage->batchCreateTest($param3)) && p() && e('12'); // 测试批量创建阶段 3 r($stage->batchCreateTest($param4)) && p() && e('13'); // 测试批量创建阶段 4 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/stage/create.php b/test/model/stage/create.php index f36b638153..900bbf25bc 100755 --- a/test/model/stage/create.php +++ b/test/model/stage/create.php @@ -10,6 +10,14 @@ title=测试 stageModel->create(); cid=1 pid=1 +测试新建一个需求阶段 >> 新建的需求,1,request +测试新建一个设计阶段 >> 新建的设计,2,design +测试新建一个开发阶段 >> 新建的开发,3,dev +测试新建一个测试阶段 >> 新建的测试,4,qa +测试新建一个发布阶段 >> 新建的发布,5,release +测试新建一个总结评审阶段 >> 新建的总结评审,6,review +测试新建一个其他阶段 >> 新建的其他,7,other + */ $stage1 = new stdclass(); @@ -56,4 +64,4 @@ r($stage->createTest($stage4)) && p('name,percent,type') && e('新建的测试,4 r($stage->createTest($stage5)) && p('name,percent,type') && e('新建的发布,5,release'); // 测试新建一个发布阶段 r($stage->createTest($stage6)) && p('name,percent,type') && e('新建的总结评审,6,review'); // 测试新建一个总结评审阶段 r($stage->createTest($stage7)) && p('name,percent,type') && e('新建的其他,7,other'); // 测试新建一个其他阶段 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/stage/getbyid.php b/test/model/stage/getbyid.php index bf6743d703..51472c3c53 100755 --- a/test/model/stage/getbyid.php +++ b/test/model/stage/getbyid.php @@ -10,6 +10,13 @@ title=测试 stageModel->getByID(); cid=1 pid=1 +测试获取阶段 1 >> 需求,10,request +测试获取阶段 2 >> 设计,10,design +测试获取阶段 3 >> 开发,50,dev +测试获取阶段 4 >> 测试,15,qa +测试获取阶段 5 >> 发布,10,release +测试获取阶段 6 >> 总结评审,5,review + */ $stageIDList = array(1, 2, 3, 4, 5, 6); @@ -21,4 +28,4 @@ r($stage->getByIDTest($stageIDList[1])) && p('name,percent,type') && e('设计,1 r($stage->getByIDTest($stageIDList[2])) && p('name,percent,type') && e('开发,50,dev'); // 测试获取阶段 3 r($stage->getByIDTest($stageIDList[3])) && p('name,percent,type') && e('测试,15,qa'); // 测试获取阶段 4 r($stage->getByIDTest($stageIDList[4])) && p('name,percent,type') && e('发布,10,release'); // 测试获取阶段 5 -r($stage->getByIDTest($stageIDList[5])) && p('name,percent,type') && e('总结评审,5,review'); // 测试获取阶段 6 +r($stage->getByIDTest($stageIDList[5])) && p('name,percent,type') && e('总结评审,5,review'); // 测试获取阶段 6 \ No newline at end of file diff --git a/test/model/stage/getpairs.php b/test/model/stage/getpairs.php index b1c4e34e73..e9d599f496 100755 --- a/test/model/stage/getpairs.php +++ b/test/model/stage/getpairs.php @@ -10,6 +10,13 @@ title=测试 stageModel->getPairs(); cid=1 pid=1 +测试获取阶段 1 >> 需求 +测试获取阶段 2 >> 设计 +测试获取阶段 3 >> 开发 +测试获取阶段 4 >> 测试 +测试获取阶段 5 >> 发布 +测试获取阶段 6 >> 总结评审 + */ $stage = new stageTest(); @@ -19,4 +26,4 @@ r($stage->getPairsTest()) && p('2') && e('设计'); // 测试获取阶段 2 r($stage->getPairsTest()) && p('3') && e('开发'); // 测试获取阶段 3 r($stage->getPairsTest()) && p('4') && e('测试'); // 测试获取阶段 4 r($stage->getPairsTest()) && p('5') && e('发布'); // 测试获取阶段 5 -r($stage->getPairsTest()) && p('6') && e('总结评审'); // 测试获取阶段 6 +r($stage->getPairsTest()) && p('6') && e('总结评审'); // 测试获取阶段 6 \ No newline at end of file diff --git a/test/model/stage/getstages.php b/test/model/stage/getstages.php index d58f5146f5..a9d94c9d34 100755 --- a/test/model/stage/getstages.php +++ b/test/model/stage/getstages.php @@ -10,6 +10,13 @@ title=测试 stageModel->getStages(); cid=1 pid=1 +测试获取阶段 1 >> 需求,10,request +测试获取阶段 2 >> 设计,10,design +测试获取阶段 3 >> 开发,50,dev +测试获取阶段 4 >> 测试,15,qa +测试获取阶段 5 >> 发布,10,release +测试获取阶段 6 >> 总结评审,5,review + */ $stage = new stageTest(); @@ -19,4 +26,4 @@ r($stage->getStagesTest()) && p('2:name,percent,type') && e('设计,10,design'); r($stage->getStagesTest()) && p('3:name,percent,type') && e('开发,50,dev'); // 测试获取阶段 3 r($stage->getStagesTest()) && p('4:name,percent,type') && e('测试,15,qa'); // 测试获取阶段 4 r($stage->getStagesTest()) && p('5:name,percent,type') && e('发布,10,release'); // 测试获取阶段 5 -r($stage->getStagesTest()) && p('6:name,percent,type') && e('总结评审,5,review'); // 测试获取阶段 6 +r($stage->getStagesTest()) && p('6:name,percent,type') && e('总结评审,5,review'); // 测试获取阶段 6 \ No newline at end of file diff --git a/test/model/stage/update.php b/test/model/stage/update.php index e52ea89cb5..d09386ca34 100755 --- a/test/model/stage/update.php +++ b/test/model/stage/update.php @@ -10,6 +10,10 @@ title=测试 stageModel->update(); cid=1 pid=1 +测试修改名称 >> name,需求,修改后的需求 +测试修改工作量占比 >> percent,10,15 +测试修改阶段分类 >> type,request,other + */ $stageID = 1; @@ -23,5 +27,4 @@ $stage = new stageTest(); r($stage->updateTest($stageID, $changeName)) && p('0:field,old,new') && e('name,需求,修改后的需求'); // 测试修改名称 r($stage->updateTest($stageID, $changePercent)) && p('0:field,old,new') && e('percent,10,15'); // 测试修改工作量占比 r($stage->updateTest($stageID, $changeType)) && p('0:field,old,new') && e('type,request,other'); // 测试修改阶段分类 -system("./ztest init"); - +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/appenddata.php b/test/model/testcase/appenddata.php index a31e8fe300..3b5fd7cbd7 100755 --- a/test/model/testcase/appenddata.php +++ b/test/model/testcase/appenddata.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->appendData(); cid=1 pid=1 +获取case 1 2 可以加入的数据 >> 0,1,0,1;2,1,1,1 +获取case 1 2 可以加入的数据 >> 0,1,0,1;0,1,1,1 +获取case 1 2 可以加入的数据 >> 0,1,0,1;2,1,1,1 +获取case 1 2 可以加入的数据 >> 0,1,0,1;0,1,1,1 +获取case 1 2 可以加入的数据 >> 0,1,0,1;2,1,1,1 + */ $case1 = new stdclass(); $case1->id = 1; @@ -61,4 +67,4 @@ r($testcase->appendDataTest($cases[0])) && p('1:bugs,results,caseFails,stepNumbe r($testcase->appendDataTest($cases[1])) && p('3:bugs,results,caseFails,stepNumber;4:bugs,results,caseFails,stepNumber') && e('0,1,0,1;0,1,1,1'); // 获取case 1 2 可以加入的数据 r($testcase->appendDataTest($cases[2])) && p('5:bugs,results,caseFails,stepNumber;6:bugs,results,caseFails,stepNumber') && e('0,1,0,1;2,1,1,1'); // 获取case 1 2 可以加入的数据 r($testcase->appendDataTest($cases[3])) && p('7:bugs,results,caseFails,stepNumber;8:bugs,results,caseFails,stepNumber') && e('0,1,0,1;0,1,1,1'); // 获取case 1 2 可以加入的数据 -r($testcase->appendDataTest($cases[4])) && p('9:bugs,results,caseFails,stepNumber;10:bugs,results,caseFails,stepNumber') && e('0,1,0,1;2,1,1,1'); // 获取case 1 2 可以加入的数据 +r($testcase->appendDataTest($cases[4])) && p('9:bugs,results,caseFails,stepNumber;10:bugs,results,caseFails,stepNumber') && e('0,1,0,1;2,1,1,1'); // 获取case 1 2 可以加入的数据 \ No newline at end of file diff --git a/test/model/testcase/batchcasetypechange.php b/test/model/testcase/batchcasetypechange.php index c2eb7d6be9..600cab7e28 100755 --- a/test/model/testcase/batchcasetypechange.php +++ b/test/model/testcase/batchcasetypechange.php @@ -10,6 +10,14 @@ title=测试 testcaseModel->batchCaseTypeChange(); cid=1 pid=1 +测试批量修改case 1 2 type为 feature >> feature;feature +测试批量修改case 3 4 type为 performance >> performance;performance +测试批量修改case 5 6 type为 config >> config;config +测试批量修改case 7 8 type为 install >> install;install +测试批量修改case 9 10 type为 security >> security;security +测试批量修改case 11 12 type为 interface >> interface;interface +测试批量修改case 13 14 15 type为 other >> other;other;other + */ $caseIDList = array(array(1, 2), array(3, 4), array(5, 6), array(7, 8), array(9, 10), array(11, 12), array(13, 14, 15)); $typeList = array('feature', 'performance', 'config', 'install', 'security', 'interface', 'other'); @@ -23,4 +31,4 @@ r($testcase->batchCaseTypeChangeTest($caseIDList[3], $typeList[3])) && p('7:type r($testcase->batchCaseTypeChangeTest($caseIDList[4], $typeList[4])) && p('9:type;10:type') && e('security;security'); // 测试批量修改case 9 10 type为 security r($testcase->batchCaseTypeChangeTest($caseIDList[5], $typeList[5])) && p('11:type;12:type') && e('interface;interface'); // 测试批量修改case 11 12 type为 interface r($testcase->batchCaseTypeChangeTest($caseIDList[6], $typeList[6])) && p('13:type;14:type;15:type') && e('other;other;other'); // 测试批量修改case 13 14 15 type为 other -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/batchchangebranch.php b/test/model/testcase/batchchangebranch.php index 90fd71f9c2..84ebcb6ce1 100755 --- a/test/model/testcase/batchchangebranch.php +++ b/test/model/testcase/batchchangebranch.php @@ -10,6 +10,14 @@ title=测试 testcaseModel->batchChangeBranch(); cid=1 pid=1 +测试批量修改case 161 162 的branch为1 >> 1;1 +测试批量修改case 163 164 的branch为2 >> 2;2 +测试批量修改case 165 166 的branch为3 >> 3;3 +测试批量修改case 167 168 的branch为4 >> 4;4 +测试批量修改case 169 170 的branch为5 >> 5;5 +测试批量修改case 171 172 的branch为6 >> 6;6 +测试批量修改case 173 174 的branch为7 >> 7;7 + */ $caseIDList = array(array(161, 162), array(163, 164), array(165, 166), array(167, 168), array(169, 170), array(171, 172), array(173, 174)); @@ -24,4 +32,4 @@ r($testcase->batchChangeBranchTest($caseIDList[3], $branchList[3])) && p('167:br r($testcase->batchChangeBranchTest($caseIDList[4], $branchList[4])) && p('169:branch;170:branch') && e('5;5'); // 测试批量修改case 169 170 的branch为5 r($testcase->batchChangeBranchTest($caseIDList[5], $branchList[5])) && p('171:branch;172:branch') && e('6;6'); // 测试批量修改case 171 172 的branch为6 r($testcase->batchChangeBranchTest($caseIDList[6], $branchList[6])) && p('173:branch;174:branch') && e('7;7'); // 测试批量修改case 173 174 的branch为7 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/batchchangemodule.php b/test/model/testcase/batchchangemodule.php index fdb478cd62..d0c3ceff68 100755 --- a/test/model/testcase/batchchangemodule.php +++ b/test/model/testcase/batchchangemodule.php @@ -10,6 +10,14 @@ title=测试 testcaseModel->batchChangeModule(); cid=1 pid=1 +测试批量修改case 161 162 的module为161 >> 161;161 +测试批量修改case 163 164 的module为163 >> 163;163 +测试批量修改case 165 166 的module为165 >> 165;165 +测试批量修改case 167 168 的module为167 >> 167;167 +测试批量修改case 169 170 的module为169 >> 169;169 +测试批量修改case 171 172 的module为171 >> 171;171 +测试批量修改case 173 174 的module为173 >> 173;173 + */ $caseIDList = array(array(161, 162), array(163, 164), array(165, 166), array(167, 168), array(169, 170), array(171, 172), array(173, 174)); $moduleList = array(161, 163, 165, 167, 169, 171, 173); @@ -23,4 +31,4 @@ r($testcase->batchChangeModuleTest($caseIDList[3], $moduleList[3])) && p('167:mo r($testcase->batchChangeModuleTest($caseIDList[4], $moduleList[4])) && p('169:module;170:module') && e('169;169'); // 测试批量修改case 169 170 的module为169 r($testcase->batchChangeModuleTest($caseIDList[5], $moduleList[5])) && p('171:module;172:module') && e('171;171'); // 测试批量修改case 171 172 的module为171 r($testcase->batchChangeModuleTest($caseIDList[6], $moduleList[6])) && p('173:module;174:module') && e('173;173'); // 测试批量修改case 173 174 的module为173 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/batchcreate.php b/test/model/testcase/batchcreate.php index f6857731fa..8fec5d990a 100755 --- a/test/model/testcase/batchcreate.php +++ b/test/model/testcase/batchcreate.php @@ -10,6 +10,13 @@ title=测试 testcaseModel->batchCreate(); cid=1 pid=1 +测试批量创建用例1 >> 2 +测试批量创建用例2 >> 3 +测试批量创建用例3 >> 3 +测试批量创建用例4 >> 3 +测试批量创建用例5 >> 3 +测试重复批量创建用例1 >> 0 + */ $title1 = array('测试批量创建4', '', '测试批量创建6'); @@ -22,7 +29,6 @@ $pri = array('2', 'ditto', '1'); $stage = array(array('system', 'smoke'), array('bvt'), array('unittest')); $needReview = array(0, 1, 0); - $testcase = new testcaseTest(); r($testcase->batchCreateTest(array('title' => $title1))) && p() && e('2'); // 测试批量创建用例1 @@ -31,4 +37,4 @@ r($testcase->batchCreateTest(array('pri' => $pri, 'title' => $title3))) r($testcase->batchCreateTest(array('stage' => $stage, 'title' => $title4))) && p() && e('3'); // 测试批量创建用例4 r($testcase->batchCreateTest(array('needReview' => $needReview, 'title' => $title5))) && p() && e('3'); // 测试批量创建用例5 r($testcase->batchCreateTest(array('title' => $title1))) && p() && e('0'); // 测试重复批量创建用例1 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/batchreview.php b/test/model/testcase/batchreview.php index 5580f0c000..6972c3a9cb 100755 --- a/test/model/testcase/batchreview.php +++ b/test/model/testcase/batchreview.php @@ -10,6 +10,17 @@ title=测试 testcaseModel->batchReview(); cid=1 pid=1 +测试评审case 401 402 为clarify >> 102 +测试评审case 403 404 为clarify >> 0 +测试评审case 405 406 为clarify >> 103 +测试评审case 407 408 为clarify >> 0 +测试评审case 409 410 为clarify >> 104 +测试评审case 401 402 为pass >> 105 +测试评审case 403 404 为pass >> 0 +测试评审case 405 406 为pass >> 106 +测试评审case 407 408 为pass >> 0 +测试评审case 409 410 为pass >> 107 + */ $caseIDList = array(array(401, 402), array(403, 404), array(405, 406), array(407, 408), array(409, 410)); $resultList = array('clarify', 'pass'); @@ -26,4 +37,4 @@ r($testcase->batchReviewTest($caseIDList[1], $resultList[1])) && p() && e(' r($testcase->batchReviewTest($caseIDList[2], $resultList[1])) && p('405') && e('106'); // 测试评审case 405 406 为pass r($testcase->batchReviewTest($caseIDList[3], $resultList[1])) && p() && e('0'); // 测试评审case 407 408 为pass r($testcase->batchReviewTest($caseIDList[4], $resultList[1])) && p('409') && e('107'); // 测试评审case 409 410 为pass -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/batchupdate.php b/test/model/testcase/batchupdate.php index c41c261b53..de0dc481cd 100755 --- a/test/model/testcase/batchupdate.php +++ b/test/model/testcase/batchupdate.php @@ -10,6 +10,16 @@ title=测试 testcaseModel->batchUpdate(); cid=1 pid=1 +测试批量修改用例标题 >> title,这个是测试用例1,修改后的测试用例1 +测试批量修改用例优先级 >> pri,2,1 +测试批量修改用例状态 >> status,blocked,nomal +测试批量修改用例模块 >> module,0,1822 +测试批量修改用例颜色 >> color,#3da7f5,#2dbdb2 +测试批量修改用例类型 >> type,performance,other +测试批量修改用例前置条件 >> precondition,这是前置条件3,修改后的前置条件3 +测试批量修改用例关键词 >> keywords,这是关键词4,修改后的关键词4 +测试批量修改用例阶段 >> stage,unittest,unittest,feature + */ $changeTitle = array('1' => '修改后的测试用例1', '2' => '这个是测试用例2', '3' => '这个是测试用例3', '4' => '这个是测试用例4');; @@ -32,7 +42,6 @@ $changePrecondition = array('precondition' => $changePrecondition); $changeKeywords = array('keywords' => $changeKeywords); $changeStages = array('stages' => $changeStages); - $testcase = new testcaseTest(); r($testcase->batchUpdateTest(1, $changeTitle)) && p('field,old,new') && e('title,这个是测试用例1,修改后的测试用例1'); // 测试批量修改用例标题 @@ -44,4 +53,4 @@ r($testcase->batchUpdateTest(2, $changeTypes)) && p('field,old,new') && e r($testcase->batchUpdateTest(3, $changePrecondition)) && p('field,old,new') && e('precondition,这是前置条件3,修改后的前置条件3'); // 测试批量修改用例前置条件 r($testcase->batchUpdateTest(4, $changeKeywords)) && p('field,old,new') && e('keywords,这是关键词4,修改后的关键词4'); // 测试批量修改用例关键词 r($testcase->batchUpdateTest(1, $changeStages)) && p('field,old,new') && e('stage,unittest,unittest,feature'); // 测试批量修改用例阶段 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/create.php b/test/model/testcase/create.php index 84f17b9b86..22fbbb6f7f 100755 --- a/test/model/testcase/create.php +++ b/test/model/testcase/create.php @@ -10,6 +10,13 @@ title=测试 testcaseModel->create(); cid=1 pid=1 +测试创建用例1 >> created +测试创建用例2 >> created +测试创建用例3 >> created +测试创建重名用例1 >> exists +测试创建没有填写名字的用例 >> 『用例标题』不能为空。 +测试创建没有填写类型的用例 >> 『用例类型』不能为空。 + */ $testcase1 = array('title' => '测试创建测试用例1'); @@ -19,8 +26,6 @@ $testcase3 = array('title' => '测试创建测试用例3', 'keywords' => '测试 $no_title = array('title' => ''); $no_type = array('type' => '', 'title' => '测试创建没有填写类型的用例'); - - $testcase = new testcaseTest(); r($testcase->createTest($testcase1)) && p('status') && e('created'); // 测试创建用例1 @@ -29,4 +34,4 @@ r($testcase->createTest($testcase3)) && p('status') && e('created'); r($testcase->createTest($testcase1)) && p('status') && e('exists'); // 测试创建重名用例1 r($testcase->createTest($no_title)) && p() && e('『用例标题』不能为空。'); // 测试创建没有填写名字的用例 r($testcase->createTest($no_type)) && p() && e('『用例类型』不能为空。'); // 测试创建没有填写类型的用例 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/createfromimport.php b/test/model/testcase/createfromimport.php index 0f47224321..538f743058 100755 --- a/test/model/testcase/createfromimport.php +++ b/test/model/testcase/createfromimport.php @@ -10,6 +10,10 @@ title=测试 testcaseModel->createFromImport(); cid=1 pid=1 +测试直接导入数据 >> 这个是测试用例1,这个是测试用例2,导入测试用例1,导入测试用例2 +测试导入数据覆盖原有数据 >> 导入覆盖的用例1,导入覆盖的用例2,导入测试用例1,导入测试用例2 +测试导入数据不覆盖原有数据 >> 导入覆盖的用例1,导入覆盖的用例2,导入测试用例1,导入测试用例2,导入插入的用例1,导入插入的用例2 + */ $productID = 1; @@ -22,4 +26,4 @@ $testcase = new testcaseTest(); r($testcase->createFromImportTest($productID)) && p() && e('这个是测试用例1,这个是测试用例2,导入测试用例1,导入测试用例2'); // 测试直接导入数据 r($testcase->createFromImportTest($productID, $param1)) && p() && e('导入覆盖的用例1,导入覆盖的用例2,导入测试用例1,导入测试用例2'); // 测试导入数据覆盖原有数据 r($testcase->createFromImportTest($productID, $param2)) && p() && e('导入覆盖的用例1,导入覆盖的用例2,导入测试用例1,导入测试用例2,导入插入的用例1,导入插入的用例2'); // 测试导入数据不覆盖原有数据 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/forcenotreview.php b/test/model/testcase/forcenotreview.php index 5e5e81319f..d4dfc432ed 100755 --- a/test/model/testcase/forcenotreview.php +++ b/test/model/testcase/forcenotreview.php @@ -10,8 +10,10 @@ title=测试 testcaseModel->forceNotReview(); cid=1 pid=1 +测试检查是否强制审核 >> 1 + */ $testcase = new testcaseTest(); -r($testcase->forceNotReviewTest()) && p() && e('1'); // 测试检查是否强制审核 +r($testcase->forceNotReviewTest()) && p() && e('1'); // 测试检查是否强制审核 \ No newline at end of file diff --git a/test/model/testcase/getbyassignedto.php b/test/model/testcase/getbyassignedto.php index 476aef6e25..56ac64204f 100755 --- a/test/model/testcase/getbyassignedto.php +++ b/test/model/testcase/getbyassignedto.php @@ -10,6 +10,11 @@ title=测试 testcaseModel->getByAssignedTo(); cid=1 pid=1 +测试获取指派给 admin 的用例执行 >> 37,33,29,21,17,13,5,1 +测试获取指派给 user2 的用例执行 >> 38,34,30,22,18,14,6,2 +测试获取指派给 test3 的用例执行 >> 39,35,31,23,19,15,7,3 +测试获取指派给 dev4 的用例执行 >> 40,36,32,24,20,16,8,4 + */ $accountList = array('admin', 'user2', 'test3', 'dev4'); @@ -19,4 +24,4 @@ $testcase = new testcaseTest(); r($testcase->getByAssignedToTest($accountList[0])) && p() && e('37,33,29,21,17,13,5,1'); // 测试获取指派给 admin 的用例执行 r($testcase->getByAssignedToTest($accountList[1])) && p() && e('38,34,30,22,18,14,6,2'); // 测试获取指派给 user2 的用例执行 r($testcase->getByAssignedToTest($accountList[2])) && p() && e('39,35,31,23,19,15,7,3'); // 测试获取指派给 test3 的用例执行 -r($testcase->getByAssignedToTest($accountList[3])) && p() && e('40,36,32,24,20,16,8,4'); // 测试获取指派给 dev4 的用例执行 +r($testcase->getByAssignedToTest($accountList[3])) && p() && e('40,36,32,24,20,16,8,4'); // 测试获取指派给 dev4 的用例执行 \ No newline at end of file diff --git a/test/model/testcase/getbyid.php b/test/model/testcase/getbyid.php index e6074f327a..c6875db6f8 100755 --- a/test/model/testcase/getbyid.php +++ b/test/model/testcase/getbyid.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->getById(); cid=1 pid=1 +测试获取case 1 的信息 >> 这个是测试用例1,feature,wait +测试获取case 2 的信息 >> 这个是测试用例2,performance,normal +测试获取case 3 的信息 >> 这个是测试用例3,config,blocked +测试获取case 4 的信息 >> 这个是测试用例4,install,investigate +测试获取case 5 的信息 >> 这个是测试用例5,security,wait + */ $caseIDList = array(1, 2, 3, 4, 5); @@ -20,4 +26,4 @@ r($testcase->getByIdTest($caseIDList[0])) && p('title,type,status') && e('这个 r($testcase->getByIdTest($caseIDList[1])) && p('title,type,status') && e('这个是测试用例2,performance,normal'); // 测试获取case 2 的信息 r($testcase->getByIdTest($caseIDList[2])) && p('title,type,status') && e('这个是测试用例3,config,blocked'); // 测试获取case 3 的信息 r($testcase->getByIdTest($caseIDList[3])) && p('title,type,status') && e('这个是测试用例4,install,investigate'); // 测试获取case 4 的信息 -r($testcase->getByIdTest($caseIDList[4])) && p('title,type,status') && e('这个是测试用例5,security,wait'); // 测试获取case 5 的信息 +r($testcase->getByIdTest($caseIDList[4])) && p('title,type,status') && e('这个是测试用例5,security,wait'); // 测试获取case 5 的信息 \ No newline at end of file diff --git a/test/model/testcase/getbylist.php b/test/model/testcase/getbylist.php index 1d61fb2730..650f54dc93 100755 --- a/test/model/testcase/getbylist.php +++ b/test/model/testcase/getbylist.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->getByList(); cid=1 pid=1 +测试获取case 1 2 3 的信息 >> 这个是测试用例1;这个是测试用例2;这个是测试用例3 +测试获取case 4 5 6 的信息 >> 这个是测试用例4;这个是测试用例5;这个是测试用例6 +测试获取case 7 8 9 的信息 >> 这个是测试用例7;这个是测试用例8;这个是测试用例9 +测试获取case 10 11 12 的信息 >> 这个是测试用例10;这个是测试用例11;这个是测试用例12 +测试获取case 13 14 15 的信息 >> 这个是测试用例13;这个是测试用例14;这个是测试用例15 + */ $caseIDList = array('1,2,3', '4,5,6', '7,8,9', '10,11,12', '13,14,15'); @@ -20,4 +26,4 @@ r($testcase->getByListTest($caseIDList[0])) && p('1:title;2:title;3:title') & r($testcase->getByListTest($caseIDList[0])) && p('4:title;5:title;6:title') && e('这个是测试用例4;这个是测试用例5;这个是测试用例6'); // 测试获取case 4 5 6 的信息 r($testcase->getByListTest($caseIDList[0])) && p('7:title;8:title;9:title') && e('这个是测试用例7;这个是测试用例8;这个是测试用例9'); // 测试获取case 7 8 9 的信息 r($testcase->getByListTest($caseIDList[0])) && p('10:title;11:title;12:title') && e('这个是测试用例10;这个是测试用例11;这个是测试用例12'); // 测试获取case 10 11 12 的信息 -r($testcase->getByListTest($caseIDList[0])) && p('13:title;14:title;15:title') && e('这个是测试用例13;这个是测试用例14;这个是测试用例15'); // 测试获取case 13 14 15 的信息 +r($testcase->getByListTest($caseIDList[0])) && p('13:title;14:title;15:title') && e('这个是测试用例13;这个是测试用例14;这个是测试用例15'); // 测试获取case 13 14 15 的信息 \ No newline at end of file diff --git a/test/model/testcase/getbyopenedby.php b/test/model/testcase/getbyopenedby.php index f633b851a5..80a5b6b688 100755 --- a/test/model/testcase/getbyopenedby.php +++ b/test/model/testcase/getbyopenedby.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->getByOpenedBy(); cid=1 pid=1 +测试查询由 test1 创建的case信息 >> 这个是测试用例1;这个是测试用例101;这个是测试用例201;这个是测试用例301 +测试查询由 test2 创建的case信息 >> 这个是测试用例2;这个是测试用例102;这个是测试用例202;这个是测试用例302 +测试查询由 test3 创建的case信息 >> 这个是测试用例3;这个是测试用例103;这个是测试用例203;这个是测试用例303 +测试查询由 test4 创建的case信息 >> 这个是测试用例4;这个是测试用例104;这个是测试用例204;这个是测试用例304 +测试查询由 test5 创建的case信息 >> 这个是测试用例5;这个是测试用例105;这个是测试用例205;这个是测试用例305 + */ $accountList = array('test1', 'test2', 'test3', 'test4', 'test5'); @@ -19,4 +25,4 @@ r($testcase->getByOpenedByTest($accountList[0])) && p('1:title;101:title;201:tit r($testcase->getByOpenedByTest($accountList[1])) && p('2:title;102:title;202:title;302:title') && e('这个是测试用例2;这个是测试用例102;这个是测试用例202;这个是测试用例302'); // 测试查询由 test2 创建的case信息 r($testcase->getByOpenedByTest($accountList[2])) && p('3:title;103:title;203:title;303:title') && e('这个是测试用例3;这个是测试用例103;这个是测试用例203;这个是测试用例303'); // 测试查询由 test3 创建的case信息 r($testcase->getByOpenedByTest($accountList[3])) && p('4:title;104:title;204:title;304:title') && e('这个是测试用例4;这个是测试用例104;这个是测试用例204;这个是测试用例304'); // 测试查询由 test4 创建的case信息 -r($testcase->getByOpenedByTest($accountList[4])) && p('5:title;105:title;205:title;305:title') && e('这个是测试用例5;这个是测试用例105;这个是测试用例205;这个是测试用例305'); // 测试查询由 test5 创建的case信息 +r($testcase->getByOpenedByTest($accountList[4])) && p('5:title;105:title;205:title;305:title') && e('这个是测试用例5;这个是测试用例105;这个是测试用例205;这个是测试用例305'); // 测试查询由 test5 创建的case信息 \ No newline at end of file diff --git a/test/model/testcase/getbystatus.php b/test/model/testcase/getbystatus.php index b0c3f52d6e..e3e534c0c2 100755 --- a/test/model/testcase/getbystatus.php +++ b/test/model/testcase/getbystatus.php @@ -10,6 +10,23 @@ title=测试 testcaseModel->getByStatus(); cid=1 pid=1 +测试查询所有产品 所有状态的case >> 400 +测试查询产品1 所有状态的case >> 4 +测试查询产品2 所有状态的case >> 4 +测试查询所有产品 type needconfirm 的case >> 100 +测试查询所有产品 状态 wait 的case >> 100 +测试查询所有产品 状态 normal 的case >> 100 +测试查询所有产品 状态 blocked 的case >> 100 +测试查询所有产品 状态 investigate 的case >> 100 +测试查询产品1 状态 wait 的case >> 1 +测试查询产品1 状态 normal 的case >> 1 +测试查询产品1 状态 blocked 的case >> 1 +测试查询产品1 状态 investigate 的case >> 1 +测试查询产品2 状态 wait 的case >> 1 +测试查询产品2 状态 normal 的case >> 1 +测试查询产品2 状态 blocked 的case >> 1 +测试查询产品2 状态 investigate 的case >> 1 + */ $productIDList = array('0', '1', '2'); $branch = 0; @@ -33,4 +50,4 @@ r($testcase->getByStatusTest($productIDList[1], $branch, $typeList[0], $statusLi r($testcase->getByStatusTest($productIDList[2], $branch, $typeList[0], $statusList[0])) && p() && e('1'); // 测试查询产品2 状态 wait 的case r($testcase->getByStatusTest($productIDList[2], $branch, $typeList[0], $statusList[1])) && p() && e('1'); // 测试查询产品2 状态 normal 的case r($testcase->getByStatusTest($productIDList[2], $branch, $typeList[0], $statusList[2])) && p() && e('1'); // 测试查询产品2 状态 blocked 的case -r($testcase->getByStatusTest($productIDList[2], $branch, $typeList[0], $statusList[3])) && p() && e('1'); // 测试查询产品2 状态 investigate 的case +r($testcase->getByStatusTest($productIDList[2], $branch, $typeList[0], $statusList[3])) && p() && e('1'); // 测试查询产品2 状态 investigate 的case \ No newline at end of file diff --git a/test/model/testcase/getbysuite.php b/test/model/testcase/getbysuite.php index 4c101a5b36..b48189c2e5 100755 --- a/test/model/testcase/getbysuite.php +++ b/test/model/testcase/getbysuite.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->getBySuite(); cid=1 pid=1 +测试获取产品 1 套件 1 的case >> 这个是测试用例1;这个是测试用例2 +测试获取产品 2 套件 3 的case >> 这个是测试用例5;这个是测试用例6 +测试获取产品 3 套件 5 的case >> 这个是测试用例9;这个是测试用例10 +测试获取产品 4 套件 7 的case >> 这个是测试用例13;这个是测试用例14 +测试获取产品 5 套件 9 的case >> 这个是测试用例17;这个是测试用例18 + */ $productIDList = array(1, 2, 3, 4, 5); $branch = 0; @@ -21,4 +27,4 @@ r($testcase->getBySuiteTest($productIDList[0], $branch, $suiteIDList[0])) && p(' r($testcase->getBySuiteTest($productIDList[1], $branch, $suiteIDList[1])) && p('5:title;6:title') && e('这个是测试用例5;这个是测试用例6'); // 测试获取产品 2 套件 3 的case r($testcase->getBySuiteTest($productIDList[2], $branch, $suiteIDList[2])) && p('9:title;10:title') && e('这个是测试用例9;这个是测试用例10'); // 测试获取产品 3 套件 5 的case r($testcase->getBySuiteTest($productIDList[3], $branch, $suiteIDList[3])) && p('13:title;14:title') && e('这个是测试用例13;这个是测试用例14'); // 测试获取产品 4 套件 7 的case -r($testcase->getBySuiteTest($productIDList[4], $branch, $suiteIDList[4])) && p('17:title;18:title') && e('这个是测试用例17;这个是测试用例18'); // 测试获取产品 5 套件 9 的case +r($testcase->getBySuiteTest($productIDList[4], $branch, $suiteIDList[4])) && p('17:title;18:title') && e('这个是测试用例17;这个是测试用例18'); // 测试获取产品 5 套件 9 的case \ No newline at end of file diff --git a/test/model/testcase/getexecutioncases.php b/test/model/testcase/getexecutioncases.php index 9687e1cca3..1b6dd18a6a 100755 --- a/test/model/testcase/getexecutioncases.php +++ b/test/model/testcase/getexecutioncases.php @@ -10,6 +10,37 @@ title=测试 testcaseModel->getExecutionCases(); cid=1 pid=1 +测试获取执行 101 的用例 >> 这个是测试用例1;这个是测试用例2;这个是测试用例3;这个是测试用例4 +测试获取执行 101 状态 wait 的用例 >> 1 +测试获取执行 101 状态 normal 的用例 >> 1 +测试获取执行 101 状态 blocked 的用例 >> 1 +测试获取执行 101 状态 investigate 的用例 >> 1 +测试获取执行 101 状态 needconfirm 的用例 >> 4 +测试获取执行 102 的用例 >> 这个是测试用例5;这个是测试用例6;这个是测试用例7;这个是测试用例8 +测试获取执行 102 状态 wait 的用例 >> 1 +测试获取执行 102 状态 normal 的用例 >> 1 +测试获取执行 102 状态 blocked 的用例 >> 1 +测试获取执行 102 状态 investigate 的用例 >> 1 +测试获取执行 102 状态 needconfirm 的用例 >> 4 +测试获取执行 103 的用例 >> 这个是测试用例9;这个是测试用例10;这个是测试用例11;这个是测试用例12 +测试获取执行 103 状态 wait 的用例 >> 1 +测试获取执行 103 状态 normal 的用例 >> 1 +测试获取执行 103 状态 blocked 的用例 >> 1 +测试获取执行 103 状态 investigate 的用例 >> 1 +测试获取执行 103 状态 needconfirm 的用例 >> 4 +测试获取执行 104 的用例 >> 这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例16 +测试获取执行 104 状态 wait 的用例 >> 1 +测试获取执行 104 状态 normal 的用例 >> 1 +测试获取执行 104 状态 blocked 的用例 >> 1 +测试获取执行 104 状态 investigate 的用例 >> 1 +测试获取执行 104 状态 needconfirm 的用例 >> 4 +测试获取执行 105 的用例 >> 这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例20 +测试获取执行 105 状态 wait 的用例 >> 1 +测试获取执行 105 状态 normal 的用例 >> 1 +测试获取执行 105 状态 blocked 的用例 >> 1 +测试获取执行 105 状态 investigate 的用例 >> 1 +测试获取执行 105 状态 needconfirm 的用例 >> 4 + */ $executionIDList = array(101, 102, 103, 104, 105); @@ -48,4 +79,4 @@ r($testcase->getExecutionCasesTest($executionIDList[4], $orderBy, $pager, $brows r($testcase->getExecutionCasesTest($executionIDList[4], $orderBy, $pager, $browseTypeList[2])) && p() && e('1'); // 测试获取执行 105 状态 normal 的用例 r($testcase->getExecutionCasesTest($executionIDList[4], $orderBy, $pager, $browseTypeList[3])) && p() && e('1'); // 测试获取执行 105 状态 blocked 的用例 r($testcase->getExecutionCasesTest($executionIDList[4], $orderBy, $pager, $browseTypeList[4])) && p() && e('1'); // 测试获取执行 105 状态 investigate 的用例 -r($testcase->getExecutionCasesTest($executionIDList[4], $orderBy, $pager, $browseTypeList[5])) && p() && e('4'); // 测试获取执行 105 状态 needconfirm 的用例 +r($testcase->getExecutionCasesTest($executionIDList[4], $orderBy, $pager, $browseTypeList[5])) && p() && e('4'); // 测试获取执行 105 状态 needconfirm 的用例 \ No newline at end of file diff --git a/test/model/testcase/getimportfields.php b/test/model/testcase/getimportfields.php index b18fabe4ee..cf01e501d0 100755 --- a/test/model/testcase/getimportfields.php +++ b/test/model/testcase/getimportfields.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->getImportFields(); cid=1 pid=1 +测试获取product 1 可以导出的字段的名称 >> 用例编号,所属产品,分支/平台,所属模块,B,R,S +测试获取product 2 可以导出的字段的名称 >> 用例编号,所属产品,分支/平台,所属模块,B,R,S +测试获取product 3 可以导出的字段的名称 >> 用例编号,所属产品,分支/平台,所属模块,B,R,S +测试获取product 4 可以导出的字段的名称 >> 用例编号,所属产品,分支/平台,所属模块,B,R,S +测试获取product 5 可以导出的字段的名称 >> 用例编号,所属产品,分支/平台,所属模块,B,R,S + */ $productIDList = array(1, 2, 3, 4, 5); @@ -20,4 +26,4 @@ r($testcase->getImportFieldsTest($productIDList[0])) && p('id,product,branch,mod r($testcase->getImportFieldsTest($productIDList[1])) && p('id,product,branch,module,bugsAB,resultsAB,stepNumberAB') && e('用例编号,所属产品,分支/平台,所属模块,B,R,S'); // 测试获取product 2 可以导出的字段的名称 r($testcase->getImportFieldsTest($productIDList[2])) && p('id,product,branch,module,bugsAB,resultsAB,stepNumberAB') && e('用例编号,所属产品,分支/平台,所属模块,B,R,S'); // 测试获取product 3 可以导出的字段的名称 r($testcase->getImportFieldsTest($productIDList[3])) && p('id,product,branch,module,bugsAB,resultsAB,stepNumberAB') && e('用例编号,所属产品,分支/平台,所属模块,B,R,S'); // 测试获取product 4 可以导出的字段的名称 -r($testcase->getImportFieldsTest($productIDList[4])) && p('id,product,branch,module,bugsAB,resultsAB,stepNumberAB') && e('用例编号,所属产品,分支/平台,所属模块,B,R,S'); // 测试获取product 5 可以导出的字段的名称 +r($testcase->getImportFieldsTest($productIDList[4])) && p('id,product,branch,module,bugsAB,resultsAB,stepNumberAB') && e('用例编号,所属产品,分支/平台,所属模块,B,R,S'); // 测试获取product 5 可以导出的字段的名称 \ No newline at end of file diff --git a/test/model/testcase/getmodulecases.php b/test/model/testcase/getmodulecases.php index 7eb2dfd03b..7f8692bf5d 100755 --- a/test/model/testcase/getmodulecases.php +++ b/test/model/testcase/getmodulecases.php @@ -10,6 +10,17 @@ title=测试 testcaseModel->getModuleCases(); cid=1 pid=1 +测试获取产品1的case >> 这个是测试用例1;这个是测试用例2;这个是测试用例3;这个是测试用例4 +测试获取产品1 module 1821 1822 的case >> 0 +测试获取产品2的case >> 这个是测试用例5;这个是测试用例6;这个是测试用例7;这个是测试用例8 +测试获取产品2 module 1825 2827 的case >> 0 +测试获取产品3的case >> 这个是测试用例9;这个是测试用例10;这个是测试用例11;这个是测试用例 +测试获取产品3 module 1829 2832 的case >> 0 +测试获取产品4的case >> 这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例 +测试获取产品4 module 1834 2835 的case >> 0 +测试获取产品5的case >> 这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例 +测试获取产品5 module 1838 2840 的case >> 0 + */ $productIDList = array(1, 2, 3, 4, 5); @@ -27,4 +38,4 @@ r($testcase->getModuleCasesTest($productIDList[2], $branch, $moduleIDList[2])) & r($testcase->getModuleCasesTest($productIDList[3])) && p('13:title;14:title;15:title;16:title') && e('这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例'); // 测试获取产品4的case r($testcase->getModuleCasesTest($productIDList[3], $branch, $moduleIDList[3])) && p() && e('0'); // 测试获取产品4 module 1834 2835 的case r($testcase->getModuleCasesTest($productIDList[4])) && p('17:title;18:title;19:title;20:title') && e('这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例'); // 测试获取产品5的case -r($testcase->getModuleCasesTest($productIDList[4], $branch, $moduleIDList[4])) && p() && e('0'); // 测试获取产品5 module 1838 2840 的case +r($testcase->getModuleCasesTest($productIDList[4], $branch, $moduleIDList[4])) && p() && e('0'); // 测试获取产品5 module 1838 2840 的case \ No newline at end of file diff --git a/test/model/testcase/getmoduleprojectcases.php b/test/model/testcase/getmoduleprojectcases.php index acb4db765e..4282bcf899 100755 --- a/test/model/testcase/getmoduleprojectcases.php +++ b/test/model/testcase/getmoduleprojectcases.php @@ -10,6 +10,17 @@ title=测试 testcaseModel->getModuleProjectCases(); cid=1 pid=1 +测试获取产品1的case >> 这个是测试用例1;这个是测试用例2;这个是测试用例3;这个是测试用例4 +测试获取产品1 module 1821 1822 的case >> 0 +测试获取产品2的case >> 这个是测试用例5;这个是测试用例6;这个是测试用例7;这个是测试用例8 +测试获取产品2 module 1825 2827 的case >> 0 +测试获取产品3的case >> 这个是测试用例9;这个是测试用例10;这个是测试用例11;这个是测试用例12 +测试获取产品3 module 1829 2832 的case >> 0 +测试获取产品4的case >> 这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例16 +测试获取产品4 module 1834 2835 的case >> 0 +测试获取产品5的case >> 这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例20 +测试获取产品5 module 1838 2840 的case >> 0 + */ $productIDList = array(1, 2, 3, 4, 5); $branch = 0; @@ -26,4 +37,4 @@ r($testcase->getModuleProjectCasesTest($productIDList[2], $branch, $moduleIDList r($testcase->getModuleProjectCasesTest($productIDList[3])) && p('13:title;14:title;15:title;16:title') && e('这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例16'); // 测试获取产品4的case r($testcase->getModuleProjectCasesTest($productIDList[3], $branch, $moduleIDList[3])) && p() && e('0'); // 测试获取产品4 module 1834 2835 的case r($testcase->getModuleProjectCasesTest($productIDList[4])) && p('17:title;18:title;19:title;20:title') && e('这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例20'); // 测试获取产品5的case -r($testcase->getModuleProjectCasesTest($productIDList[4], $branch, $moduleIDList[4])) && p() && e('0'); // 测试获取产品5 module 1838 2840 的case +r($testcase->getModuleProjectCasesTest($productIDList[4], $branch, $moduleIDList[4])) && p() && e('0'); // 测试获取产品5 module 1838 2840 的case \ No newline at end of file diff --git a/test/model/testcase/getstatus.php b/test/model/testcase/getstatus.php index 63721cd77c..ad974b6d64 100755 --- a/test/model/testcase/getstatus.php +++ b/test/model/testcase/getstatus.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->getStatus(); cid=1 pid=1 +测试获取create的状态 >> normal +测试获取review pass 的状态 >> pass +测试获取review clarify 的状态 >> clarify +测试获取update的状态 >> wait +测试获取update 别人变更 的状态 >> 该记录可能已经被改动。请刷新页面重新编辑! + */ $typeList = array('create', 'review', 'update'); @@ -29,4 +35,4 @@ r($testcase->getStatusTest($typeList[0])) && p() && e('normal r($testcase->getStatusTest($typeList[1], $case1)) && p() && e('pass'); // 测试获取review pass 的状态 r($testcase->getStatusTest($typeList[1], $case2)) && p() && e('clarify'); // 测试获取review clarify 的状态 r($testcase->getStatusTest($typeList[2], $case)) && p('1') && e('wait'); // 测试获取update的状态 -r($testcase->getStatusTest($typeList[2], $case, $param1)) && p() && e('该记录可能已经被改动。请刷新页面重新编辑!'); // 测试获取update 别人变更 的状态 +r($testcase->getStatusTest($typeList[2], $case, $param1)) && p() && e('该记录可能已经被改动。请刷新页面重新编辑!'); // 测试获取update 别人变更 的状态 \ No newline at end of file diff --git a/test/model/testcase/getstorycasecounts.php b/test/model/testcase/getstorycasecounts.php index e6af0f64cf..3b49f388c2 100755 --- a/test/model/testcase/getstorycasecounts.php +++ b/test/model/testcase/getstorycasecounts.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->getStoryCaseCounts(); cid=1 pid=1 +测试获取需求 1 2 的测试用例个数 >> 0;8 +测试获取需求 3 4 的测试用例个数 >> 0;0 +测试获取需求 5 6 的测试用例个数 >> 0;8 +测试获取需求 7 8 的测试用例个数 >> 0;0 +测试获取需求 9 10 的测试用例个数 >> 0;6 + */ $stories = array(array('1' => 1, '2' => 2 ), array('3' => 3, '4' => 4 ), array('5' => 5, '6' => 6 ), array('7' => 7, '8' => 8 ), array('9' => 9, '10' => 10 )); @@ -20,4 +26,4 @@ r($testcase->getStoryCaseCountsTest($stories[0])) && p('1;2') && e('0;8'); // r($testcase->getStoryCaseCountsTest($stories[1])) && p('3;4') && e('0;0'); // 测试获取需求 3 4 的测试用例个数 r($testcase->getStoryCaseCountsTest($stories[2])) && p('5;6') && e('0;8'); // 测试获取需求 5 6 的测试用例个数 r($testcase->getStoryCaseCountsTest($stories[3])) && p('7;8') && e('0;0'); // 测试获取需求 7 8 的测试用例个数 -r($testcase->getStoryCaseCountsTest($stories[4])) && p('9;10') && e('0;6'); // 测试获取需求 9 10 的测试用例个数 +r($testcase->getStoryCaseCountsTest($stories[4])) && p('9;10') && e('0;6'); // 测试获取需求 9 10 的测试用例个数 \ No newline at end of file diff --git a/test/model/testcase/getstorycases.php b/test/model/testcase/getstorycases.php index 2ac3358af6..89236653ec 100755 --- a/test/model/testcase/getstorycases.php +++ b/test/model/testcase/getstorycases.php @@ -10,6 +10,13 @@ title=测试 testcaseModel->getStoryCases(); cid=1 pid=1 +测试获取需求 2 的关联用例 >> 这个是测试用例1;这个是测试用例2;这个是测试用例3;这个是测试用例4;用例库用例1;用例库用例2;用例库用例3;用例库用例4 +测试获取需求 6 的关联用例 >> 这个是测试用例5;这个是测试用例6;这个是测试用例7;这个是测试用例8;用例库用例5;用例库用例6;用例库用例7;用例库用例8 +测试获取需求 10 的关联用例 >> 这个是测试用例9;这个是测试用例10;这个是测试用例11;这个是测试用例12;用例库用例9;用例库用例10 +测试获取需求 14 的关联用例 >> 这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例16 +测试获取需求 18 的关联用例 >> 这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例20 +测试获取需求 1 的关联用例 >> 0 + */ $storyIDList = array(2, 6, 10, 14, 18, 1); @@ -21,4 +28,4 @@ r($testcase->getStoryCasesTest($storyIDList[1])) && p('5:title;6:title;7:title;8 r($testcase->getStoryCasesTest($storyIDList[2])) && p('9:title;10:title;11:title;12:title;409:title;410:title') && e('这个是测试用例9;这个是测试用例10;这个是测试用例11;这个是测试用例12;用例库用例9;用例库用例10'); // 测试获取需求 10 的关联用例 r($testcase->getStoryCasesTest($storyIDList[3])) && p('13:title;14:title;15:title;16:title') && e('这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例16'); // 测试获取需求 14 的关联用例 r($testcase->getStoryCasesTest($storyIDList[4])) && p('17:title;18:title;19:title;20:title') && e('这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例20'); // 测试获取需求 18 的关联用例 -r($testcase->getStoryCasesTest($storyIDList[5])) && p() && e('0'); // 测试获取需求 1 的关联用例 +r($testcase->getStoryCasesTest($storyIDList[5])) && p() && e('0'); // 测试获取需求 1 的关联用例 \ No newline at end of file diff --git a/test/model/testcase/gettestcases.php b/test/model/testcase/gettestcases.php index aaf5649a36..9d5daaf34f 100755 --- a/test/model/testcase/gettestcases.php +++ b/test/model/testcase/gettestcases.php @@ -10,6 +10,32 @@ title=测试 testcaseModel->getTestCases(); cid=1 pid=1 +测试查询产品1 suiteID 1 browseType all 的测试用例 >> 这个是测试用例1;这个是测试用例2;这个是测试用例3;这个是测试用例4 +测试查询产品1 suiteID 1 browseType wait 的测试用例 >> 这个是测试用例1 +测试查询产品1 suiteID 1 browseType bymodule 的测试用例 >> 这个是测试用例1;这个是测试用例2;这个是测试用例3;这个是测试用例4 +测试查询产品1 suiteID 1 browseType needconfirm 的测试用例 >> 这个是测试用例4;这个是测试用例3;这个是测试用例2;这个是测试用例1 +测试查询产品1 suiteID 1 browseType bysuite 的测试用例 >> 这个是测试用例1;这个是测试用例2 +测试查询产品2 suiteID 3 browseType all 的测试用例 >> 这个是测试用例5;这个是测试用例6;这个是测试用例7;这个是测试用例8 +测试查询产品2 suiteID 3 browseType wait 的测试用例 >> 这个是测试用例5 +测试查询产品2 suiteID 3 browseType bymodule 的测试用例 >> 这个是测试用例5;这个是测试用例6;这个是测试用例7;这个是测试用例8 +测试查询产品2 suiteID 3 browseType needconfirm 的测试用例 >> 这个是测试用例8;这个是测试用例7;这个是测试用例6;这个是测试用例5 +测试查询产品2 suiteID 3 browseType bysuite 的测试用例 >> 这个是测试用例5;这个是测试用例6 +测试查询产品3 suiteID 5 browseType all 的测试用例 >> 这个是测试用例9;这个是测试用例10;这个是测试用例11;这个是测试用例12 +测试查询产品3 suiteID 5 browseType wait 的测试用例 >> 这个是测试用例9 +测试查询产品3 suiteID 5 browseType bymodule 的测试用例 >> 这个是测试用例9;这个是测试用例10;这个是测试用例11;这个是测试用例12 +测试查询产品3 suiteID 5 browseType needconfirm 的测试用例 >> 这个是测试用例12;这个是测试用例11;这个是测试用例10;这个是测试用例9 +测试查询产品3 suiteID 5 browseType bysuite 的测试用例 >> 这个是测试用例9;这个是测试用例10 +测试查询产品4 suiteID 7 browseType all 的测试用例 >> 这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例16 +测试查询产品4 suiteID 7 browseType wait 的测试用例 >> 这个是测试用例13 +测试查询产品4 suiteID 7 browseType bymodule 的测试用例 >> 这个是测试用例13;这个是测试用例14;这个是测试用例15;这个是测试用例16 +测试查询产品4 suiteID 7 browseType needconfirm 的测试用例 >> 这个是测试用例16;这个是测试用例15;这个是测试用例14;这个是测试用例13 +测试查询产品4 suiteID 7 browseType bysuite 的测试用例 >> 这个是测试用例13;这个是测试用例14 +测试查询产品5 suiteID 9 browseType all 的测试用例 >> 这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例20 +测试查询产品5 suiteID 9 browseType wait 的测试用例 >> 这个是测试用例17 +测试查询产品5 suiteID 9 browseType bymodule 的测试用例 >> 这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例20 +测试查询产品5 suiteID 9 browseType needconfirm 的测试用例 >> 这个是测试用例20;这个是测试用例19;这个是测试用例18;这个是测试用例17 +测试查询产品5 suiteID 9 browseType bysuite 的测试用例 >> 这个是测试用例17;这个是测试用例18 + */ $productID = array('1', '2', '3', '4', '5'); @@ -42,4 +68,4 @@ r($testcase->getTestCasesTest($productID[4], $browseType[0], $suiteID[4])) && p( r($testcase->getTestCasesTest($productID[4], $browseType[1], $suiteID[4])) && p('17:title') && e('这个是测试用例17'); // 测试查询产品5 suiteID 9 browseType wait 的测试用例 r($testcase->getTestCasesTest($productID[4], $browseType[2], $suiteID[4])) && p('17:title;18:title;19:title;20:title') && e('这个是测试用例17;这个是测试用例18;这个是测试用例19;这个是测试用例20'); // 测试查询产品5 suiteID 9 browseType bymodule 的测试用例 r($testcase->getTestCasesTest($productID[4], $browseType[3], $suiteID[4])) && p('0:title;1:title;2:title;3:title') && e('这个是测试用例20;这个是测试用例19;这个是测试用例18;这个是测试用例17'); // 测试查询产品5 suiteID 9 browseType needconfirm 的测试用例 -r($testcase->getTestCasesTest($productID[4], $browseType[4], $suiteID[4])) && p('17:title;18:title') && e('这个是测试用例17;这个是测试用例18'); // 测试查询产品5 suiteID 9 browseType bysuite 的测试用例 +r($testcase->getTestCasesTest($productID[4], $browseType[4], $suiteID[4])) && p('17:title;18:title') && e('这个是测试用例17;这个是测试用例18'); // 测试查询产品5 suiteID 9 browseType bysuite 的测试用例 \ No newline at end of file diff --git a/test/model/testcase/importfromlib.php b/test/model/testcase/importfromlib.php index 8d4871d39f..931597fcc7 100755 --- a/test/model/testcase/importfromlib.php +++ b/test/model/testcase/importfromlib.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->importFromLib(); cid=1 pid=1 +测试导入用例库用例 401 402 >> 用例库用例1;用例库用例2 +测试导入用例库用例 403 404 >> 用例库用例3;用例库用例4 +测试导入用例库用例 405 406 >> 用例库用例5;用例库用例6 +测试导入用例库用例 407 408 >> 用例库用例7;用例库用例8 +测试导入用例库用例 409 410 >> 用例库用例9;用例库用例10 + */ $productID = 1; @@ -22,4 +28,4 @@ r($testcase->importFromLibTest($productID, $caseIdList[1])) && p('0:title;1:titl r($testcase->importFromLibTest($productID, $caseIdList[2])) && p('0:title;1:title') && e('用例库用例5;用例库用例6'); // 测试导入用例库用例 405 406 r($testcase->importFromLibTest($productID, $caseIdList[3])) && p('0:title;1:title') && e('用例库用例7;用例库用例8'); // 测试导入用例库用例 407 408 r($testcase->importFromLibTest($productID, $caseIdList[4])) && p('0:title;1:title') && e('用例库用例9;用例库用例10'); // 测试导入用例库用例 409 410 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/joinstep.php b/test/model/testcase/joinstep.php index 00240da386..2e5c44ceb8 100755 --- a/test/model/testcase/joinstep.php +++ b/test/model/testcase/joinstep.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->joinStep(); cid=1 pid=1 +测试获取步骤 1 2 的字符串 >> 用例步骤描述1 EXPECT:这是用例预期结果1 用例步骤描述2 EXPECT:这是用例预期结果2 +测试获取步骤 3 4 的字符串 >> 用例步骤描述3 EXPECT:这是用例预期结果3 用例步骤描述4 EXPECT:这是用例预期结果4 +测试获取步骤 5 6 的字符串 >> 用例步骤描述5 EXPECT:这是用例预期结果5 用例步骤描述6 EXPECT:这是用例预期结果6 +测试获取步骤 7 8 的字符串 >> 用例步骤描述7 EXPECT:这是用例预期结果7 用例步骤描述8 EXPECT:这是用例预期结果8 +测试获取步骤 9 10 的字符串 >> 用例步骤描述9 EXPECT:这是用例预期结果9 用例步骤描述10 EXPECT:这是用例预期结果10 + */ $stepIDList = array('1,2', '3,4', '5,6', '7,8', '9,10'); @@ -20,4 +26,4 @@ r($testcase->joinStepTest($stepIDList[0])) && p() && e('用例步骤描述1 EXPE r($testcase->joinStepTest($stepIDList[1])) && p() && e('用例步骤描述3 EXPECT:这是用例预期结果3 用例步骤描述4 EXPECT:这是用例预期结果4'); // 测试获取步骤 3 4 的字符串 r($testcase->joinStepTest($stepIDList[2])) && p() && e('用例步骤描述5 EXPECT:这是用例预期结果5 用例步骤描述6 EXPECT:这是用例预期结果6'); // 测试获取步骤 5 6 的字符串 r($testcase->joinStepTest($stepIDList[3])) && p() && e('用例步骤描述7 EXPECT:这是用例预期结果7 用例步骤描述8 EXPECT:这是用例预期结果8'); // 测试获取步骤 7 8 的字符串 -r($testcase->joinStepTest($stepIDList[4])) && p() && e('用例步骤描述9 EXPECT:这是用例预期结果9 用例步骤描述10 EXPECT:这是用例预期结果10'); // 测试获取步骤 9 10 的字符串 +r($testcase->joinStepTest($stepIDList[4])) && p() && e('用例步骤描述9 EXPECT:这是用例预期结果9 用例步骤描述10 EXPECT:这是用例预期结果10'); // 测试获取步骤 9 10 的字符串 \ No newline at end of file diff --git a/test/model/testcase/review.php b/test/model/testcase/review.php index 24367cef64..e5d73edec7 100755 --- a/test/model/testcase/review.php +++ b/test/model/testcase/review.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->review(); cid=1 pid=1 +测试评审用例 1 >> status,wait,normal +测试评审用例 2 >> reviewedBy,admin,test2 +测试评审用例 3 >> status,wait,normal +测试评审用例 4 >> reviewedBy,admin,test4 +测试评审用例 5 >> status,wait,normal + */ $caseIDList = array(1, 5, 9, 13, 17); @@ -46,4 +52,4 @@ r($testcase->reviewTest($caseIDList[1], $case2)) && p('0:field,old,new') && e('r r($testcase->reviewTest($caseIDList[2], $case3)) && p('0:field,old,new') && e('status,wait,normal'); // 测试评审用例 3 r($testcase->reviewTest($caseIDList[3], $case4)) && p('0:field,old,new') && e('reviewedBy,admin,test4'); // 测试评审用例 4 r($testcase->reviewTest($caseIDList[4], $case5)) && p('0:field,old,new') && e('status,wait,normal'); // 测试评审用例 5 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/synccase2project.php b/test/model/testcase/synccase2project.php index 71a53dddfa..0b0868a733 100755 --- a/test/model/testcase/synccase2project.php +++ b/test/model/testcase/synccase2project.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->syncCase2Project(); cid=1 pid=1 +测试同步用例 1 到关联项目中 >> 2 +测试同步用例 2 到关联项目中 >> 2 +测试同步用例 3 到关联项目中 >> 2 +测试同步用例 4 到关联项目中 >> 2 +测试同步用例 5 到关联项目中 >> 2 + */ $caseIDList = array(1, 5, 9, 13, 17, 2); @@ -21,4 +27,4 @@ r($testcase->syncCase2ProjectTest($caseIDList[1])) && p() && e('2'); // 测试 r($testcase->syncCase2ProjectTest($caseIDList[2])) && p() && e('2'); // 测试同步用例 3 到关联项目中 r($testcase->syncCase2ProjectTest($caseIDList[3])) && p() && e('2'); // 测试同步用例 4 到关联项目中 r($testcase->syncCase2ProjectTest($caseIDList[4])) && p() && e('2'); // 测试同步用例 5 到关联项目中 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/update.php b/test/model/testcase/update.php index 7fe154abc0..683c8c6eaa 100755 --- a/test/model/testcase/update.php +++ b/test/model/testcase/update.php @@ -10,6 +10,12 @@ title=测试 testcaseModel->update(); cid=1 pid=1 +测试修改标题 >> title,这个是测试用例1,修改后的名称 +测试重复修改标题 >> 没有数据更新 +测试修改前置条件 >> precondition,这是前置条件1,修改后的前置条件 +测试修改状态 >> status,wait,normal +测试修改优先级 >> pri,1,3 + */ $changeTitle = array('title' => '修改后的名称'); @@ -24,4 +30,4 @@ r($testcase->updateTest($changeTitle)) && p('0:field,old,new') && e('没 r($testcase->updateTest($changePrecondition)) && p('0:field,old,new') && e('precondition,这是前置条件1,修改后的前置条件'); // 测试修改前置条件 r($testcase->updateTest($changeStatus)) && p('0:field,old,new') && e('status,wait,normal'); // 测试修改状态 r($testcase->updateTest($changePri)) && p('0:field,old,new') && e('pri,1,3'); // 测试修改优先级 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/testcase/updatecase2project.php b/test/model/testcase/updatecase2project.php index 169881869b..533fcbc21b 100755 --- a/test/model/testcase/updatecase2project.php +++ b/test/model/testcase/updatecase2project.php @@ -10,6 +10,17 @@ title=测试 testcaseModel->updateCase2Project(); cid=1 pid=1 +测试修改用例 1 产品 >> 101,2,1 +测试修改用例 1 需求 >> 101,2,1;12,1,1;102,1,1 +测试修改用例 3 产品 >> 101,2,3 +测试修改用例 3 需求 >> 101,2,3;12,1,3;102,1,3 +测试修改用例 5 产品 >> 102,1,5 +测试修改用例 5 需求 >> 102,1,5;11,2,5;101,2,5 +测试修改用例 7 产品 >> 102,1,7 +测试修改用例 7 需求 >> 102,1,7;11,2,7;101,2,7 +测试修改用例 9 产品 >> 103,1,9 +测试修改用例 9 需求 >> 103,1,9;11,3,9;101,3,9 + */ $caseIDList = array('1', '3', '5', '7', '9'); @@ -28,4 +39,4 @@ r($testcase->updateCase2ProjectTest($caseIDList[3], $objectTypeList[0], $objectI r($testcase->updateCase2ProjectTest($caseIDList[3], $objectTypeList[1], $objectIDList[3])) && p('0:project,product,case;1:project,product,case;2:project,product,case') && e('102,1,7;11,2,7;101,2,7'); // 测试修改用例 7 需求 r($testcase->updateCase2ProjectTest($caseIDList[4], $objectTypeList[0], $objectIDList[1])) && p('0:project,product,case') && e('103,1,9'); // 测试修改用例 9 产品 r($testcase->updateCase2ProjectTest($caseIDList[4], $objectTypeList[1], $objectIDList[3])) && p('0:project,product,case;1:project,product,case;2:project,product,case') && e('103,1,9;11,3,9;101,3,9'); // 测试修改用例 9 需求 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/tree/buildmenuquery.php b/test/model/tree/buildmenuquery.php index 615cfb20e4..30a02fe449 100755 --- a/test/model/tree/buildmenuquery.php +++ b/test/model/tree/buildmenuquery.php @@ -10,6 +10,18 @@ title=测试 treeModel->buildMenuQuery(); cid=1 pid=1 +测试查询root 1 type story 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '1' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order` +测试查询root 2 type story 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '2' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order` +测试查询root 3 type story 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '3' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order` +测试查询root 41 type story 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order` +测试查询root 42 type story 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '42' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order` +测试查询root 43 type story 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '43' AND type = 'story' AND deleted = '0' ORDER BY `grade` desc,`order` +测试查询root 101 type task 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '101' AND type = 'task' AND deleted = '0' ORDER BY `grade` desc,`order`,`type` desc +测试查询root 102 type task 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '102' AND type = 'task' AND deleted = '0' ORDER BY `grade` desc,`order`,`type` desc +测试查询root 103 type task 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '103' AND type = 'task' AND deleted = '0' ORDER BY `grade` desc,`order`,`type` desc +测试查询root 41 type story startModule 1821的查询语句 >> SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND path LIKE ',1821,%' AND deleted = '0' ORDER BY `grade` desc,`order` +测试查询root 41 type story startModule 0 branch 1 的查询语句 >> SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND path LIKE ',1982,%' AND (branch = '0' OR branch = '1 + */ $root = array(1, 2, 3, 41, 42, 43, 101, 102, 103); @@ -29,4 +41,4 @@ r($tree->buildMenuQueryTest($root[6], $type[1])) && p( r($tree->buildMenuQueryTest($root[7], $type[1])) && p() && e("SELECT * FROM `zt_module` WHERE root = '102' AND type = 'task' AND deleted = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 102 type task 的查询语句 r($tree->buildMenuQueryTest($root[8], $type[1])) && p() && e("SELECT * FROM `zt_module` WHERE root = '103' AND type = 'task' AND deleted = '0' ORDER BY `grade` desc,`order`,`type` desc"); // 测试查询root 103 type task 的查询语句 r($tree->buildMenuQueryTest($root[3], $type[0], $startModule[0])) && p() && e("SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND path LIKE ',1821,%' AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 41 type story startModule 1821的查询语句 -r($tree->buildMenuQueryTest($root[3], $type[0], $startModule[1], $branch)) && p() && e("SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND path LIKE ',1982,%' AND (branch = '0' OR branch = '1') AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 41 type story startModule 0 branch 1 的查询语句 +r($tree->buildMenuQueryTest($root[3], $type[0], $startModule[1], $branch)) && p() && e("SELECT * FROM `zt_module` WHERE root = '41' AND type = 'story' AND path LIKE ',1982,%' AND (branch = '0' OR branch = '1') AND deleted = '0' ORDER BY `grade` desc,`order`"); // 测试查询root 41 type story startModule 0 branch 1 的查询语句 \ No newline at end of file diff --git a/test/model/tree/buildtreearray.php b/test/model/tree/buildtreearray.php index 62883cd7f1..0c76d79091 100755 --- a/test/model/tree/buildtreearray.php +++ b/test/model/tree/buildtreearray.php @@ -10,6 +10,19 @@ title=测试 treeModel->buildTreeArray(); cid=1 pid=1 +测试创建树选项的字符串长度 1 >> 56 +测试创建树选项的字符串长度 2 >> 56;58 +测试创建树选项的字符串长度 3 >> 112;58 +测试创建树选项的字符串长度 4 >> 112;116 +测试创建树选项的字符串长度 5 >> 112;116;148 +测试创建树选项的字符串长度 6 >> 112;116;300 +测试创建树选项的字符串长度 7 >> 112;116;336 +测试创建树选项的字符串长度 8 >> 112;116;372 +测试创建树选项的字符串长度 9 >> 112;116;408 +测试创建树选项的字符串长度 10 >> 112;116;444 +测试创建树选项的字符串长度 11 >> 112;116;480 +测试创建树选项的字符串长度 12 >> 112;116;516 + */ $tree = new treeTest(); @@ -35,4 +48,4 @@ r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[7])) && p('1981; r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[8])) && p('1981;2381;0') && e('112;116;408'); // 测试创建树选项的字符串长度 9 r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[9])) && p('1981;2381;0') && e('112;116;444'); // 测试创建树选项的字符串长度 10 r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[10])) && p('1981;2381;0') && e('112;116;480'); // 测试创建树选项的字符串长度 11 -r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[11])) && p('1981;2381;0') && e('112;116;516'); // 测试创建树选项的字符串长度 12 +r($tree->buildTreeArrayTest($treeMenu, $modules, $moduleIDList[11])) && p('1981;2381;0') && e('112;116;516'); // 测试创建树选项的字符串长度 12 \ No newline at end of file diff --git a/test/model/tree/changeroot.php b/test/model/tree/changeroot.php index f0fdc2626b..0e44707ca9 100755 --- a/test/model/tree/changeroot.php +++ b/test/model/tree/changeroot.php @@ -10,6 +10,19 @@ title=测试 treeModel->changeRoot(); cid=1 pid=1 +测试修改module 1821 的root从 1 修改为 2 >> 0 +测试修改module 1822 的root从 1 修改为 2 >> 0 +测试修改module 1825 的root从 2 修改为 1 >> 0 +测试修改module 1826 的root从 2 修改为 1 >> 0 +测试修改module 1981 的root从 41 修改为 42 >> 0 +测试修改module 1982 的root从 41 修改为 42 >> 0 +测试修改module 1985 的root从 42 修改为 41 >> 0 +测试修改module 1986 的root从 42 修改为 41 >> 0 +测试修改module 21 的root从 101 修改为 102 >> 0 +测试修改module 22 的root从 101 修改为 102 >> 0 +测试修改module 24 的root从 102 修改为 101 >> 0 +测试修改module 25 的root从 102 修改为 101 >> 0 + */ $moduleID = array(1821, 1822, 1825, 1826, 1981, 1982, 1985, 1986, 21, 22, 24, 25); $root = array(1, 2, 41, 42, 101, 102); @@ -29,4 +42,4 @@ r($tree->changeRootTest($moduleID[8], $root[4], $root[5], $type[1])) && p('id,r r($tree->changeRootTest($moduleID[9], $root[4], $root[5], $type[1])) && p('id,root') && e('0'); // 测试修改module 22 的root从 101 修改为 102 r($tree->changeRootTest($moduleID[10], $root[5], $root[4], $type[1])) && p('id,root') && e('0'); // 测试修改module 24 的root从 102 修改为 101 r($tree->changeRootTest($moduleID[11], $root[5], $root[4], $type[1])) && p('id,root') && e('0'); // 测试修改module 25 的root从 102 修改为 101 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/tree/checkunique.php b/test/model/tree/checkunique.php index 5cb5bc78f4..468d404650 100755 --- a/test/model/tree/checkunique.php +++ b/test/model/tree/checkunique.php @@ -10,6 +10,22 @@ title=测试 treeModel->checkUnique(); cid=1 pid=1 +测试module1是否与已存在的模块重名 >> 0 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 产品模块1 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 产品模块2 +测试module1是否与已存在的模块重名 >> 产品模块3 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 产品模块1 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 产品模块2 +测试module1是否与已存在的模块重名 >> 0 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 产品模块161 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 产品模块161 +测试module1是否与已存在的模块重名 >> 产品子模块281 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 产品子模块281 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 0 +测试module1是否与已存在的模块重名 >> 0 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 0 +测试module1 和 moduleID1 里的模块是否与已存在的模块重名 >> 0 + */ $module1 = new stdclass(); $module1->name = '不会重名的模块'; @@ -66,4 +82,4 @@ r($tree->checkUniqueTest($module4, $moduleID1, $branches)) && p() && e('产品 r($tree->checkUniqueTest($module4, $moduleID2, $branches)) && p() && e('0'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名 r($tree->checkUniqueTest($module5)) && p() && e('0'); // 测试module1是否与已存在的模块重名 r($tree->checkUniqueTest($module5, $moduleID1, $branches)) && p() && e('0'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名 -r($tree->checkUniqueTest($module5, $moduleID2, $branches)) && p() && e('0'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名 +r($tree->checkUniqueTest($module5, $moduleID2, $branches)) && p() && e('0'); // 测试module1 和 moduleID1 里的模块是否与已存在的模块重名 \ No newline at end of file diff --git a/test/model/tree/createbuglink.php b/test/model/tree/createbuglink.php index 5902fb260e..f805fcbaf8 100755 --- a/test/model/tree/createbuglink.php +++ b/test/model/tree/createbuglink.php @@ -10,6 +10,15 @@ title=测试 treeModel->createBugLink(); cid=1 pid=1 +测试创建module 1821 的buglink >> title='产品模块1' +测试创建module 1822 的buglink >> title='产品模块2' +测试创建module 1981 的buglink >> title='产品模块161' +测试创建module 1982 的buglink >> title='产品模块162' +测试创建module 1621 的buglink >> title='模块1601' +测试创建module 1622 的buglink >> title='模块1602' +测试创建module 21 的buglink >> title='模块1' +测试创建module 22 的buglink >> title='模块2' + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); @@ -23,4 +32,4 @@ r($tree->createBugLinkTest($moduleID[3])) && p() && e("title='产品模块162'") r($tree->createBugLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的buglink r($tree->createBugLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的buglink r($tree->createBugLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的buglink -r($tree->createBugLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的buglink +r($tree->createBugLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的buglink \ No newline at end of file diff --git a/test/model/tree/createcaseliblink.php b/test/model/tree/createcaseliblink.php index 643f747154..262901217c 100755 --- a/test/model/tree/createcaseliblink.php +++ b/test/model/tree/createcaseliblink.php @@ -10,6 +10,15 @@ title=测试 treeModel->createCaseLibLink(); cid=1 pid=1 +测试创建module 1821 的caseliblink >> title='产品模块1' +测试创建module 1822 的caseliblink >> title='产品模块2' +测试创建module 1981 的caseliblink >> title='产品模块161' +测试创建module 1982 的caseliblink >> title='产品模块162' +测试创建module 1621 的caseliblink >> title='模块1601' +测试创建module 1622 的caseliblink >> title='模块1602' +测试创建module 21 的caseliblink >> title='模块1' +测试创建module 22 的caseliblink >> title='模块2' + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); @@ -22,4 +31,4 @@ r($tree->createCaseLibLinkTest($moduleID[3])) && p() && e("title='产品模块16 r($tree->createCaseLibLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的caseliblink r($tree->createCaseLibLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的caseliblink r($tree->createCaseLibLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的caseliblink -r($tree->createCaseLibLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的caseliblink +r($tree->createCaseLibLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的caseliblink \ No newline at end of file diff --git a/test/model/tree/createcaselink.php b/test/model/tree/createcaselink.php index 73d668dc4a..96c29be4fe 100755 --- a/test/model/tree/createcaselink.php +++ b/test/model/tree/createcaselink.php @@ -10,6 +10,19 @@ title=测试 treeModel->createCaseLink(); cid=1 pid=1 +测试创建module 1821 的caselink >> title='产品模块1' +测试创建module 1822 的caselink >> title='产品模块2' +测试创建module 1983 branch 0 的caselink >> title='产品模块162' +测试创建module 1983 branch 1 的caselink >> title='产品模块162' +测试创建module 1983 branch 2 的caselink >> title='产品模块162' +测试创建module 1983 branch 0 的caselink >> title='产品模块163' +测试创建module 1983 branch 1 的caselink >> title='产品模块163' +测试创建module 1983 branch 2 的caselink >> title='产品模块163' +测试创建module 1621 的caselink >> title='模块1601' +测试创建module 1622 的caselink >> title='模块1602' +测试创建module 21 的caselink >> title='模块1' +测试创建module 22 的caselink >> title='模块2' + */ $moduleID = array(1821, 1822, 1982, 1983, 1621, 1622, 21, 22); @@ -28,4 +41,4 @@ r($tree->createCaseLinkTest($moduleID[3], array('branchID' => $extra[2]))) && p( r($tree->createCaseLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的caselink r($tree->createCaseLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的caselink r($tree->createCaseLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的caselink -r($tree->createCaseLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的caselink +r($tree->createCaseLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的caselink \ No newline at end of file diff --git a/test/model/tree/createfeedbacklink.php b/test/model/tree/createfeedbacklink.php index 617307a5b1..14c57c7868 100755 --- a/test/model/tree/createfeedbacklink.php +++ b/test/model/tree/createfeedbacklink.php @@ -10,6 +10,15 @@ title=测试 treeModel->createFeedbackLink(); cid=1 pid=1 +测试创建module 1821 的feedbacklink >> title='产品模块1' +测试创建module 1822 的feedbacklink >> title='产品模块2' +测试创建module 1981 的feedbacklink >> title='产品模块161' +测试创建module 1982 的feedbacklink >> title='产品模块162' +测试创建module 1621 的feedbacklink >> title='模块1601' +测试创建module 1622 的feedbacklink >> title='模块1602' +测试创建module 21 的feedbacklink >> title='模块1' +测试创建module 22 的feedbacklink >> title='模块2' + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); @@ -22,4 +31,4 @@ r($tree->createFeedbackLinkTest($moduleID[3])) && p() && e("title='产品模块1 r($tree->createFeedbackLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的feedbacklink r($tree->createFeedbackLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的feedbacklink r($tree->createFeedbackLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的feedbacklink -r($tree->createFeedbackLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的feedbacklink +r($tree->createFeedbackLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的feedbacklink \ No newline at end of file diff --git a/test/model/tree/createmanagelink.php b/test/model/tree/createmanagelink.php index ae051dec84..fdbbdb834e 100755 --- a/test/model/tree/createmanagelink.php +++ b/test/model/tree/createmanagelink.php @@ -10,6 +10,19 @@ title=测试 treeModel->createManageLink(); cid=1 pid=1 +测试创建module 1821 branch 0 的managelink >> 产品模块1 < +测试创建module 1822 branch 0 的managelink >> 产品模块2 < +测试创建module 1981 branch 0 的managelink >> 产品模块161 +测试创建module 1981 branch 1 的managelink >> 产品模块161 +测试创建module 1981 branch 2 的managelink >> 产品模块161 +测试创建module 1982 branch 0 的managelink >> 产品模块162 +测试创建module 1982 branch 1 的managelink >> 产品模块162 +测试创建module 1982 branch 2 的managelink >> 产品模块162 +测试创建module 1621 branch 0 的managelink >> 模块1601 > 模块1602 > 模块1 > 模块2 0); @@ -29,4 +42,4 @@ r($tree->createManageLinkTest($moduleID[3], $extra2)) && p() && e("产品模块1 r($tree->createManageLinkTest($moduleID[4], $extra0)) && p() && e("模块1601 createManageLinkTest($moduleID[5], $extra0)) && p() && e("模块1602 createManageLinkTest($moduleID[6], $extra0)) && p() && e("模块1 createManageLinkTest($moduleID[7], $extra0)) && p() && e("模块2 createManageLinkTest($moduleID[7], $extra0)) && p() && e("模块2 createRequirementLink(); cid=1 pid=1 +测试创建module 1821 的RequirementLink >> title='产品模块1' +测试创建module 1822 的RequirementLink >> title='产品模块2' +测试创建module 1981 的RequirementLink >> title='产品模块161' +测试创建module 1982 的RequirementLink >> title='产品模块162' +测试创建module 1621 的RequirementLink >> title='模块1601' +测试创建module 1622 的RequirementLink >> title='模块1602' +测试创建module 21 的RequirementLink >> title='模块1' +测试创建module 22 的RequirementLink >> title='模块2' + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); @@ -22,4 +31,4 @@ r($tree->createRequirementLinkTest($moduleID[3])) && p() && e("title='产品模 r($tree->createRequirementLinkTest($moduleID[4])) && p() && e("title='模块1601'"); // 测试创建module 1621 的RequirementLink r($tree->createRequirementLinkTest($moduleID[5])) && p() && e("title='模块1602'"); // 测试创建module 1622 的RequirementLink r($tree->createRequirementLinkTest($moduleID[6])) && p() && e("title='模块1'"); // 测试创建module 21 的RequirementLink -r($tree->createRequirementLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的RequirementLink +r($tree->createRequirementLinkTest($moduleID[7])) && p() && e("title='模块2'"); // 测试创建module 22 的RequirementLink \ No newline at end of file diff --git a/test/model/tree/createstorylink.php b/test/model/tree/createstorylink.php index 8dc2c35b25..27a299ac8d 100755 --- a/test/model/tree/createstorylink.php +++ b/test/model/tree/createstorylink.php @@ -10,6 +10,16 @@ title=测试 treeModel->createStoryLink(); cid=1 pid=1 +测试获取module 1821 project 11 product 1 的 story link >> projectstory title='产品模块1' +测试获取module 1822 project 11 product 1 的 story link >> projectstory title='产品模块2' +测试获取module 1981 project 2 product 2 的 story link >> projectstory title='产品模块161' +测试获取module 1982 product 1 的 story link >> product title='产品模块162' +测试获取module 1621 execution 101 的 story link >> execution title='模块1601' +测试获取module 1622 execution 102 的 story link >> execution title='模块1602' +测试获取module 21 branch 0 的 story link >> product title='模块1' +测试获取module 22 branch 1 的 story link >> product title='模块2' +测试获取module 1821 branch 2 的 story link >> product title='产品模块1' + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); $projectID = array(11,12); @@ -37,4 +47,4 @@ r($tree->createStoryLinkTest($moduleID[4], $extra5)) && p() && e("execution titl r($tree->createStoryLinkTest($moduleID[5], $extra6)) && p() && e("execution title='模块1602'"); // 测试获取module 1622 execution 102 的 story link r($tree->createStoryLinkTest($moduleID[6], $extra7)) && p() && e("product title='模块1'"); // 测试获取module 21 branch 0 的 story link r($tree->createStoryLinkTest($moduleID[7], $extra8)) && p() && e("product title='模块2'"); // 测试获取module 22 branch 1 的 story link -r($tree->createStoryLinkTest($moduleID[0], $extra9)) && p() && e("product title='产品模块1'"); // 测试获取module 1821 branch 2 的 story link +r($tree->createStoryLinkTest($moduleID[0], $extra9)) && p() && e("product title='产品模块1'"); // 测试获取module 1821 branch 2 的 story link \ No newline at end of file diff --git a/test/model/tree/createtasklink.php b/test/model/tree/createtasklink.php index f523bd5957..9f3864693a 100755 --- a/test/model/tree/createtasklink.php +++ b/test/model/tree/createtasklink.php @@ -10,6 +10,23 @@ title=测试 treeModel->createTaskLink(); cid=1 pid=1 +测试获取module 1821 product 1 execution 101 的 story link >> 101 1821 title='产品模块1' +测试获取module 1822 product 1 execution 101 的 story link >> 101 1822 title='产品模块2' +测试获取module 1981 product 1 execution 101 的 story link >> 101 1981 title='产品模块161' +测试获取module 1982 product 1 execution 101 的 story link >> 101 1982 title='产品模块162' +测试获取module 1621 product 1 execution 101 的 story link >> 101 1621 title='模块1601' +测试获取module 1622 product 1 execution 101 的 story link >> 101 1622 title='模块1602' +测试获取module 21 product 1 execution 101 的 story link >> 101 21 title='模块1' +测试获取module 22 product 1 execution 101 的 story link >> 101 22 title='模块2' +测试获取module 1821 product 2 execution 102 的 story link >> 102 1821 title='产品模块1' +测试获取module 1822 product 2 execution 102 的 story link >> 102 1822 title='产品模块2' +测试获取module 1981 product 2 execution 102 的 story link >> 102 1981 title='产品模块161' +测试获取module 1982 product 2 execution 102 的 story link >> 102 1982 title='产品模块162' +测试获取module 1621 product 2 execution 102 的 story link >> 102 1621 title='模块1601' +测试获取module 1622 product 2 execution 102 的 story link >> 102 1622 title='模块1602' +测试获取module 21 product 2 execution 102 的 story link >> 102 21 title='模块1' +测试获取module 22 product 2 execution 102 的 story link >> 102 22 title='模块2' + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); $productID = array(1, 2); @@ -35,4 +52,4 @@ r($tree->createTaskLinkTest($moduleID[3], $extra2)) && p() && e("102 1982 title= r($tree->createTaskLinkTest($moduleID[4], $extra2)) && p() && e("102 1621 title='模块1601'"); // 测试获取module 1621 product 2 execution 102 的 story link r($tree->createTaskLinkTest($moduleID[5], $extra2)) && p() && e("102 1622 title='模块1602'"); // 测试获取module 1622 product 2 execution 102 的 story link r($tree->createTaskLinkTest($moduleID[6], $extra2)) && p() && e("102 21 title='模块1'"); // 测试获取module 21 product 2 execution 102 的 story link -r($tree->createTaskLinkTest($moduleID[7], $extra2)) && p() && e("102 22 title='模块2'"); // 测试获取module 22 product 2 execution 102 的 story link +r($tree->createTaskLinkTest($moduleID[7], $extra2)) && p() && e("102 22 title='模块2'"); // 测试获取module 22 product 2 execution 102 的 story link \ No newline at end of file diff --git a/test/model/tree/createtaskmanagelink.php b/test/model/tree/createtaskmanagelink.php index fdd76b4fdc..da967aa829 100755 --- a/test/model/tree/createtaskmanagelink.php +++ b/test/model/tree/createtaskmanagelink.php @@ -10,6 +10,31 @@ title=测试 treeModel->createTaskManageLink(); cid=1 pid=1 +测试获取module 1821 product 1 execution 101 的 story manage link >> 产品模块1 browsetask 子模块 +测试获取module 1822 product 1 execution 101 的 story manage link >> 产品模块2 browsetask 子模块 +测试获取module 1981 product 1 execution 101 的 story manage link >> 产品模块161 browsetask 子模块 +测试获取module 1982 product 1 execution 101 的 story manage link >> 产品模块162 browsetask 子模块 +测试获取module 1621 product 1 execution 101 的 story manage link >> 模块1601 [T] edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 1622 product 1 execution 101 的 story manage link >> 模块1602 [T] edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 21 product 1 execution 101 的 story manage link >> 模块1 [T] edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 22 product 1 execution 101 的 story manage link >> 模块2 [T] edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 1821 product 2 execution 102 的 story manage link >> 产品模块1 browsetask 子模块 +测试获取module 1822 product 2 execution 102 的 story manage link >> 产品模块2 browsetask 子模块 +测试获取module 1981 product 2 execution 102 的 story manage link >> 产品模块161 browsetask 子模块 +测试获取module 1982 product 2 execution 102 的 story manage link >> 产品模块162 browsetask 子模块 +测试获取module 1621 product 2 execution 102 的 story manage link >> 模块1601 [T] edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 1622 product 2 execution 102 的 story manage link >> 模块1602 [T] edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 21 product 2 execution 102 的 story manage link >> 模块1 [T] edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 22 product 2 execution 102 的 story manage link >> 模块2 [T] edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 1821 product 1 execution 101 tip null 的 story manage link >> 产品模块1 browsetask 子模块 +测试获取module 1822 product 1 execution 101 tip null 的 story manage link >> 产品模块2 browsetask 子模块 +测试获取module 21 product 1 execution 101 tip null的 story manage link >> 模块1 edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 22 product 1 execution 101 tip null的 story manage link >> 模块2 edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 1821 product 2 execution 102 tip null的 story manage link >> 产品模块1 browsetask 子模块 +测试获取module 1822 product 2 execution 102 tip null的 story manage link >> 产品模块2 browsetask 子模块 +测试获取module 21 product 2 execution 102 tip null 的 story manage link >> 模块1 edit 编辑模块 browsetask 子模块 delete 删除 +测试获取module 22 product 2 execution 102 tip null 的 story manage link >> 模块2 edit 编辑模块 browsetask 子模块 delete 删除 + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); $productID = array(1, 2); @@ -46,4 +71,4 @@ r($tree->createTaskManageLinkTest($moduleID[7], $extra3)) && p() && e("模块2 e r($tree->createTaskManageLinkTest($moduleID[0], $extra4)) && p() && e("产品模块1 browsetask 子模块"); // 测试获取module 1821 product 2 execution 102 tip null的 story manage link r($tree->createTaskManageLinkTest($moduleID[1], $extra4)) && p() && e("产品模块2 browsetask 子模块"); // 测试获取module 1822 product 2 execution 102 tip null的 story manage link r($tree->createTaskManageLinkTest($moduleID[6], $extra4)) && p() && e("模块1 edit 编辑模块 browsetask 子模块 delete 删除"); // 测试获取module 21 product 2 execution 102 tip null 的 story manage link -r($tree->createTaskManageLinkTest($moduleID[7], $extra4)) && p() && e("模块2 edit 编辑模块 browsetask 子模块 delete 删除"); // 测试获取module 22 product 2 execution 102 tip null 的 story manage link +r($tree->createTaskManageLinkTest($moduleID[7], $extra4)) && p() && e("模块2 edit 编辑模块 browsetask 子模块 delete 删除"); // 测试获取module 22 product 2 execution 102 tip null 的 story manage link \ No newline at end of file diff --git a/test/model/tree/createtesttasklink.php b/test/model/tree/createtesttasklink.php index 049e7d7068..d9057623c6 100755 --- a/test/model/tree/createtesttasklink.php +++ b/test/model/tree/createtesttasklink.php @@ -10,6 +10,15 @@ title=测试 treeModel->createTestTaskLink(); cid=1 pid=1 +测试创建module 1821 的TestTasklink >> title='产品模块1' +测试创建module 1822 的TestTasklink >> title='产品模块2' +测试创建module 1981 的TestTasklink >> title='产品模块161' +测试创建module 1982 的TestTasklink >> title='产品模块162' +测试创建module 1621 的TestTasklink >> title='模块1601' +测试创建module 1622 的TestTasklink >> title='模块1602' +测试创建module 21 的TestTasklink >> title='模块1' +测试创建module 22 的TestTasklink >> title='模块2' + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); $extra = 1; @@ -23,4 +32,4 @@ r($tree->createTestTaskLinkTest($moduleID[3], $extra)) && p() && e("title='产 r($tree->createTestTaskLinkTest($moduleID[4], $extra)) && p() && e("title='模块1601'"); // 测试创建module 1621 的TestTasklink r($tree->createTestTaskLinkTest($moduleID[5], $extra)) && p() && e("title='模块1602'"); // 测试创建module 1622 的TestTasklink r($tree->createTestTaskLinkTest($moduleID[6], $extra)) && p() && e("title='模块1'"); // 测试创建module 21 的TestTasklink -r($tree->createTestTaskLinkTest($moduleID[7], $extra)) && p() && e("title='模块2'"); // 测试创建module 22 的TestTasklink +r($tree->createTestTaskLinkTest($moduleID[7], $extra)) && p() && e("title='模块2'"); // 测试创建module 22 的TestTasklink \ No newline at end of file diff --git a/test/model/tree/delete.php b/test/model/tree/delete.php index 0a75bca8ff..97ae33c36a 100755 --- a/test/model/tree/delete.php +++ b/test/model/tree/delete.php @@ -10,6 +10,15 @@ title=测试 treeModel->delete(); cid=1 pid=1 +测试删除module 1821 >> 1 +测试删除module 1822 >> 1 +测试删除module 1981 >> 1 +测试删除module 1982 >> 1 +测试删除module 1621 >> 1 +测试删除module 1622 >> 1 +测试删除module 21 >> 1 +测试删除module 22 >> 1 + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); @@ -26,4 +35,4 @@ r($tree->deleteTest($moduleID[5])) && p('deleted') && e('1'); // 测试删除mod r($tree->deleteTest($moduleID[6])) && p('deleted') && e('1'); // 测试删除module 21 r($tree->deleteTest($moduleID[7])) && p('deleted') && e('1'); // 测试删除module 22 ob_end_flush(); -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/tree/fixmodulepath.php b/test/model/tree/fixmodulepath.php index 61d125869a..187d095a11 100755 --- a/test/model/tree/fixmodulepath.php +++ b/test/model/tree/fixmodulepath.php @@ -10,6 +10,16 @@ title=测试 treeModel->fixModulePath(); cid=1 pid=1 +修复root为 1 的module path >> ,1821,;,1821,2621,;,2221,2821, +修复root为 2 的module path >> ,1825,;,1825,2623,;,2225,2823, +修复root为 3 的module path >> ,1829,;,1829,2625,;,2229,2825, +修复root为 41 的module path >> ,1981,;,1981,2701,;,2381,2901, +修复root为 42 的module path >> ,1985,;,1985,2703,;,2385,2903, +修复root为 43 的module path >> ,1989,;,1989,2705,;,2389,2905, +修复root为 101 的module path >> ,21,;,22,;,21,3021, +修复root为 102 的module path >> ,24,;,25,;,23,3022 +修复root为 103 的module path >> ,27,;,28,;,25,3023 + */ $root = array(1, 2, 3, 41, 42, 43, 101, 102, 103); $type = array('story', 'task'); @@ -25,4 +35,4 @@ r($tree->fixModulePathTest($root[5], $type[0])) && p('1989:path;2705:path;2905:p r($tree->fixModulePathTest($root[6], $type[1])) && p('21:path;22:path;3021:path') && e(',21,;,22,;,21,3021,'); // 修复root为 101 的module path r($tree->fixModulePathTest($root[7], $type[1])) && p('24:path;25:path;3022:path') && e(',24,;,25,;,23,3022'); // 修复root为 102 的module path r($tree->fixModulePathTest($root[8], $type[1])) && p('27:path;28:path;3023:path') && e(',27,;,28,;,25,3023'); // 修复root为 103 的module path -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/tree/getallchildid.php b/test/model/tree/getallchildid.php index 34bfafdb0f..3370bcd04a 100755 --- a/test/model/tree/getallchildid.php +++ b/test/model/tree/getallchildid.php @@ -10,6 +10,19 @@ title=测试 treeModel->getAllChildId(); cid=1 pid=1 +测试获取module 1821 的全部子项 >> ,1821,2621,2622 +测试获取module 1821 的全部子项 >> ,1822 +测试获取module 1821 的全部子项 >> ,1825,2623,2624 +测试获取module 1821 的全部子项 >> ,1826 +测试获取module 1821 的全部子项 >> ,1981,2701,2702 +测试获取module 1821 的全部子项 >> ,1982 +测试获取module 1821 的全部子项 >> ,1985,2703,2704 +测试获取module 1821 的全部子项 >> ,1986 +测试获取module 1821 的全部子项 >> ,21,3021 +测试获取module 1821 的全部子项 >> ,22 +测试获取module 1821 的全部子项 >> ,24 +测试获取module 1821 的全部子项 >> ,25,3023 + */ $moduleID = array(1821, 1822, 1825, 1826, 1981, 1982, 1985, 1986, 21, 22, 24, 25); @@ -26,4 +39,4 @@ r($tree->getAllChildIdTest($moduleID[7])) && p() && e(',1986'); // r($tree->getAllChildIdTest($moduleID[8])) && p() && e(',21,3021'); // 测试获取module 1821 的全部子项 r($tree->getAllChildIdTest($moduleID[9])) && p() && e(',22'); // 测试获取module 1821 的全部子项 r($tree->getAllChildIdTest($moduleID[10])) && p() && e(',24'); // 测试获取module 1821 的全部子项 -r($tree->getAllChildIdTest($moduleID[11])) && p() && e(',25,3023'); // 测试获取module 1821 的全部子项 +r($tree->getAllChildIdTest($moduleID[11])) && p() && e(',25,3023'); // 测试获取module 1821 的全部子项 \ No newline at end of file diff --git a/test/model/tree/getallmodulepairs.php b/test/model/tree/getallmodulepairs.php index 3b7b326359..4c620e5441 100755 --- a/test/model/tree/getallmodulepairs.php +++ b/test/model/tree/getallmodulepairs.php @@ -10,6 +10,11 @@ title=测试 treeModel->getAllModulePairs(); cid=1 pid=1 +测试获取默认(task)的模块信息 >> 3601 +测试获取默认(task)的模块信息 >> 1501 +测试获取默认(task)的模块信息 >> 1501 +测试获取默认(task)的模块信息 >> 3601 + */ $type = array('bug', 'case', 'task'); @@ -18,4 +23,4 @@ $tree = new treeTest(); r($tree->getAllModulePairsTest()) && p() && e('3601'); // 测试获取默认(task)的模块信息 r($tree->getAllModulePairsTest($type[0])) && p() && e('1501'); // 测试获取默认(task)的模块信息 r($tree->getAllModulePairsTest($type[1])) && p() && e('1501'); // 测试获取默认(task)的模块信息 -r($tree->getAllModulePairsTest($type[2])) && p() && e('3601'); // 测试获取默认(task)的模块信息 +r($tree->getAllModulePairsTest($type[2])) && p() && e('3601'); // 测试获取默认(task)的模块信息 \ No newline at end of file diff --git a/test/model/tree/getbyid.php b/test/model/tree/getbyid.php index 1e549e57fa..8c6662dc50 100755 --- a/test/model/tree/getbyid.php +++ b/test/model/tree/getbyid.php @@ -10,6 +10,15 @@ title=测试 treeModel->getByID(); cid=1 pid=1 +测试获取module 1821 的信息 >> 1,产品模块1,模块简称1 +测试获取module 1822 的信息 >> 1,产品模块2,模块简称2 +测试获取module 1981 的信息 >> 41,产品模块161,模块简称161 +测试获取module 1982 的信息 >> 41,产品模块162,模块简称162 +测试获取module 1621 的信息 >> 634,模块1601,模块简称1601 +测试获取module 1622 的信息 >> 634,模块1602,模块简称1602 +测试获取module 21 的信息 >> 101,模块1,模块简称1 +测试获取module 22 的信息 >> 101,模块2,模块简称2 + */ $moduleID = array(1821, 1822, 1981, 1982, 1621, 1622, 21, 22); @@ -22,4 +31,4 @@ r($tree->getByIDTest($moduleID[3])) && p('root,name,short') && e('41,产品模 r($tree->getByIDTest($moduleID[4])) && p('root,name,short') && e('634,模块1601,模块简称1601'); // 测试获取module 1621 的信息 r($tree->getByIDTest($moduleID[5])) && p('root,name,short') && e('634,模块1602,模块简称1602'); // 测试获取module 1622 的信息 r($tree->getByIDTest($moduleID[6])) && p('root,name,short') && e('101,模块1,模块简称1'); // 测试获取module 21 的信息 -r($tree->getByIDTest($moduleID[7])) && p('root,name,short') && e('101,模块2,模块简称2'); // 测试获取module 22 的信息 +r($tree->getByIDTest($moduleID[7])) && p('root,name,short') && e('101,模块2,模块简称2'); // 测试获取module 22 的信息 \ No newline at end of file diff --git a/test/model/tree/getdatastructure.php b/test/model/tree/getdatastructure.php index 0ecab517dd..18ef44ef15 100755 --- a/test/model/tree/getdatastructure.php +++ b/test/model/tree/getdatastructure.php @@ -10,6 +10,16 @@ title=测试 treeModel->getDataStructure(); cid=1 pid=1 +测试获取root 1 type story 的树结构 >> 1821:2;2221:2;1822:0;2222:0;1823:0;2223:0;1824:0;2224:0; +测试获取root 2 type story 的树结构 >> 1825:2;2225:2;1826:0;2226:0;1827:0;2227:0;1828:0;2228:0; +测试获取root 3 type story 的树结构 >> 1831:0;2231:0;1832:0;2232:0;1829:2;2229:2;1830:0;2230:0; +测试获取root 41 type story 的树结构 >> 1981:2;2381:2;1982:0;2382:0;1983:0;2383:0;1984:0;2384:0; +测试获取root 42 type story 的树结构 >> 1985:2;2385:2;1986:0;2386:0;1987:0;2387:0;1988:0;2388:0; +测试获取root 43 type story 的树结构 >> 1991:0;2391:0;1992:0;2392:0;1989:2;2389:2;1990:0;2390:0; +测试获取root 101 type task 的树结构 >> 0 +测试获取root 102 type task 的树结构 >> 0 +测试获取root 103 type task 的树结构 >> 0 + */ $root = array(1, 2, 3, 41, 42, 43, 101, 102, 103); $type = array('story', 'task'); @@ -24,4 +34,4 @@ r($tree->getDataStructureTest($root[4], $type[0])) && p() && e('1985:2;2385:2;19 r($tree->getDataStructureTest($root[5], $type[0])) && p() && e('1991:0;2391:0;1992:0;2392:0;1989:2;2389:2;1990:0;2390:0;'); // 测试获取root 43 type story 的树结构 r($tree->getDataStructureTest($root[6], $type[1])) && p() && e('0'); // 测试获取root 101 type task 的树结构 r($tree->getDataStructureTest($root[7], $type[1])) && p() && e('0'); // 测试获取root 102 type task 的树结构 -r($tree->getDataStructureTest($root[8], $type[1])) && p() && e('0'); // 测试获取root 103 type task 的树结构 +r($tree->getDataStructureTest($root[8], $type[1])) && p() && e('0'); // 测试获取root 103 type task 的树结构 \ No newline at end of file diff --git a/test/model/tree/getdocstructure.php b/test/model/tree/getdocstructure.php index c3a553147c..f2f343f4ab 100755 --- a/test/model/tree/getdocstructure.php +++ b/test/model/tree/getdocstructure.php @@ -10,8 +10,10 @@ title=测试 treeModel->getDocStructure(); cid=1 pid=1 +测试获取doc树 >> 3621:2;3626:2;3631:2;3636:2;3641:2;3646:2;3651:2;3656:2;3661:2;3666:2;3671:2;3676:2;3681:2;3686:2;3691:2;3696:2;3701:2;3706:2;3711:2;3716:2;3622:2;3627:2;3632:2;3637:2;3642:2;3647:2;3652:2;3657:2;3662:2;3667:2;3672:2;3677:2;3682:2;3687:2;3692:2;3697:2;3702:2;3707:2;3712:2;3717:2;3623:2;3628:2;3633:2;3638:2;3643:2;3648:2;3653:2;3658:2;3663:2;3668:2;3673:2;3678:2;3683:2;3688:2;3693:2;3698:2;3703:2;3708:2;3713:2;3718:2;3624:2;3629:2;3634:2;3639:2;3644:2;3649:2;3654:2;3659:2;3664:2;3669:2;3674:2;3679:2;3684:2;3689:2;3694:2;3699:2;3704:2;3709:2;3714:2;3719:2;3625:2;3630:2;3635:2;3640:2;3645:2;3650:2;3655:2;3660:2;3665:2;3670:2;3675:2;3680:2;3685:2;3690:2;3695:2;3700:2;3705:2;3710:2;3715:2;3720:2; + */ $tree = new treeTest(); -r($tree->getDocStructureTest()) && p() && e('3621:2;3626:2;3631:2;3636:2;3641:2;3646:2;3651:2;3656:2;3661:2;3666:2;3671:2;3676:2;3681:2;3686:2;3691:2;3696:2;3701:2;3706:2;3711:2;3716:2;3622:2;3627:2;3632:2;3637:2;3642:2;3647:2;3652:2;3657:2;3662:2;3667:2;3672:2;3677:2;3682:2;3687:2;3692:2;3697:2;3702:2;3707:2;3712:2;3717:2;3623:2;3628:2;3633:2;3638:2;3643:2;3648:2;3653:2;3658:2;3663:2;3668:2;3673:2;3678:2;3683:2;3688:2;3693:2;3698:2;3703:2;3708:2;3713:2;3718:2;3624:2;3629:2;3634:2;3639:2;3644:2;3649:2;3654:2;3659:2;3664:2;3669:2;3674:2;3679:2;3684:2;3689:2;3694:2;3699:2;3704:2;3709:2;3714:2;3719:2;3625:2;3630:2;3635:2;3640:2;3645:2;3650:2;3655:2;3660:2;3665:2;3670:2;3675:2;3680:2;3685:2;3690:2;3695:2;3700:2;3705:2;3710:2;3715:2;3720:2;'); //测试获取doc树 +r($tree->getDocStructureTest()) && p() && e('3621:2;3626:2;3631:2;3636:2;3641:2;3646:2;3651:2;3656:2;3661:2;3666:2;3671:2;3676:2;3681:2;3686:2;3691:2;3696:2;3701:2;3706:2;3711:2;3716:2;3622:2;3627:2;3632:2;3637:2;3642:2;3647:2;3652:2;3657:2;3662:2;3667:2;3672:2;3677:2;3682:2;3687:2;3692:2;3697:2;3702:2;3707:2;3712:2;3717:2;3623:2;3628:2;3633:2;3638:2;3643:2;3648:2;3653:2;3658:2;3663:2;3668:2;3673:2;3678:2;3683:2;3688:2;3693:2;3698:2;3703:2;3708:2;3713:2;3718:2;3624:2;3629:2;3634:2;3639:2;3644:2;3649:2;3654:2;3659:2;3664:2;3669:2;3674:2;3679:2;3684:2;3689:2;3694:2;3699:2;3704:2;3709:2;3714:2;3719:2;3625:2;3630:2;3635:2;3640:2;3645:2;3650:2;3655:2;3660:2;3665:2;3670:2;3675:2;3680:2;3685:2;3690:2;3695:2;3700:2;3705:2;3710:2;3715:2;3720:2;'); //测试获取doc树 \ No newline at end of file diff --git a/test/model/tree/getmodulepairs.php b/test/model/tree/getmodulepairs.php index 2fa4237325..7d9cbb5157 100755 --- a/test/model/tree/getmodulepairs.php +++ b/test/model/tree/getmodulepairs.php @@ -10,6 +10,16 @@ title=测试 treeModel->getModulePairs(); cid=1 pid=1 +测试获取root 1 type story 的树结构 >> 12 +测试获取root 2 type story 的树结构 >> 12 +测试获取root 3 type story 的树结构 >> 12 +测试获取root 41 type story 的树结构 >> 12 +测试获取root 42 type story 的树结构 >> 12 +测试获取root 43 type story 的树结构 >> 12 +测试获取root 101 type task 的树结构 >> 40 +测试获取root 102 type task 的树结构 >> 40 +测试获取root 103 type task 的树结构 >> 40 + */ $root = array(1, 2, 3, 41, 42, 43, 101, 102, 103); $type = array('story', 'task'); @@ -24,4 +34,4 @@ r($tree->getModulePairsTest($root[4], $type[0])) && p() && e('12'); // 测试获 r($tree->getModulePairsTest($root[5], $type[0])) && p() && e('12'); // 测试获取root 43 type story 的树结构 r($tree->getModulePairsTest($root[6], $type[1])) && p() && e('40'); // 测试获取root 101 type task 的树结构 r($tree->getModulePairsTest($root[7], $type[1])) && p() && e('40'); // 测试获取root 102 type task 的树结构 -r($tree->getModulePairsTest($root[8], $type[1])) && p() && e('40'); // 测试获取root 103 type task 的树结构 +r($tree->getModulePairsTest($root[8], $type[1])) && p() && e('40'); // 测试获取root 103 type task 的树结构 \ No newline at end of file diff --git a/test/model/tree/getmodulesname.php b/test/model/tree/getmodulesname.php index f16b387dcc..d9c4fd4e44 100755 --- a/test/model/tree/getmodulesname.php +++ b/test/model/tree/getmodulesname.php @@ -10,6 +10,11 @@ title=测试 treeModel->getModulesName(); cid=1 pid=1 +测试获取module 1821 1981 的module name >> /产品模块1;/产品模块161 +测试获取module 1982 1621 的module name >> /产品模块162;/模块1601 +测试获取module 1822 22 的module name >> /产品模块2;/模块2 +测试获取module 1622 21 的module name >> /模块1602;/模块1 + */ $moduleIDList = array(array(1821, 1981), array(1982, 1621), array(1822, 22), array(1622, 21)); @@ -18,4 +23,4 @@ $tree = new treeTest(); r($tree->getModulesNameTest($moduleIDList[0])) && p('1821;1981') && e('/产品模块1;/产品模块161'); // 测试获取module 1821 1981 的module name r($tree->getModulesNameTest($moduleIDList[1])) && p('1982;1621') && e('/产品模块162;/模块1601'); // 测试获取module 1982 1621 的module name r($tree->getModulesNameTest($moduleIDList[2])) && p('1822;22') && e('/产品模块2;/模块2'); // 测试获取module 1822 22 的module name -r($tree->getModulesNameTest($moduleIDList[3])) && p('1622;21') && e('/模块1602;/模块1'); // 测试获取module 1622 21 的module name +r($tree->getModulesNameTest($moduleIDList[3])) && p('1622;21') && e('/模块1602;/模块1'); // 测试获取module 1622 21 的module name \ No newline at end of file diff --git a/test/model/tree/getoptionmenu.php b/test/model/tree/getoptionmenu.php index b0c50a7e71..519ec10a43 100755 --- a/test/model/tree/getoptionmenu.php +++ b/test/model/tree/getoptionmenu.php @@ -10,6 +10,15 @@ title=测试 treeModel->getOptionMenu(); cid=1 pid=1 +测试获取root 1 type story 的目录 >> 13 +测试获取root 2 type story 的目录 >> 13 +测试获取root 41 type story 的目录 >> 11 +测试获取root 42 type story 的目录 >> 11 +测试获取root 101 type task 的目录 >> 5 +测试获取root 102 type task 的目录 >> 4 +测试获取root 1 type doc 的目录 >> 4 +测试获取root 2 type doc 的目录 >> 4 + */ $root = array(1, 2, 41, 42, 101, 102); $type = array('story', 'task', 'doc'); @@ -23,4 +32,4 @@ r($tree->getOptionMenuTest($root[3], $type[0])) && p() && e('11'); // 测试获 r($tree->getOptionMenuTest($root[4], $type[1])) && p() && e('5'); // 测试获取root 101 type task 的目录 r($tree->getOptionMenuTest($root[5], $type[1])) && p() && e('4'); // 测试获取root 102 type task 的目录 r($tree->getOptionMenuTest($root[0], $type[2])) && p() && e('4'); // 测试获取root 1 type doc 的目录 -r($tree->getOptionMenuTest($root[1], $type[2])) && p() && e('4'); // 测试获取root 2 type doc 的目录 +r($tree->getOptionMenuTest($root[1], $type[2])) && p() && e('4'); // 测试获取root 2 type doc 的目录 \ No newline at end of file diff --git a/test/model/tree/getparents.php b/test/model/tree/getparents.php index 4749478999..36084a21d8 100755 --- a/test/model/tree/getparents.php +++ b/test/model/tree/getparents.php @@ -10,6 +10,17 @@ title=测试 treeModel->getParents(); cid=1 pid=1 +获取 module 1821 的父module >> ,1821 +获取 module 2621 的父module >> ,1821,2621 +获取 module 2622 的父module >> ,1821,2622 +获取 module 21 的父module >> ,21 +获取 module 3021 的父module >> ,21,3021 +获取 module 3022 的父module >> ,23,3022 +获取 module 3621 的父module >> ,3621 +获取 module 3721 的父module >> ,3621,3721 +获取 module 3722 的父module >> ,3621,3722 +获取 module 0 的父module >> 0 + */ $moduleID = array(1821, 2621, 2622, 21, 3021, 3022, 3621, 3721, 3722, 0); @@ -25,4 +36,4 @@ r($tree->getParentsTest($moduleID[5])) && p() && e(',23,3022'); // 获取 modu r($tree->getParentsTest($moduleID[6])) && p() && e(',3621'); // 获取 module 3621 的父module r($tree->getParentsTest($moduleID[7])) && p() && e(',3621,3721'); // 获取 module 3721 的父module r($tree->getParentsTest($moduleID[8])) && p() && e(',3621,3722'); // 获取 module 3722 的父module -r($tree->getParentsTest($moduleID[9])) && p() && e('0'); // 获取 module 0 的父module +r($tree->getParentsTest($moduleID[9])) && p() && e('0'); // 获取 module 0 的父module \ No newline at end of file diff --git a/test/model/tree/getproduct.php b/test/model/tree/getproduct.php index 2fa427446d..e062b64985 100755 --- a/test/model/tree/getproduct.php +++ b/test/model/tree/getproduct.php @@ -10,6 +10,17 @@ title=测试 treeModel->getProduct(); cid=1 pid=1 +获取module 1821 的产品 >> 正常产品1 +获取module 1825 的产品 >> 正常产品2 +获取module 2621 的产品 >> 正常产品1 +获取module 21 的产品 >> 0 +获取module 25 的产品 >> 0 +获取module 3021 的产品 >> 0 +获取module 3621 的产品 >> 0 +获取module 3622 的产品 >> 0 +获取module 3722 的产品 >> 0 +获取module 0 的产品 >> 0 + */ $moduleID = array(1821, 1825, 2621, 21, 25, 3021, 3621, 3622, 3722, 0); @@ -24,4 +35,4 @@ r($tree->getProductTest($moduleID[5])) && p('name') && e('0'); // 获取 r($tree->getProductTest($moduleID[6])) && p('name') && e('0'); // 获取module 3621 的产品 r($tree->getProductTest($moduleID[7])) && p('name') && e('0'); // 获取module 3622 的产品 r($tree->getProductTest($moduleID[8])) && p('name') && e('0'); // 获取module 3722 的产品 -r($tree->getProductTest($moduleID[9])) && p('name') && e('0'); // 获取module 0 的产品 +r($tree->getProductTest($moduleID[9])) && p('name') && e('0'); // 获取module 0 的产品 \ No newline at end of file diff --git a/test/model/tree/getproductstructure.php b/test/model/tree/getproductstructure.php index 4854115266..e0a100a37c 100755 --- a/test/model/tree/getproductstructure.php +++ b/test/model/tree/getproductstructure.php @@ -10,6 +10,19 @@ title=测试 treeModel->getProductStructure(); cid=1 pid=1 +测试获取 root 1 type story 的树结构 >> 1821:2;2221:2;1822:0;2222:0;1823:0;2223:0;1824:0;2224:0; +测试获取 root 2 type story 的树结构 >> 1825:2;2225:2;1826:0;2226:0;1827:0;2227:0;1828:0;2228:0; +测试获取 root 3 type story 的树结构 >> 1831:0;2231:0;1832:0;2232:0;1829:2;2229:2;1830:0;2230:0; +测试获取 root 41 type story 的树结构 >> 1981:2;2381:2;1982:0;2382:0;1983:0;2383:0;1984:0;2384:0; +测试获取 root 42 type story 的树结构 >> 1985:2;2385:2;1986:0;2386:0;1987:0;2387:0;1988:0;2388:0; +测试获取 root 43 type story 的树结构 >> 1991:0;2391:0;1992:0;2392:0;1989:2;2389:2;1990:0;2390:0; +测试获取 root 101 type task 的树结构 >> 0 +测试获取 root 102 type task 的树结构 >> 0 +测试获取 root 103 type task 的树结构 >> 0 +测试获取 root 1 type doc 的树结构 >> 3621:2; +测试获取 root 2 type doc 的树结构 >> 3622:2; +测试获取 root 3 type doc 的树结构 >> 3623:2; + */ $root = array(1, 2, 3, 41, 42, 43, 101, 102, 103); $type = array('story', 'task', 'doc'); @@ -27,4 +40,4 @@ r($tree->getProductStructureTest($root[7], $type[1])) && p() && e('0'); r($tree->getProductStructureTest($root[8], $type[1])) && p() && e('0'); // 测试获取 root 103 type task 的树结构 r($tree->getProductStructureTest($root[0], $type[2])) && p() && e('3621:2;'); // 测试获取 root 1 type doc 的树结构 r($tree->getProductStructureTest($root[1], $type[2])) && p() && e('3622:2;'); // 测试获取 root 2 type doc 的树结构 -r($tree->getProductStructureTest($root[2], $type[2])) && p() && e('3623:2;'); // 测试获取 root 3 type doc 的树结构 +r($tree->getProductStructureTest($root[2], $type[2])) && p() && e('3623:2;'); // 测试获取 root 3 type doc 的树结构 \ No newline at end of file diff --git a/test/model/tree/getprojectmodule.php b/test/model/tree/getprojectmodule.php index 4e137d3b68..fe393f939f 100755 --- a/test/model/tree/getprojectmodule.php +++ b/test/model/tree/getprojectmodule.php @@ -10,6 +10,13 @@ title=测试 treeModel->getProjectModule(); cid=1 pid=1 +测试获取项目模块 1 >> ,1821,2621,2622,1822,1823,1824,2221,2821,2822,2222,2223,2224 +测试获取项目模块 2 >> ,1825,2623,2624,1826,1827,1828,2225,2823,2824,2226,2227,2228 +测试获取项目模块 3 >> ,1829,2625,2626,1830,1831,1832,2229,2825,2826,2230,2231,2232 +测试获取项目模块 4 >> ,1833,2627,2628,1834,1835,1836,2233,2827,2828,2234,2235,2236 +测试获取项目模块 5 >> ,1837,2629,2630,1838,1839,1840,2237,2829,2830,2238,2239,2240 +测试获取项目模块 6 >> ,1841,2631,2632,1842,1843,1844,2241,2831,2832,2242,2243,2244 + */ $projectID = 1; $productID = array(1, 2, 3, 4, 5, 6); @@ -21,4 +28,4 @@ r($tree->getProjectModuleTest($projectID, $productID[1])) && p() && e(',1825,262 r($tree->getProjectModuleTest($projectID, $productID[2])) && p() && e(',1829,2625,2626,1830,1831,1832,2229,2825,2826,2230,2231,2232'); // 测试获取项目模块 3 r($tree->getProjectModuleTest($projectID, $productID[3])) && p() && e(',1833,2627,2628,1834,1835,1836,2233,2827,2828,2234,2235,2236'); // 测试获取项目模块 4 r($tree->getProjectModuleTest($projectID, $productID[4])) && p() && e(',1837,2629,2630,1838,1839,1840,2237,2829,2830,2238,2239,2240'); // 测试获取项目模块 5 -r($tree->getProjectModuleTest($projectID, $productID[5])) && p() && e(',1841,2631,2632,1842,1843,1844,2241,2831,2832,2242,2243,2244'); // 测试获取项目模块 6 +r($tree->getProjectModuleTest($projectID, $productID[5])) && p() && e(',1841,2631,2632,1842,1843,1844,2241,2831,2832,2242,2243,2244'); // 测试获取项目模块 6 \ No newline at end of file diff --git a/test/model/tree/getsons.php b/test/model/tree/getsons.php index 7bcca086d5..547c363a6a 100755 --- a/test/model/tree/getsons.php +++ b/test/model/tree/getsons.php @@ -10,6 +10,25 @@ title=测试 treeModel->getSons(); cid=1 pid=1 +测试获取root 1 module 1821 type story branch 0 的子module >> ,2621,2622 +测试获取root 2 module 1822 type story branch 0 的子module >> ,2623,2624 +测试获取root 41 module 1981 type story branch 0 的子module >> ,2701,2702 +测试获取root 41 module 1981 type story branch 1 的子module >> ,2701,2702 +测试获取root 41 module 1981 type story branch 2 的子module >> ,2701,2702 +测试获取root 41 module 1982 type story branch 0 的子module >> 0 +测试获取root 41 module 1982 type story branch 1 的子module >> 0 +测试获取root 41 module 1982 type story branch 2 的子module >> 0 +测试获取root 42 module 1985 type story branch 0 的子module >> ,2703,2704 +测试获取root 42 module 1985 type story branch 1 的子module >> ,2703,2704 +测试获取root 42 module 1985 type story branch 2 的子module >> ,2703,2704 +测试获取root 42 module 1987 type story branch 0 的子module >> 0 +测试获取root 42 module 1987 type story branch 1 的子module >> 0 +测试获取root 42 module 1987 type story branch 2 的子module >> 0 +测试获取root 101 module 21 type task branch 0 的子module >> ,3021 +测试获取root 102 module 22 type task branch 0 的子module >> 0 +测试获取root 1 module 3621 type doc branch 0 的子module >> ,3721,3722 +测试获取root 2 module 3621 type doc branch 0 的子module >> ,3723,3724 + */ $root = array(1, 2, 41, 42, 101, 102); $module = array(1821, 1825, 1981, 1982, 1985, 1987, 21, 24, 3621, 3622); @@ -35,4 +54,4 @@ r($tree->getSonsTest($root[3], $module[5], $type[0], $branch[2])) && p() && e('0 r($tree->getSonsTest($root[4], $module[6], $type[1], $branch[0])) && p() && e(',3021'); // 测试获取root 101 module 21 type task branch 0 的子module r($tree->getSonsTest($root[5], $module[7], $type[1], $branch[0])) && p() && e('0'); // 测试获取root 102 module 22 type task branch 0 的子module r($tree->getSonsTest($root[0], $module[8], $type[2], $branch[0])) && p() && e(',3721,3722'); // 测试获取root 1 module 3621 type doc branch 0 的子module -r($tree->getSonsTest($root[1], $module[9], $type[2], $branch[0])) && p() && e(',3723,3724'); // 测试获取root 2 module 3621 type doc branch 0 的子module +r($tree->getSonsTest($root[1], $module[9], $type[2], $branch[0])) && p() && e(',3723,3724'); // 测试获取root 2 module 3621 type doc branch 0 的子module \ No newline at end of file diff --git a/test/model/tree/getstorymodule.php b/test/model/tree/getstorymodule.php index 7d304d8d36..7d3f79529e 100755 --- a/test/model/tree/getstorymodule.php +++ b/test/model/tree/getstorymodule.php @@ -10,6 +10,15 @@ title=测试 treeModel->getStoryModule(); cid=1 pid=1 +测试获取module 1821 的story模块 >> 1821 +测试获取module 1822 的story模块 >> 1822 +测试获取module 1982 的story模块 >> 1982 +测试获取module 1983 的story模块 >> 1983 +测试获取module 2621 的story模块 >> 2621 +测试获取module 2622 的story模块 >> 2622 +测试获取module 21 的story模块 >> 0 +测试获取module 3021 的story模块 >> 0 + */ $moduleID = array(1821, 1822, 1982, 1983, 2621, 2622, 21, 3021); @@ -22,4 +31,4 @@ r($tree->getStoryModuleTest($moduleID[3])) && p() && e('1983'); // 测试获取m r($tree->getStoryModuleTest($moduleID[4])) && p() && e('2621'); // 测试获取module 2621 的story模块 r($tree->getStoryModuleTest($moduleID[5])) && p() && e('2622'); // 测试获取module 2622 的story模块 r($tree->getStoryModuleTest($moduleID[6])) && p() && e('0'); // 测试获取module 21 的story模块 -r($tree->getStoryModuleTest($moduleID[7])) && p() && e('0'); // 测试获取module 3021 的story模块 +r($tree->getStoryModuleTest($moduleID[7])) && p() && e('0'); // 测试获取module 3021 的story模块 \ No newline at end of file diff --git a/test/model/tree/gettaskoptionmenu.php b/test/model/tree/gettaskoptionmenu.php index b51bb295c2..3d3527d568 100755 --- a/test/model/tree/gettaskoptionmenu.php +++ b/test/model/tree/gettaskoptionmenu.php @@ -10,6 +10,19 @@ title=测试 treeModel->getTaskOptionMenu(); cid=1 pid=1 +测试获取 root 1 task目录 >> ,/ +测试获取 root 2 task目录 >> ,/ +测试获取 root 3 task目录 >> ,/ +测试获取 root 41 task目录 >> ,/,/已关闭的正常产品31/产品模块122,/已关闭的正常产品31/产品模块124 +测试获取 root 42 task目录 >> ,/,/已关闭的正常产品32/产品模块126,/已关闭的正常产品32/产品模块128 +测试获取 root 43 task目录 >> ,/,/已关闭的正常产品33/产品模块132,/已关闭的正常产品33/产品模块130 +测试获取 root 101 task目录 >> ,/,/正常产品1/产品模块2,/正常产品1/产品模块4,/模块1,/模块1/执行子模块1,/模块2,/模块3 +测试获取 root 101 product 1 task目录 >> ,/,/正常产品1/产品模块2,/正常产品1/产品模块4,/模块1,/模块1/执行子模块1,/模块2,/模块3 +测试获取 root 101 product 1 startModule 3021 task目录 >> ,/,/正常产品1/产品模块2,/正常产品1/产品模块4,/模块1,/模块1/执行子模块1,/模块2,/模块3 +测试获取 root 101 product 1 startModule 3021 allModule task目录 >> ,/,/正常产品1/产品模块2,/正常产品1/产品模块4,/模块1,/模块1/执行子模块1,/模块2,/模块3 +测试获取 root 102 task目录 >> ,/,/正常产品2/产品模块6,/正常产品2/产品模块8,/模块4,/模块5,/模块6 +测试获取 root 103 task目录 >> ,/,/正常产品3/产品模块12,/正常产品3/产品模块10,/模块7,/模块8,/模块9 + */ $root = array(1, 2, 3, 41, 42, 43, 101, 102, 103); $productID = 1; @@ -29,4 +42,4 @@ r($tree->getTaskOptionMenuTest($root[6], $productID)) && p r($tree->getTaskOptionMenuTest($root[6], $productID, $startModule)) && p() && e(',/,/正常产品1/产品模块2,/正常产品1/产品模块4,/模块1,/模块1/执行子模块1,/模块2,/模块3'); // 测试获取 root 101 product 1 startModule 3021 task目录 r($tree->getTaskOptionMenuTest($root[6], $productID, $startModule, $extra)) && p() && e(',/,/正常产品1/产品模块2,/正常产品1/产品模块4,/模块1,/模块1/执行子模块1,/模块2,/模块3'); // 测试获取 root 101 product 1 startModule 3021 allModule task目录 r($tree->getTaskOptionMenuTest($root[7])) && p() && e(',/,/正常产品2/产品模块6,/正常产品2/产品模块8,/模块4,/模块5,/模块6'); // 测试获取 root 102 task目录 -r($tree->getTaskOptionMenuTest($root[8])) && p() && e(',/,/正常产品3/产品模块12,/正常产品3/产品模块10,/模块7,/模块8,/模块9'); // 测试获取 root 103 task目录 +r($tree->getTaskOptionMenuTest($root[8])) && p() && e(',/,/正常产品3/产品模块12,/正常产品3/产品模块10,/模块7,/模块8,/模块9'); // 测试获取 root 103 task目录 \ No newline at end of file diff --git a/test/model/tree/gettasksons.php b/test/model/tree/gettasksons.php index b8d5ceef01..65822c72fb 100755 --- a/test/model/tree/gettasksons.php +++ b/test/model/tree/gettasksons.php @@ -10,6 +10,31 @@ title=测试 treeModel->getTaskSons(); cid=1 pid=1 +测试获取 root 1 product 1 task模块的子模块 >> ,1821,2221,1822,2222,1823,2223,1824,2224 +测试获取 root 1 product 2 task模块的子模块 >> ,1825,2225,1826,2226,1827,2227,1828,2228 +测试获取 root 1 module 1821 task模块的子模块 >> ,2621,2622 +测试获取 root 1 module 1825 task模块的子模块 >> 0 +测试获取 root 1 module 21 task模块的子模块 >> 0 +测试获取 root 1 module 23 task模块的子模块 >> 0 +测试获取 root 2 product 1 task模块的子模块 >> ,1821,2221,1822,2222,1823,2223,1824,2224 +测试获取 root 2 product 2 task模块的子模块 >> ,1825,2225,1826,2226,1827,2227,1828,2228 +测试获取 root 2 module 1821 task模块的子模块 >> 0 +测试获取 root 2 module 1825 task模块的子模块 >> ,2623,2624 +测试获取 root 2 module 21 task模块的子模块 >> 0 +测试获取 root 2 module 23 task模块的子模块 >> 0 +测试获取 root 101 product 1 task模块的子模块 >> ,1821,2221,21,1822,2222,22,1823,2223,23,1824,2224 +测试获取 root 101 product 2 task模块的子模块 >> ,21,22,23,1825,2225,1826,2226,1827,2227,1828,2228 +测试获取 root 101 module 1821 task模块的子模块 >> 0 +测试获取 root 101 module 1825 task模块的子模块 >> 0 +测试获取 root 101 module 21 task模块的子模块 >> ,3021 +测试获取 root 101 module 23 task模块的子模块 >> 0 +测试获取 root 102 product 1 task模块的子模块 >> ,1821,2221,1822,2222,1823,2223,1824,2224,24,25,26 +测试获取 root 102 product 2 task模块的子模块 >> ,24,1825,2225,25,1826,2226,26,1827,2227,1828,2228 +测试获取 root 102 module 1821 task模块的子模块 >> 0 +测试获取 root 102 module 1825 task模块的子模块 >> 0 +测试获取 root 102 module 21 task模块的子模块 >> 0 +测试获取 root 102 module 23 task模块的子模块 >> ,3022 + */ $rootID = array(1, 2, 101, 102); $productID = array(0, 1, 2); @@ -40,4 +65,4 @@ r($tree->getTaskSonsTest($rootID[3], $productID[2], $moduleID[0])) && p() && e(' r($tree->getTaskSonsTest($rootID[3], $productID[0], $moduleID[1])) && p() && e('0'); // 测试获取 root 102 module 1821 task模块的子模块 r($tree->getTaskSonsTest($rootID[3], $productID[0], $moduleID[2])) && p() && e('0'); // 测试获取 root 102 module 1825 task模块的子模块 r($tree->getTaskSonsTest($rootID[3], $productID[0], $moduleID[3])) && p() && e('0'); // 测试获取 root 102 module 21 task模块的子模块 -r($tree->getTaskSonsTest($rootID[3], $productID[0], $moduleID[4])) && p() && e(',3022'); // 测试获取 root 102 module 23 task模块的子模块 +r($tree->getTaskSonsTest($rootID[3], $productID[0], $moduleID[4])) && p() && e(',3022'); // 测试获取 root 102 module 23 task模块的子模块 \ No newline at end of file diff --git a/test/model/tree/gettaskstructure.php b/test/model/tree/gettaskstructure.php index 0858e7db9a..683a2737b9 100755 --- a/test/model/tree/gettaskstructure.php +++ b/test/model/tree/gettaskstructure.php @@ -10,6 +10,13 @@ title=测试 treeModel->getTaskStructure(); cid=1 pid=1 +获取root 101 的task 结构 >> 正常产品1:2;多平台产品81:0;多平台产品91:0;模块1:1;模块2:0模块3:0 +获取root 102 的task 结构 >> 正常产品2:2;多平台产品82:0;多平台产品92:0;模块4:0模块5:0模块6:0 +获取root 103 的task 结构 >> 正常产品3:2;多平台产品83:0;多平台产品93:0;模块7:0模块8:0模块9:0 +获取root 104 的task 结构 >> 正常产品4:2;多平台产品84:0;多平台产品94:0;模块11:0模块12:0模块10:0 +获取root 105 的task 结构 >> 正常产品5:2;多平台产品85:0;多平台产品95:0;模块13:0模块14:0模块15:0 +获取root 106 的task 结构 >> 正常产品6:2;多平台产品86:0;多平台产品96:0;模块16:0模块17:0模块18:0 + */ $root = array(101, 102, 103, 104, 105, 106); @@ -20,4 +27,4 @@ r($tree->getTaskStructureTest($root[1])) && p() && e('正常产品2:2;多平台 r($tree->getTaskStructureTest($root[2])) && p() && e('正常产品3:2;多平台产品83:0;多平台产品93:0;模块7:0模块8:0模块9:0'); // 获取root 103 的task 结构 r($tree->getTaskStructureTest($root[3])) && p() && e('正常产品4:2;多平台产品84:0;多平台产品94:0;模块11:0模块12:0模块10:0'); // 获取root 104 的task 结构 r($tree->getTaskStructureTest($root[4])) && p() && e('正常产品5:2;多平台产品85:0;多平台产品95:0;模块13:0模块14:0模块15:0'); // 获取root 105 的task 结构 -r($tree->getTaskStructureTest($root[5])) && p() && e('正常产品6:2;多平台产品86:0;多平台产品96:0;模块16:0模块17:0模块18:0'); // 获取root 106 的task 结构 +r($tree->getTaskStructureTest($root[5])) && p() && e('正常产品6:2;多平台产品86:0;多平台产品96:0;模块16:0模块17:0模块18:0'); // 获取root 106 的task 结构 \ No newline at end of file diff --git a/test/model/tree/gettasktreemodules.php b/test/model/tree/gettasktreemodules.php index 1935834c1d..c6f560c1a3 100755 --- a/test/model/tree/gettasktreemodules.php +++ b/test/model/tree/gettasktreemodules.php @@ -10,6 +10,23 @@ title=测试 treeModel->getTaskTreeModules(); cid=1 pid=1 +测试获取 execution 101 parent false story 的树 >> ,1822,1824,21,22,23,3021 +测试获取 execution 102 parent false story 的树 >> ,1826,1828,24,25,26,3022 +测试获取 execution 103 parent false story 的树 >> ,1830,1832,27,28,29,3023 +测试获取 execution 104 parent false story 的树 >> ,1834,1836,30,31,32,3024 +测试获取 execution 101 parent true story 的树 >> ,,1822,1824,21,22,23,3021 +测试获取 execution 102 parent true story 的树 >> ,,1826,1828,24,25,26,23,3022 +测试获取 execution 103 parent true story 的树 >> ,,1830,1832,27,28,29,25,3023 +测试获取 execution 104 parent true story 的树 >> ,,1834,1836,30,31,32,27,3024 +测试获取 execution 101 parent false case 的树 >> ,21,22,23,3021 +测试获取 execution 102 parent false case 的树 >> ,24,25,26,3022 +测试获取 execution 103 parent false case 的树 >> ,27,28,29,3023 +测试获取 execution 104 parent false case 的树 >> ,30,31,32,3024 +测试获取 execution 101 parent true case 的树 >> ,,21,22,23,3021 +测试获取 execution 102 parent true case 的树 >> ,,24,25,26,23,3022 +测试获取 execution 103 parent true case 的树 >> ,,27,28,29,25,3023 +测试获取 execution 104 parent true case 的树 >> ,,30,31,32,27,3024 + */ $executionID = array(101, 102, 103, 104); $parent = array(false, true); @@ -32,4 +49,4 @@ r($tree->getTaskTreeModulesTest($executionID[3], $parent[0], $linkObject[1])) && r($tree->getTaskTreeModulesTest($executionID[0], $parent[1], $linkObject[1])) && p() && e(',,21,22,23,3021'); // 测试获取 execution 101 parent true case 的树 r($tree->getTaskTreeModulesTest($executionID[1], $parent[1], $linkObject[1])) && p() && e(',,24,25,26,23,3022'); // 测试获取 execution 102 parent true case 的树 r($tree->getTaskTreeModulesTest($executionID[2], $parent[1], $linkObject[1])) && p() && e(',,27,28,29,25,3023'); // 测试获取 execution 103 parent true case 的树 -r($tree->getTaskTreeModulesTest($executionID[3], $parent[1], $linkObject[1])) && p() && e(',,30,31,32,27,3024'); // 测试获取 execution 104 parent true case 的树 +r($tree->getTaskTreeModulesTest($executionID[3], $parent[1], $linkObject[1])) && p() && e(',,30,31,32,27,3024'); // 测试获取 execution 104 parent true case 的树 \ No newline at end of file diff --git a/test/model/tree/gettreestructure.php b/test/model/tree/gettreestructure.php index 60f4863f5c..b8edf431d3 100755 --- a/test/model/tree/gettreestructure.php +++ b/test/model/tree/gettreestructure.php @@ -10,6 +10,22 @@ title=测试 treeModel->getTreeStructure(); cid=1 pid=1 +测试获取root 1 story 的树结构 >> 1821:2;2221:2;1822:0;2222:0;1823:0;2223:0;1824:0;2224:0; +测试获取root 2 story 的树结构 >> 1825:2;2225:2;1826:0;2226:0;1827:0;2227:0;1828:0;2228:0; +测试获取root 3 story 的树结构 >> 1831:0;2231:0;1832:0;2232:0;1829:2;2229:2;1830:0;2230:0; +测试获取root 41 story 的树结构 >> 1981:2;2381:2;1982:0;2382:0;1983:0;2383:0;1984:0;2384:0; +测试获取root 42 story 的树结构 >> 1985:2;2385:2;1986:0;2386:0;1987:0;2387:0;1988:0;2388:0; +测试获取root 43 story 的树结构 >> 1991:0;2391:0;1992:0;2392:0;1989:2;2389:2;1990:0;2390:0; +测试获取root 1 case 的树结构 >> 1821:2;2221:2;3921:2;1822:0;2222:0;1823:0;2223:0;1824:0;2224:0; +测试获取root 2 case 的树结构 >> 3922:2;1825:2;2225:2;1826:0;2226:0;1827:0;2227:0;1828:0;2228:0; +测试获取root 3 case 的树结构 >> 1831:0;2231:0;1832:0;2232:0;3923:2;1829:2;2229:2;1830:0;2230:0; +测试获取root 1 doc 的树结构 >> 3621:2; +测试获取root 2 doc 的树结构 >> 3622:2; +测试获取root 3 doc 的树结构 >> 3623:2; +测试获取root 101 task 的树结构 >> 0 +测试获取root 102 task 的树结构 >> 0 +测试获取root 103 task 的树结构 >> 0 + */ $root = array(1, 2, 3, 41, 42, 43, 101, 102, 103); $type = array('story', 'case', 'doc', 'task'); @@ -30,4 +46,4 @@ r($tree->getTreeStructureTest($root[1], $type[2])) && p() && e('3622:2;'); r($tree->getTreeStructureTest($root[2], $type[2])) && p() && e('3623:2;'); // 测试获取root 3 doc 的树结构 r($tree->getTreeStructureTest($root[6], $type[3])) && p() && e('0'); // 测试获取root 101 task 的树结构 r($tree->getTreeStructureTest($root[7], $type[3])) && p() && e('0'); // 测试获取root 102 task 的树结构 -r($tree->getTreeStructureTest($root[8], $type[3])) && p() && e('0'); // 测试获取root 103 task 的树结构 +r($tree->getTreeStructureTest($root[8], $type[3])) && p() && e('0'); // 测试获取root 103 task 的树结构 \ No newline at end of file diff --git a/test/model/tree/ismergemodule.php b/test/model/tree/ismergemodule.php index ca7335bbd3..24e3619028 100755 --- a/test/model/tree/ismergemodule.php +++ b/test/model/tree/ismergemodule.php @@ -10,6 +10,16 @@ title=测试 treeModel->isMergeModule(); cid=1 pid=1 +测试检查root 1 type bug 合并模块版本 >> 1 +测试检查root 2 type bug 合并模块版本 >> 1 +测试检查root 3 type bug 合并模块版本 >> 1 +测试检查root 1 type case 合并模块版本 >> 1 +测试检查root 2 type case 合并模块版本 >> 1 +测试检查root 3 type case 合并模块版本 >> 1 +测试检查root 101 type task 合并模块版本 >> 1 +测试检查root 102 type task 合并模块版本 >> 1 +测试检查root 103 type task 合并模块版本 >> 1 + */ $root = array(1, 2, 3, 101, 102, 103); $type = array('bug', 'case', 'task'); @@ -24,4 +34,4 @@ r($tree->isMergeModuleTest($root[1], $type[1])) && p() && e('1'); // 测试检 r($tree->isMergeModuleTest($root[2], $type[1])) && p() && e('1'); // 测试检查root 3 type case 合并模块版本 r($tree->isMergeModuleTest($root[3], $type[2])) && p() && e('1'); // 测试检查root 101 type task 合并模块版本 r($tree->isMergeModuleTest($root[4], $type[2])) && p() && e('1'); // 测试检查root 102 type task 合并模块版本 -r($tree->isMergeModuleTest($root[5], $type[2])) && p() && e('1'); // 测试检查root 103 type task 合并模块版本 +r($tree->isMergeModuleTest($root[5], $type[2])) && p() && e('1'); // 测试检查root 103 type task 合并模块版本 \ No newline at end of file diff --git a/test/model/tree/managechild.php b/test/model/tree/managechild.php index 8d7fba9f50..577c94d4bc 100755 --- a/test/model/tree/managechild.php +++ b/test/model/tree/managechild.php @@ -10,7 +10,12 @@ title=测试 treeModel->manageChild(); cid=1 pid=1 - */ +测试管理module 1821 的子模块 >> ,修改名称的产品子模块1,产品子模块2,新建产品子模块1,新建产品子模块2 +测试管理module 2621 的子模块 >> ,新建产品子模块3,新建产品子模块4 +测试管理module 1981 的子模块 >> ,修改名称的产品子模块81,产品子模块82,新建产品子模块5,新建产品子模块6 +测试管理module 1982 的子模块 >> ,新建产品子模块7,新建产品子模块8 + +*/ $root = array(1, 41); $parentModuleID = array(1821, 2621, 1981, 1982); $branch = array(0, 0, 0, 0, 0); @@ -42,4 +47,4 @@ r($tree->manageChildTest($root[0], $type, $tree1)) && p() && e(',修改名称的 r($tree->manageChildTest($root[0], $type, $tree2)) && p() && e(',新建产品子模块3,新建产品子模块4'); // 测试管理module 2621 的子模块 r($tree->manageChildTest($root[1], $type, $tree3)) && p() && e(',修改名称的产品子模块81,产品子模块82,新建产品子模块5,新建产品子模块6'); // 测试管理module 1981 的子模块 r($tree->manageChildTest($root[1], $type, $tree4)) && p() && e(',新建产品子模块7,新建产品子模块8'); // 测试管理module 1982 的子模块 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/tree/update.php b/test/model/tree/update.php index e94db41efd..14b8c1c35a 100755 --- a/test/model/tree/update.php +++ b/test/model/tree/update.php @@ -10,6 +10,12 @@ title=测试 treeModel->update(); cid=1 pid=1 +测试更新module 1821 的 root >> 2,0,0,产品模块1,模块简称1 +测试更新module 1821 的 root >> 2,0,1822,产品模块1,模块简称1 +测试更新module 1821 的 root >> 2,0,1822,修改后的模块名,模块简称1 +测试更新module 1821 的 root >> 2,0,1822,修改后的模块名,修改后的简称 +测试更新module 1981 的 root >> 41,1,0,产品模块161,模块简称161 + */ $moduleID = array(1821, 1981); @@ -26,4 +32,4 @@ r($tree->updateTest($moduleID[0], $changeParent)) && p('root,branch,parent,name, r($tree->updateTest($moduleID[0], $changeName)) && p('root,branch,parent,name,short') && e('2,0,1822,修改后的模块名,模块简称1'); // 测试更新module 1821 的 root r($tree->updateTest($moduleID[0], $changeShort)) && p('root,branch,parent,name,short') && e('2,0,1822,修改后的模块名,修改后的简称'); // 测试更新module 1821 的 root r($tree->updateTest($moduleID[1], $changeBranch)) && p('root,branch,parent,name,short') && e('41,1,0,产品模块161,模块简称161'); // 测试更新module 1981 的 root -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/tree/updateorder.php b/test/model/tree/updateorder.php index 2efcb273d1..1d1b0c8829 100755 --- a/test/model/tree/updateorder.php +++ b/test/model/tree/updateorder.php @@ -10,6 +10,11 @@ title=测试 treeModel->updateOrder(); cid=1 pid=1 +测试更新模块顺序 1 >> ,2221,2821,1822,2822,1823,2222,2223,1824,2224 +测试更新模块顺序 2 >> ,2221,2821,1822,2822,1823,1824,2222,2223,2224 +测试更新模块顺序 3 >> ,2221,2822,1822,2821,1823,1824,2222,2223,2224 +测试更新模块顺序 4 >> ,1984,2901,2381,2902,2382,2383,2384 + */ $orders1 = array('2221' => 0, '2821' => 1, '2822' => 2, '1822' => 3, '1823' => 4, '2222' => 5, '2223' => 6, '1824' => 7, '2224' => 8); $orders2 = array('2221' => 0, '2821' => 1, '2822' => 2, '1822' => 3, '1823' => 4, '1824' => 5, '2222' => 6, '2223' => 7, '2224' => 8); @@ -22,4 +27,4 @@ r($tree->updateOrderTest($orders1)) && p() && e(',2221,2821,1822,2822,1823,2222, r($tree->updateOrderTest($orders2)) && p() && e(',2221,2821,1822,2822,1823,1824,2222,2223,2224'); // 测试更新模块顺序 2 r($tree->updateOrderTest($orders3)) && p() && e(',2221,2822,1822,2821,1823,1824,2222,2223,2224'); // 测试更新模块顺序 3 r($tree->updateOrderTest($orders4)) && p() && e(',1984,2901,2381,2902,2382,2383,2384'); // 测试更新模块顺序 4 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file From c595eaa0d54382caf0a14df09e4eaeb6baa94e93 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 19 Apr 2022 10:49:03 +0800 Subject: [PATCH 39/42] * Fix bug #21830. --- module/execution/control.php | 9 +++++---- module/project/model.php | 9 ++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/module/execution/control.php b/module/execution/control.php index 0a963e0551..904db8455a 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -1631,7 +1631,7 @@ class execution extends control $this->view->productPlans = $productPlans; $this->view->branchGroups = $this->execution->getBranchByProduct(array_keys($linkedProducts), $this->config->systemMode == 'new' ? $execution->project : 0, 'noclosed', $linkedBranchList); $this->view->teamMembers = $this->execution->getTeamMembers($executionID); - if($this->config->systemMode == 'new') $this->view->allProjects = $this->project->getPairsByModel($project->model, 0, 'noclosed'); + if($this->config->systemMode == 'new') $this->view->allProjects = $this->project->getPairsByModel($project->model, 0, 'noclosed', $project->id); $this->display(); } @@ -1677,8 +1677,9 @@ class execution extends control if($this->app->tab == 'project') { - $this->project->setMenu($this->session->project); - $this->view->project = $this->project->getById($this->session->project); + $projectID = $this->session->project; + $this->project->setMenu($projectID); + $this->view->project = $this->project->getById($projectID); } if(!$this->post->executionIDList) return print(js::locate($this->session->executionList, 'parent')); @@ -1716,7 +1717,7 @@ class execution extends control $this->view->position[] = $this->lang->execution->batchEdit; $this->view->executionIDList = $executionIDList; $this->view->executions = $executions; - $this->view->allProjects = $this->project->getPairsByModel('all', 0, 'noclosed'); + $this->view->allProjects = $this->project->getPairsByModel('all', 0, 'noclosed', isset($projectID) ? $projectID : 0); $this->view->pmUsers = $pmUsers; $this->view->poUsers = $poUsers; $this->view->qdUsers = $qdUsers; diff --git a/module/project/model.php b/module/project/model.php index 9076a4abde..0ae9c93ae7 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -678,12 +678,14 @@ class projectModel extends model /** * Get project pairs by model and project. * - * @param string $model all|scrum|waterfall|kanban - * @param int $programID + * @param string $model all|scrum|waterfall|kanban + * @param int $programID + * @param string $param noclosed + * @param string|int|array $append * @access public * @return array */ - public function getPairsByModel($model = 'all', $programID = 0, $param = '') + public function getPairsByModel($model = 'all', $programID = 0, $param = '', $append = '') { if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getProjectPairs(); @@ -696,6 +698,7 @@ class projectModel extends model ->beginIF($model != 'all')->andWhere('model')->eq($model)->fi() ->beginIF(strpos($param, 'noclosed') !== false)->andWhere('status')->ne('closed')->fi() ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() + ->beginIF(!empty($append))->orWhere('id')->in($append)->fi() ->orderBy('id_desc') ->fetchAll(); From a6ee04c3a1c39a3b989e0415cf3916b137e46e7b Mon Sep 17 00:00:00 2001 From: liumengyi Date: Tue, 19 Apr 2022 10:51:15 +0800 Subject: [PATCH 40/42] * Add annotation of unit test. --- test/model/action/builddategroup.php | 12 ++++- test/model/action/computebeginandend.php | 12 ++++- test/model/action/create.php | 9 +++- test/model/action/getbyid.php | 8 +++- test/model/action/getbysql.php | 8 +++- test/model/action/getdynamic.php | 21 ++++++++- test/model/action/gethistory.php | 8 +++- test/model/action/getlist.php | 42 +++++++++++++++++- test/model/action/getobjectlabel.php | 44 +++++++++---------- test/model/action/getrelateddatabyactions.php | 22 +++++++++- test/model/action/getrelatedfields.php | 42 +++++++++++++++++- test/model/action/gettrashes.php | 7 ++- test/model/action/hideall.php | 4 +- test/model/action/hideone.php | 7 ++- test/model/action/loghistory.php | 9 +++- test/model/action/processprojectactions.php | 9 +++- test/model/action/read.php | 8 +++- test/model/action/setobjectlink.php | 42 +++++++++++++++++- test/model/action/transformactions.php | 8 +++- test/model/action/undelete.php | 7 ++- test/model/action/updatecomment.php | 8 +++- test/model/kanban/activatecard.php | 13 +++++- test/model/kanban/addkanbancell.php | 19 +++++++- test/model/kanban/archivecard.php | 8 +++- test/model/kanban/archivecolumn.php | 9 +++- test/model/kanban/batchcreatecard.php | 7 ++- test/model/kanban/create.php | 9 +++- test/model/kanban/createcard.php | 8 +++- test/model/kanban/createcolumn.php | 11 ++++- test/model/kanban/createdefaultcolumns.php | 9 +++- test/model/kanban/createdefaultlane.php | 8 +++- test/model/kanban/createdefaultregion.php | 8 +++- test/model/kanban/createexecutioncolumns.php | 18 +++++++- test/model/kanban/createexecutionlane.php | 16 ++++++- test/model/kanban/creategroup.php | 8 +++- test/model/kanban/createlane.php | 9 +++- test/model/kanban/createrdcolumn.php | 9 +++- test/model/kanban/createrdkanban.php | 8 +++- test/model/kanban/createrdlane.php | 8 +++- test/model/kanban/createrdregion.php | 8 +++- test/model/kanban/createregion.php | 10 ++++- test/model/kanban/createspace.php | 8 +++- test/model/kanban/getbyid.php | 9 +++- test/model/kanban/getcanviewobjects.php | 18 +++++++- test/model/kanban/getcardbyid.php | 9 +++- test/model/kanban/getcardgroupbyexecution.php | 14 +++++- test/model/kanban/getcardgroupbykanban.php | 9 +++- test/model/kanban/getcards2import.php | 16 ++++++- test/model/kanban/getcardsbyobject.php | 17 ++++++- test/model/kanban/getcolumnbyid.php | 9 +++- test/model/kanban/getcolumngroupbyregions.php | 8 +++- test/model/kanban/getcolumnidbylaneid.php | 20 ++++++++- test/model/kanban/getcolumnsbyobject.php | 15 ++++++- test/model/kanban/getexecutionkanban.php | 19 +++++++- test/model/kanban/getgroupbyspacelist.php | 13 +++++- test/model/kanban/getgroupgroupbyregions.php | 8 +++- test/model/kanban/getgrouplist.php | 9 +++- test/model/kanban/getimportedcards.php | 19 +++++++- test/model/kanban/getkanban4group.php | 17 ++++++- test/model/kanban/getkanbancardmenu.php | 18 +++++++- test/model/kanban/getkanbandata.php | 9 +++- test/model/kanban/getkanbanidbyregion.php | 9 +++- test/model/kanban/getkanbanpairs.php | 10 ++++- test/model/kanban/getlanebyid.php | 9 +++- test/model/kanban/getlanegroupbyregion.php | 27 +++++++++++- test/model/kanban/getlanegroupbyregions.php | 27 +++++++++++- test/model/kanban/getlanepairsbygroup.php | 9 +++- test/model/kanban/getlanepairsbyregion.php | 27 +++++++++++- test/model/kanban/getlanes4group.php | 23 +++++++++- test/model/kanban/getobjectgroup.php | 23 +++++++++- test/model/kanban/getplankanban.php | 10 ++++- .../kanban/getrdcolumngroupbyregions.php | 16 ++++++- test/model/kanban/getrdkanban.php | 14 +++++- test/model/kanban/getregionbyid.php | 9 +++- test/model/kanban/getregionpairs.php | 21 ++++++++- test/model/kanban/getspacebyid.php | 9 +++- test/model/kanban/getspacelist.php | 19 +++++++- test/model/kanban/getspacepairs.php | 19 +++++++- test/model/kanban/import.php | 23 +++++++++- test/model/kanban/importcard.php | 8 +++- test/model/kanban/importobject.php | 7 ++- test/model/kanban/isclickable.php | 27 +++++++++++- test/model/kanban/movecard.php | 9 +++- test/model/kanban/processcards.php | 7 ++- test/model/kanban/refreshcards.php | 8 +++- test/model/kanban/removekanbancell.php | 11 ++++- test/model/kanban/restorecard.php | 8 +++- test/model/kanban/restorecolumn.php | 8 +++- test/model/kanban/setcolumnwidth.php | 9 +++- test/model/kanban/setlane.php | 10 ++++- test/model/kanban/setlaneheight.php | 9 +++- test/model/kanban/setwip.php | 15 ++++++- test/model/kanban/sortgroup.php | 8 +++- test/model/kanban/splitcolumn.php | 10 +++-- test/model/kanban/update.php | 12 ++++- test/model/kanban/updatecard.php | 12 ++++- test/model/kanban/updatecardcolor.php | 8 +++- test/model/kanban/updatelane.php | 12 ++++- test/model/kanban/updatelanecolumn.php | 8 +++- test/model/kanban/updateregion.php | 8 +++- test/model/kanban/updatespace.php | 11 ++++- test/model/product/batchgetstorystage.php | 6 ++- test/model/product/batchupdate.php | 6 ++- test/model/product/checkpriv.php | 24 +++++----- test/model/product/close.php | 9 +++- test/model/product/create.php | 2 +- .../product/getallexecutionpairsbyproduct.php | 8 +++- test/model/product/getbyid.php | 12 ++--- test/model/product/getbyidlist.php | 2 +- .../product/getexecutionpairsbyproduct.php | 18 +++++++- test/model/product/getlatestproject.php | 2 +- test/model/product/getlinepairs.php | 9 +++- test/model/product/getlist.php | 4 +- test/model/product/getmultibranchpairs.php | 9 +++- test/model/product/getorderedproducts.php | 6 ++- test/model/product/getpairs.php | 2 +- test/model/product/getpairsbyprojectmodel.php | 7 ++- test/model/product/getproductidbyproject.php | 9 +++- .../product/getproductpairsbyproject.php | 26 +++++------ test/model/product/getproducts.php | 15 ++++++- .../model/product/getprojectlistbyproduct.php | 2 +- .../product/getprojectpairsbyproduct.php | 2 +- .../product/getprojectstatsbyproduct.php | 22 +++++++++- test/model/product/getroadmap.php | 9 +++- test/model/product/getstatbyid.php | 9 +++- test/model/product/getstats.php | 11 ++++- test/model/product/getstats4kanban.php | 13 +++++- test/model/product/getstories.php | 27 +++++++++++- test/model/product/getteammemberpairs.php | 8 +++- test/model/product/isclickable.php | 2 +- test/model/product/manageline.php | 7 ++- test/model/product/processroadmap.php | 9 +++- test/model/product/statisticdata.php | 12 ++++- test/model/product/statisticprogram.php | 19 +++++++- test/model/product/update.php | 2 +- test/model/product/updateprojects.php | 8 +++- 136 files changed, 1476 insertions(+), 195 deletions(-) diff --git a/test/model/action/builddategroup.php b/test/model/action/builddategroup.php index bbff76ff35..ce41493cba 100755 --- a/test/model/action/builddategroup.php +++ b/test/model/action/builddategroup.php @@ -10,6 +10,16 @@ title=测试 actionModel->buildDateGroup(); cid=1 pid=1 +测试创建下一个动作日期组 今天 >> 3 +测试创建下一个动作日期组 昨天 >> 3 +测试创建下一个动作日期组 上周 >> 21 +测试创建下一个动作日期组 今天 >> 3 +测试创建下一个动作日期组 昨天 >> 3 +测试创建下一个动作日期组 上周 >> 21 +测试创建下一个动作日期组 今天 >> 3 +测试创建下一个动作日期组 昨天 >> 3 +测试创建下一个动作日期组 上周 >> 21 + */ $directionList = array('next', 'pre'); @@ -26,4 +36,4 @@ r($action->buildDateGroupTest($directionList[0], $typeList[1], $orderBy)) && p() r($action->buildDateGroupTest($directionList[0], $typeList[2], $orderBy)) && p() && e('21'); // 测试创建下一个动作日期组 上周 r($action->buildDateGroupTest($directionList[1], $typeList[0])) && p() && e('3'); // 测试创建下一个动作日期组 今天 r($action->buildDateGroupTest($directionList[1], $typeList[1])) && p() && e('3'); // 测试创建下一个动作日期组 昨天 -r($action->buildDateGroupTest($directionList[1], $typeList[2])) && p() && e('21'); // 测试创建下一个动作日期组 上周 +r($action->buildDateGroupTest($directionList[1], $typeList[2])) && p() && e('21'); // 测试创建下一个动作日期组 上周 \ No newline at end of file diff --git a/test/model/action/computebeginandend.php b/test/model/action/computebeginandend.php index dc2d7221f0..f3f5609778 100755 --- a/test/model/action/computebeginandend.php +++ b/test/model/action/computebeginandend.php @@ -10,6 +10,16 @@ title=测试 actionModel->computeBeginAndEnd(); cid=1 pid=1 +测试计算all的日期 >> 1 +测试计算today的日期 >> 1 +测试计算yesterday的日期 >> 1 +测试计算twodaysago的日期 >> 1 +测试计算latest3days的日期 >> 1 +测试计算thisweek的日期 >> 1 +测试计算lastweek的日期 >> 1 +测试计算thismonth的日期 >> 1 +测试计算lastmonth的日期 >> 1 + */ $typeList = array('all', 'today', 'yesterday', 'twodaysago', 'latest3days', 'thisweek', 'lastweek', 'thismonth', 'lastmonth'); @@ -24,4 +34,4 @@ r($action->computeBeginAndEndTest($typeList[4])) && p() && e('1'); // 测试计 r($action->computeBeginAndEndTest($typeList[5])) && p() && e('1'); // 测试计算thisweek的日期 r($action->computeBeginAndEndTest($typeList[6])) && p() && e('1'); // 测试计算lastweek的日期 r($action->computeBeginAndEndTest($typeList[7])) && p() && e('1'); // 测试计算thismonth的日期 -r($action->computeBeginAndEndTest($typeList[8])) && p() && e('1'); // 测试计算lastmonth的日期 +r($action->computeBeginAndEndTest($typeList[8])) && p() && e('1'); // 测试计算lastmonth的日期 \ No newline at end of file diff --git a/test/model/action/create.php b/test/model/action/create.php index 738929294e..9bf65ea0f4 100755 --- a/test/model/action/create.php +++ b/test/model/action/create.php @@ -10,6 +10,13 @@ title=测试 actionModel->create(); cid=1 pid=1 +测试创建task 1 edited动态 >> task,,edited, +测试创建project 11 editestimate动态 >> project,,editestimate, +测试创建user 1 login动态 >> user,,login, +测试创建bug 1 closed动态 >> bug,,closed, +测试创建story 1 comment动态 >> story,,comments,测试备注 +测试创建游客 logout动态 >> 0 + */ $objectTypeList = array('task', 'project', 'user', 'bug', 'story'); @@ -27,4 +34,4 @@ r($action->createTest($objectTypeList[3], $objectIDList[0], $actionTypeList[3])) r($action->createTest($objectTypeList[4], $objectIDList[0], $actionTypeList[4], $comment)) && p('objectType,objectId,action,comment') && e('story,,comments,测试备注'); // 测试创建story 1 comment动态 r($action->createTest($objectTypeList[4], $objectIDList[0], $actionTypeList[4])) && p() && e(''); // 测试创建story 1 comment动态 不填写备注 r($action->createTest($objectTypeList[2], $objectIDList[0], $actionTypeList[5], '', '', $actor)) && p() && e('0'); // 测试创建游客 logout动态 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/action/getbyid.php b/test/model/action/getbyid.php index 8943e9ad2d..1df040499b 100755 --- a/test/model/action/getbyid.php +++ b/test/model/action/getbyid.php @@ -10,6 +10,12 @@ title=测试 actionModel->getById(); cid=1 pid=1 +测试获取动态1的信息 >> product,,common,这是一个系统日志测试备注1 +测试获取动态2的信息 >> story,,extra,这是一个系统日志测试备注2 +测试获取动态3的信息 >> productplan,,opened,这是一个系统日志测试备注3 +测试获取动态4的信息 >> release,,created,这是一个系统日志测试备注4 +测试获取动态5的信息 >> project,,changed,这是一个系统日志测试备注5 + */ $actionIDList = array('1', '2', '3', '4', '5'); @@ -20,4 +26,4 @@ r($action->getByIdTest($actionIDList[0])) && p('objectType,objectId,action,comme r($action->getByIdTest($actionIDList[1])) && p('objectType,objectId,action,comment') && e('story,,extra,这是一个系统日志测试备注2'); // 测试获取动态2的信息 r($action->getByIdTest($actionIDList[2])) && p('objectType,objectId,action,comment') && e('productplan,,opened,这是一个系统日志测试备注3'); // 测试获取动态3的信息 r($action->getByIdTest($actionIDList[3])) && p('objectType,objectId,action,comment') && e('release,,created,这是一个系统日志测试备注4'); // 测试获取动态4的信息 -r($action->getByIdTest($actionIDList[4])) && p('objectType,objectId,action,comment') && e('project,,changed,这是一个系统日志测试备注5'); // 测试获取动态5的信息 +r($action->getByIdTest($actionIDList[4])) && p('objectType,objectId,action,comment') && e('project,,changed,这是一个系统日志测试备注5'); // 测试获取动态5的信息 \ No newline at end of file diff --git a/test/model/action/getbysql.php b/test/model/action/getbysql.php index 2e186ec2bf..1f5c651b1e 100755 --- a/test/model/action/getbysql.php +++ b/test/model/action/getbysql.php @@ -10,6 +10,12 @@ title=测试 actionModel->getBySQL(); cid=1 pid=1 +查询id like %1的动作个数 >> 12 +查询objectType = product的动作个数 >> 5 +查询objectID < 10的动作个数 >> 9 +查询action = opend的动作个数 >> 3 +查询read = 0的动作个数 >> 50 + */ $sql1 = "id like '1%'"; @@ -24,4 +30,4 @@ r($action->getBySQLTest($sql1)) && p() && e('12'); // 查询id like %1的动作 r($action->getBySQLTest($sql2)) && p() && e('5'); // 查询objectType = product的动作个数 r($action->getBySQLTest($sql3)) && p() && e('9'); // 查询objectID < 10的动作个数 r($action->getBySQLTest($sql4)) && p() && e('3'); // 查询action = opend的动作个数 -r($action->getBySQLTest($sql5)) && p() && e('50'); // 查询read = 0的动作个数 +r($action->getBySQLTest($sql5)) && p() && e('50'); // 查询read = 0的动作个数 \ No newline at end of file diff --git a/test/model/action/getdynamic.php b/test/model/action/getdynamic.php index 1d113cf901..9389bba19a 100755 --- a/test/model/action/getdynamic.php +++ b/test/model/action/getdynamic.php @@ -10,6 +10,24 @@ title=测试 actionModel->getDynamic(); cid=1 pid=1 +查找全部动态 >> 100 +查找用户admin动态 >> 34 +查找用户dev17动态 >> 33 +查找用户test18动态 >> 33 +查找今天的动态 >> 3 +查找昨天的动态 >> 3 +查找上周的动态 >> 21 +查找产品1的动态 >> 1 +查找产品2的动态 >> 1 +查找产品3的动态 >> 1 +查找项目1的动态 >> 1 +查找项目2的动态 >> 1 +查找项目3的动态 >> 1 +查找执行1的动态 >> 0 +查找执行2的动态 >> 0 +查找执行3的动态 >> 0 +查找今天的动态 >> 97 + */ $accountList = array('all', 'admin', 'dev17', 'test18'); @@ -19,7 +37,6 @@ $projectIDList = array('all', 1, 2, 3); $executionIDList = array('all', 1, 2, 3); $dateList = array('', 'today'); - $action = new actionTest(); r($action->getDynamicTest()) && p() && e('100'); // 查找全部动态 @@ -38,4 +55,4 @@ r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $pro r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[1])) && p() && e('0'); // 查找执行1的动态 r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[2])) && p() && e('0'); // 查找执行2的动态 r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[3])) && p() && e('0'); // 查找执行3的动态 -r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[0], $dateList[1])) && p() && e('97'); // 查找今天的动态 +r($action->getDynamicTest($accountList[0], $typeList[0], $productIDList[0], $projectIDList[0], $executionIDList[0], $dateList[1])) && p() && e('97'); // 查找今天的动态 \ No newline at end of file diff --git a/test/model/action/gethistory.php b/test/model/action/gethistory.php index 4b21386aec..3e72626a5c 100755 --- a/test/model/action/gethistory.php +++ b/test/model/action/gethistory.php @@ -10,6 +10,12 @@ title=测试 actionModel->getHistory(); cid=1 pid=1 +查找actionID为1的历史记录 >> resolution,1,2 +查找actionID为2的历史记录 >> resolvedBuild,2,3 +查找actionID为3的历史记录 >> resolvedDate,2020-01-01,2020-01-17 +查找actionID为4的历史记录 >> status,doing,done +查找actionID为5的历史记录 >> resolution,1,2 + */ $actionIDList = array('1', '2', '3', '4', '5'); @@ -19,4 +25,4 @@ r($action->getHistoryTest($actionIDList[0])) && p("0:field,old,new") && e('resol r($action->getHistoryTest($actionIDList[1])) && p("0:field,old,new") && e('resolvedBuild,2,3'); // 查找actionID为2的历史记录 r($action->getHistoryTest($actionIDList[2])) && p("0:field,old,new") && e('resolvedDate,2020-01-01,2020-01-17'); // 查找actionID为3的历史记录 r($action->getHistoryTest($actionIDList[3])) && p("0:field,old,new") && e('status,doing,done'); // 查找actionID为4的历史记录 -r($action->getHistoryTest($actionIDList[4])) && p("0:field,old,new") && e('resolution,1,2'); // 查找actionID为5的历史记录 +r($action->getHistoryTest($actionIDList[4])) && p("0:field,old,new") && e('resolution,1,2'); // 查找actionID为5的历史记录 \ No newline at end of file diff --git a/test/model/action/getlist.php b/test/model/action/getlist.php index ee81c8740e..d713cafcbb 100755 --- a/test/model/action/getlist.php +++ b/test/model/action/getlist.php @@ -10,6 +10,46 @@ title=测试 actionModel->getList(); cid=1 pid=1 +测试获取objectType product objectId 1的动态信息 >> 1,admin,1 +测试获取objectType story objectId 2的动态信息 >> 2,dev17,1 +测试获取objectType productplan objectId 3的动态信息 >> 3,test18,1 +测试获取objectType release objectId 4的动态信息 >> 4,admin,1 +测试获取objectType project objectId 5的动态信息 >> 5,dev17,11 +测试获取objectType task objectId 6的动态信息 >> 6,test18,1 +测试获取objectType build objectId 7的动态信息 >> 7,admin,1 +测试获取objectType bug objectId 8的动态信息 >> 8,dev17,1 +测试获取objectType testcase objectId 9的动态信息 >> 9,test18,2 +测试获取objectType case objectId 10的动态信息 >> 10,admin,1 +测试获取objectType testtask objectId 11的动态信息 >> 11,dev17,1 +测试获取objectType user objectId 12的动态信息 >> 12,test18,1 +测试获取objectType doc objectId 13的动态信息 >> 13,admin,1 +测试获取objectType doclib objectId 14的动态信息 >> 14,dev17,1 +测试获取objectType todo objectId 15的动态信息 >> 15,test18,1 +测试获取objectType branch objectId 16的动态信息 >> 16,admin,1 +测试获取objectType module objectId 17的动态信息 >> 17,dev17,1 +测试获取objectType testsuite objectId 18的动态信息 >> 18,test18,#1 项目集1 +测试获取objectType caselib objectId 19的动态信息 >> 19,admin,1 +测试获取objectType testreport objectId 20的动态信息 >> 20,dev17,1 +测试获取objectType entry objectId 21的动态信息 >> 21,test18,1 +测试获取objectType webhook objectId 22的动态信息 >> 22,admin,1 +测试获取objectType review objectId 23的动态信息 >> 23,dev17,1 +测试获取objectType product objectId 24的动态信息 >> 24,test18,1 +测试获取objectType story objectId 25的动态信息 >> 25,admin,1 +测试获取objectType productplan objectId 26的动态信息 >> 26,dev17,1 +测试获取objectType release objectId 27的动态信息 >> 27,test18,1 +测试获取objectType project objectId 28的动态信息 >> 28,admin,33 +测试获取objectType task objectId 29的动态信息 >> 29,dev17,1 +测试获取objectType build objectId 30的动态信息 >> 30,test18,1 +测试获取objectType bug objectId 31的动态信息 >> 31,admin,1 +测试获取objectType testcase objectId 32的动态信息 >> 32,项目经理17,1 +测试获取objectType case objectId 33的动态信息 >> 33,test18,1 +测试获取objectType testtask objectId 34的动态信息 >> 34,admin,1 +测试获取objectType user objectId 35的动态信息 >> 35,dev17,1 +测试获取objectType doc objectId 36的动态信息 >> 36,test18,1 +测试获取objectType doclib objectId 37的动态信息 >> 37,admin,1 +测试获取objectType todo objectId 38的动态信息 >> 38,dev17,1 +测试获取objectType branch objectId 39的动态信息 >> 39,test18,项目版本版本1 + */ $objectType = array('product', 'story', 'productplan', 'release', 'project', 'task', 'build', 'bug', 'testcase', 'case', 'testtask', 'user', 'doc', 'doclib', 'todo', 'branch', 'module', 'testsuite', 'caselib', 'testreport', 'entry', 'webhook', 'review'); @@ -55,4 +95,4 @@ r($action->getListTest($objectType[11], $objectId[34])) && p('id,actor,extra') & r($action->getListTest($objectType[12], $objectId[35])) && p('id,actor,extra') && e("36,test18,1"); // 测试获取objectType doc objectId 36的动态信息 r($action->getListTest($objectType[13], $objectId[36])) && p('id,actor,extra') && e("37,admin,1"); // 测试获取objectType doclib objectId 37的动态信息 r($action->getListTest($objectType[14], $objectId[37])) && p('id,actor,extra') && e("38,dev17,1"); // 测试获取objectType todo objectId 38的动态信息 -r($action->getListTest($objectType[15], $objectId[38])) && p('id,actor,extra') && e("39,test18,项目版本版本1"); // 测试获取objectType branch objectId 39的动态信息 +r($action->getListTest($objectType[15], $objectId[38])) && p('id,actor,extra') && e("39,test18,项目版本版本1"); // 测试获取objectType branch objectId 39的动态信息 \ No newline at end of file diff --git a/test/model/action/getobjectlabel.php b/test/model/action/getobjectlabel.php index f363696c6a..d2a192961d 100755 --- a/test/model/action/getobjectlabel.php +++ b/test/model/action/getobjectlabel.php @@ -10,29 +10,29 @@ title=测试 actionModel->getObjectLabel(); cid=1 pid=1 -测试获取objectType product objectId 1的动态信息 >> 产品|product|view|productID=%s -测试获取objectType story objectId 2的动态信息 >> 研发需求|story|view|storyID=%s +测试获取objectType product objectId 1的动态信息 >> 产品|product|view|productID=%s +测试获取objectType story objectId 2的动态信息 >> 研发需求|story|view|storyID=%s 测试获取objectType productplan objectId 3的动态信息 >> 计划|productplan|view|productID=%s -测试获取objectType release objectId 4的动态信息 >> 发布|release|view|productID=%s -测试获取objectType project objectId 5的动态信息 >> 项目|project|index|projectID=%s -测试获取objectType task objectId 6的动态信息 >> 任务|task|view|taskID=%s -测试获取objectType build objectId 7的动态信息 >> 版本|build|view|buildID=%s -测试获取objectType bug objectId 8的动态信息 >> Bug|bug|view|bugID=%s -测试获取objectType testcase objectId 9的动态信息 >> testcase -测试获取objectType case objectId 10的动态信息 >> 用例|testcase|view|caseID=%s -测试获取objectType testtask objectId 11的动态信息 >> 测试单|testtask|view|caseID=%s -测试获取objectType user objectId 12的动态信息 >> 用户|user|view|account=%s -测试获取objectType doclib objectId 14的动态信息 >> 文档库|doc|tablecontents|type=%s&objectID=%s&libID=%s -测试获取objectType todo objectId 15的动态信息 >> 待办|todo|view|todoID=%s -测试获取objectType branch objectId 16的动态信息 >> branch -测试获取objectType module objectId 17的动态信息 >> module -测试获取objectType testsuite objectId 18的动态信息 >> 测试套件|testsuite|view|suiteID=%s -测试获取objectType caselib objectId 19的动态信息 >> 用例库|caselib|view|libID=%s +测试获取objectType release objectId 4的动态信息 >> 发布|release|view|productID=%s +测试获取objectType project objectId 5的动态信息 >> 项目|project|index|projectID=%s +测试获取objectType task objectId 6的动态信息 >> 任务|task|view|taskID=%s +测试获取objectType build objectId 7的动态信息 >> 版本|build|view|buildID=%s +测试获取objectType bug objectId 8的动态信息 >> Bug|bug|view|bugID=%s +测试获取objectType testcase objectId 9的动态信息 >> testcase +测试获取objectType case objectId 10的动态信息 >> 用例|testcase|view|caseID=%s +测试获取objectType testtask objectId 11的动态信息 >> 测试单|testtask|view|caseID=%s +测试获取objectType user objectId 12的动态信息 >> 用户|user|view|account=%s +测试获取objectType doclib objectId 14的动态信息 >> 文档库|doc|tablecontents|type=%s&objectID=%s&libID=%s +测试获取objectType todo objectId 15的动态信息 >> 待办|todo|view|todoID=%s +测试获取objectType branch objectId 16的动态信息 >> branch +测试获取objectType module objectId 17的动态信息 >> module +测试获取objectType testsuite objectId 18的动态信息 >> 测试套件|testsuite|view|suiteID=%s +测试获取objectType caselib objectId 19的动态信息 >> 用例库|caselib|view|libID=%s 测试获取objectType testreport objectId 20的动态信息 >> 报告|testreport|view|report=%s -测试获取objectType entry objectId 21的动态信息 >> 应用|entry|browse| -测试获取objectType webhook objectId 22的动态信息 >> Webhook|webhook|browse| -测试获取objectType review objectId 23的动态信息 >> review -测试获取objectType story objectId 25的动态信息 >> 用户需求|story|view|storyID=%s +测试获取objectType entry objectId 21的动态信息 >> 应用|entry|browse| +测试获取objectType webhook objectId 22的动态信息 >> Webhook|webhook|browse| +测试获取objectType review objectId 23的动态信息 >> review +测试获取objectType story objectId 25的动态信息 >> 用户需求|story|view|storyID=%s */ @@ -65,4 +65,4 @@ r($action->getObjectLabelTest($objectType[19], $objectId[19], $actionType[19], $ r($action->getObjectLabelTest($objectType[20], $objectId[20], $actionType[20], $requirements)) && p() && e('应用|entry|browse|'); // 测试获取objectType entry objectId 21的动态信息 r($action->getObjectLabelTest($objectType[21], $objectId[21], $actionType[21], $requirements)) && p() && e('Webhook|webhook|browse|'); // 测试获取objectType webhook objectId 22的动态信息 r($action->getObjectLabelTest($objectType[22], $objectId[22], $actionType[22], $requirements)) && p() && e('review'); // 测试获取objectType review objectId 23的动态信息 -r($action->getObjectLabelTest($objectType[1], $objectId[23], $actionType[23], $requirements)) && p() && e('用户需求|story|view|storyID=%s'); // 测试获取objectType story objectId 25的动态信息 +r($action->getObjectLabelTest($objectType[1], $objectId[23], $actionType[23], $requirements)) && p() && e('用户需求|story|view|storyID=%s'); // 测试获取objectType story objectId 25的动态信息 \ No newline at end of file diff --git a/test/model/action/getrelateddatabyactions.php b/test/model/action/getrelateddatabyactions.php index 1918a6e0e9..7137143a0b 100755 --- a/test/model/action/getrelateddatabyactions.php +++ b/test/model/action/getrelateddatabyactions.php @@ -10,6 +10,26 @@ title=测试 actionModel->getRelatedDataByActions(); cid=1 pid=1 +获取动态1 2 3 4 5 objectNames的关联信息 >> 项目集5 +获取动态1 2 3 4 5 objectNames的关联信息 >> guest +获取动态1 2 3 4 5 relatedProjects的关联信息 >> 5 +获取动态1 2 3 4 5 requirements的关联信息 >> 0 +获取动态6 7 8 9 10 objectNames的关联信息 >> 这个是测试用例10 +获取动态6 7 8 9 10 objectNames的关联信息 >> guest +获取动态6 7 8 9 10 relatedProjects的关联信息 >> 0 +获取动态6 7 8 9 10 requirements的关联信息 >> 0 +获取动态11 12 13 14 15 objectNames的关联信息 >> 测试单15的待办 +获取动态11 12 13 14 15 objectNames的关联信息 >> guest +获取动态11 12 13 14 15 relatedProjects的关联信息 >> 0 +获取动态11 12 13 14 15 requirements的关联信息 >> 0 +获取动态16 17 18 19 20 objectNames的关联信息 >> 这是测试套件名称19 +获取动态16 17 18 19 20 objectNames的关联信息 >> guest +获取动态16 17 18 19 20 relatedProjects的关联信息 >> 0 +获取动态16 17 18 19 20 requirements的关联信息 >> 0 +获取动态21 22 23 24 25 objectNames的关联信息 >> 用户需求25 +获取动态21 22 23 24 25 objectNames的关联信息 >> guest +获取动态21 22 23 24 25 requirements的关联信息 >> 25 + */ $actions = array('1,2,3,4,5', '6,7,8,9,10', '11,12,13,14,15', '16,17,18,19,20', '21,22,23,24,25'); @@ -35,4 +55,4 @@ r($action->getRelatedDataByActionsTest($actions[3], 'requirements')) && p() r($action->getRelatedDataByActionsTest($actions[4], 'objectNames')) && p('story:25') && e('用户需求25'); // 获取动态21 22 23 24 25 objectNames的关联信息 r($action->getRelatedDataByActionsTest($actions[4], 'objectNames')) && p('user:0') && e('guest'); // 获取动态21 22 23 24 25 objectNames的关联信息 r($action->getRelatedDataByActionsTest($actions[4], 'relatedProjects')) && p('story:0') && e(''); // 获取动态21 22 23 24 25 relatedProjects的关联信息 -r($action->getRelatedDataByActionsTest($actions[4], 'requirements')) && p('25') && e('25'); // 获取动态21 22 23 24 25 requirements的关联信息 +r($action->getRelatedDataByActionsTest($actions[4], 'requirements')) && p('25') && e('25'); // 获取动态21 22 23 24 25 requirements的关联信息 \ No newline at end of file diff --git a/test/model/action/getrelatedfields.php b/test/model/action/getrelatedfields.php index a49649b317..48e06bde51 100755 --- a/test/model/action/getrelatedfields.php +++ b/test/model/action/getrelatedfields.php @@ -10,6 +10,46 @@ title=测试 actionModel->getRelatedFields(); cid=1 pid=1 +测试获取objectType product objectId 1 actionType common extra 1 的动态信息 >> ,1,;0;0 +测试获取objectType story objectId 2 actionType extra extra 1 的动态信息 >> ,1,;11;101 +测试获取objectType productplan objectId 3 actionType opened extra 1 的动态信息 >> ,1,;0;0 +测试获取objectType release objectId 4 actionType created extra 1 的动态信息 >> ,41,;14;0 +测试获取objectType project objectId 5 actionType changed extra 11 的动态信息 >> ,,;5;0 +测试获取objectType task objectId 6 actionType edited extra 1 的动态信息 >> ,6,;16;106 +测试获取objectType build objectId 7 actionType assigned extra 1 的动态信息 >> ,7,;17;0 +测试获取objectType bug objectId 8 actionType closed extra 1 的动态信息 >> ,3,;13;103 +测试获取objectType testcase objectId 9 actionType deleted extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType case objectId 10 actionType deletedfile extra 1 的动态信息 >> ,3,;13;103 +测试获取objectType testtask objectId 1 actionType editfile extra 1 的动态信息 >> ,1,;11;101 +测试获取objectType user objectId 12 actionType erased extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType doc objectId 13 actionType undeleted extra 1 的动态信息 >> ,13,;0;0 +测试获取objectType doclib objectId 14 actionType hidden extra 1 的动态信息 >> ,14,;0;0 +测试获取objectType todo objectId 15 actionType commented extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType branch objectId 16 actionType activated extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType module objectId 17 actionType blocked extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType testsuite objectId 18 actionType moved extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType caselib objectId 19 actionType confirmed extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType testreport objectId 20 actionType caseconfirmed extra 1 的动态信息 >> ,,;0;0 +测试获取objectType entry objectId 21 actionType bugconfirmed extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType webhook objectId 22 actionType frombug extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType review objectId 23 actionType started extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType product objectId 24 actionType restarted extra 1 的动态信息 >> ,24,;0;0 +测试获取objectType story objectId 25 actionType delayed extra 1 的动态信息 >> ,7,;0;0 +测试获取objectType productplan objectId 26 actionType suspended extra 1 的动态信息 >> ,9,;0;0 +测试获取objectType release objectId 1 actionType recordestimate extra 1 的动态信息 >> ,1,;11;0 +测试获取objectType project objectId 28 actionType editestimate extra 33 的动态信息 >> ,8,18,98,;28;0 +测试获取objectType task objectId 29 actionType deleteestimate extra 1 的动态信息 >> ,29,;39;129 +测试获取objectType build objectId 1 actionType canceled extra 1 的动态信息 >> ,1,;11;0 +测试获取objectType bug objectId 31 actionType svncommited extra 1 的动态信息 >> ,11,;21;111 +测试获取objectType testcase objectId 32 actionType gitcommited extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType case objectId 33 actionType finished extra 1 的动态信息 >> ,9,;19;109 +测试获取objectType testtask objectId 1 actionType paused extra 1 的动态信息 >> ,1,;11;101 +测试获取objectType user objectId 35 actionType verified extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType doc objectId 36 actionType diff1 extra 1 的动态信息 >> ,36,;0;0 +测试获取objectType doclib objectId 37 actionType diff2 extra 1 的动态信息 >> ,37,;0;0 +测试获取objectType todo objectId 38 actionType diff3 extra 1 的动态信息 >> ,0,;0;0 +测试获取objectType branch objectId 39 actionType linked2bug extra 1 的动态信息 >> ,0,;0;0 + */ $objectType = array('product', 'story', 'productplan', 'release', 'project', 'task', 'build', 'bug', 'testcase', 'case', 'testtask', 'user', 'doc', 'doclib', 'todo', 'branch', 'module', 'testsuite', 'caselib', 'testreport', 'entry', 'webhook', 'review'); $objectId = array(1,2,3,4,5,6,7,8,9,10,1,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,1,28,29,1,31,32,33,1,35,36,37,38,39); @@ -56,4 +96,4 @@ r($action->getRelatedFieldsTest($objectType[11], $objectId[34], $actionType[34], r($action->getRelatedFieldsTest($objectType[12], $objectId[35], $actionType[35], $extra[35])) && p('product;project;execution') && e(',36,;0;0'); // 测试获取objectType doc objectId 36 actionType diff1 extra 1 的动态信息 r($action->getRelatedFieldsTest($objectType[13], $objectId[36], $actionType[36], $extra[36])) && p('product;project;execution') && e(',37,;0;0'); // 测试获取objectType doclib objectId 37 actionType diff2 extra 1 的动态信息 r($action->getRelatedFieldsTest($objectType[14], $objectId[37], $actionType[37], $extra[37])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType todo objectId 38 actionType diff3 extra 1 的动态信息 -r($action->getRelatedFieldsTest($objectType[15], $objectId[38], $actionType[38], $extra[38])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType branch objectId 39 actionType linked2bug extra 1 的动态信息 +r($action->getRelatedFieldsTest($objectType[15], $objectId[38], $actionType[38], $extra[38])) && p('product;project;execution') && e(',0,;0;0'); // 测试获取objectType branch objectId 39 actionType linked2bug extra 1 的动态信息 \ No newline at end of file diff --git a/test/model/action/gettrashes.php b/test/model/action/gettrashes.php index 0afe21d5a9..29242599b3 100755 --- a/test/model/action/gettrashes.php +++ b/test/model/action/gettrashes.php @@ -10,6 +10,11 @@ title=测试 actionModel->getTrashes(); cid=1 pid=1 +查询type all id desc排序的回收站信息 >> testsuite,,这是测试套件名称87;story,,软件需求48 +查询type all id desc排序的回收站信息 >> story,,软件需求48;testsuite,,这是测试套件名称87 +查询type hidden id asc排序的回收站信息 >> testcase,,这个是测试用例9 +查询type hidden id asc排序的回收站信息 >> testcase,,这个是测试用例9 + */ $typeList = array('all', 'hidden'); @@ -21,4 +26,4 @@ $action = new actionTest(); r($action->getTrashesTest($typeList[0], $orderBy[0], $pager)) && p('0:objectType,objectId,objectName;1:objectType,objectId,objectName') && e('testsuite,,这是测试套件名称87;story,,软件需求48'); // 查询type all id desc排序的回收站信息 r($action->getTrashesTest($typeList[0], $orderBy[1], $pager)) && p('0:objectType,objectId,objectName;1:objectType,objectId,objectName') && e('story,,软件需求48;testsuite,,这是测试套件名称87'); // 查询type all id desc排序的回收站信息 r($action->getTrashesTest($typeList[1], $orderBy[0], $pager)) && p('0:objectType,objectId,objectName') && e('testcase,,这个是测试用例9'); // 查询type hidden id asc排序的回收站信息 -r($action->getTrashesTest($typeList[1], $orderBy[1], $pager)) && p('0:objectType,objectId,objectName') && e('testcase,,这个是测试用例9'); // 查询type hidden id asc排序的回收站信息 +r($action->getTrashesTest($typeList[1], $orderBy[1], $pager)) && p('0:objectType,objectId,objectName') && e('testcase,,这个是测试用例9'); // 查询type hidden id asc排序的回收站信息 \ No newline at end of file diff --git a/test/model/action/hideall.php b/test/model/action/hideall.php index 0cdccd848f..8e6313ce5d 100755 --- a/test/model/action/hideall.php +++ b/test/model/action/hideall.php @@ -10,9 +10,11 @@ title=测试 actionModel->hideAll(); cid=1 pid=1 +隐藏回收站全部信息 >> 2;2;2 + */ $action = new actionTest(); r($action->hideAllTest()) && p('0:extra;1:extra;2:extra') && e('2;2;2'); // 隐藏回收站全部信息 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/action/hideone.php b/test/model/action/hideone.php index 3947173c02..aed9d946d7 100755 --- a/test/model/action/hideone.php +++ b/test/model/action/hideone.php @@ -10,6 +10,11 @@ title=测试 actionModel->hideOne(); cid=1 pid=1 +隐藏action 28 >> 2 +隐藏action 87 >> 2 +隐藏已隐藏action 9 >> 2 +隐藏非删除action 1 >> 1 + */ $actionIDList = array('48', '87', '9', '1'); @@ -19,4 +24,4 @@ r($action->hideOneTest($actionIDList[0])) && p('extra') && e('2'); // 隐藏acti r($action->hideOneTest($actionIDList[1])) && p('extra') && e('2'); // 隐藏action 87 r($action->hideOneTest($actionIDList[2])) && p('extra') && e('2'); // 隐藏已隐藏action 9 r($action->hideOneTest($actionIDList[3])) && p('extra') && e('1'); // 隐藏非删除action 1 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/action/loghistory.php b/test/model/action/loghistory.php index 61aa07e8bb..ae7665a2fe 100755 --- a/test/model/action/loghistory.php +++ b/test/model/action/loghistory.php @@ -10,6 +10,12 @@ title=测试 actionModel->logHistory(); cid=1 pid=1 +测试新增actionID 10001 历史记录 >> name,变更前名称,变更后名称;code,变更前编号,变更后编号 +测试新增actionID 10002 历史记录 >> assignedTo,admin,test1 +测试新增actionID 10003 历史记录 >> name,name1,name2 +测试新增actionID 10004 历史记录 >> code,code1,code2 +测试新增actionID 10005 历史记录 >> assignedTo,test2,test1 + */ $actionIDList = array('10001', '10002', '10003', '10004', '10005'); @@ -23,10 +29,9 @@ $changes5[0] = array('field' => 'assignedTo', 'old' => 'test2', 'new' => 'test1' $action = new actionTest(); - r($action->logHistoryTest($actionIDList[0], $changes1)) && p('0:field,old,new;1:field,old,new') && e('name,变更前名称,变更后名称;code,变更前编号,变更后编号'); // 测试新增actionID 10001 历史记录 r($action->logHistoryTest($actionIDList[1], $changes2)) && p('0:field,old,new') && e('assignedTo,admin,test1'); // 测试新增actionID 10002 历史记录 r($action->logHistoryTest($actionIDList[2], $changes3)) && p('0:field,old,new') && e('name,name1,name2'); // 测试新增actionID 10003 历史记录 r($action->logHistoryTest($actionIDList[3], $changes4)) && p('0:field,old,new') && e('code,code1,code2'); // 测试新增actionID 10004 历史记录 r($action->logHistoryTest($actionIDList[4], $changes5)) && p('0:field,old,new') && e('assignedTo,test2,test1'); // 测试新增actionID 10005 历史记录 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/action/processprojectactions.php b/test/model/action/processprojectactions.php index 0f4e9c94df..7b72f56fa5 100755 --- a/test/model/action/processprojectactions.php +++ b/test/model/action/processprojectactions.php @@ -10,6 +10,13 @@ title=测试 actionModel->processProjectActions(); cid=1 pid=1 +测试计算action 1 2 3 4 5 的项目动态 >> 5 +测试计算action 26 27 28 29 30 的项目动态 >> 28 +测试计算action 51 52 53 54 55 的项目动态 >> 51 +测试计算action 71 72 73 74 75 的项目动态 >> 74 +测试计算action 96 97 98 99 100 的项目动态 >> 97 +测试计算action 5 28 51 74 97 的项目动态 >> 5,28,51,74,97 + */ $actions = array('1,2,3,4,5', '26,27,28,29,30', '51,52,53,54,55', '71,72,73,74,75', '96,97,98,99,100', '5,28,51,74,97'); @@ -21,4 +28,4 @@ r($action->processProjectActionsTest($actions[1])) && p() && e('28'); r($action->processProjectActionsTest($actions[2])) && p() && e('51'); // 测试计算action 51 52 53 54 55 的项目动态 r($action->processProjectActionsTest($actions[3])) && p() && e('74'); // 测试计算action 71 72 73 74 75 的项目动态 r($action->processProjectActionsTest($actions[4])) && p() && e('97'); // 测试计算action 96 97 98 99 100 的项目动态 -r($action->processProjectActionsTest($actions[5])) && p() && e('5,28,51,74,97'); // 测试计算action 5 28 51 74 97 的项目动态 +r($action->processProjectActionsTest($actions[5])) && p() && e('5,28,51,74,97'); // 测试计算action 5 28 51 74 97 的项目动态 \ No newline at end of file diff --git a/test/model/action/read.php b/test/model/action/read.php index 2186ae52a6..821a8f6bfb 100755 --- a/test/model/action/read.php +++ b/test/model/action/read.php @@ -10,6 +10,12 @@ title=测试 actionModel->read(); cid=1 pid=1 +测试对action 1 进行阅读操作 >> product,1,1 +测试对action 2 进行阅读操作 >> story,2,1 +测试对action 3 进行阅读操作 >> productplan,3,1 +测试对action 4 进行阅读操作 >> release,4,1 +测试对action 5 进行阅读操作 >> project,5,1 + */ $objectType = array('product', 'story', 'productplan', 'release', 'project'); @@ -22,4 +28,4 @@ r($action->readTest($objectType[1], $objectID[1])) && p('0:objectType,objectID,r r($action->readTest($objectType[2], $objectID[2])) && p('0:objectType,objectID,read') && e('productplan,3,1'); // 测试对action 3 进行阅读操作 r($action->readTest($objectType[3], $objectID[3])) && p('0:objectType,objectID,read') && e('release,4,1'); // 测试对action 4 进行阅读操作 r($action->readTest($objectType[4], $objectID[4])) && p('0:objectType,objectID,read') && e('project,5,1'); // 测试对action 5 进行阅读操作 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/action/setobjectlink.php b/test/model/action/setobjectlink.php index d1b2e67375..f88a9d9809 100755 --- a/test/model/action/setobjectlink.php +++ b/test/model/action/setobjectlink.php @@ -10,6 +10,46 @@ title=测试 actionModel->setObjectLink(); cid=1 pid=1 +测试获取action 1 的objectLink >> 1,model/action/product-view-1. +测试获取action 2 的objectLink >> 2,model/action/story-view-2. +测试获取action 3 的objectLink >> 3,model/action/productplan-view-3. +测试获取action 4 的objectLink >> 4,model/action/release-view-4. +测试获取action 5 的objectLink >> 5,model/action/project-index-5. +测试获取action 6 的objectLink >> 6,model/action/task-view-6. +测试获取action 7 的objectLink >> 7,model/action/build-view-7. +测试获取action 8 的objectLink >> 8,model/action/bug-view-8. +测试获取action 9 的objectLink >> 9, +测试获取action 10 的objectLink >> 10,model/action/testcase-view-10. +测试获取action 11 的objectLink >> 11,model/action/testtask-view-11. +测试获取action 12 的objectLink >> 12,javascript:void(0) +测试获取action 13 的objectLink >> 13,model/action/doc-view-13. +测试获取action 14 的objectLink >> 14,model/action/doc-objectLibs-product-14-14. +测试获取action 15 的objectLink >> 15,model/action/todo-view-15. +测试获取action 16 的objectLink >> 16, +测试获取action 17 的objectLink >> 17, +测试获取action 18 的objectLink >> 18,model/action/testsuite-view-18. +测试获取action 19 的objectLink >> 19,model/action/caselib-view-19. +测试获取action 20 的objectLink >> 20,model/action/testreport-view-20. +测试获取action 21 的objectLink >> 21,model/action/entry-browse. +测试获取action 22 的objectLink >> 22,model/action/webhook-browse. +测试获取action 23 的objectLink >> 23, +测试获取action 24 的objectLink >> 24,model/action/product-view-24. +测试获取action 25 的objectLink >> 25,model/action/story-view-25. +测试获取action 26 的objectLink >> 26,model/action/productplan-view-26. +测试获取action 27 的objectLink >> 27,model/action/release-view-27. +测试获取action 28 的objectLink >> 28,model/action/project-index-28. +测试获取action 29 的objectLink >> 29,model/action/task-view-29. +测试获取action 30 的objectLink >> 30,model/action/build-view-30. +测试获取action 31 的objectLink >> 31,model/action/bug-view-31. +测试获取action 32 的objectLink >> 32, +测试获取action 33 的objectLink >> 33,model/action/testcase-view-33. +测试获取action 34 的objectLink >> 34,model/action/testtask-view-34. +测试获取action 35 的objectLink >> 35,javascript:void(0) +测试获取action 36 的objectLink >> 36,model/action/doc-view-36. +测试获取action 37 的objectLink >> 37,model/action/doc-objectLibs-product-37-37. +测试获取action 38 的objectLink >> 38,model/action/todo-view-38. +测试获取action 39 的objectLink >> 39, + */ $actionIDList = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39); @@ -54,4 +94,4 @@ r($action->setObjectLinkTest($actionIDList[34])) && p('id,objectLink') && e("35, r($action->setObjectLinkTest($actionIDList[35])) && p('id,objectLink') && e("36,model/action/doc-view-36."); // 测试获取action 36 的objectLink r($action->setObjectLinkTest($actionIDList[36])) && p('id,objectLink') && e("37,model/action/doc-objectLibs-product-37-37."); // 测试获取action 37 的objectLink r($action->setObjectLinkTest($actionIDList[37])) && p('id,objectLink') && e("38,model/action/todo-view-38."); // 测试获取action 38 的objectLink -r($action->setObjectLinkTest($actionIDList[38])) && p('id,objectLink') && e("39,"); // 测试获取action 39 的objectLink +r($action->setObjectLinkTest($actionIDList[38])) && p('id,objectLink') && e("39,"); // 测试获取action 39 的objectLink \ No newline at end of file diff --git a/test/model/action/transformactions.php b/test/model/action/transformactions.php index 8f940eb1b0..3fc3807f02 100755 --- a/test/model/action/transformactions.php +++ b/test/model/action/transformactions.php @@ -10,6 +10,12 @@ title=测试 actionModel->transformActions(); cid=1 pid=1 +测试转换动态1 2 3 4 5 >> 正常产品1;软件需求2;长名称好长好长好长好长好长好长好长好长好长好长好长好好长好长好长好长好长好好长好长好长好长好长好好长好长好长好长好长好的名字啊!@ase!!@#%@^&#!;项目停止维护的停止维护的里程碑发布4;项目集5 +测试转换动态26 27 28 29 30 >> 1.1;;项目18;开发任务39; +测试转换动态51 52 53 54 55 >> 项目41;开发任务62;;BUG54;这个是测试用例55 +测试转换动态71 72 73 74 75 >> 用户需求71;;;项目64;开发任务85 +测试转换动态96 97 98 99 100 >> ;项目87;开发任务108;;BUG10 + */ $actions = array('1,2,3,4,5', '26,27,28,29,30', '51,52,53,54,55', '71,72,73,74,75', '96,97,98,99,100'); @@ -19,4 +25,4 @@ r($action->transformActionsTest($actions[0])) && p('1:objectName;2:objectName;3: r($action->transformActionsTest($actions[1])) && p('26:objectName;27:objectName;28:objectName;29:objectName;30:objectName') && e('1.1;;项目18;开发任务39;'); // 测试转换动态26 27 28 29 30 r($action->transformActionsTest($actions[2])) && p('51:objectName;52:objectName;53:objectName;54:objectName;55:objectName') && e('项目41;开发任务62;;BUG54;这个是测试用例55'); // 测试转换动态51 52 53 54 55 r($action->transformActionsTest($actions[3])) && p('71:objectName;72:objectName;73:objectName;74:objectName;75:objectName') && e('用户需求71;;;项目64;开发任务85'); // 测试转换动态71 72 73 74 75 -r($action->transformActionsTest($actions[4])) && p('96:objectName;97:objectName;98:objectName;99:objectName;100:objectName') && e(';项目87;开发任务108;;BUG10'); // 测试转换动态96 97 98 99 100 +r($action->transformActionsTest($actions[4])) && p('96:objectName;97:objectName;98:objectName;99:objectName;100:objectName') && e(';项目87;开发任务108;;BUG10'); // 测试转换动态96 97 98 99 100 \ No newline at end of file diff --git a/test/model/action/undelete.php b/test/model/action/undelete.php index df3bf0155d..eee51b42b0 100755 --- a/test/model/action/undelete.php +++ b/test/model/action/undelete.php @@ -10,6 +10,11 @@ title=测试 actionModel->undelete(); cid=1 pid=1 +测试还原action 28 >> 0 +测试还原action 87 >> 0 +测试还原action 9 >> 0 +测试还原未删除action 1 >> 1 + */ $actionIDList = array('48', '87', '9', '1'); @@ -19,4 +24,4 @@ r($action->undeleteTest($actionIDList[0])) && p('extra') && e('0'); // 测试还 r($action->undeleteTest($actionIDList[1])) && p('extra') && e('0'); // 测试还原action 87 r($action->undeleteTest($actionIDList[2])) && p('extra') && e('0'); // 测试还原action 9 r($action->undeleteTest($actionIDList[3])) && p('extra') && e('1'); // 测试还原未删除action 1 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/action/updatecomment.php b/test/model/action/updatecomment.php index 0f879a34f1..26316266b0 100755 --- a/test/model/action/updatecomment.php +++ b/test/model/action/updatecomment.php @@ -10,6 +10,12 @@ title=测试 actionModel->updateComment(); cid=1 pid=1 +测试更新action 1的备注 >> 备注1 +测试更新action 2的备注 >> 备注2 +测试更新action 3的备注 >> 备注3 +测试更新action 4的备注 >> 备注4 +测试更新action 5的备注 >> 备注5 + */ $actionIDList = array('1', '2', '3', '4', '5'); $commentList = array('备注1', '备注2', '备注3', '备注4', '备注5'); @@ -21,4 +27,4 @@ r($action->updateCommentTest($actionIDList[1], $commentList[1])) && p('comment') r($action->updateCommentTest($actionIDList[2], $commentList[2])) && p('comment') && e('备注3'); // 测试更新action 3的备注 r($action->updateCommentTest($actionIDList[3], $commentList[3])) && p('comment') && e('备注4'); // 测试更新action 4的备注 r($action->updateCommentTest($actionIDList[4], $commentList[4])) && p('comment') && e('备注5'); // 测试更新action 5的备注 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/activatecard.php b/test/model/kanban/activatecard.php index 06e1f85d09..2e7c1c40c0 100755 --- a/test/model/kanban/activatecard.php +++ b/test/model/kanban/activatecard.php @@ -10,6 +10,17 @@ title=测试 kanbanModel->activateCard(); cid=1 pid=1 +测试激活卡片1,进度0 >> 1,卡片1,doing,0 +测试激活卡片1,进度50 >> 1,卡片1,doing,50 +测试激活卡片1,进度100 >> 请输入正确的进度 +测试激活卡片1,进度101 >> 请输入正确的进度 +测试激活卡片1,进度-1 >> 请输入正确的进度 +测试激活卡片2,进度0 >> 2,卡片2,doing,0 +测试激活卡片3,进度0 >> 3,卡片3,doing,50 +测试激活卡片4,进度0 >> 4,卡片4,doing,0 +测试激活卡片5,进度0 >> 5,卡片5,doing,50 +测试激活不存在的卡片,进度0 >> 0 + */ $cardIDList = array('1', '2', '3', '4', '5', '100001'); @@ -27,4 +38,4 @@ r($kanban->activateCardTest($cardIDList[2], $progressList[1])) && p('id,name,sta r($kanban->activateCardTest($cardIDList[3], $progressList[0])) && p('id,name,status,progress') && e('4,卡片4,doing,0'); // 测试激活卡片4,进度0 r($kanban->activateCardTest($cardIDList[4], $progressList[1])) && p('id,name,status,progress') && e('5,卡片5,doing,50'); // 测试激活卡片5,进度0 r($kanban->activateCardTest($cardIDList[5], $progressList[0])) && p('id,name,status,progress') && e('0'); // 测试激活不存在的卡片,进度0 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/addkanbancell.php b/test/model/kanban/addkanbancell.php index 6a12004ac1..261f9a3f3d 100755 --- a/test/model/kanban/addkanbancell.php +++ b/test/model/kanban/addkanbancell.php @@ -10,6 +10,23 @@ title=测试 kanbanModel->addKanbanCell(); cid=1 pid=1 +更新类型为common的kanbancell >> common,,0,1,2, +更新类型为common的kanbancell 有cardID >> common,,3,0,1,2, +插入类型为common的kanbancell >> common, +插入类型为common的kanbancell 有cardID >> common,,3, +更新类型为story的kanbancell >> story,,0, +更新类型为story的kanbancell 有cardID >> story,,3,0, +插入类型为story的kanbancell >> story, +插入类型为story的kanbancell 有cardID >> story,,3, +更新类型为bug的kanbancell >> bug,,0, +更新类型为bug的kanbancell 有cardID >> bug,,3,0, +插入类型为bug的kanbancell >> bug, +插入类型为bug的kanbancell 有cardID >> bug,,3, +更新类型为task的kanbancell >> task,,0, +更新类型为task的kanbancell 有cardID >> task,,3,0, +插入类型为task的kanbancell >> task, +插入类型为task的kanbancell 有cardID >> task,,3, + */ $kanban = new kanbanTest(); @@ -36,4 +53,4 @@ r($kanban->addKanbanCellTest($kanbanIDList[1], $laneIDList[3], $columnIDList[3], r($kanban->addKanbanCellTest($kanbanIDList[1], $laneIDList[3], $columnIDList[3], $typeList[3], $cardID)) && p('type,cards') && e('task,,3,0,'); // 更新类型为task的kanbancell 有cardID r($kanban->addKanbanCellTest($kanbanIDList[1], $laneIDList[3], $columnIDList[0], $typeList[3])) && p('type,cards') && e('task,'); // 插入类型为task的kanbancell r($kanban->addKanbanCellTest($kanbanIDList[1], $laneIDList[3], $columnIDList[0], $typeList[3], $cardID)) && p('type,cards') && e('task,,3,'); // 插入类型为task的kanbancell 有cardID -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/archivecard.php b/test/model/kanban/archivecard.php index b9ad77afa9..0d0c8cab78 100755 --- a/test/model/kanban/archivecard.php +++ b/test/model/kanban/archivecard.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->archiveCard(); cid=1 pid=1 +测试归档卡片1 >> archived,0,1 +测试归档卡片2 >> archived,0,1 +测试归档卡片3 >> archived,0,1 +测试归档卡片4 >> archived,0,1 +测试归档卡片5 >> archived,0,1 + */ $cardIDList = array('1', '2', '3', '4', '5'); @@ -21,4 +27,4 @@ r($kanban->archiveCardTest($cardIDList[1])) && p('0:field,old,new') && e('archiv r($kanban->archiveCardTest($cardIDList[2])) && p('0:field,old,new') && e('archived,0,1'); // 测试归档卡片3 r($kanban->archiveCardTest($cardIDList[3])) && p('0:field,old,new') && e('archived,0,1'); // 测试归档卡片4 r($kanban->archiveCardTest($cardIDList[4])) && p('0:field,old,new') && e('archived,0,1'); // 测试归档卡片5 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/archivecolumn.php b/test/model/kanban/archivecolumn.php index 46f0a6b2aa..3cd7059dfc 100755 --- a/test/model/kanban/archivecolumn.php +++ b/test/model/kanban/archivecolumn.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->archiveColumn(); cid=1 pid=1 +测试归档列1 >> 1,1 +测试归档列2 >> 2,1 +测试归档列3 >> 3,1 +测试归档列4 >> 4,1 +测试归档列5 >> 5,1 +测试归档不存在的列 >> 0 + */ $columnIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -22,4 +29,4 @@ r($kanban->archiveColumnTest($columnIDList[2])) && p('id,archived') && e('3,1'); r($kanban->archiveColumnTest($columnIDList[3])) && p('id,archived') && e('4,1'); // 测试归档列4 r($kanban->archiveColumnTest($columnIDList[4])) && p('id,archived') && e('5,1'); // 测试归档列5 r($kanban->archiveColumnTest($columnIDList[5])) && p() && e('0'); // 测试归档不存在的列 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/batchcreatecard.php b/test/model/kanban/batchcreatecard.php index aff87bf523..b3a97b686b 100755 --- a/test/model/kanban/batchcreatecard.php +++ b/test/model/kanban/batchcreatecard.php @@ -10,6 +10,11 @@ title=测试 kanbanModel->batchCreateCard(); cid=1 pid=1 +批量创建卡片 其中一个没有名称 >> 1,1,1,common,,1003,1002,1001,1,2,801, +批量创建卡片 预计为负数 >> 预计不能为负数! +批量创建看板 截止日期小于开始日期 >> "截止日期"不能小于"预计开始"! +批量创建看板 >> 1,1,1,common,,1010,1009,1008,1007,1004,1003,1002,1001,1,2,801, + */ $no_name = array('0' => '', '1' => '批量创建的卡片2', '2' => '批量创建的卡片3', '3' => '批量创建的卡片4'); @@ -22,4 +27,4 @@ r($kanban->batchCreateCardTest(array('name' => $no_name))) && p('kanban,col r($kanban->batchCreateCardTest(array('estimate' => $estimate))) && p() && e('预计不能为负数!'); // 批量创建卡片 预计为负数 r($kanban->batchCreateCardTest(array(), true)) && p() && e('"截止日期"不能小于"预计开始"!'); // 批量创建看板 截止日期小于开始日期 r($kanban->batchCreateCardTest()) && p('kanban,column,lane,type,cards') && e('1,1,1,common,,1010,1009,1008,1007,1004,1003,1002,1001,1,2,801,'); // 批量创建看板 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/create.php b/test/model/kanban/create.php index 9974cc05b3..9d814a4a59 100755 --- a/test/model/kanban/create.php +++ b/test/model/kanban/create.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->create(); cid=1 pid=1 +创建协同空间 >> 测试创建协作看板,1,,po15, +创建私人空间 >> 测试创建私人看板,2,,admin,,user4 +创建公共空间 >> 测试创建公共看板,3,,po17, +创建没有名字的公共空间 >> 『看板名称』不能为空。 +创建没有空间公共空间 >> 『所属空间』不能为空。 +创建重名公共空间 >> 『看板名称』已经有『测试创建公共看板』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。 + */ $kanban1 = new stdclass(); @@ -68,4 +75,4 @@ r($kanban->createTest($kanban3)) && p('name,space,type,owner,whitelist') && e(' r($kanban->createTest($kanban4)) && p('name:0') && e('『看板名称』不能为空。'); // 创建没有名字的公共空间 r($kanban->createTest($kanban5)) && p('space:0') && e('『所属空间』不能为空。'); // 创建没有空间公共空间 r($kanban->createTest($kanban6)) && p('name:0') && e('『看板名称』已经有『测试创建公共看板』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); // 创建重名公共空间 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createcard.php b/test/model/kanban/createcard.php index 3bef554215..1b299b5648 100755 --- a/test/model/kanban/createcard.php +++ b/test/model/kanban/createcard.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createCard(); cid=1 pid=1 +测试创建卡片1 >> 测试创建卡片1,1,1,测试创建卡片1的卡片描述 +测试创建卡片2 >> 测试创建卡片2,2,2,测试创建卡片2的卡片描述 +测试创建预计小于0的卡片 >> 预计不能为负数! +测试创建结束小于开始日期的卡片 >> "截止日期"不能小于"预计开始"! +测试创建没有名字的卡片 >> 『卡片名称』不能为空。 + */ $card1 = new stdclass(); @@ -56,4 +62,4 @@ r($kanban->createCardTest($card2)) && p('name,pri,estimate,desc') && e('测试 r($kanban->createCardTest($card3)) && p('estimate') && e('预计不能为负数!'); // 测试创建预计小于0的卡片 r($kanban->createCardTest($card4)) && p('end') && e('"截止日期"不能小于"预计开始"!'); // 测试创建结束小于开始日期的卡片 r($kanban->createCardTest($card5)) && p('name:0') && e('『卡片名称』不能为空。'); // 测试创建没有名字的卡片 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createcolumn.php b/test/model/kanban/createcolumn.php index 55cd98ee4f..b372470b7e 100755 --- a/test/model/kanban/createcolumn.php +++ b/test/model/kanban/createcolumn.php @@ -10,6 +10,15 @@ title=测试 kanbanModel->createColumn(); cid=1 pid=1 +创建没有在制品限制的看板列 >> 测试创建不限制看板列,-1,#333,0,1 +创建没有在制品限制的看板列 >> 测试创建不限制子看板列,-1,#333,1,1 +创建有在制品限制的看板列 >> 测试创建限制父看板列,111,#333,-1,1 +创建有在制品限制的子看板列 >> 测试创建限制子看板列,11,#333,5263,1 +创建没有名称的看板列 >> 『看板列名称』不能为空。 +创建没有填写在制品限制的看板列 >> 在制品数量必须是正整数。 +创建在制品数量为0的看板列 >> 在制品数量必须是正整数。 +创建在制品数量超出限制的子看板列 >> 父列的在制品数量不能小于子列在制品数量之和 + */ $column1 = new stdclass(); @@ -86,4 +95,4 @@ r($kanban->createColumnTest($column5)) && p('name:0') && r($kanban->createColumnTest($column6)) && p('limit') && e('在制品数量必须是正整数。'); // 创建没有填写在制品限制的看板列 r($kanban->createColumnTest($column7)) && p('limit') && e('在制品数量必须是正整数。'); // 创建在制品数量为0的看板列 r($kanban->createColumnTest($column8)) && p('limit:0') && e('父列的在制品数量不能小于子列在制品数量之和'); // 创建在制品数量超出限制的子看板列 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createdefaultcolumns.php b/test/model/kanban/createdefaultcolumns.php index 88b95477b1..c2d722efec 100755 --- a/test/model/kanban/createdefaultcolumns.php +++ b/test/model/kanban/createdefaultcolumns.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->createDefaultColumns(); cid=1 pid=1 +创建region 1 group 1的默认泳道列 >> 8 +创建region 2 group 2的默认泳道列 >> 8 +创建region 3 group 3的默认泳道列 >> 8 +创建region 4 group 4的默认泳道列 >> 8 +创建region 5 group 5的默认泳道列 >> 8 +重复创建region 1 group 1的默认泳道列 >> 12 + */ $kanban = new kanbanTest(); @@ -23,4 +30,4 @@ r($kanban->createDefaultColumnsTest($regionIDList[2], $groupIDList[2])) && p() & r($kanban->createDefaultColumnsTest($regionIDList[3], $groupIDList[3])) && p() && e('8'); // 创建region 4 group 4的默认泳道列 r($kanban->createDefaultColumnsTest($regionIDList[4], $groupIDList[4])) && p() && e('8'); // 创建region 5 group 5的默认泳道列 r($kanban->createDefaultColumnsTest($regionIDList[0], $groupIDList[0])) && p() && e('12'); // 重复创建region 1 group 1的默认泳道列 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createdefaultlane.php b/test/model/kanban/createdefaultlane.php index 5de6a9df41..4fd997b86c 100755 --- a/test/model/kanban/createdefaultlane.php +++ b/test/model/kanban/createdefaultlane.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createDefaultLane(); cid=1 pid=1 +创建region 1 group 1的默认泳道 >> 默认泳道,1,1,common +创建region 2 group 2的默认泳道 >> 默认泳道,2,2,common +创建region 3 group 3的默认泳道 >> 默认泳道,3,3,common +创建region 4 group 4的默认泳道 >> 默认泳道,4,4,common +创建region 5 group 5的默认泳道 >> 默认泳道,5,5,common + */ $kanban = new kanbanTest(); @@ -22,4 +28,4 @@ r($kanban->createDefaultLaneTest($regionIDList[1], $groupIDList[1])) && p('name, r($kanban->createDefaultLaneTest($regionIDList[2], $groupIDList[2])) && p('name,group,region,type') && e('默认泳道,3,3,common'); // 创建region 3 group 3的默认泳道 r($kanban->createDefaultLaneTest($regionIDList[3], $groupIDList[3])) && p('name,group,region,type') && e('默认泳道,4,4,common'); // 创建region 4 group 4的默认泳道 r($kanban->createDefaultLaneTest($regionIDList[4], $groupIDList[4])) && p('name,group,region,type') && e('默认泳道,5,5,common'); // 创建region 5 group 5的默认泳道 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createdefaultregion.php b/test/model/kanban/createdefaultregion.php index efe8c8e287..5d7f9cdd18 100755 --- a/test/model/kanban/createdefaultregion.php +++ b/test/model/kanban/createdefaultregion.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createDefaultRegion(); cid=1 pid=1 +创建看板10001的默认区域 >> 10001,10001,默认区域 +创建看板10002的默认区域 >> 10002,10002,默认区域 +创建看板10003的默认区域 >> 10003,10003,默认区域 +创建看板10004的默认区域 >> 10004,10004,默认区域 +重复创建看板1的默认区域 >> 『区域名称』已经有『默认区域』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。 + */ $kanban1 = new stdclass(); @@ -39,4 +45,4 @@ r($kanban->createDefaultRegionTest($kanban2)) && p('space,kanban,name') && e('10 r($kanban->createDefaultRegionTest($kanban3)) && p('space,kanban,name') && e('10003,10003,默认区域'); // 创建看板10003的默认区域 r($kanban->createDefaultRegionTest($kanban4)) && p('space,kanban,name') && e('10004,10004,默认区域'); // 创建看板10004的默认区域 r($kanban->createDefaultRegionTest($kanban5)) && p('name:0') && e('『区域名称』已经有『默认区域』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); // 重复创建看板1的默认区域 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createexecutioncolumns.php b/test/model/kanban/createexecutioncolumns.php index 94bcfe5eb4..c475d049f2 100755 --- a/test/model/kanban/createexecutioncolumns.php +++ b/test/model/kanban/createexecutioncolumns.php @@ -10,6 +10,22 @@ title=测试 kanbanModel->createExecutionColumns(); cid=1 pid=1 +创建泳道 100001 执行101 需求的看板列 >> 11 +创建泳道 100001 执行101 任务的看板列 >> 7 +创建泳道 100001 执行101 bug 的看板列 >> 9 +创建泳道 100002 执行102 需求的看板列 >> 11 +创建泳道 100002 执行102 任务的看板列 >> 7 +创建泳道 100002 执行102 bug 的看板列 >> 14 +创建泳道 100003 执行103 需求的看板列 >> 11 +创建泳道 100003 执行103 任务的看板列 >> 7 +创建泳道 100003 执行103 bug 的看板列 >> 9 +创建泳道 100004 执行104 需求的看板列 >> 11 +创建泳道 100004 执行104 任务的看板列 >> 7 +创建泳道 100004 执行104 bug 的看板列 >> 9 +创建泳道 100005 执行105 需求的看板列 >> 11 +创建泳道 100005 执行105 任务的看板列 >> 7 +创建泳道 100005 执行105 bug 的看板列 >> 9 + */ $laneIDList = array('100001', '100002', '100003', '10004', '10005'); @@ -33,4 +49,4 @@ r($kanban->createExecutionColumnsTest($laneIDList[3], $typeList[2], $executionID r($kanban->createExecutionColumnsTest($laneIDList[4], $typeList[0], $executionIDList[4])) && p() && e('11'); // 创建泳道 100005 执行105 需求的看板列 r($kanban->createExecutionColumnsTest($laneIDList[4], $typeList[1], $executionIDList[4])) && p() && e('7'); // 创建泳道 100005 执行105 任务的看板列 r($kanban->createExecutionColumnsTest($laneIDList[4], $typeList[2], $executionIDList[4])) && p() && e('9'); // 创建泳道 100005 执行105 bug 的看板列 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createexecutionlane.php b/test/model/kanban/createexecutionlane.php index 523722b831..aa9fe6feb3 100755 --- a/test/model/kanban/createexecutionlane.php +++ b/test/model/kanban/createexecutionlane.php @@ -10,6 +10,20 @@ title=测试 kanbanModel->createExecutionLane(); cid=1 pid=1 +创建执行101的泳道 >> 3 +创建执行101 需求的泳道 >> 2 +创建执行101 需求 按类别分组的泳道 >> 3 +创建执行101的泳道 >> 3 +创建执行102 需求 按来源分组的泳道 >> 3 +创建执行102 任务 按优先级分组的泳道 >> 4 +创建执行102 任务 按需求分组的泳道 >> 7 +创建执行103的泳道 >> 3 +创建执行103 bug 按严重程度分组的泳道 >> 4 +创建执行103 bug 按模块分组的泳道 >> 8 +创建执行103 bug 按指派给分组的泳道 >> 10 +创建执行104的泳道 >> 3 +创建执行105的泳道 >> 3 + */ $executionIDList = array('101', '102', '103', '104', '105'); @@ -31,4 +45,4 @@ r($kanban->createExecutionLaneTest($executionIDList[2], $typeIDList[3], $groupBy r($kanban->createExecutionLaneTest($executionIDList[2], $typeIDList[3], $groupByIDList[5])) && p() && e('10'); // 创建执行103 bug 按指派给分组的泳道 r($kanban->createExecutionLaneTest($executionIDList[3])) && p() && e('3'); // 创建执行104的泳道 r($kanban->createExecutionLaneTest($executionIDList[4])) && p() && e('3'); // 创建执行105的泳道 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/creategroup.php b/test/model/kanban/creategroup.php index b5e6f66e90..34bd0af144 100755 --- a/test/model/kanban/creategroup.php +++ b/test/model/kanban/creategroup.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createGroup(); cid=1 pid=1 +测试创建看板1 区域1的看板组 >> ,1, +测试创建看板2 区域2的看板组 >> ,2, +测试创建看板3 区域3的看板组 >> ,3, +测试创建看板4 区域4的看板组 >> ,4, +测试创建看板5 区域5的看板组 >> ,5, + */ $kanbanIDList = array('1', '2', '3', '4', '5'); @@ -22,4 +28,4 @@ r($kanban->createGroupTest($kanbanIDList[1], $regionIDList[1])) && p('kanaban,re r($kanban->createGroupTest($kanbanIDList[2], $regionIDList[2])) && p('kanaban,region,orde') && e(',3,'); // 测试创建看板3 区域3的看板组 r($kanban->createGroupTest($kanbanIDList[3], $regionIDList[3])) && p('kanaban,region,orde') && e(',4,'); // 测试创建看板4 区域4的看板组 r($kanban->createGroupTest($kanbanIDList[4], $regionIDList[4])) && p('kanaban,region,orde') && e(',5,'); // 测试创建看板5 区域5的看板组 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createlane.php b/test/model/kanban/createlane.php index b21358a6e2..3ca0b6ff57 100755 --- a/test/model/kanban/createlane.php +++ b/test/model/kanban/createlane.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createLane(); cid=1 pid=1 +测试创建与其他泳道使用相同看板列的泳道 >> 测试创建与其他泳道使用相同看板列的泳道,1,1 +测试创建使用独立看板列的泳道 >> 测试创建使用独立看板列的泳道,1,641 +测试创建不填写名称的泳道 >> 『泳道名称』不能为空。 +测试创建复用泳道1信息的泳道 >> 默认泳道,1,1 +测试创建复用泳道2信息的泳道 >> 默认泳道,2,2 + */ $kanbanID = 1; @@ -37,7 +43,6 @@ $lane4->id = 1; $lane5 = new stdclass(); $lane5->id = 2; - $kanban = new kanbanTest(); r($kanban->createLaneTest($lane1, $kanbanID, $regionID)) && p('name,region,group') && e('测试创建与其他泳道使用相同看板列的泳道,1,1'); //测试创建与其他泳道使用相同看板列的泳道 @@ -45,4 +50,4 @@ r($kanban->createLaneTest($lane2, $kanbanID, $regionID)) && p('name,region,group r($kanban->createLaneTest($lane3, $kanbanID, $regionID)) && p('name:0') && e('『泳道名称』不能为空。'); //测试创建不填写名称的泳道 r($kanban->createLaneTest($lane4, $kanbanID, $regionID)) && p('name,region,group') && e('默认泳道,1,1'); //测试创建复用泳道1信息的泳道 r($kanban->createLaneTest($lane5, $kanbanID, $regionID)) && p('name,region,group') && e('默认泳道,2,2'); //测试创建复用泳道2信息的泳道 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createrdcolumn.php b/test/model/kanban/createrdcolumn.php index f53030a019..a277078951 100755 --- a/test/model/kanban/createrdcolumn.php +++ b/test/model/kanban/createrdcolumn.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->createRDColumn(); cid=1 pid=1 +测试创建执行161 区域101 泳道组101 泳道101 story执行看板的泳道列 >> 22 +测试创建执行161 区域101 泳道组102 泳道102 bug执行看板的泳道列 >> 18 +测试创建执行161 区域101 泳道组103 泳道103 task执行看板的泳道列 >> 14 +测试创建执行162 区域102 泳道组104 泳道104 story执行看板的泳道列 >> 22 +测试创建执行162 区域102 泳道组105 泳道105 bug执行看板的泳道列 >> 18 +测试创建执行162 区域102 泳道组106 泳道106 task执行看板的泳道列 >> 14 + */ $regionIDList = array('101', '102'); @@ -26,4 +33,4 @@ r($kanban->createRDColumnTest($regionIDList[0], $groupIDList[2], $laneIDList[2], r($kanban->createRDColumnTest($regionIDList[1], $groupIDList[3], $laneIDList[3], $laneTypeList[0], $executionIDList[1])) && p() && e('22'); // 测试创建执行162 区域102 泳道组104 泳道104 story执行看板的泳道列 r($kanban->createRDColumnTest($regionIDList[1], $groupIDList[4], $laneIDList[4], $laneTypeList[1], $executionIDList[1])) && p() && e('18'); // 测试创建执行162 区域102 泳道组105 泳道105 bug执行看板的泳道列 r($kanban->createRDColumnTest($regionIDList[1], $groupIDList[5], $laneIDList[5], $laneTypeList[2], $executionIDList[1])) && p() && e('14'); // 测试创建执行162 区域102 泳道组106 泳道106 task执行看板的泳道列 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createrdkanban.php b/test/model/kanban/createrdkanban.php index bdc7e685ef..8b4861c08d 100755 --- a/test/model/kanban/createrdkanban.php +++ b/test/model/kanban/createrdkanban.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createRDKanban(); cid=1 pid=1 +测试创建执行10001的执行看板 >> 1,3,0 +测试创建执行10002的执行看板 >> 1,3,0 +测试创建执行10003的执行看板 >> 1,3,0 +测试创建执行10004的执行看板 >> 1,3,0 +测试创建执行10005的执行看板 >> 1,3,0 + */ $execution1 = new stdclass(); @@ -34,4 +40,4 @@ r($kanban->createRDKanbanTest($execution2)) && p() && e('1,3,0'); // 测试创 r($kanban->createRDKanbanTest($execution3)) && p() && e('1,3,0'); // 测试创建执行10003的执行看板 r($kanban->createRDKanbanTest($execution4)) && p() && e('1,3,0'); // 测试创建执行10004的执行看板 r($kanban->createRDKanbanTest($execution5)) && p() && e('1,3,0'); // 测试创建执行10005的执行看板 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createrdlane.php b/test/model/kanban/createrdlane.php index 6d3b23e411..1ea9a7f65a 100755 --- a/test/model/kanban/createrdlane.php +++ b/test/model/kanban/createrdlane.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createRDLane(); cid=1 pid=1 +测试创建执行101的执行看板的泳道 >> 6 +测试创建执行102的执行看板的泳道 >> 6 +测试创建执行103的执行看板的泳道 >> 6 +测试创建执行104的执行看板的泳道 >> 6 +测试创建执行105的执行看板的泳道 >> 6 + */ $executionIDList = array('161', '162', '163', '164', '165'); @@ -22,4 +28,4 @@ r($kanban->createRDLaneTest($executionIDList[1], $regionIDList[1])) && p() && e( r($kanban->createRDLaneTest($executionIDList[2], $regionIDList[2])) && p() && e('6'); // 测试创建执行103的执行看板的泳道 r($kanban->createRDLaneTest($executionIDList[3], $regionIDList[3])) && p() && e('6'); // 测试创建执行104的执行看板的泳道 r($kanban->createRDLaneTest($executionIDList[4], $regionIDList[4])) && p() && e('6'); // 测试创建执行105的执行看板的泳道 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createrdregion.php b/test/model/kanban/createrdregion.php index ce4f0982a0..128bac350c 100755 --- a/test/model/kanban/createrdregion.php +++ b/test/model/kanban/createrdregion.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createRDRegion(); cid=1 pid=1 +测试创建执行10001的执行看板区域 >> 默认区域,100001 +测试创建执行10002的执行看板区域 >> 默认区域,100002 +测试创建执行10003的执行看板区域 >> 默认区域,100003 +测试创建执行10004的执行看板区域 >> 默认区域,100004 +测试创建执行10005的执行看板区域 >> 默认区域,100005 + */ $execution1 = new stdclass(); @@ -34,4 +40,4 @@ r($kanban->createRDRegionTest($execution2)) && p('name,kanban') && e('默认区 r($kanban->createRDRegionTest($execution3)) && p('name,kanban') && e('默认区域,100003'); // 测试创建执行10003的执行看板区域 r($kanban->createRDRegionTest($execution4)) && p('name,kanban') && e('默认区域,100004'); // 测试创建执行10004的执行看板区域 r($kanban->createRDRegionTest($execution5)) && p('name,kanban') && e('默认区域,100005'); // 测试创建执行10005的执行看板区域 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createregion.php b/test/model/kanban/createregion.php index b71fcc79ea..e9b6e36610 100755 --- a/test/model/kanban/createregion.php +++ b/test/model/kanban/createregion.php @@ -10,6 +10,14 @@ title=测试 kanbanModel->createRegion(); cid=1 pid=1 +创建默认区域 >> 默认区域,1,100001 +创建自定义区域1 >> 新增的区域1,1,100001 +创建复制样式区域2 >> 新增的区域2,1,0 +创建自定义区域3 >> 新增的区域3,1,100001 +创建复制样式区域4 >> 新增的区域4,1,0 +创建没有名称的区域 >> 『区域名称』不能为空。 +创建重名自定义区域1 >> 『区域名称』已经有『新增的区域1』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。 + */ $kanban1 = new stdclass(); $kanban1->id = '100001'; @@ -46,4 +54,4 @@ r($kanban->createRegionTest($kanban1, $region3)) && p('name,space r($kanban->createRegionTest($kanban1, $region4, $copyRegionID)) && p('name,space,kanban') && e('新增的区域4,1,0'); // 创建复制样式区域4 r($kanban->createRegionTest($kanban1, $region5)) && p('name:0') && e('『区域名称』不能为空。'); // 创建没有名称的区域 r($kanban->createRegionTest($kanban1, $region1)) && p('name:0') && e('『区域名称』已经有『新增的区域1』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); // 创建重名自定义区域1 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/createspace.php b/test/model/kanban/createspace.php index 06d7800395..effb8119a2 100755 --- a/test/model/kanban/createspace.php +++ b/test/model/kanban/createspace.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->createSpace(); cid=1 pid=1 +创建私人空间 >> 测试创建私人空间,private,私人空间的描述,admin,,admin,po15 +创建协作空间 >> 测试创建协作空间,cooperation,协作空间的描述,po16,po15,admin,po16, +创建公共空间 >> 测试创建公共空间,public,公共空间的描述,user1,user2,user3,admin,user1, +创建不填写名称的空间 >> 『空间名称』不能为空。 +创建不填写负责人的空间 >> 『负责人』不能为空。 + */ $space1 = new stdclass(); @@ -58,4 +64,4 @@ r($kanban->createSpaceTest($space1)) && p('name,type,desc,owner,team,whitelist') r($kanban->createSpaceTest($space2)) && p('name,type,desc,owner,team,whitelist') && e('测试创建协作空间,cooperation,协作空间的描述,po16,po15,admin,po16,'); // 创建协作空间 r($kanban->createSpaceTest($space3)) && p('name,type,desc,owner,team,whitelist') && e('测试创建公共空间,public,公共空间的描述,user1,user2,user3,admin,user1,'); // 创建公共空间 r($kanban->createSpaceTest($space4)) && p('name:0') && e('『空间名称』不能为空。'); // 创建不填写名称的空间 -r($kanban->createSpaceTest($space5)) && p('owner:0') && e('『负责人』不能为空。'); // 创建不填写负责人的空间 +r($kanban->createSpaceTest($space5)) && p('owner:0') && e('『负责人』不能为空。'); // 创建不填写负责人的空间 \ No newline at end of file diff --git a/test/model/kanban/getbyid.php b/test/model/kanban/getbyid.php index 35a67379c4..c05a2756ea 100755 --- a/test/model/kanban/getbyid.php +++ b/test/model/kanban/getbyid.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getByID(); cid=1 pid=1 +测试查询看板1的信息 >> 通用看板1,1,po15,,user3,po15,,,user3,po15 +测试查询看板2的信息 >> 通用看板2,1,po15,,user3,po15,,,user3,po15 +测试查询看板3的信息 >> 通用看板3,2,po16,,user4,po16,,,user4,po16 +测试查询看板4的信息 >> 通用看板4,2,po16,,user4,po16,,,user4,po16 +测试查询看板5的信息 >> 通用看板5,3,po17,,user5,po17,,,user5,po17 +测试查询不存在的看板信息 >> 0 + */ $kanbanIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -21,4 +28,4 @@ r($kanban->getByIDTest($kanbanIDList[1])) && p('name,space,owner,team,whitelist' r($kanban->getByIDTest($kanbanIDList[2])) && p('name,space,owner,team,whitelist') && e('通用看板3,2,po16,,user4,po16,,,user4,po16'); // 测试查询看板3的信息 r($kanban->getByIDTest($kanbanIDList[3])) && p('name,space,owner,team,whitelist') && e('通用看板4,2,po16,,user4,po16,,,user4,po16'); // 测试查询看板4的信息 r($kanban->getByIDTest($kanbanIDList[4])) && p('name,space,owner,team,whitelist') && e('通用看板5,3,po17,,user5,po17,,,user5,po17'); // 测试查询看板5的信息 -r($kanban->getByIDTest($kanbanIDList[5])) && p('name,space,owner,team,whitelist') && e('0'); // 测试查询不存在的看板信息 +r($kanban->getByIDTest($kanbanIDList[5])) && p('name,space,owner,team,whitelist') && e('0'); // 测试查询不存在的看板信息 \ No newline at end of file diff --git a/test/model/kanban/getcanviewobjects.php b/test/model/kanban/getcanviewobjects.php index cf2e4db4d8..128fb2d2f5 100755 --- a/test/model/kanban/getcanviewobjects.php +++ b/test/model/kanban/getcanviewobjects.php @@ -9,6 +9,22 @@ title=测试 kanbanModel->getCanViewObjects(); cid=1 pid=1 +测试查询admin有权限查看的看板个数 >> 32 +测试查询admin有权限查看的空间个数 >> 19 +测试查询admin有权限查看的未关闭看板个数 >> 100 +测试查询admin有权限查看的私人看板个数 >> 32 +测试查询admin有权限查看的协同看板个数 >> 100 +测试查询admin有权限查看的公共看板个数 >> 100 +测试查询admin有权限查看的参与看板个数 >> 0 +测试查询admin有权限查看的看板个数 >> 32 +测试查询admin有权限查看的看板个数 >> 32 +测试查询po1有权限查看的看板个数 >> 32 +测试查询po2有权限查看的看板个数 >> 32 +测试查询user1有权限查看的看板个数 >> 32 +测试查询user2有权限查看的看板个数 >> 32 +测试查询pm1有权限查看的看板个数 >> 32 +测试查询pm2有权限查看的看板个数 >> 32 + */ $kanban = new kanbanTest(); @@ -31,4 +47,4 @@ r($kanban->getCanViewObjectsTest($userList[2])) & r($kanban->getCanViewObjectsTest($userList[3])) && p() && e('32'); // 测试查询user1有权限查看的看板个数 r($kanban->getCanViewObjectsTest($userList[4])) && p() && e('32'); // 测试查询user2有权限查看的看板个数 r($kanban->getCanViewObjectsTest($userList[5])) && p() && e('32'); // 测试查询pm1有权限查看的看板个数 -r($kanban->getCanViewObjectsTest($userList[6])) && p() && e('32'); // 测试查询pm2有权限查看的看板个数 +r($kanban->getCanViewObjectsTest($userList[6])) && p() && e('32'); // 测试查询pm2有权限查看的看板个数 \ No newline at end of file diff --git a/test/model/kanban/getcardbyid.php b/test/model/kanban/getcardbyid.php index 0140ee5983..d74c32150d 100755 --- a/test/model/kanban/getcardbyid.php +++ b/test/model/kanban/getcardbyid.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getCardByID(); cid=1 pid=1 +测试查询卡片1的信息 >> 卡片1,doing,3,0 +测试查询卡片2的信息 >> 卡片2,doing,3,50 +测试查询卡片3的信息 >> 卡片3,done,3,100 +测试查询卡片4的信息 >> 卡片4,doing,3,0 +测试查询卡片5的信息 >> 卡片5,doing,3,50 +测试查询不存在卡片的信息 >> 0 + */ $cardIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -21,4 +28,4 @@ r($kanban->getCardByIDTest($cardIDList[1])) && p('name,status,pri,progress') && r($kanban->getCardByIDTest($cardIDList[2])) && p('name,status,pri,progress') && e('卡片3,done,3,100'); // 测试查询卡片3的信息 r($kanban->getCardByIDTest($cardIDList[3])) && p('name,status,pri,progress') && e('卡片4,doing,3,0'); // 测试查询卡片4的信息 r($kanban->getCardByIDTest($cardIDList[4])) && p('name,status,pri,progress') && e('卡片5,doing,3,50'); // 测试查询卡片5的信息 -r($kanban->getCardByIDTest($cardIDList[5])) && p() && e('0'); // 测试查询不存在卡片的信息 +r($kanban->getCardByIDTest($cardIDList[5])) && p() && e('0'); // 测试查询不存在卡片的信息 \ No newline at end of file diff --git a/test/model/kanban/getcardgroupbyexecution.php b/test/model/kanban/getcardgroupbyexecution.php index affbfd3a54..def1e08799 100755 --- a/test/model/kanban/getcardgroupbyexecution.php +++ b/test/model/kanban/getcardgroupbyexecution.php @@ -10,6 +10,18 @@ title=测试 kanbanModel->getCardGroupByExecution(); cid=1 pid=1 +测试查询execution161的卡片 >> 5 +测试查询execution161的task卡片 >> 1 +测试查询execution161的bug卡片 >> 3 +测试查询execution161的story卡片 >> 1 +测试查询execution162的卡片 >> 5 +测试查询execution162的task卡片 >> 1 +测试查询execution162的bug卡片 >> 3 +测试查询execution162的story卡片 >> 1 +测试查询execution163的卡片 >> 4 +测试查询execution164的卡片 >> 4 +测试查询execution165的卡片 >> 0 + */ $executionIDList = array('161', '162', '163', '164', '165'); @@ -26,4 +38,4 @@ r($kanban->getCardGroupByExecutionTest($executionIDList[1], $browseTypeList[1])) r($kanban->getCardGroupByExecutionTest($executionIDList[1], $browseTypeList[2])) && p() && e('1'); // 测试查询execution162的story卡片 r($kanban->getCardGroupByExecutionTest($executionIDList[2])) && p() && e('4'); // 测试查询execution163的卡片 r($kanban->getCardGroupByExecutionTest($executionIDList[3])) && p() && e('4'); // 测试查询execution164的卡片 -r($kanban->getCardGroupByExecutionTest($executionIDList[4])) && p() && e('0'); // 测试查询execution165的卡片 +r($kanban->getCardGroupByExecutionTest($executionIDList[4])) && p() && e('0'); // 测试查询execution165的卡片 \ No newline at end of file diff --git a/test/model/kanban/getcardgroupbykanban.php b/test/model/kanban/getcardgroupbykanban.php index c835b8b15c..a0dfb69a4d 100755 --- a/test/model/kanban/getcardgroupbykanban.php +++ b/test/model/kanban/getcardgroupbykanban.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getCardGroupByKanban(); cid=1 pid=1 +测试查询看板1的卡片数量 >> 1 +测试查询看板2的卡片数量 >> 1 +测试查询看板3的卡片数量 >> 1 +测试查询看板4的卡片数量 >> 1 +测试查询看板5的卡片数量 >> 1 +测试查询不存在看板的卡片数量 >> 0 + */ $kanbanIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -21,4 +28,4 @@ r($kanban->getCardGroupByKanbanTest($kanbanIDList[1])) && p() && e('1'); // 测 r($kanban->getCardGroupByKanbanTest($kanbanIDList[2])) && p() && e('1'); // 测试查询看板3的卡片数量 r($kanban->getCardGroupByKanbanTest($kanbanIDList[3])) && p() && e('1'); // 测试查询看板4的卡片数量 r($kanban->getCardGroupByKanbanTest($kanbanIDList[4])) && p() && e('1'); // 测试查询看板5的卡片数量 -r($kanban->getCardGroupByKanbanTest($kanbanIDList[5])) && p() && e('0'); // 测试查询不存在看板的卡片数量 +r($kanban->getCardGroupByKanbanTest($kanbanIDList[5])) && p() && e('0'); // 测试查询不存在看板的卡片数量 \ No newline at end of file diff --git a/test/model/kanban/getcards2import.php b/test/model/kanban/getcards2import.php index 5d9c769981..98bd06100d 100755 --- a/test/model/kanban/getcards2import.php +++ b/test/model/kanban/getcards2import.php @@ -10,6 +10,20 @@ title=测试 kanbanModel->getCards2Import(); cid=1 pid=1 +测试获取可以导入的卡片数量 >> 256 +测试获取看板1可以导入的卡片数量 >> 0 +测试获取看板1可以导入的卡片数量 排除看板1 >> 0 +测试获取看板2可以导入的卡片数量 >> 0 +测试获取看板2可以导入的卡片数量 排除看板1 >> 0 +测试获取看板3可以导入的卡片数量 >> 0 +测试获取看板3可以导入的卡片数量 排除看板1 >> 0 +测试获取看板4可以导入的卡片数量 >> 0 +测试获取看板4可以导入的卡片数量 排除看板1 >> 0 +测试获取看板5可以导入的卡片数量 >> 8 +测试获取看板5可以导入的卡片数量 >> 8 +测试获取不存在看板可以导入的卡片数量 排除看板1 >> 0 +测试获取不存在看板可以导入的卡片数量 排除看板1 >> 0 + */ $kanbanIDList = array('1', '2', '3', '4', '5', '1000001'); $excludedID = 1; @@ -28,4 +42,4 @@ r($kanban->getCards2ImportTest($kanbanIDList[3], $excludedID)) && p() && e('0'); r($kanban->getCards2ImportTest($kanbanIDList[4])) && p() && e('8'); // 测试获取看板5可以导入的卡片数量 r($kanban->getCards2ImportTest($kanbanIDList[4])) && p() && e('8'); // 测试获取看板5可以导入的卡片数量 r($kanban->getCards2ImportTest($kanbanIDList[5], $excludedID)) && p() && e('0'); // 测试获取不存在看板可以导入的卡片数量 排除看板1 -r($kanban->getCards2ImportTest($kanbanIDList[5], $excludedID)) && p() && e('0'); // 测试获取不存在看板可以导入的卡片数量 排除看板1 +r($kanban->getCards2ImportTest($kanbanIDList[5], $excludedID)) && p() && e('0'); // 测试获取不存在看板可以导入的卡片数量 排除看板1 \ No newline at end of file diff --git a/test/model/kanban/getcardsbyobject.php b/test/model/kanban/getcardsbyobject.php index 8f28653a99..d3f29a5f85 100755 --- a/test/model/kanban/getcardsbyobject.php +++ b/test/model/kanban/getcardsbyobject.php @@ -10,6 +10,21 @@ title=测试 kanbanModel->getCardsByObject(); cid=1 pid=1 +测试查询kanban 1的卡片数量 >> 16 +测试查询kanban 2的卡片数量 >> 16 +测试查询kanban 3的卡片数量 >> 16 +测试查询kanban 4的卡片数量 >> 16 +测试查询kanban 5的卡片数量 >> 16 +测试查询不存在kanban的卡片数量 >> 0 +测试查询region 1的卡片数量 >> 16 +测试查询region 2的卡片数量 >> 16 +测试查询region 3的卡片数量 >> 16 +测试查询region 4的卡片数量 >> 16 +测试查询region 5的卡片数量 >> 16 +测试查询不存在region的卡片数量 >> 0 +测试查询status doing的卡片数量 >> 667 +测试查询status doing的卡片数量 >> 333 + */ $objectType = array('kanban', 'region', 'status'); @@ -32,4 +47,4 @@ r($kanban->getCardsByObjectTest($objectType[1], $regionIDList[3])) && p() && e(' r($kanban->getCardsByObjectTest($objectType[1], $regionIDList[4])) && p() && e('16'); // 测试查询region 5的卡片数量 r($kanban->getCardsByObjectTest($objectType[1], $regionIDList[5])) && p() && e('0'); // 测试查询不存在region的卡片数量 r($kanban->getCardsByObjectTest($objectType[2], $statusList[0])) && p() && e('667'); // 测试查询status doing的卡片数量 -r($kanban->getCardsByObjectTest($objectType[2], $statusList[1])) && p() && e('333'); // 测试查询status doing的卡片数量 +r($kanban->getCardsByObjectTest($objectType[2], $statusList[1])) && p() && e('333'); // 测试查询status doing的卡片数量 \ No newline at end of file diff --git a/test/model/kanban/getcolumnbyid.php b/test/model/kanban/getcolumnbyid.php index a675153319..d9edb3b943 100755 --- a/test/model/kanban/getcolumnbyid.php +++ b/test/model/kanban/getcolumnbyid.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getColumnByID(); cid=1 pid=1 +测试查询看板列1的信息 >> column1,1,未开始,-1 +测试查询看板列2的信息 >> column2,1,进行中,-1 +测试查询看板列3的信息 >> column3,1,已完成,-1 +测试查询看板列4的信息 >> column4,1,已关闭,-1 +测试查询看板列5的信息 >> column5,2,未开始,-1 +测试查询不存在看板列的信息 >> 0 + */ $columnIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -21,4 +28,4 @@ r($kanban->getColumnByIDTest($columnIDList[1])) && p('type,region,name,limit') & r($kanban->getColumnByIDTest($columnIDList[2])) && p('type,region,name,limit') && e('column3,1,已完成,-1'); // 测试查询看板列3的信息 r($kanban->getColumnByIDTest($columnIDList[3])) && p('type,region,name,limit') && e('column4,1,已关闭,-1'); // 测试查询看板列4的信息 r($kanban->getColumnByIDTest($columnIDList[4])) && p('type,region,name,limit') && e('column5,2,未开始,-1'); // 测试查询看板列5的信息 -r($kanban->getColumnByIDTest($columnIDList[5])) && p('type,region,name,limit') && e('0'); // 测试查询不存在看板列的信息 +r($kanban->getColumnByIDTest($columnIDList[5])) && p('type,region,name,limit') && e('0'); // 测试查询不存在看板列的信息 \ No newline at end of file diff --git a/test/model/kanban/getcolumngroupbyregions.php b/test/model/kanban/getcolumngroupbyregions.php index 18c5fd886f..d448188551 100755 --- a/test/model/kanban/getcolumngroupbyregions.php +++ b/test/model/kanban/getcolumngroupbyregions.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->getColumnGroupByRegions(); cid=1 pid=1 +测试获取region 1 2 3 的看板列数量 >> 12 +测试获取region 4,5,6的看板列数量 >> 12 +测试获取region 7,8,9的看板列数量 >> 12 +测试获取region 10,11,12的看板列数量 >> 12 +测试获取region 13,14,15的看板列数量 >> 12 + */ $regions1 = '1,2,3'; @@ -24,4 +30,4 @@ r($kanban->getColumnGroupByRegionsTest($regions1)) && p() && e('12'); // 测试 r($kanban->getColumnGroupByRegionsTest($regions2)) && p() && e('12'); // 测试获取region 4,5,6的看板列数量 r($kanban->getColumnGroupByRegionsTest($regions3)) && p() && e('12'); // 测试获取region 7,8,9的看板列数量 r($kanban->getColumnGroupByRegionsTest($regions4)) && p() && e('12'); // 测试获取region 10,11,12的看板列数量 -r($kanban->getColumnGroupByRegionsTest($regions5)) && p() && e('12'); // 测试获取region 13,14,15的看板列数量 +r($kanban->getColumnGroupByRegionsTest($regions5)) && p() && e('12'); // 测试获取region 13,14,15的看板列数量 \ No newline at end of file diff --git a/test/model/kanban/getcolumnidbylaneid.php b/test/model/kanban/getcolumnidbylaneid.php index 31262f3b3e..db7a70909e 100755 --- a/test/model/kanban/getcolumnidbylaneid.php +++ b/test/model/kanban/getcolumnidbylaneid.php @@ -10,6 +10,24 @@ title=测试 kanbanModel->getColumnIDByLaneID(); cid=1 pid=1 +测试获取泳道1 column1的看板列 >> 1 +测试获取泳道1 column2的看板列 >> 2 +测试获取泳道1 wait的看板列 >> 0 +测试获取泳道1 test的看板列 >> 0 +测试获取泳道1 backlog的看板列 >> 0 +测试获取泳道2 column2的看板列 >> 0 +测试获取泳道2 wait的看板列 >> 0 +测试获取泳道107 wait的看板列 >> 0 +测试获取泳道107 test的看板列 >> 460 +测试获取泳道107 backlog的看板列 >> 455 +测试获取泳道108 wait的看板列 >> 0 +测试获取泳道108 test的看板列 >> 471 +测试获取泳道108 backlog的看板列 >> 0 +测试获取泳道109 wait的看板列 >> 475 +测试获取泳道109 test的看板列 >> 0 +测试获取泳道109 backlog的看板列 >> 0 +测试获取不存在的泳道 common的看板列 >> 0 + */ $laneIDList = array('1', '2', '107', '108', '109', '10001'); @@ -33,4 +51,4 @@ r($kanban->getColumnIDByLaneIDTest($laneIDList[3], $columnTypeList[4])) && p() & r($kanban->getColumnIDByLaneIDTest($laneIDList[4], $columnTypeList[2])) && p() && e('475'); // 测试获取泳道109 wait的看板列 r($kanban->getColumnIDByLaneIDTest($laneIDList[4], $columnTypeList[3])) && p() && e('0'); // 测试获取泳道109 test的看板列 r($kanban->getColumnIDByLaneIDTest($laneIDList[4], $columnTypeList[4])) && p() && e('0'); // 测试获取泳道109 backlog的看板列 -r($kanban->getColumnIDByLaneIDTest($laneIDList[5], $columnTypeList[0])) && p() && e('0'); // 测试获取不存在的泳道 common的看板列 +r($kanban->getColumnIDByLaneIDTest($laneIDList[5], $columnTypeList[0])) && p() && e('0'); // 测试获取不存在的泳道 common的看板列 \ No newline at end of file diff --git a/test/model/kanban/getcolumnsbyobject.php b/test/model/kanban/getcolumnsbyobject.php index 16959303f0..5aaa455754 100755 --- a/test/model/kanban/getcolumnsbyobject.php +++ b/test/model/kanban/getcolumnsbyobject.php @@ -10,6 +10,19 @@ title=测试 kanbanModel->getColumnsByObject(); cid=1 pid=1 +测试获取parent 457的看板列数量 >> 2 +测试获取parent 468的看板列数量 >> 2 +测试获取parent 471的看板列数量 >> 2 +测试获取parent 100001的看板列数量 >> 0 +测试获取region 1的看板列数量 >> 0 +测试获取region 2的看板列数量 >> 0 +测试获取region 3的看板列数量 >> 0 +测试获取region 100001的看板列数量 >> 0 +测试获取group 1的看板列数量 >> 7 +测试获取group 2的看板列数量 >> 9 +测试获取group 3的看板列数量 >> 9 +测试获取group 100001的看板列数量 >> 0 + */ $objectTypeList = array('parent', 'region', '`group`'); @@ -30,4 +43,4 @@ r($kanban->getColumnsByObjectTest($objectTypeList[1], $parentIDList[3])) && p() r($kanban->getColumnsByObjectTest($objectTypeList[2], $parentIDList[0])) && p() && e('7'); // 测试获取group 1的看板列数量 r($kanban->getColumnsByObjectTest($objectTypeList[2], $parentIDList[1])) && p() && e('9'); // 测试获取group 2的看板列数量 r($kanban->getColumnsByObjectTest($objectTypeList[2], $parentIDList[2])) && p() && e('9'); // 测试获取group 3的看板列数量 -r($kanban->getColumnsByObjectTest($objectTypeList[2], $parentIDList[3])) && p() && e('0'); // 测试获取group 100001的看板列数量 +r($kanban->getColumnsByObjectTest($objectTypeList[2], $parentIDList[3])) && p() && e('0'); // 测试获取group 100001的看板列数量 \ No newline at end of file diff --git a/test/model/kanban/getexecutionkanban.php b/test/model/kanban/getexecutionkanban.php index b7e0456aec..4ee1b53470 100755 --- a/test/model/kanban/getexecutionkanban.php +++ b/test/model/kanban/getexecutionkanban.php @@ -10,6 +10,23 @@ title=测试 kanbanModel->getExecutionKanban(); cid=1 pid=1 +测试获取execution101的执行看板信息 >> columns:27, lanes:3, cards:15 +测试获取execution101 story的执行看板信息 >> columns:11, lanes:1, cards:0 +测试获取execution101 task的执行看板信息 >> columns:7, lanes:1, cards:11 +测试获取execution101 bug的执行看板信息 >> columns:9, lanes:1, cards:4 +测试获取execution102的执行看板信息 >> columns:27, lanes:3, cards:10 +测试获取execution102 story pri的执行看板信息 >> columns:11, lanes:3, cards:2 +测试获取execution102 story category的执行看板信息 >> columns:11, lanes:2, cards:2 +测试获取execution103的执行看板信息 >> columns:27, lanes:3, cards:10 +测试获取execution103 task module的执行看板信息 >> columns:7, lanes:5, cards:4 +测试获取execution103 story source的执行看板信息 >> columns:11, lanes:3, cards:2 +测试获取execution103的执行看板信息 >> columns:27, lanes:3, cards:10 +测试获取execution103 bug module的执行看板信息 >> columns:9, lanes:2, cards:4 +测试获取execution103 bug source的执行看板信息 >> columns:9, lanes:5, cards:4 +测试获取execution103的执行看板信息 >> columns:27, lanes:3, cards:10 +测试获取execution103 bug module的执行看板信息 >> columns:9, lanes:5, cards:4 +测试获取execution103 bug severity的执行看板信息 >> columns:9, lanes:4, cards:4 + */ $executionIDList = array('101', '102', '103', '104', '105'); @@ -34,4 +51,4 @@ r($kanban->getExecutionKanbanTest($executionIDList[3], $browseTypeList[2], $grou r($kanban->getExecutionKanbanTest($executionIDList[4])) && p() && e('columns:27, lanes:3, cards:10'); // 测试获取execution103的执行看板信息 r($kanban->getExecutionKanbanTest($executionIDList[4], $browseTypeList[2], $groupByList[5])) && p() && e('columns:9, lanes:5, cards:4'); // 测试获取execution103 bug module的执行看板信息 r($kanban->getExecutionKanbanTest($executionIDList[4], $browseTypeList[2], $groupByList[6])) && p() && e('columns:9, lanes:4, cards:4'); // 测试获取execution103 bug severity的执行看板信息 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/getgroupbyspacelist.php b/test/model/kanban/getgroupbyspacelist.php index 48423ff337..06d3ea97a4 100755 --- a/test/model/kanban/getgroupbyspacelist.php +++ b/test/model/kanban/getgroupbyspacelist.php @@ -10,6 +10,17 @@ title=测试 kanbanModel->getGroupBySpaceList(); cid=1 pid=1 +获取空间1 2 3的看板 >> 6 +获取空间1 2 3 看板1,2,3,4的看板 >> 2 +获取空间4,5,6的看板 >> 6 +获取空间4,5,6 看板7,8,11,12的看板 >> 2 +获取空间7,8,9的看板 >> 6 +获取空间7,8,9 看板15,16,17,18的看板 >> 2 +获取空间10,11,12的看板 >> 6 +获取空间10,11,12 看板19,20,21,22,23,24,25的看板 >> 3 +获取空间13,14,15的看板 >> 6 +获取空间13,14,15 看板26,28,30的看板 >> 3 + */ $spaceIDList = array('1,2,3', '4,5,6', '7,8,9', '10,11,12', '13,14,15'); @@ -26,4 +37,4 @@ r($kanban->getGroupBySpaceListTest($spaceIDList[2], $kanbanIDList[2])) && p() && r($kanban->getGroupBySpaceListTest($spaceIDList[3])) && p() && e('6'); // 获取空间10,11,12的看板 r($kanban->getGroupBySpaceListTest($spaceIDList[3], $kanbanIDList[3])) && p() && e('3'); // 获取空间10,11,12 看板19,20,21,22,23,24,25的看板 r($kanban->getGroupBySpaceListTest($spaceIDList[4])) && p() && e('6'); // 获取空间13,14,15的看板 -r($kanban->getGroupBySpaceListTest($spaceIDList[4], $kanbanIDList[4])) && p() && e('3'); // 获取空间13,14,15 看板26,28,30的看板 +r($kanban->getGroupBySpaceListTest($spaceIDList[4], $kanbanIDList[4])) && p() && e('3'); // 获取空间13,14,15 看板26,28,30的看板 \ No newline at end of file diff --git a/test/model/kanban/getgroupgroupbyregions.php b/test/model/kanban/getgroupgroupbyregions.php index 5fe1e2b1c3..16e0a9289c 100755 --- a/test/model/kanban/getgroupgroupbyregions.php +++ b/test/model/kanban/getgroupgroupbyregions.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->getGroupGroupByRegions(); cid=1 pid=1 +获取区域1 2 3的泳道组数量 >> 3 +获取区域4,5,6的泳道组数量 >> 3 +获取区域7,8,9的泳道组数量 >> 3 +获取区域10,11,12的泳道组数量 >> 3 +获取区域13,14,15的泳道组数量 >> 3 + */ $regions = array('1,2,3', '4,5,6', '7,8,9', '10,11,12', '13,14,15'); @@ -20,4 +26,4 @@ r($kanban->getGroupGroupByRegionsTest($regions[0])) && p() && e('3'); //获取 r($kanban->getGroupGroupByRegionsTest($regions[1])) && p() && e('3'); //获取区域4,5,6的泳道组数量 r($kanban->getGroupGroupByRegionsTest($regions[2])) && p() && e('3'); //获取区域7,8,9的泳道组数量 r($kanban->getGroupGroupByRegionsTest($regions[3])) && p() && e('3'); //获取区域10,11,12的泳道组数量 -r($kanban->getGroupGroupByRegionsTest($regions[4])) && p() && e('3'); //获取区域13,14,15的泳道组数量 +r($kanban->getGroupGroupByRegionsTest($regions[4])) && p() && e('3'); //获取区域13,14,15的泳道组数量 \ No newline at end of file diff --git a/test/model/kanban/getgrouplist.php b/test/model/kanban/getgrouplist.php index ffa23ca58e..bfd591425a 100755 --- a/test/model/kanban/getgrouplist.php +++ b/test/model/kanban/getgrouplist.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getGroupList(); cid=1 pid=1 +获取区域1的看板 >> ,1 +获取区域1的看板 >> ,2 +获取区域1的看板 >> ,179,180,181 +获取区域1的看板 >> ,182,183,184 +获取区域1的看板 >> ,185,186,187 +获取区域1的看板 >> 0 + */ $regionIDList = array('1', '2', '107', '108', '109', '10001'); @@ -21,4 +28,4 @@ r($kanban->getGroupListTest($regionIDList[1])) && p() && e(',2'); // r($kanban->getGroupListTest($regionIDList[2])) && p() && e(',179,180,181'); // 获取区域1的看板 r($kanban->getGroupListTest($regionIDList[3])) && p() && e(',182,183,184'); // 获取区域1的看板 r($kanban->getGroupListTest($regionIDList[4])) && p() && e(',185,186,187'); // 获取区域1的看板 -r($kanban->getGroupListTest($regionIDList[5])) && p() && e('0'); // 获取区域1的看板 +r($kanban->getGroupListTest($regionIDList[5])) && p() && e('0'); // 获取区域1的看板 \ No newline at end of file diff --git a/test/model/kanban/getimportedcards.php b/test/model/kanban/getimportedcards.php index 97638c27f9..699429d5ff 100755 --- a/test/model/kanban/getimportedcards.php +++ b/test/model/kanban/getimportedcards.php @@ -10,6 +10,23 @@ title=测试 kanbanModel->getImportedCards(); cid=1 pid=1 +查看看板1的普通卡片和productplan卡片 >> ,1,2,3,4,5,6,7,8,801,802,803,804,805,806,807,808 +查看看板1的普通卡片和release卡片 >> ,1,2,3,4,5,6,7,8 +查看看板2的普通卡片和productplan卡片 >> ,9,10,11,12,13,14,15,16,809,810,811,812,813,814,815,816 +查看看板2的普通卡片和release卡片 >> ,9,10,11,12,13,14,15,16 +查看看板9的普通卡片和release卡片 >> ,65,66,67,68,69,70,71,72,871,872 +查看看板9的普通卡片和execution卡片 >> ,65,66,67,68,69,70,71,72 +查看看板10的普通卡片和release卡片 >> ,73,74,75,76,77,78,79,80,873,874,875,876,877,878,879,880 +查看看板10的普通卡片和execution卡片 >> ,73,74,75,76,77,78,79,80 +查看看板11的普通卡片和execution卡片 >> ,81,82,83,84,85,86,87,88,881,882,883,884,885,886,887,888 +查看看板11的普通卡片和build卡片 >> ,81,82,83,84,85,86,87,88 +查看看板12的普通卡片和execution卡片 >> ,89,90,91,92,93,94,95,96,889,890,891,892,893,894,895,896 +查看看板12的普通卡片和build卡片 >> ,89,90,91,92,93,94,95,96 +查看看板23的普通卡片和build卡片 >> ,177,178,179,180,181,182,183,184,981,982,983,984 +查看看板23的普通卡片和productplan片 >> ,177,178,179,180,181,182,183,184 +查看看板25的普通卡片和build卡片 >> ,193,194,195,196,197,198,199,200,993,994,995,996,997,998,999,1000 +查看看板25的普通卡片和productplan片 >> ,193,194,195,196,197,198,199,200 + */ $kanbanIDList = array('1', '2', '9', '10', '11', '12', '23', '25'); @@ -32,4 +49,4 @@ r($kanban->getImportedCardstest($kanbanIDList[5], $fromType[3])) && p() && e(',8 r($kanban->getImportedCardstest($kanbanIDList[6], $fromType[3])) && p() && e(',177,178,179,180,181,182,183,184,981,982,983,984'); // 查看看板23的普通卡片和build卡片 r($kanban->getImportedCardstest($kanbanIDList[6], $fromType[0])) && p() && e(',177,178,179,180,181,182,183,184'); // 查看看板23的普通卡片和productplan片 r($kanban->getImportedCardstest($kanbanIDList[7], $fromType[3])) && p() && e(',193,194,195,196,197,198,199,200,993,994,995,996,997,998,999,1000'); // 查看看板25的普通卡片和build卡片 -r($kanban->getImportedCardstest($kanbanIDList[7], $fromType[0])) && p() && e(',193,194,195,196,197,198,199,200'); // 查看看板25的普通卡片和productplan片 +r($kanban->getImportedCardstest($kanbanIDList[7], $fromType[0])) && p() && e(',193,194,195,196,197,198,199,200'); // 查看看板25的普通卡片和productplan片 \ No newline at end of file diff --git a/test/model/kanban/getkanban4group.php b/test/model/kanban/getkanban4group.php index da50abe391..b818a5b333 100755 --- a/test/model/kanban/getkanban4group.php +++ b/test/model/kanban/getkanban4group.php @@ -10,6 +10,21 @@ title=测试 kanbanModel->getKanban4Group(); cid=1 pid=1 +获取执行101 类型story 分组pri的看板信息 >> lanes:3 +获取执行101 类型story 分组category的看板信息 >> lanes:2 +获取执行101 类型story 分组module的看板信息 >> lanes:3 +获取执行101 类型story 分组source的看板信息 >> lanes:3 +获取执行102 类型task 分组pri的看板信息 >> lanes:4 +获取执行102 类型task 分组module的看板信息 >> lanes:5 +获取执行102 类型task 分组assignedTo的看板信息 >> lanes:1 +获取执行102 类型task 分组story的看板信息 >> lanes:2 +获取执行103 类型bug 分组pri的看板信息 >> lanes:4 +获取执行103 类型bug 分组module的看板信息 >> lanes:4 +获取执行103 类型bug 分组assignedTo的看板信息 >> lanes:3 +获取执行103 类型bug 分组severity的看板信息 >> lanes:4 +获取执行104 类型story 分组pri的看板信息 >> lanes:3 +获取执行105 类型story 分组pri的看板信息 >> lanes:3 + */ $executionIDList = array('101', '102', '103', '104', '105'); @@ -32,4 +47,4 @@ r($kanban->getKanban4GroupTest($executionIDList[2], $browseTypeList[2], $groupBy r($kanban->getKanban4GroupTest($executionIDList[2], $browseTypeList[2], $groupByList[6])) && p() && e('lanes:4'); //获取执行103 类型bug 分组severity的看板信息 r($kanban->getKanban4GroupTest($executionIDList[3], $browseTypeList[0], $groupByList[0])) && p() && e('lanes:3'); //获取执行104 类型story 分组pri的看板信息 r($kanban->getKanban4GroupTest($executionIDList[4], $browseTypeList[0], $groupByList[0])) && p() && e('lanes:3'); //获取执行105 类型story 分组pri的看板信息 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/getkanbancardmenu.php b/test/model/kanban/getkanbancardmenu.php index 444480ab4d..c282d9ae24 100755 --- a/test/model/kanban/getkanbancardmenu.php +++ b/test/model/kanban/getkanbancardmenu.php @@ -10,6 +10,22 @@ title=测试 kanbanModel->getKanbanCardMenu(); cid=1 pid=1 +测试获取执行101 story的操作数量 >> 12 +测试获取执行101 task的操作数量 >> 60 +测试获取执行101 bug的操作数量 >> 23 +测试获取执行102 story的操作数量 >> 12 +测试获取执行102 task的操作数量 >> 26 +测试获取执行102 bug的操作数量 >> 22 +测试获取执行103 story的操作数量 >> 12 +测试获取执行103 task的操作数量 >> 25 +测试获取执行103 bug的操作数量 >> 23 +测试获取执行104 story的操作数量 >> 12 +测试获取执行104 task的操作数量 >> 26 +测试获取执行104 bug的操作数量 >> 22 +测试获取执行105 story的操作数量 >> 12 +测试获取执行105 task的操作数量 >> 25 +测试获取执行105 bug的操作数量 >> 23 + */ $executionIDList = array('101', '102', '103', '104', '105'); @@ -31,4 +47,4 @@ r($kanban->getKanbanCardMenuTest($executionIDList[3], $browseTypeList[1])) && p( r($kanban->getKanbanCardMenuTest($executionIDList[3], $browseTypeList[2])) && p() && e('22'); // 测试获取执行104 bug的操作数量 r($kanban->getKanbanCardMenuTest($executionIDList[4], $browseTypeList[0])) && p() && e('12'); // 测试获取执行105 story的操作数量 r($kanban->getKanbanCardMenuTest($executionIDList[4], $browseTypeList[1])) && p() && e('25'); // 测试获取执行105 task的操作数量 -r($kanban->getKanbanCardMenuTest($executionIDList[4], $browseTypeList[2])) && p() && e('23'); // 测试获取执行105 bug的操作数量 +r($kanban->getKanbanCardMenuTest($executionIDList[4], $browseTypeList[2])) && p() && e('23'); // 测试获取执行105 bug的操作数量 \ No newline at end of file diff --git a/test/model/kanban/getkanbandata.php b/test/model/kanban/getkanbandata.php index 723cd52b84..2a5e14e4ca 100755 --- a/test/model/kanban/getkanbandata.php +++ b/test/model/kanban/getkanbandata.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getKanbanData(); cid=1 pid=1 +测试获取kanban1的视图 >> columns:4, lanes:1, cards:4 +测试获取kanban2的视图 >> columns:4, lanes:1, cards:4 +测试获取kanban3的视图 >> columns:4, lanes:1, cards:4 +测试获取kanban4的视图 >> columns:4, lanes:1, cards:4 +测试获取kanban5的视图 >> columns:4, lanes:1, cards:4 +测试获取不存在的kanban的视图 >> columns:0, lanes:0, cards:0 + */ $kanbanIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -21,4 +28,4 @@ r($kanban->getKanbanDataTest($kanbanIDList[1])) && p() && e('columns:4, lanes:1, r($kanban->getKanbanDataTest($kanbanIDList[2])) && p() && e('columns:4, lanes:1, cards:4'); // 测试获取kanban3的视图 r($kanban->getKanbanDataTest($kanbanIDList[3])) && p() && e('columns:4, lanes:1, cards:4'); // 测试获取kanban4的视图 r($kanban->getKanbanDataTest($kanbanIDList[4])) && p() && e('columns:4, lanes:1, cards:4'); // 测试获取kanban5的视图 -r($kanban->getKanbanDataTest($kanbanIDList[5])) && p() && e('columns:0, lanes:0, cards:0'); // 测试获取不存在的kanban的视图 +r($kanban->getKanbanDataTest($kanbanIDList[5])) && p() && e('columns:0, lanes:0, cards:0'); // 测试获取不存在的kanban的视图 \ No newline at end of file diff --git a/test/model/kanban/getkanbanidbyregion.php b/test/model/kanban/getkanbanidbyregion.php index c486008c37..d73069a4dd 100755 --- a/test/model/kanban/getkanbanidbyregion.php +++ b/test/model/kanban/getkanbanidbyregion.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getKanbanIDByRegion(); cid=1 pid=1 +测试通过区域1获取看板id >> 1 +测试通过区域2获取看板id >> 2 +测试通过区域3获取看板id >> 3 +测试通过区域4获取看板id >> 4 +测试通过区域5获取看板id >> 5 +测试通过不存在的区域获取看板id >> 0 + */ $regionIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -20,4 +27,4 @@ r($kanban->getKanbanIDByRegionTest($regionIDList[1])) && p() && e('2'); // 测 r($kanban->getKanbanIDByRegionTest($regionIDList[2])) && p() && e('3'); // 测试通过区域3获取看板id r($kanban->getKanbanIDByRegionTest($regionIDList[3])) && p() && e('4'); // 测试通过区域4获取看板id r($kanban->getKanbanIDByRegionTest($regionIDList[4])) && p() && e('5'); // 测试通过区域5获取看板id -r($kanban->getKanbanIDByRegionTest($regionIDList[5])) && p() && e('0'); // 测试通过不存在的区域获取看板id +r($kanban->getKanbanIDByRegionTest($regionIDList[5])) && p() && e('0'); // 测试通过不存在的区域获取看板id \ No newline at end of file diff --git a/test/model/kanban/getkanbanpairs.php b/test/model/kanban/getkanbanpairs.php index 99562a08af..dd8ee8c4d5 100755 --- a/test/model/kanban/getkanbanpairs.php +++ b/test/model/kanban/getkanbanpairs.php @@ -9,6 +9,14 @@ title=测试 kanbanModel->getKanbanPairs(); cid=1 pid=1 +获取用户admin可以看到的看板pairs >> 100 +获取用户po1可以看到的看板pairs >> 32 +获取用户po2可以看到的看板pairs >> 32 +获取用户user1可以看到的看板pairs >> 32 +获取用户user2可以看到的看板pairs >> 32 +获取用户pm1可以看到的看板pairs >> 32 +获取用户pm2可以看到的看板pairs >> 32 + */ $userList = array('admin', 'po1', 'po2', 'user1', 'user2', 'pm1', 'pm2'); @@ -21,4 +29,4 @@ r($kanban->getKanbanPairsTest($userList[2])) && p() && e('32'); //获取用户p r($kanban->getKanbanPairsTest($userList[3])) && p() && e('32'); //获取用户user1可以看到的看板pairs r($kanban->getKanbanPairsTest($userList[4])) && p() && e('32'); //获取用户user2可以看到的看板pairs r($kanban->getKanbanPairsTest($userList[5])) && p() && e('32'); //获取用户pm1可以看到的看板pairs -r($kanban->getKanbanPairsTest($userList[6])) && p() && e('32'); //获取用户pm2可以看到的看板pairs +r($kanban->getKanbanPairsTest($userList[6])) && p() && e('32'); //获取用户pm2可以看到的看板pairs \ No newline at end of file diff --git a/test/model/kanban/getlanebyid.php b/test/model/kanban/getlanebyid.php index 2b14b2d76a..760270449e 100755 --- a/test/model/kanban/getlanebyid.php +++ b/test/model/kanban/getlanebyid.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getLaneById(); cid=1 pid=1 +测试通过id1获取泳道信息 >> 默认泳道,common,1,1 +测试通过id2获取泳道信息 >> 默认泳道,common,2,2 +测试通过id3获取泳道信息 >> 默认泳道,common,3,3 +测试通过id4获取泳道信息 >> 默认泳道,common,4,4 +测试通过id5获取泳道信息 >> 默认泳道,common,5,5 +测试通过不存在的id获取泳道信息 >> 0 + */ $laneIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -21,4 +28,4 @@ r($kanban->getLaneByIdTest($laneIDList[1])) && p('name,type,region,group') && e( r($kanban->getLaneByIdTest($laneIDList[2])) && p('name,type,region,group') && e('默认泳道,common,3,3'); // 测试通过id3获取泳道信息 r($kanban->getLaneByIdTest($laneIDList[3])) && p('name,type,region,group') && e('默认泳道,common,4,4'); // 测试通过id4获取泳道信息 r($kanban->getLaneByIdTest($laneIDList[4])) && p('name,type,region,group') && e('默认泳道,common,5,5'); // 测试通过id5获取泳道信息 -r($kanban->getLaneByIdTest($laneIDList[5])) && p('name,type,region,group') && e('0'); // 测试通过不存在的id获取泳道信息 +r($kanban->getLaneByIdTest($laneIDList[5])) && p('name,type,region,group') && e('0'); // 测试通过不存在的id获取泳道信息 \ No newline at end of file diff --git a/test/model/kanban/getlanegroupbyregion.php b/test/model/kanban/getlanegroupbyregion.php index 030c057ed1..baa1cfedd9 100755 --- a/test/model/kanban/getlanegroupbyregion.php +++ b/test/model/kanban/getlanegroupbyregion.php @@ -10,6 +10,31 @@ title=测试 kanbanModel->getLaneGroupByRegion(); cid=1 pid=1 +测试获取区域101的泳道 >> 3 +测试获取区域101的bug泳道 >> 1 +测试获取区域101的task泳道 >> 1 +测试获取区域101的story泳道 >> 1 +测试获取区域102的泳道 >> 3 +测试获取区域102的bug泳道 >> 1 +测试获取区域102的task泳道 >> 1 +测试获取区域102的story泳道 >> 1 +测试获取区域103的泳道 >> 3 +测试获取区域103的bug泳道 >> 1 +测试获取区域103的task泳道 >> 1 +测试获取区域103的story泳道 >> 1 +测试获取区域104的泳道 >> 3 +测试获取区域104的bug泳道 >> 1 +测试获取区域104的task泳道 >> 1 +测试获取区域104的story泳道 >> 1 +测试获取区域105的泳道 >> 3 +测试获取区域105的bug泳道 >> 1 +测试获取区域105的task泳道 >> 1 +测试获取区域105的story泳道 >> 1 +测试获取不存在的区域的泳道 >> 0 +测试获取不存在的区域的bug泳道 >> 0 +测试获取不存在的区域的task泳道 >> 0 +测试获取不存在的区域的story泳道 >> 0 + */ $regionIDList = array('101', '102', '103', '104', '105', '1000001'); @@ -39,4 +64,4 @@ r($kanban->getLaneGroupByRegionTest($regionIDList[4], $type[2])) && p() && e('1' r($kanban->getLaneGroupByRegionTest($regionIDList[5])) && p() && e('0'); // 测试获取不存在的区域的泳道 r($kanban->getLaneGroupByRegionTest($regionIDList[5], $type[0])) && p() && e('0'); // 测试获取不存在的区域的bug泳道 r($kanban->getLaneGroupByRegionTest($regionIDList[5], $type[1])) && p() && e('0'); // 测试获取不存在的区域的task泳道 -r($kanban->getLaneGroupByRegionTest($regionIDList[5], $type[2])) && p() && e('0'); // 测试获取不存在的区域的story泳道 +r($kanban->getLaneGroupByRegionTest($regionIDList[5], $type[2])) && p() && e('0'); // 测试获取不存在的区域的story泳道 \ No newline at end of file diff --git a/test/model/kanban/getlanegroupbyregions.php b/test/model/kanban/getlanegroupbyregions.php index 2f9e094b16..15a6654e9b 100755 --- a/test/model/kanban/getlanegroupbyregions.php +++ b/test/model/kanban/getlanegroupbyregions.php @@ -10,6 +10,31 @@ title=测试 kanbanModel->getLaneGroupByRegions(); cid=1 pid=1 +测试获取区域101,102,103的泳道 >> 9 +测试获取区域101,102,103的bug泳道 >> 3 +测试获取区域101,102,103的task泳道 >> 3 +测试获取区域101,102,103的story泳道 >> 3 +测试获取区域104,105,106的泳道 >> 9 +测试获取区域104,105,106的bug泳道 >> 3 +测试获取区域104,105,106的task泳道 >> 3 +测试获取区域104,105,106的story泳道 >> 3 +测试获取区域107,108,109的泳道 >> 9 +测试获取区域107,108,109的bug泳道 >> 3 +测试获取区域107,108,109的task泳道 >> 3 +测试获取区域107,108,109的story泳道 >> 3 +测试获取区域110,111,112的泳道 >> 9 +测试获取区域110,111,112的bug泳道 >> 3 +测试获取区域110,111,112的task泳道 >> 3 +测试获取区域110,111,112的story泳道 >> 3 +测试获取区域113,114,115的泳道 >> 9 +测试获取区域113,114,115的bug泳道 >> 3 +测试获取区域113,114,115的task泳道 >> 3 +测试获取区域113,114,115的story泳道 >> 3 +测试获取不存在的区域的泳道 >> 0 +测试获取不存在的区域的bug泳道 >> 0 +测试获取不存在的区域的task泳道 >> 0 +测试获取不存在的区域的story泳道 >> 0 + */ $regionsList = array('101,102,103', '104,105,106', '107,108,109', '110,111,112', '113,114,115', '1000001'); $type = array('bug', 'task', 'story'); @@ -39,4 +64,4 @@ r($kanban->getLaneGroupByRegionsTest($regionsList[4], $type[2])) && p() && e('3' r($kanban->getLaneGroupByRegionsTest($regionsList[5])) && p() && e('0'); // 测试获取不存在的区域的泳道 r($kanban->getLaneGroupByRegionsTest($regionsList[5], $type[0])) && p() && e('0'); // 测试获取不存在的区域的bug泳道 r($kanban->getLaneGroupByRegionsTest($regionsList[5], $type[1])) && p() && e('0'); // 测试获取不存在的区域的task泳道 -r($kanban->getLaneGroupByRegionsTest($regionsList[5], $type[2])) && p() && e('0'); // 测试获取不存在的区域的story泳道 +r($kanban->getLaneGroupByRegionsTest($regionsList[5], $type[2])) && p() && e('0'); // 测试获取不存在的区域的story泳道 \ No newline at end of file diff --git a/test/model/kanban/getlanepairsbygroup.php b/test/model/kanban/getlanepairsbygroup.php index 51ba429f89..609c387e5b 100755 --- a/test/model/kanban/getlanepairsbygroup.php +++ b/test/model/kanban/getlanepairsbygroup.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getLanePairsByGroup(); cid=1 pid=1 +获取泳道组101的泳道 >> 研发需求 +获取泳道组102的泳道 >> Bug +获取泳道组103的泳道 >> 任务 +获取泳道组104的泳道 >> 研发需求 +获取泳道组105的泳道 >> Bug +获取不存在泳道组的泳道 >> 0 + */ $groupIDList = array('101', '102', '103', '104', '105', '1000001'); @@ -21,4 +28,4 @@ r($kanban->getLanePairsByGroupTest($groupIDList[1])) && p() && e('Bug'); // 获 r($kanban->getLanePairsByGroupTest($groupIDList[2])) && p() && e('任务'); // 获取泳道组103的泳道 r($kanban->getLanePairsByGroupTest($groupIDList[3])) && p() && e('研发需求'); // 获取泳道组104的泳道 r($kanban->getLanePairsByGroupTest($groupIDList[4])) && p() && e('Bug'); // 获取泳道组105的泳道 -r($kanban->getLanePairsByGroupTest($groupIDList[5])) && p() && e('0'); // 获取不存在泳道组的泳道 +r($kanban->getLanePairsByGroupTest($groupIDList[5])) && p() && e('0'); // 获取不存在泳道组的泳道 \ No newline at end of file diff --git a/test/model/kanban/getlanepairsbyregion.php b/test/model/kanban/getlanepairsbyregion.php index 39bdb8d1c9..75762c5a1b 100755 --- a/test/model/kanban/getlanepairsbyregion.php +++ b/test/model/kanban/getlanepairsbyregion.php @@ -10,6 +10,31 @@ title=测试 kanbanModel->getLanePairsByRegion(); cid=1 pid=1 +测试获取区域101的泳道 >> 研发需求,Bug,任务 +测试获取区域101的bug泳道 >> Bug +测试获取区域101的task泳道 >> 任务 +测试获取区域101的story泳道 >> 研发需求 +测试获取区域102的泳道 >> 研发需求,Bug,任务 +测试获取区域102的bug泳道 >> Bug +测试获取区域102的task泳道 >> 任务 +测试获取区域102的story泳道 >> 研发需求 +测试获取区域103的泳道 >> 研发需求,Bug,任务 +测试获取区域103的bug泳道 >> Bug +测试获取区域103的task泳道 >> 任务 +测试获取区域103的story泳道 >> 研发需求 +测试获取区域104的泳道 >> 研发需求,Bug,任务 +测试获取区域104的bug泳道 >> Bug +测试获取区域104的task泳道 >> 任务 +测试获取区域104的story泳道 >> 研发需求 +测试获取区域105的泳道 >> 研发需求,Bug,任务 +测试获取区域105的bug泳道 >> Bug +测试获取区域105的task泳道 >> 任务 +测试获取区域105的story泳道 >> 研发需求 +测试获取不存在的区域的泳道 >> 0 +测试获取不存在的区域的bug泳道 >> 0 +测试获取不存在的区域的task泳道 >> 0 +测试获取不存在的区域的story泳道 >> 0 + */ $regionIDList = array('101', '102', '103', '104', '105', '1000001'); @@ -40,4 +65,4 @@ r($kanban->getLanePairsByRegionTest($regionIDList[4], $type[2])) && p() && e(' r($kanban->getLanePairsByRegionTest($regionIDList[5])) && p() && e('0'); // 测试获取不存在的区域的泳道 r($kanban->getLanePairsByRegionTest($regionIDList[5], $type[0])) && p() && e('0'); // 测试获取不存在的区域的bug泳道 r($kanban->getLanePairsByRegionTest($regionIDList[5], $type[1])) && p() && e('0'); // 测试获取不存在的区域的task泳道 -r($kanban->getLanePairsByRegionTest($regionIDList[5], $type[2])) && p() && e('0'); // 测试获取不存在的区域的story泳道 +r($kanban->getLanePairsByRegionTest($regionIDList[5], $type[2])) && p() && e('0'); // 测试获取不存在的区域的story泳道 \ No newline at end of file diff --git a/test/model/kanban/getlanes4group.php b/test/model/kanban/getlanes4group.php index 2c69fc4c58..741a9c9f81 100755 --- a/test/model/kanban/getlanes4group.php +++ b/test/model/kanban/getlanes4group.php @@ -10,6 +10,27 @@ title=测试 kanbanModel->getLanes4Group(); cid=1 pid=1 +获取执行101 story pri的泳道 >> ,优先级: 无,2,4 +获取执行101 story category的泳道 >> ,类型: 无,功能 +获取执行101 story module的泳道 >> ,所属模块: 无,产品模块2,产品模块4 +获取执行101 story source的泳道 >> ,来源: 无,用户,市场 +获取执行102 task pri的泳道 >> ,优先级: 无,1,2,4 +获取执行102 task module的泳道 >> ,所属模块: 无,模块4,模块10,模块13,模块16 +获取执行102 task assignedTo的泳道 >> ,指派给: 无 +获取执行102 task story的泳道 >> ,相关研发需求: 无,用户需求5 +获取执行101 bug pri的泳道 >> ,优先级: 无,1,3,4 +获取执行101 bug module的泳道 >> ,所属模块: 无,产品模块11,产品模块12,产品模块13 +获取执行101 bug assignedTo的泳道 >> ,指派给: 无,admin,测试1 +获取执行101 bug severity的泳道 >> ,严重程度: 无,1,3,4 +获取执行101 story pri的泳道 >> ,优先级: 无,2,4 +获取执行101 story category的泳道 >> ,类型: 无,功能 +获取执行101 story module的泳道 >> ,所属模块: 无,产品模块14,产品模块16 +获取执行101 story source的泳道 >> ,来源: 无,用户,其他 +获取执行102 task pri的泳道 >> ,优先级: 无,1,2,3 +获取执行102 task module的泳道 >> ,所属模块: 无,模块13,模块37,模块40,模块43 +获取执行102 task assignedTo的泳道 >> ,指派给: 无 +获取执行102 task story的泳道 >> ,相关研发需求: 无,用户需求17 + */ $executionIDList = array('101', '102', '103', '104', '105'); $browseTypeList = array('story', 'task', 'bug'); @@ -37,4 +58,4 @@ r($kanban->getLanes4GroupTest($executionIDList[4], $browseTypeList[1], $groupByL r($kanban->getLanes4GroupTest($executionIDList[4], $browseTypeList[1], $groupByList[2])) && p() && e(',所属模块: 无,模块13,模块37,模块40,模块43'); // 获取执行102 task module的泳道 r($kanban->getLanes4GroupTest($executionIDList[4], $browseTypeList[1], $groupByList[4])) && p() && e(',指派给: 无'); // 获取执行102 task assignedTo的泳道 r($kanban->getLanes4GroupTest($executionIDList[4], $browseTypeList[1], $groupByList[5])) && p() && e(',相关研发需求: 无,用户需求17'); // 获取执行102 task story的泳道 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/getobjectgroup.php b/test/model/kanban/getobjectgroup.php index fff58fe98c..2b9f1801f3 100755 --- a/test/model/kanban/getobjectgroup.php +++ b/test/model/kanban/getobjectgroup.php @@ -10,6 +10,27 @@ title=测试 kanbanModel->getObjectGroup(); cid=1 pid=1 +获取执行101 story pri的分组 >> 4,2 +获取执行101 story category的分组 >> feature +获取执行101 story module的分组 >> 1824,1822 +获取执行101 story source的分组 >> user,market +获取执行102 task pri的分组 >> 4,2,1 +获取执行102 task module的分组 >> 36,33,30,24 +获取执行102 task assignedTo的分组 >> 0 +获取执行102 task story的分组 >> 8,6,0 +获取执行101 bug pri的分组 >> 4,3,1 +获取执行101 bug module的分组 >> 1833,1832,1831,0 +获取执行101 bug assignedTo的分组 >> test1,admin +获取执行101 bug severity的分组 >> 4,3,1 +获取执行101 story pri的分组 >> 4,2 +获取执行101 story category的分组 >> feature +获取执行101 story module的分组 >> 1836,1834 +获取执行101 story source的分组 >> user,other +获取执行102 task pri的分组 >> 3,2,1 +获取执行102 task module的分组 >> 63,60,57,33 +获取执行102 task assignedTo的分组 >> 0 +获取执行102 task story的分组 >> 20,18,0 + */ $executionIDList = array('101', '102', '103', '104', '105'); $browseTypeList = array('story', 'task', 'bug'); @@ -36,4 +57,4 @@ r($kanban->getObjectGroupTest($executionIDList[3], $browseTypeList[0], $groupByL r($kanban->getObjectGroupTest($executionIDList[4], $browseTypeList[1], $groupByList[0])) && p() && e('3,2,1'); // 获取执行102 task pri的分组 r($kanban->getObjectGroupTest($executionIDList[4], $browseTypeList[1], $groupByList[2])) && p() && e('63,60,57,33'); // 获取执行102 task module的分组 r($kanban->getObjectGroupTest($executionIDList[4], $browseTypeList[1], $groupByList[4])) && p() && e('0'); // 获取执行102 task assignedTo的分组 -r($kanban->getObjectGroupTest($executionIDList[4], $browseTypeList[1], $groupByList[5])) && p() && e('20,18,0'); // 获取执行102 task story的分组 +r($kanban->getObjectGroupTest($executionIDList[4], $browseTypeList[1], $groupByList[5])) && p() && e('20,18,0'); // 获取执行102 task story的分组 \ No newline at end of file diff --git a/test/model/kanban/getplankanban.php b/test/model/kanban/getplankanban.php index b1a25f814b..e403a4f7d5 100755 --- a/test/model/kanban/getplankanban.php +++ b/test/model/kanban/getplankanban.php @@ -10,6 +10,14 @@ title=测试 kanbanModel->getPlanKanban(); cid=1 pid=1 +测试获取产品1的计划看板 >> lanes:1, cards:3 +测试获取产品2的计划看板 >> lanes:1, cards:3 +测试获取产品3的计划看板 >> lanes:1, cards:3 +测试获取产品4的计划看板 >> lanes:3, cards:2 +测试获取产品4 分支1的计划看板 >> lanes:1, cards:1 +测试获取产品5的计划看板 >> lanes:3, cards:2 +测试获取产品5 分支3的计划看板 >> lanes:1, cards:1 + */ $productIDList = array('1', '2', '3', '41', '42'); @@ -23,4 +31,4 @@ r($kanban->getPlanKanbanTest($productIDList[2])) && p() && e(' r($kanban->getPlanKanbanTest($productIDList[3])) && p() && e('lanes:3, cards:2'); // 测试获取产品4的计划看板 r($kanban->getPlanKanbanTest($productIDList[3], $branchIDList[1])) && p() && e('lanes:1, cards:1'); // 测试获取产品4 分支1的计划看板 r($kanban->getPlanKanbanTest($productIDList[4])) && p() && e('lanes:3, cards:2'); // 测试获取产品5的计划看板 -r($kanban->getPlanKanbanTest($productIDList[4], $branchIDList[2])) && p() && e('lanes:1, cards:1'); // 测试获取产品5 分支3的计划看板 +r($kanban->getPlanKanbanTest($productIDList[4], $branchIDList[2])) && p() && e('lanes:1, cards:1'); // 测试获取产品5 分支3的计划看板 \ No newline at end of file diff --git a/test/model/kanban/getrdcolumngroupbyregions.php b/test/model/kanban/getrdcolumngroupbyregions.php index 89242d2468..a2667eac52 100755 --- a/test/model/kanban/getrdcolumngroupbyregions.php +++ b/test/model/kanban/getrdcolumngroupbyregions.php @@ -10,6 +10,20 @@ title=测试 kanbanModel->getRDColumnGroupByRegions(); cid=1 pid=1 +测试获取region 1 执行看板泳道列组 >> 4 +测试获取region 1 group 1执行看板泳道列组 >> 4 +测试获取region 1 group 2执行看板泳道列组 >> 0 +测试获取region 2 执行看板泳道列组 >> 4 +测试获取region 2 group 2执行看板泳道列组 >> 4 +测试获取region 2 group 1执行看板泳道列组 >> 0 +测试获取region 3 执行看板泳道列组 >> 8 +测试获取region 3 group 3执行看板泳道列组 >> 4 +测试获取region 3 group 1执行看板泳道列组 >> 0 +测试获取region 4 执行看板泳道列组 >> 12 +测试获取region 4 group 5,6执行看板泳道列组 >> 8 +测试获取region 5 执行看板泳道列组 >> 16 +测试获取region 5 group 8,10执行看板泳道列组 >> 8 + */ $regions = array('1', '2', '3,4', '5,6,7', '8,9,10,11'); @@ -29,4 +43,4 @@ r($kanban->getRDColumnGroupByRegionsTest($regions[2], $groupIDList[0])) && p() & r($kanban->getRDColumnGroupByRegionsTest($regions[3])) && p() && e('12'); // 测试获取region 4 执行看板泳道列组 r($kanban->getRDColumnGroupByRegionsTest($regions[3], $groupIDList[3])) && p() && e('8'); // 测试获取region 4 group 5,6执行看板泳道列组 r($kanban->getRDColumnGroupByRegionsTest($regions[4])) && p() && e('16'); // 测试获取region 5 执行看板泳道列组 -r($kanban->getRDColumnGroupByRegionsTest($regions[4], $groupIDList[4])) && p() && e('8'); // 测试获取region 5 group 8,10执行看板泳道列组 +r($kanban->getRDColumnGroupByRegionsTest($regions[4], $groupIDList[4])) && p() && e('8'); // 测试获取region 5 group 8,10执行看板泳道列组 \ No newline at end of file diff --git a/test/model/kanban/getrdkanban.php b/test/model/kanban/getrdkanban.php index 44283c43b7..b7a41bce0d 100755 --- a/test/model/kanban/getrdkanban.php +++ b/test/model/kanban/getrdkanban.php @@ -10,6 +10,18 @@ title=测试 kanbanModel->getRDKanban(); cid=1 pid=1 +获取执行161的执行看板 >> columns:27, lanes:3, cards:5 +获取执行161 all region 101的执行看板 >> columns:27, lanes:3, cards:8 +获取执行161 all region 102的执行看板 >> columns:0, lanes:0, cards:0 +获取执行162的执行看板 >> columns:27, lanes:3, cards:5 +获取执行162 story region 102的执行看板 >> columns:11, lanes:1, cards:2 +获取执行163的执行看板 >> columns:27, lanes:3, cards:4 +获取执行163 task region 103的执行看板 >> columns:7, lanes:1, cards:4 +获取执行164的执行看板 >> columns:27, lanes:3, cards:4 +获取执行164 bug region 104的执行看板 >> columns:9, lanes:1, cards:3 +获取执行165的执行看板 >> columns:27, lanes:3, cards:0 +获取执行165 story region 105的执行看板 >> columns:11, lanes:1, cards:2 + */ $executionIDList = array('161', '162', '163', '164', '165'); $browseTypeList = array('all', 'story', 'task', 'bug'); @@ -28,4 +40,4 @@ r($kanban->getRDKanbanTest($executionIDList[2], $browseTypeList[2], $regionIDLis r($kanban->getRDKanbanTest($executionIDList[3])) && p() && e('columns:27, lanes:3, cards:4'); // 获取执行164的执行看板 r($kanban->getRDKanbanTest($executionIDList[3], $browseTypeList[3], $regionIDList[4])) && p() && e('columns:9, lanes:1, cards:3'); // 获取执行164 bug region 104的执行看板 r($kanban->getRDKanbanTest($executionIDList[4])) && p() && e('columns:27, lanes:3, cards:0'); // 获取执行165的执行看板 -r($kanban->getRDKanbanTest($executionIDList[4], $browseTypeList[1], $regionIDList[5])) && p() && e('columns:11, lanes:1, cards:2'); // 获取执行165 story region 105的执行看板 +r($kanban->getRDKanbanTest($executionIDList[4], $browseTypeList[1], $regionIDList[5])) && p() && e('columns:11, lanes:1, cards:2'); // 获取执行165 story region 105的执行看板 \ No newline at end of file diff --git a/test/model/kanban/getregionbyid.php b/test/model/kanban/getregionbyid.php index 7f6a52f8c1..7348d2e01b 100755 --- a/test/model/kanban/getregionbyid.php +++ b/test/model/kanban/getregionbyid.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getRegionByID(); cid=1 pid=1 +测试查询看板1信息 >> 默认区域,1,1 +测试查询看板2信息 >> 默认区域,2,1 +测试查询看板3信息 >> 默认区域,3,2 +测试查询看板4信息 >> 默认区域,4,2 +测试查询看板5信息 >> 默认区域,5,3 +测试查询不存在的看板信息 >> 0 + */ $regionIDList = array('1', '2', '3', '4', '5', '10001'); @@ -20,4 +27,4 @@ r($kanban->getRegionByIDTest($regionIDList[1])) && p('name,kanban,space') && e(' r($kanban->getRegionByIDTest($regionIDList[2])) && p('name,kanban,space') && e('默认区域,3,2'); // 测试查询看板3信息 r($kanban->getRegionByIDTest($regionIDList[3])) && p('name,kanban,space') && e('默认区域,4,2'); // 测试查询看板4信息 r($kanban->getRegionByIDTest($regionIDList[4])) && p('name,kanban,space') && e('默认区域,5,3'); // 测试查询看板5信息 -r($kanban->getRegionByIDTest($regionIDList[5])) && p('name,kanban,space') && e('0'); // 测试查询不存在的看板信息 +r($kanban->getRegionByIDTest($regionIDList[5])) && p('name,kanban,space') && e('0'); // 测试查询不存在的看板信息 \ No newline at end of file diff --git a/test/model/kanban/getregionpairs.php b/test/model/kanban/getregionpairs.php index fbd5c5e601..9211914d87 100755 --- a/test/model/kanban/getregionpairs.php +++ b/test/model/kanban/getregionpairs.php @@ -10,6 +10,25 @@ title=测试 kanbanModel->getRegionPairs(); cid=1 pid=1 +测试查询kanban1的区域信息 >> 默认区域 +测试查询kanban1 reigon1的区域信息 >> 默认区域 +测试查询kanban1 region2的区域信息 >> 0 +测试查询kanban1的区域信息 >> 默认区域 +测试查询kanban1 reigon2的区域信息 >> 默认区域 +测试查询kanban1 region3的区域信息 >> 0 +测试查询kanban1的区域信息 >> 默认区域 +测试查询kanban1 reigon3的区域信息 >> 默认区域 +测试查询kanban1 region4的区域信息 >> 0 +测试查询kanban1的区域信息 >> 默认区域 +测试查询kanban1 reigon4的区域信息 >> 默认区域 +测试查询kanban1 region5的区域信息 >> 0 +测试查询kanban1的区域信息 >> 默认区域 +测试查询kanban1 reigon5的区域信息 >> 默认区域 +测试查询kanban1 region10001的区域信息 >> 0 +测试查询不存在的kanban的区域信息 >> 0 +测试查询执行161的区域信息 >> 默认区域 +测试查询执行162的区域信息 >> 默认区域 + */ $kanbanIDList = array('1', '2', '3', '4', '5', '10001'); $regionIDList = array('1', '2', '3', '4', '5', '10001'); @@ -34,4 +53,4 @@ r($kanban->getRegionPairsTest($kanbanIDList[4], $regionIDList[4])) && p('5') r($kanban->getRegionPairsTest($kanbanIDList[4], $regionIDList[5])) && p('5') && e('0'); // 测试查询kanban1 region10001的区域信息 r($kanban->getRegionPairsTest($kanbanIDList[5])) && p() && e('0'); // 测试查询不存在的kanban的区域信息 r($kanban->getRegionPairsTest($executionIDList[0], 0, 'execution')) && p('101') && e('默认区域'); // 测试查询执行161的区域信息 -r($kanban->getRegionPairsTest($executionIDList[1], 0, 'execution')) && p('102') && e('默认区域'); // 测试查询执行162的区域信息 +r($kanban->getRegionPairsTest($executionIDList[1], 0, 'execution')) && p('102') && e('默认区域'); // 测试查询执行162的区域信息 \ No newline at end of file diff --git a/test/model/kanban/getspacebyid.php b/test/model/kanban/getspacebyid.php index 07b1c9cac3..0086e03a17 100755 --- a/test/model/kanban/getspacebyid.php +++ b/test/model/kanban/getspacebyid.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->getSpaceById(); cid=1 pid=1 +测试查询空间1信息 >> 协作空间1,cooperation,po15,active +测试查询空间2信息 >> 私有空间2,private,po16,active +测试查询空间3信息 >> 公共空间3,public,po17,active +测试查询空间4信息 >> 协作空间4,cooperation,po18,active +测试查询空间5信息 >> 私有空间5,private,po19,active +测试查询不存在的空间信息 >> 0 + */ $spaceIDList = array('1', '2', '3', '4', '5', '10001'); @@ -20,4 +27,4 @@ r($kanban->getSpaceByIdTest($spaceIDList[1])) && p('name,type,owner,status') && r($kanban->getSpaceByIdTest($spaceIDList[2])) && p('name,type,owner,status') && e('公共空间3,public,po17,active'); // 测试查询空间3信息 r($kanban->getSpaceByIdTest($spaceIDList[3])) && p('name,type,owner,status') && e('协作空间4,cooperation,po18,active'); // 测试查询空间4信息 r($kanban->getSpaceByIdTest($spaceIDList[4])) && p('name,type,owner,status') && e('私有空间5,private,po19,active'); // 测试查询空间5信息 -r($kanban->getSpaceByIdTest($spaceIDList[5])) && p('name,type,owner,status') && e('0'); // 测试查询不存在的空间信息 +r($kanban->getSpaceByIdTest($spaceIDList[5])) && p('name,type,owner,status') && e('0'); // 测试查询不存在的空间信息 \ No newline at end of file diff --git a/test/model/kanban/getspacelist.php b/test/model/kanban/getspacelist.php index 1bf8306961..c37cf7dca0 100755 --- a/test/model/kanban/getspacelist.php +++ b/test/model/kanban/getspacelist.php @@ -9,6 +9,23 @@ title=测试 kanbanModel->getSpaceList(); cid=1 pid=1 +查询用户可以看到的admin private的空间数量 >> 0 +查询用户可以看到的admin cooperation的空间数量 >> 17 +查询用户可以看到的admin public的空间数量 >> 16 +查询用户可以看到的admin involved的空间数量 >> 0 +查询用户可以看到的po16 private的空间数量 >> 1 +查询用户可以看到的po16 cooperation的空间数量 >> 0 +查询用户可以看到的po16 public的空间数量 >> 16 +查询用户可以看到的po16 involved的空间数量 >> 0 +查询用户可以看到的pm3 private的空间数量 >> 1 +查询用户可以看到的test37 cooperation的空间数量 >> 0 +查询用户可以看到的test37 public的空间数量 >> 16 +查询用户可以看到的test37 involved的空间数量 >> 0 +查询用户可以看到的user25 private的空间数量 >> 1 +查询用户可以看到的user25 cooperation的空间数量 >> 0 +查询用户可以看到的user25 public的空间数量 >> 16 +查询用户可以看到的user25 involved的空间数量 >> 0 + */ $userList = array('admin', 'po16', 'test37', 'user25'); @@ -31,4 +48,4 @@ r($kanban->getSpaceListTest($userList[2], $browseType[3])) && p() && e('0'); // r($kanban->getSpaceListTest($userList[3], $browseType[0])) && p() && e('1'); // 查询用户可以看到的user25 private的空间数量 r($kanban->getSpaceListTest($userList[3], $browseType[1])) && p() && e('0'); // 查询用户可以看到的user25 cooperation的空间数量 r($kanban->getSpaceListTest($userList[3], $browseType[2])) && p() && e('16'); // 查询用户可以看到的user25 public的空间数量 -r($kanban->getSpaceListTest($userList[3], $browseType[3])) && p() && e('0'); // 查询用户可以看到的user25 involved的空间数量 +r($kanban->getSpaceListTest($userList[3], $browseType[3])) && p() && e('0'); // 查询用户可以看到的user25 involved的空间数量 \ No newline at end of file diff --git a/test/model/kanban/getspacepairs.php b/test/model/kanban/getspacepairs.php index 6a4465bd1d..e0589b1aac 100755 --- a/test/model/kanban/getspacepairs.php +++ b/test/model/kanban/getspacepairs.php @@ -10,6 +10,23 @@ title=测试 kanbanModel->getSpacePairs(); cid=1 pid=1 +查询用户可以看到的admin private的空间数量 >> 0 +查询用户可以看到的admin cooperation的空间数量 >> 17 +查询用户可以看到的admin public的空间数量 >> 16 +查询用户可以看到的admin involved的空间数量 >> 0 +查询用户可以看到的po16 private的空间数量 >> 1 +查询用户可以看到的po16 cooperation的空间数量 >> 0 +查询用户可以看到的po16 public的空间数量 >> 16 +查询用户可以看到的po16 involved的空间数量 >> 0 +查询用户可以看到的pm3 private的空间数量 >> 1 +查询用户可以看到的test37 cooperation的空间数量 >> 0 +查询用户可以看到的test37 public的空间数量 >> 16 +查询用户可以看到的test37 involved的空间数量 >> 0 +查询用户可以看到的user25 private的空间数量 >> 1 +查询用户可以看到的user25 cooperation的空间数量 >> 0 +查询用户可以看到的user25 public的空间数量 >> 16 +查询用户可以看到的user25 involved的空间数量 >> 0 + */ $userList = array('admin', 'po16', 'test37', 'user25'); $browseType = array('private', 'cooperation', 'public', 'involved'); @@ -31,4 +48,4 @@ r($kanban->getSpacePairsTest($userList[2], $browseType[3])) && p() && e('0'); / r($kanban->getSpacePairsTest($userList[3], $browseType[0])) && p() && e('1'); // 查询用户可以看到的user25 private的空间数量 r($kanban->getSpacePairsTest($userList[3], $browseType[1])) && p() && e('0'); // 查询用户可以看到的user25 cooperation的空间数量 r($kanban->getSpacePairsTest($userList[3], $browseType[2])) && p() && e('16'); // 查询用户可以看到的user25 public的空间数量 -r($kanban->getSpacePairsTest($userList[3], $browseType[3])) && p() && e('0'); // 查询用户可以看到的user25 involved的空间数量 +r($kanban->getSpacePairsTest($userList[3], $browseType[3])) && p() && e('0'); // 查询用户可以看到的user25 involved的空间数量 \ No newline at end of file diff --git a/test/model/kanban/import.php b/test/model/kanban/import.php index 1a3424b659..15af15f97f 100755 --- a/test/model/kanban/import.php +++ b/test/model/kanban/import.php @@ -10,6 +10,27 @@ title=测试 kanbanModel->import(); cid=1 pid=1 +开启看板1的导入功能 可选项全部 >> plans,releases,builds,executions,cards +开启看板1的导入功能 可选项plans cards >> plans,cards +关闭看板1的导入功能 可选项全部 >> 0 +关闭看板1的导入功能 可选项plans cards >> 0 +开启看板2的导入功能 可选项全部 >> plans,releases,builds,executions,cards +开启看板2的导入功能 可选项plans cards >> plans,cards +关闭看板2的导入功能 可选项全部 >> 0 +关闭看板2的导入功能 可选项plans cards >> 0 +开启看板3的导入功能 可选项全部 >> plans,releases,builds,executions,cards +开启看板3的导入功能 可选项plans cards >> plans,cards +关闭看板3的导入功能 可选项全部 >> 0 +关闭看板3的导入功能 可选项plans cards >> 0 +开启看板4的导入功能 可选项全部 >> plans,releases,builds,executions,cards +开启看板4的导入功能 可选项plans cards >> plans,cards +关闭看板4的导入功能 可选项全部 >> 0 +关闭看板4的导入功能 可选项plans cards >> 0 +开启看板5的导入功能 可选项全部 >> plans,releases,builds,executions,cards +开启看板5的导入功能 可选项plans cards >> plans,cards +关闭看板5的导入功能 可选项全部 >> 0 +关闭看板5的导入功能 可选项plans cards >> 0 + */ $kanban = new kanbanTest(); @@ -39,4 +60,4 @@ r($kanban->importTest($kanbanIDList[4], $import[0], $importObjectList1)) && p('o r($kanban->importTest($kanbanIDList[4], $import[0], $importObjectList2)) && p('object') && e('plans,cards'); // 开启看板5的导入功能 可选项plans cards r($kanban->importTest($kanbanIDList[4], $import[1], $importObjectList1)) && p('object') && e('0'); // 关闭看板5的导入功能 可选项全部 r($kanban->importTest($kanbanIDList[4], $import[1], $importObjectList2)) && p('object') && e('0'); // 关闭看板5的导入功能 可选项plans cards -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/importcard.php b/test/model/kanban/importcard.php index 1ca2b4afe3..06b171b8ab 100755 --- a/test/model/kanban/importcard.php +++ b/test/model/kanban/importcard.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->importCard(); cid=1 pid=1 +测试导入卡片72 73 74到column 1 >> ,72,73,74,1,2,801, +测试导入卡片75 77 77到column 5 >> ,75,76,77,9,10,809, +测试导入卡片72 73 74到column 9 >> ,82,83,84,17,18,817, +测试导入卡片75 77 77到column 13 >> ,85,86,87,25,26,825, +测试导入卡片72 73 74到column 17 >> ,95,96,97,33,34,833, + */ $cards1 = array('72', '73', '74'); @@ -31,4 +37,4 @@ r($kanban->importCardTest($kanbanIDList[1], $regionIDList[1], $groupIDList[1], $ r($kanban->importCardTest($kanbanIDList[2], $regionIDList[2], $groupIDList[2], $columnIDList[2], $cards3, $targetLaneIDList[2])) && p('cards') && e(',82,83,84,17,18,817,');// 测试导入卡片72 73 74到column 9 r($kanban->importCardTest($kanbanIDList[3], $regionIDList[3], $groupIDList[3], $columnIDList[3], $cards4, $targetLaneIDList[3])) && p('cards') && e(',85,86,87,25,26,825,');// 测试导入卡片75 77 77到column 13 r($kanban->importCardTest($kanbanIDList[4], $regionIDList[4], $groupIDList[4], $columnIDList[4], $cards5, $targetLaneIDList[4])) && p('cards') && e(',95,96,97,33,34,833,');// 测试导入卡片72 73 74到column 17 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/importobject.php b/test/model/kanban/importobject.php index 12566f9574..e04504e3c7 100755 --- a/test/model/kanban/importobject.php +++ b/test/model/kanban/importobject.php @@ -10,6 +10,11 @@ title=测试 kanbanModel->importObject(); cid=1 pid=1 +测试导入卡片72 73 74到column 1 >> ,1001,1002,1003,1,2,801, +测试导入卡片75 77 77到column 5 >> ,1004,1005,1006,9,10,809, +测试导入卡片72 73 74到column 9 >> ,1007,1008,1009,17,18,817, +测试导入卡片75 77 77到column 13 >> ,1010,1011,1012,25,26,825, + */ $productplans = array('72', '73', '74'); $releases = array('75', '76', '77'); @@ -35,4 +40,4 @@ r($kanban->importObjectTest($kanbanIDList[0], $regionIDList[0], $groupIDList[0], r($kanban->importObjectTest($kanbanIDList[1], $regionIDList[1], $groupIDList[1], $columnIDList[1], $objectType[1], $param2)) && p('cards') && e(',1004,1005,1006,9,10,809,'); // 测试导入卡片75 77 77到column 5 r($kanban->importObjectTest($kanbanIDList[2], $regionIDList[2], $groupIDList[2], $columnIDList[2], $objectType[2], $param3)) && p('cards') && e(',1007,1008,1009,17,18,817,');// 测试导入卡片72 73 74到column 9 r($kanban->importObjectTest($kanbanIDList[3], $regionIDList[3], $groupIDList[3], $columnIDList[3], $objectType[3], $param4)) && p('cards') && e(',1010,1011,1012,25,26,825,');// 测试导入卡片75 77 77到column 13 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/isclickable.php b/test/model/kanban/isclickable.php index ab32f2f0f8..fb056baef2 100755 --- a/test/model/kanban/isclickable.php +++ b/test/model/kanban/isclickable.php @@ -10,6 +10,31 @@ title=测试 kanbanModel->isClickable(); cid=1 pid=1 +测试lane1 是否可以排序 >> 2 +测试lane1 是否可以删除 >> 2 +测试lane276 是否可以排序 >> 2 +测试lane276 是否可以删除 >> 1 +测试column1 是否可以拆分子列 >> 1 +测试column1 是否可以还原 >> 2 +测试column1 是否可以归档 >> 1 +测试column1 是否可以删除 >> 1 +测试column1 是否可以排序 >> 1 +测试column403 是否可以拆分子列 >> 2 +测试column403 是否可以还原 >> 2 +测试column403 是否可以归档 >> 1 +测试column403 是否可以删除 >> 1 +测试column403 是否可以排序 >> 1 +测试column404 是否可以拆分子列 >> 2 +测试column404 是否可以还原 >> 2 +测试column404 是否可以归档 >> 1 +测试column404 是否可以删除 >> 1 +测试column404 是否可以排序 >> 1 +测试column405 是否可以拆分子列 >> 2 +测试column405 是否可以还原 >> 2 +测试column405 是否可以归档 >> 1 +测试column405 是否可以删除 >> 1 +测试column405 是否可以排序 >> 1 + */ $objectType = array('Lane', 'Column'); @@ -42,4 +67,4 @@ r($kanban->isClickableTest($objectType[1], $objectID[4], $actionList[2])) && p() r($kanban->isClickableTest($objectType[1], $objectID[4], $actionList[3])) && p() && e('2'); // 测试column405 是否可以还原 r($kanban->isClickableTest($objectType[1], $objectID[4], $actionList[4])) && p() && e('1'); // 测试column405 是否可以归档 r($kanban->isClickableTest($objectType[1], $objectID[4], $actionList[5])) && p() && e('1'); // 测试column405 是否可以删除 -r($kanban->isClickableTest($objectType[1], $objectID[4], $actionList[6])) && p() && e('1'); // 测试column405 是否可以排序 +r($kanban->isClickableTest($objectType[1], $objectID[4], $actionList[6])) && p() && e('1'); // 测试column405 是否可以排序 \ No newline at end of file diff --git a/test/model/kanban/movecard.php b/test/model/kanban/movecard.php index a36c0b1c28..018dfe3be2 100755 --- a/test/model/kanban/movecard.php +++ b/test/model/kanban/movecard.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->moveCard(); cid=1 pid=1 +将卡片1从泳道1 列1转移到泳道1 列2 >> ,3,4,803,1, +将卡片2从泳道1 列1转移到泳道1 列2 >> ,3,4,803,1,2, +将卡片3从泳道1 列2转移到泳道1 列3 >> ,5,6,805,3, +将卡片4从泳道1 列2转移到泳道1 列3 >> ,5,6,805,3,4, +将卡片5从泳道1 列3转移到泳道1 列1 >> ,801,5, +将卡片6从泳道1 列3转移到泳道1 列1 >> ,801,5,6, + */ $cardIDList = array('1', '2', '3', '4', '5', '6'); $columnIDList = array('1', '2', '3'); @@ -25,4 +32,4 @@ r($kanban->moveCardTest($cardIDList[2], $columnIDList[1], $columnIDList[2], $lan r($kanban->moveCardTest($cardIDList[3], $columnIDList[1], $columnIDList[2], $laneID, $laneID, $kanbanID)) && p('cards') && e(',5,6,805,3,4,'); // 将卡片4从泳道1 列2转移到泳道1 列3 r($kanban->moveCardTest($cardIDList[4], $columnIDList[2], $columnIDList[0], $laneID, $laneID, $kanbanID)) && p('cards') && e(',801,5,'); // 将卡片5从泳道1 列3转移到泳道1 列1 r($kanban->moveCardTest($cardIDList[5], $columnIDList[2], $columnIDList[0], $laneID, $laneID, $kanbanID)) && p('cards') && e(',801,5,6,'); // 将卡片6从泳道1 列3转移到泳道1 列1 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/processcards.php b/test/model/kanban/processcards.php index 4dfcaa166e..e7fe706b81 100755 --- a/test/model/kanban/processcards.php +++ b/test/model/kanban/processcards.php @@ -10,6 +10,11 @@ title=测试 kanbanModel->processCards(); cid=1 pid=1 +计算删除列203后的卡片 >> 204:,407,408,807,405,406,805, +计算删除列204后的卡片 >> 203:,405,406,805,407,408,807,405,406,805, +计算删除列207后的卡片 >> 208:,415,416,815,413,414,813, +计算删除列208后的卡片 >> 207:,413,414,813,415,416,815,413,414,813, + */ $columnIDList = array('203', '204', '207', '208'); @@ -20,4 +25,4 @@ r($kanban->processCardsTest($columnIDList[0])) && p() && e('204:,407,408,807,405 r($kanban->processCardsTest($columnIDList[1])) && p() && e('203:,405,406,805,407,408,807,405,406,805,'); // 计算删除列204后的卡片 r($kanban->processCardsTest($columnIDList[2])) && p() && e('208:,415,416,815,413,414,813,'); // 计算删除列207后的卡片 r($kanban->processCardsTest($columnIDList[3])) && p() && e('207:,413,414,813,415,416,815,413,414,813,'); // 计算删除列208后的卡片 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/refreshcards.php b/test/model/kanban/refreshcards.php index 707cc4f64d..fd6bc5c7d4 100755 --- a/test/model/kanban/refreshcards.php +++ b/test/model/kanban/refreshcards.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->refreshCards(); cid=1 pid=1 +刷新泳道101的卡片 >> 401; 402; 403; 404:244,; 405; 406; 407; 408; 409; 410; 411: +刷新泳道102的卡片 >> 412; 413; 414; 415; 416; 417; 418; 419; 420:181,182,183, +刷新泳道103的卡片 >> 421:781,61,; 422; 423:782,; 424:783,; 425; 426; 427: +刷新泳道104的卡片 >> 428; 429; 430; 431; 432; 433; 434:246,; 435; 436:248,; 437; 438: +刷新泳道105的卡片 >> 439; 440; 441; 442; 443; 444; 445; 446; 447:184,185,186, + */ $laneIDList = array('101', '102', '103', '104', '105'); @@ -21,4 +27,4 @@ r($kanban->refreshCardsTest($laneIDList[1])) && p() && e('412; 413; 414; 415; 41 r($kanban->refreshCardsTest($laneIDList[2])) && p() && e('421:781,61,; 422; 423:782,; 424:783,; 425; 426; 427:'); // 刷新泳道103的卡片 r($kanban->refreshCardsTest($laneIDList[3])) && p() && e('428; 429; 430; 431; 432; 433; 434:246,; 435; 436:248,; 437; 438:'); // 刷新泳道104的卡片 r($kanban->refreshCardsTest($laneIDList[4])) && p() && e('439; 440; 441; 442; 443; 444; 445; 446; 447:184,185,186,'); // 刷新泳道105的卡片 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/removekanbancell.php b/test/model/kanban/removekanbancell.php index 21f9cfb42b..4a11f107f9 100755 --- a/test/model/kanban/removekanbancell.php +++ b/test/model/kanban/removekanbancell.php @@ -10,6 +10,15 @@ title=测试 kanbanModel->removeKanbanCell(); cid=1 pid=1 +移除common 看板1的卡片1 >> 1:2,801,; 2:3,4,803,; 3:5,6,805,; 4:7,8,807, +移除common 看板2的卡片3 4 >> 1:2,801,; 2:803,; 3:5,6,805,; 4:7,8,807, +移除story 看板161的卡片244 >> 401; 402; 403; 404; 405; 406; 407; 408; 409; 410; 411; 428:246,; 429; 430; 431; 432; 433; 434; 435; 436; 437; 438: +移除story 看板161的卡片246 >> 401; 402; 403; 404; 405; 406; 407; 408; 409; 410; 411; 428; 429; 430; 431; 432; 433; 434; 435; 436; 437; 438: +移除bug 看板161的卡片181 >> 412:182,183,; 413; 414; 415; 416; 417; 418; 419; 420; 439:184,185,186,; 440; 441; 442; 443; 444; 445; 446; 447: +移除bug 看板161的卡片182 >> 412:183,; 413; 414; 415; 416; 417; 418; 419; 420; 439:184,185,186,; 440; 441; 442; 443; 444; 445; 446; 447: +移除task 看板161的卡片61 >> 421; 422; 423; 424; 425; 426; 427; 448:62,; 449; 450; 451; 452; 453; 454: +移除task 看板161的卡片62 >> 421; 422; 423; 424; 425; 426; 427; 448; 449; 450; 451; 452; 453; 454: + */ $typeList = array('common', 'story', 'bug', 'task'); @@ -26,4 +35,4 @@ r($kanban->removeKanbanCellTest($typeList[2], $cardIDList[4], $kanbanList)) && p r($kanban->removeKanbanCellTest($typeList[2], $cardIDList[5], $kanbanList)) && p() && e('412:183,; 413; 414; 415; 416; 417; 418; 419; 420; 439:184,185,186,; 440; 441; 442; 443; 444; 445; 446; 447:'); // 移除bug 看板161的卡片182 r($kanban->removeKanbanCellTest($typeList[3], $cardIDList[6], $kanbanList)) && p() && e('421; 422; 423; 424; 425; 426; 427; 448:62,; 449; 450; 451; 452; 453; 454:'); // 移除task 看板161的卡片61 r($kanban->removeKanbanCellTest($typeList[3], $cardIDList[7], $kanbanList)) && p() && e('421; 422; 423; 424; 425; 426; 427; 448; 449; 450; 451; 452; 453; 454:'); // 移除task 看板161的卡片62 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/restorecard.php b/test/model/kanban/restorecard.php index 179d043d4b..1833dee9a9 100755 --- a/test/model/kanban/restorecard.php +++ b/test/model/kanban/restorecard.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->restoreCard(); cid=1 pid=1 +还原卡片1 >> archived,1,0 +还原卡片1 >> archived,1,0 +还原卡片2 >> archived,1,0 +还原卡片3 >> archived,1,0 +还原卡片4 >> archived,1,0 + */ $kanbanIDList = array('1', '2', '3', '4', '5'); @@ -25,4 +31,4 @@ r($kanban->restoreCardTest($kanbanIDList[0])) && p('0:field,old,new') && e('arch r($kanban->restoreCardTest($kanbanIDList[1])) && p('0:field,old,new') && e('archived,1,0'); // 还原卡片1 r($kanban->restoreCardTest($kanbanIDList[2])) && p('0:field,old,new') && e('archived,1,0'); // 还原卡片2 r($kanban->restoreCardTest($kanbanIDList[3])) && p('0:field,old,new') && e('archived,1,0'); // 还原卡片3 -r($kanban->restoreCardTest($kanbanIDList[4])) && p('0:field,old,new') && e('archived,1,0'); // 还原卡片4 +r($kanban->restoreCardTest($kanbanIDList[4])) && p('0:field,old,new') && e('archived,1,0'); // 还原卡片4 \ No newline at end of file diff --git a/test/model/kanban/restorecolumn.php b/test/model/kanban/restorecolumn.php index f183329f57..23ff7a7358 100755 --- a/test/model/kanban/restorecolumn.php +++ b/test/model/kanban/restorecolumn.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->restoreColumn(); cid=1 pid=1 +还原卡片1 >> 未开始,0 +还原卡片1 >> 进行中,0 +还原卡片2 >> 已完成,0 +还原卡片3 >> 已关闭,0 +还原卡片4 >> 未开始,0 + */ $columnIDList = array('1', '2', '3', '4', '5'); @@ -26,4 +32,4 @@ r($kanban->restoreColumnTest($columnIDList[0])) && p('name,archived') && e('未 r($kanban->restoreColumnTest($columnIDList[1])) && p('name,archived') && e('进行中,0'); // 还原卡片1 r($kanban->restoreColumnTest($columnIDList[2])) && p('name,archived') && e('已完成,0'); // 还原卡片2 r($kanban->restoreColumnTest($columnIDList[3])) && p('name,archived') && e('已关闭,0'); // 还原卡片3 -r($kanban->restoreColumnTest($columnIDList[4])) && p('name,archived') && e('未开始,0'); // 还原卡片4 +r($kanban->restoreColumnTest($columnIDList[4])) && p('name,archived') && e('未开始,0'); // 还原卡片4 \ No newline at end of file diff --git a/test/model/kanban/setcolumnwidth.php b/test/model/kanban/setcolumnwidth.php index 2d7b1ba364..4501336ce7 100755 --- a/test/model/kanban/setcolumnwidth.php +++ b/test/model/kanban/setcolumnwidth.php @@ -10,6 +10,13 @@ title=测试 kanbanModel->setColumnWidth(); cid=1 pid=1 +测试修改看板1的fluidBoard值 >> 通用看板1,1 +测试修改看板2的fluidBoard值 >> 通用看板2,1 +测试修改看板3的fluidBoard值 >> 通用看板3,1 +测试修改看板4的fluidBoard值 >> 迭代1,1 +测试修改看板5的fluidBoard值 >> 迭代2,1 +测试修改不存在的看板的fluidBoard值 >> 0 + */ $fromExecution = 'execution'; @@ -25,4 +32,4 @@ r($kanban->setColumnWidthTest($kanbanIDList[2], $fluidBoard)) && r($kanban->setColumnWidthTest($kanbanIDList[3], $fluidBoard, $fromExecution)) && p('name,fluidBoard') && e('迭代1,1'); // 测试修改看板4的fluidBoard值 r($kanban->setColumnWidthTest($kanbanIDList[4], $fluidBoard, $fromExecution)) && p('name,fluidBoard') && e('迭代2,1'); // 测试修改看板5的fluidBoard值 r($kanban->setColumnWidthTest($kanbanIDList[5], $fluidBoard)) && p('name,fluidBoard') && e('0'); // 测试修改不存在的看板的fluidBoard值 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/setlane.php b/test/model/kanban/setlane.php index 9108981b80..a36788d2b2 100755 --- a/test/model/kanban/setlane.php +++ b/test/model/kanban/setlane.php @@ -10,6 +10,14 @@ title=测试 kanbanModel->setLane(); cid=1 pid=1 +测试设置泳道1 >> 修改泳道1,#333 +测试设置泳道2 >> 修改泳道2,#2b529c +测试设置泳道3 >> 修改泳道3,#333 +测试设置泳道4 >> 修改泳道4,#2b529c +测试设置泳道5 >> 修改泳道5,#333 +测试设置不填写名字 >> 『泳道名称』不能为空。 +测试设置填写空格 >> 『泳道名称』不能为空。 + */ $idList = array('1' ,'2', '3', '4', '5'); @@ -25,4 +33,4 @@ r($kanban->setLaneTest($idList[3], $nameList[3], $colorList[1])) && p('name,colo r($kanban->setLaneTest($idList[4], $nameList[4], $colorList[0])) && p('name,color') && e('修改泳道5,#333'); // 测试设置泳道5 r($kanban->setLaneTest($idList[4], $nameList[5], $colorList[0])) && p('name:0') && e('『泳道名称』不能为空。'); // 测试设置不填写名字 r($kanban->setLaneTest($idList[4], $nameList[6], $colorList[0])) && p('name:0') && e('『泳道名称』不能为空。'); // 测试设置填写空格 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/setlaneheight.php b/test/model/kanban/setlaneheight.php index aa376d2b42..41ed9df1c3 100755 --- a/test/model/kanban/setlaneheight.php +++ b/test/model/kanban/setlaneheight.php @@ -10,13 +10,18 @@ title=测试 kanbanModel->setLaneHeight(); cid=1 pid=1 +测试设置看板1的泳道高度 >> 通用看板1,0 +测试设置看板1的泳道高度 >> 迭代1,3 +测试设置看板1的泳道高度 >> 迭代2,4 +测试设置看板1的泳道高度 >> 卡片数量必须是大于2的正整数。 +测试设置看板1的泳道高度 >> 卡片数量必须是大于2的正整数。 + */ $laneIDList = array('1' ,'101', '102', '4', '5'); $heightTypeList = array('auto', 'custom'); $displayCardsList = array('', '3', '4', '2', 'a3'); - $kanban = new kanbanTest(); r($kanban->setLaneHeightTest($laneIDList[0], $heightTypeList[0], $displayCardsList[0])) && p('name,displayCards') && e('通用看板1,0'); // 测试设置看板1的泳道高度 @@ -24,4 +29,4 @@ r($kanban->setLaneHeightTest($laneIDList[1], $heightTypeList[1], $displayCardsLi r($kanban->setLaneHeightTest($laneIDList[2], $heightTypeList[1], $displayCardsList[2], 'execution')) && p('name,displayCards') && e('迭代2,4'); // 测试设置看板1的泳道高度 r($kanban->setLaneHeightTest($laneIDList[3], $heightTypeList[1], $displayCardsList[3])) && p('displayCards') && e('卡片数量必须是大于2的正整数。'); // 测试设置看板1的泳道高度 r($kanban->setLaneHeightTest($laneIDList[4], $heightTypeList[1], $displayCardsList[4])) && p('displayCards') && e('卡片数量必须是大于2的正整数。'); // 测试设置看板1的泳道高度 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/setwip.php b/test/model/kanban/setwip.php index 8cf4f2cfa9..c7ffd6ac7d 100755 --- a/test/model/kanban/setwip.php +++ b/test/model/kanban/setwip.php @@ -10,6 +10,19 @@ title=测试 kanbanModel->setWIP(); cid=1 pid=1 +测试设置看板列401的在制品限制 >> Backlog,-1 +测试设置看板列402的在制品限制 >> 准备好,100 +测试设置看板列404的在制品限制 >> 进行中,100 +测试设置看板列405的在制品限制 >> 完成,100 +测试设置看板列403的在制品限制 >> 开发,220 +测试设置看板列406的在制品限制 子列未设置在制品数量 >> 请先设置子列的在制品数量后再操作 +测试设置看板列407的在制品限制 >> 进行中,100 +测试设置看板列408的在制品限制 >> 完成,100 +测试设置看板列406的在制品限制 父列小于子列 >> 父列的在制品数量不能小于子列在制品数量之和 +测试设置看板列406的在制品限制 >> 测试,220 +测试设置看板列408的在制品限制 子列大于父列 >> 子列在制品数量之和不能大于父列的在制品数量 +测试设置看板列401的在制品限制 非正整数 >> 在制品数量必须是正整数。 + */ $columnIDList = array('401', '402', '403', '404', '405', '406', '407', '408'); @@ -31,4 +44,4 @@ r($kanban->setWIPTest($columnIDList[5], $limitList[3], $WIPCountList[2])) && p(' r($kanban->setWIPTest($columnIDList[5], $limitList[4], $WIPCountList[3])) && p('name,limit') && e('测试,220'); // 测试设置看板列406的在制品限制 r($kanban->setWIPTest($columnIDList[7], $limitList[4], $WIPCountList[3])) && p('limit') && e('子列在制品数量之和不能大于父列的在制品数量'); // 测试设置看板列408的在制品限制 子列大于父列 r($kanban->setWIPTest($columnIDList[0], $limitList[1], $WIPCountList[0])) && p('limit') && e('在制品数量必须是正整数。'); // 测试设置看板列401的在制品限制 非正整数 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/sortgroup.php b/test/model/kanban/sortgroup.php index 8305c9427c..b8e07c2a72 100755 --- a/test/model/kanban/sortgroup.php +++ b/test/model/kanban/sortgroup.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->sortGroup(); cid=1 pid=1 +测试区域101 泳道组101 102 103排序 >> 103,101,102 +测试区域102 泳道组104 105 106排序 >> 105,106,104 +测试区域103 泳道组107 108 109排序 >> 107,109,108 +测试区域104 泳道组110 111 112排序 >> 112,111,110 +测试区域105 泳道组113 114 115排序 >> 114,113,115 + */ $regionIDList = array('101', '102', '103', '104', '105'); @@ -21,4 +27,4 @@ r($kanban->sortGroupTest($regionIDList[0], $groupIDList[0])) && p() && e('103,10 r($kanban->sortGroupTest($regionIDList[1], $groupIDList[1])) && p() && e('105,106,104'); // 测试区域102 泳道组104 105 106排序 r($kanban->sortGroupTest($regionIDList[2], $groupIDList[2])) && p() && e('107,109,108'); // 测试区域103 泳道组107 108 109排序 r($kanban->sortGroupTest($regionIDList[3], $groupIDList[3])) && p() && e('112,111,110'); // 测试区域104 泳道组110 111 112排序 -r($kanban->sortGroupTest($regionIDList[4], $groupIDList[4])) && p() && e('114,113,115'); // 测试区域105 泳道组113 114 115排序 +r($kanban->sortGroupTest($regionIDList[4], $groupIDList[4])) && p() && e('114,113,115'); // 测试区域105 泳道组113 114 115排序 \ No newline at end of file diff --git a/test/model/kanban/splitcolumn.php b/test/model/kanban/splitcolumn.php index 1d275aad08..41c9efbefa 100755 --- a/test/model/kanban/splitcolumn.php +++ b/test/model/kanban/splitcolumn.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->splitColumn(); cid=1 pid=1 +测试拆分列1 >> 2 +测试拆分列2 >> 2 +测试拆分列3 >> 2 +测试拆分列4 >> 在制品数量必须是正整数。 +测试拆分列4 >> 『看板列名称』不能为空。 + */ $columnIDList = array('1', '2', '3', '4'); @@ -34,8 +40,6 @@ $splits4 = array('name' => $name, 'color' => $color, 'WIPCount' => $WIPCount); $name = array('1' => '', '2' => ''); $splits5 = array('name' => $name, 'color' => $color, 'noLimit' => $noLimit); - - $kanban = new kanbanTest(); r($kanban->splitColumnTest($columnIDList[0], $splits1)) && p() && e('2'); // 测试拆分列1 @@ -43,4 +47,4 @@ r($kanban->splitColumnTest($columnIDList[1], $splits2)) && p() && e('2'); r($kanban->splitColumnTest($columnIDList[2], $splits3)) && p() && e('2'); // 测试拆分列3 r($kanban->splitColumnTest($columnIDList[3], $splits4)) && p('limit') && e('在制品数量必须是正整数。'); // 测试拆分列4 r($kanban->splitColumnTest($columnIDList[3], $splits5)) && p('name') && e('『看板列名称』不能为空。'); // 测试拆分列4 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/update.php b/test/model/kanban/update.php index 43ebe89d41..b242911110 100755 --- a/test/model/kanban/update.php +++ b/test/model/kanban/update.php @@ -10,6 +10,16 @@ title=测试 kanbanModel->update(); cid=1 pid=1 +测试修改看板名称 >> name,通用看板1,修改名字 +测试修改看板空间 >> space,1,2 +测试修改看板备注 >> desc,看板详情,修改注释 +测试修改看板负责人 >> owner,po16,user4 +测试修改看板团队成员 >> team,,user5,po17,,user5,po17,user3 +测试重复修改看板名称 >> 没有数据更新 +测试修改看板名称为空 >> 『看板名称』不能为空。 +测试修改看板名称为空格 >> 『看板名称』不能为空。 +测试修改看板空间为空 >> 『所属空间』不能为空。 + */ $kanbanIDList = array('1', '2', '3', '4', '5'); @@ -31,4 +41,4 @@ r($kanban->updateTest($kanbanIDList[0], array('name' => $names[0]))) && p() r($kanban->updateTest($kanbanIDList[0], array('name' => $names[1]))) && p('name:0') && e('『看板名称』不能为空。'); // 测试修改看板名称为空 r($kanban->updateTest($kanbanIDList[0], array('name' => $names[2]))) && p('name:0') && e('『看板名称』不能为空。'); // 测试修改看板名称为空格 r($kanban->updateTest($kanbanIDList[0], array('space' => $space[1]))) && p('space:0') && e('『所属空间』不能为空。'); // 测试修改看板空间为空 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/updatecard.php b/test/model/kanban/updatecard.php index 241305b11a..bbb7b6afef 100755 --- a/test/model/kanban/updatecard.php +++ b/test/model/kanban/updatecard.php @@ -10,6 +10,16 @@ title=测试 kanbanModel->updateCard(); cid=1 pid=1 +测试修改卡片1 >> name,卡片1,修改名字;desc,,修改注释;estimate,0,3 +测试修改卡片2 >> begin,2022-03-30;end,2022-04-01;progress,50,0 +测试修改卡片3 >> assignedTo,admin,user5,po17,user3;progress,100,50;status,done,doing +测试修改卡片4 >> progress,0,100;status,doing,done +测试修改卡片5 >> pri,3,1 +测试修改卡片开始小于结束日期 >> "截止日期"不能小于"预计开始"! +测试修改卡片预计小于0 >> 预计不能为负数! +测试修改卡片进度小于0 >> 请输入正确的进度 +测试修改卡片进度大于100 >> 请输入正确的进度 + */ $cardIDList = array('1', '2', '3', '4', '5'); @@ -46,4 +56,4 @@ r($kanban->updateCardTest($cardIDList[0], $param6)) && p() r($kanban->updateCardTest($cardIDList[0], $param7)) && p() && e('预计不能为负数!'); // 测试修改卡片预计小于0 r($kanban->updateCardTest($cardIDList[0], $param8)) && p() && e('请输入正确的进度'); // 测试修改卡片进度小于0 r($kanban->updateCardTest($cardIDList[0], $param9)) && p() && e('请输入正确的进度'); // 测试修改卡片进度大于100 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/kanban/updatecardcolor.php b/test/model/kanban/updatecardcolor.php index aca011c327..e139695b61 100755 --- a/test/model/kanban/updatecardcolor.php +++ b/test/model/kanban/updatecardcolor.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->updateCardColor(); cid=1 pid=1 +更新卡片1的颜色 >> 1,卡片1,#b10b0b +更新卡片2的颜色 >> 2,卡片2,#cfa227 +更新卡片3的颜色 >> 3,卡片3,#2a5f29 +更新卡片4的颜色 >> 4,卡片4,#b10b0b +更新卡片5的颜色 >> 5,卡片5,#cfa227 + */ $cardIDList = array('1', '2', '3', '4', '5'); @@ -21,4 +27,4 @@ r($kanban->updateCardColorTest($cardIDList[0], $colorList[0])) && p('id,name,col r($kanban->updateCardColorTest($cardIDList[1], $colorList[1])) && p('id,name,color') && e('2,卡片2,#cfa227'); // 更新卡片2的颜色 r($kanban->updateCardColorTest($cardIDList[2], $colorList[2])) && p('id,name,color') && e('3,卡片3,#2a5f29'); // 更新卡片3的颜色 r($kanban->updateCardColorTest($cardIDList[3], $colorList[0])) && p('id,name,color') && e('4,卡片4,#b10b0b'); // 更新卡片4的颜色 -r($kanban->updateCardColorTest($cardIDList[4], $colorList[1])) && p('id,name,color') && e('5,卡片5,#cfa227'); // 更新卡片5的颜色 +r($kanban->updateCardColorTest($cardIDList[4], $colorList[1])) && p('id,name,color') && e('5,卡片5,#cfa227'); // 更新卡片5的颜色 \ No newline at end of file diff --git a/test/model/kanban/updatelane.php b/test/model/kanban/updatelane.php index 6cc974983d..1da58916b3 100755 --- a/test/model/kanban/updatelane.php +++ b/test/model/kanban/updatelane.php @@ -10,6 +10,16 @@ title=测试 kanbanModel->updateLane(); cid=1 pid=1 +测试更新执行101的story泳道 >> 0 +测试更新执行101的bug泳道 >> ,1,3,301,2, +测试更新执行101的task泳道 >> ,1,901,907,902,908,903,909,904,910,905,906, +测试更新执行102的story泳道 >> ,6,8, +测试更新执行102的bug泳道 >> ,5,302,4,6, +测试更新执行102的task泳道 >> ,2,604,605,606, +测试更新执行103的story泳道 >> ,10,12, +测试更新执行103的bug泳道 >> ,7,9,303,8, +测试更新执行103的task泳道 >> ,607,608,3,609, + */ $executionID = array('101', '102', '103'); @@ -25,4 +35,4 @@ r($kanban->updateLaneTest($executionID[1], $laneType[1])) && p() && e(',5,302,4, r($kanban->updateLaneTest($executionID[1], $laneType[2])) && p() && e(',2,604,605,606,'); // 测试更新执行102的task泳道 r($kanban->updateLaneTest($executionID[2], $laneType[0])) && p() && e(',10,12,'); // 测试更新执行103的story泳道 r($kanban->updateLaneTest($executionID[2], $laneType[1])) && p() && e(',7,9,303,8,'); // 测试更新执行103的bug泳道 -r($kanban->updateLaneTest($executionID[2], $laneType[2])) && p() && e(',607,608,3,609,'); // 测试更新执行103的task泳道 +r($kanban->updateLaneTest($executionID[2], $laneType[2])) && p() && e(',607,608,3,609,'); // 测试更新执行103的task泳道 \ No newline at end of file diff --git a/test/model/kanban/updatelanecolumn.php b/test/model/kanban/updatelanecolumn.php index 4dbfdc0124..365dc2dc7a 100755 --- a/test/model/kanban/updatelanecolumn.php +++ b/test/model/kanban/updatelanecolumn.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->updateLaneColumn(); cid=1 pid=1 +测试修改列1信息 >> name,测试修改列名1,未开始;color,#2b519c,#333 +测试修改列2信息 >> name,测试修改列名2,进行中;color,#e48610,#333 +测试修改列3信息 >> name,测试修改列名3,已完成;color,#d2313d,#333 +测试修改列4信息 >> 『看板列名称』不能为空。 +测试修改列5信息 >> 『看板列名称』不能为空。 + */ $columnIDList = array('1', '2', '3', '4', '5'); $nameList = array('测试修改列名1', '测试修改列名2', '测试修改列名3', '', ' '); @@ -21,4 +27,4 @@ r($kanban->updateLaneColumnTest($columnIDList[0], $nameList[0], $colorList[0])) r($kanban->updateLaneColumnTest($columnIDList[1], $nameList[1], $colorList[1])) && p('0:field,new,old;1:field,new,old') && e('name,测试修改列名2,进行中;color,#e48610,#333'); // 测试修改列2信息 r($kanban->updateLaneColumnTest($columnIDList[2], $nameList[2], $colorList[2])) && p('0:field,new,old;1:field,new,old') && e('name,测试修改列名3,已完成;color,#d2313d,#333'); // 测试修改列3信息 r($kanban->updateLaneColumnTest($columnIDList[3], $nameList[3], $colorList[3])) && p('name:0') && e('『看板列名称』不能为空。'); // 测试修改列4信息 -r($kanban->updateLaneColumnTest($columnIDList[4], $nameList[4], $colorList[4])) && p('name:0') && e('『看板列名称』不能为空。'); // 测试修改列5信息 +r($kanban->updateLaneColumnTest($columnIDList[4], $nameList[4], $colorList[4])) && p('name:0') && e('『看板列名称』不能为空。'); // 测试修改列5信息 \ No newline at end of file diff --git a/test/model/kanban/updateregion.php b/test/model/kanban/updateregion.php index 6a9824f16e..9fc6f3a155 100755 --- a/test/model/kanban/updateregion.php +++ b/test/model/kanban/updateregion.php @@ -10,6 +10,12 @@ title=测试 kanbanModel->updateRegion(); cid=1 pid=1 +测试修改区域1的信息 >> name,默认区域,测试修改区域名称1 +测试修改区域2的信息 >> name,默认区域,测试修改区域名称2 +测试修改区域3的信息 >> name,默认区域,测试修改区域名称3 +测试修改区域4的信息 >> 『区域名称』不能为空。 +测试修改区域5的信息 >> 『区域名称』不能为空。 + */ $regionIDList = array('1', '2', '3', '4', '5'); @@ -21,4 +27,4 @@ r($kanban->updateRegionTest($regionIDList[0], $nameList[0])) && p('0:field,old,n r($kanban->updateRegionTest($regionIDList[1], $nameList[1])) && p('0:field,old,new') && e('name,默认区域,测试修改区域名称2'); // 测试修改区域2的信息 r($kanban->updateRegionTest($regionIDList[2], $nameList[2])) && p('0:field,old,new') && e('name,默认区域,测试修改区域名称3'); // 测试修改区域3的信息 r($kanban->updateRegionTest($regionIDList[3], $nameList[3])) && p('name:0') && e('『区域名称』不能为空。'); // 测试修改区域4的信息 -r($kanban->updateRegionTest($regionIDList[4], $nameList[4])) && p('name:0') && e('『区域名称』不能为空。'); // 测试修改区域5的信息 +r($kanban->updateRegionTest($regionIDList[4], $nameList[4])) && p('name:0') && e('『区域名称』不能为空。'); // 测试修改区域5的信息 \ No newline at end of file diff --git a/test/model/kanban/updatespace.php b/test/model/kanban/updatespace.php index 8215d0c4bb..d62e5eb97c 100755 --- a/test/model/kanban/updatespace.php +++ b/test/model/kanban/updatespace.php @@ -10,6 +10,15 @@ title=测试 kanbanModel->updateSpace(); cid=1 pid=1 +测试修改空间1 >> name,协作空间1,测试修改名称1;owner,po15,user3 +测试修改空间2 >> name,私有空间2,测试修改名称2;whitelist,,user4,po16,,,user4,po16,user3, +测试修改空间3 >> name,公共空间3,测试修改名称3;team,,user5,po17,,,user5,po17,user3, +测试修改空间4 >> name,协作空间4,测试修改名称4;desc,,修改备注 +测试重复修改空间4 >> 没有数据更新 +测试修改空间5 不填写名称 >> 『空间名称』不能为空。 +测试修改空间5 名称为空格 >> 『空间名称』不能为空。 +测试修改空间5 不填写负责人 >> 『负责人』不能为空。 + */ $spaceIDList = array('1', '2', '3', '4', '5'); @@ -38,4 +47,4 @@ r($kanban->updateSpaceTest($spaceIDList[3], $typeList[0], $param4)) && p() r($kanban->updateSpaceTest($spaceIDList[4], $typeList[1], $param5)) && p('name:0') && e('『空间名称』不能为空。'); // 测试修改空间5 不填写名称 r($kanban->updateSpaceTest($spaceIDList[4], $typeList[1], $param6)) && p('name:0') && e('『空间名称』不能为空。'); // 测试修改空间5 名称为空格 r($kanban->updateSpaceTest($spaceIDList[4], $typeList[1], $param7)) && p('owner:0') && e('『负责人』不能为空。'); // 测试修改空间5 不填写负责人 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/product/batchgetstorystage.php b/test/model/product/batchgetstorystage.php index ce508ad850..a2feba2c88 100755 --- a/test/model/product/batchgetstorystage.php +++ b/test/model/product/batchgetstorystage.php @@ -9,6 +9,10 @@ title=productModel->batchGetStoryStage(); cid=1 pid=1 +测试获取需求1 2 3的阶段 >> wait;planned;projected +测试获取需求4 5 6的阶段 >> developing;developed;testing +测试获取需求7 8 9的阶段 >> tested;verified;released + */ $story1 = new stdclass(); @@ -46,4 +50,4 @@ $product = new productTest('admin'); r($product->batchGetStoryStageTest($stories1)) && p('1;2;3') && e('wait;planned;projected'); // 测试获取需求1 2 3的阶段 r($product->batchGetStoryStageTest($stories2)) && p('4;5;6') && e('developing;developed;testing'); // 测试获取需求4 5 6的阶段 -r($product->batchGetStoryStageTest($stories3)) && p('7;8;9') && e('tested;verified;released'); // 测试获取需求7 8 9的阶段 +r($product->batchGetStoryStageTest($stories3)) && p('7;8;9') && e('tested;verified;released'); // 测试获取需求7 8 9的阶段 \ No newline at end of file diff --git a/test/model/product/batchupdate.php b/test/model/product/batchupdate.php index 6ff81c0489..e2b06ec78d 100755 --- a/test/model/product/batchupdate.php +++ b/test/model/product/batchupdate.php @@ -9,6 +9,10 @@ title=测试 productModel->batchUpdate(); cid=1 pid=1 +批量修改product名称 >> name,正常产品1,批量修改产品1 +批量修改produc测试负责人 >> QD,test2,test1 +批量修改product状态 >> status,normal,closed + */ $names = array('1' => '批量修改产品1', '2' => '正常产品2', '3' => '正常产品3'); @@ -24,4 +28,4 @@ $product = new productTest('admin'); r($product->batchUpdateTest($changeName, '1')) && p('0:field,old,new') && e('name,正常产品1,批量修改产品1'); // 批量修改product名称 r($product->batchUpdateTest($changeQDs, '2')) && p('0:field,old,new') && e('QD,test2,test1'); // 批量修改produc测试负责人 r($product->batchUpdateTest($changeStatus, '3')) && p('0:field,old,new') && e('status,normal,closed'); // 批量修改product状态 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/product/checkpriv.php b/test/model/product/checkpriv.php index cbd07353e8..ee13e9ad37 100755 --- a/test/model/product/checkpriv.php +++ b/test/model/product/checkpriv.php @@ -11,18 +11,18 @@ title=测试productModel->checkPriv(); cid=1 pid=1 -测试admin能否看到产品1 >> 1 -测试admin能否看到产品2 >> 1 -测试admin能否看到产品3 >> 1 -测试admin能否看到产品4 >> 1 -测试admin能否看到产品5 >> 1 +测试admin能否看到产品1 >> 1 +测试admin能否看到产品2 >> 1 +测试admin能否看到产品3 >> 1 +测试admin能否看到产品4 >> 1 +测试admin能否看到产品5 >> 1 测试admin能否看到不存在的产品 >> 1 -测试po1能否看到产品1 >> 1 -测试po1能否看到产品2 >> 1 -测试po1能否看到产品3 >> 1 -测试po1能否看到产品4 >> 1 -测试po1能否看到产品5 >> 1 -测试po1能否看到不存在的产品 >> 2 +测试po1能否看到产品1 >> 1 +测试po1能否看到产品2 >> 1 +测试po1能否看到产品3 >> 1 +测试po1能否看到产品4 >> 1 +测试po1能否看到产品5 >> 1 +测试po1能否看到不存在的产品 >> 2 */ @@ -44,4 +44,4 @@ r($productTest->checkPrivTest($productIDList[3])) && p() && e('1'); // 测试po1 r($productTest->checkPrivTest($productIDList[4])) && p() && e('1'); // 测试po1能否看到产品5 r($productTest->checkPrivTest($productIDList[5])) && p() && e('2'); // 测试po1能否看到不存在的产品 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/product/close.php b/test/model/product/close.php index 221040f9ad..8d7adfc2ce 100755 --- a/test/model/product/close.php +++ b/test/model/product/close.php @@ -9,6 +9,13 @@ title=productModel->close(); cid=1 pid=1 +测试关闭产品1 >> status,normal,closed +测试关闭产品2 >> status,normal,closed +测试关闭产品3 >> status,normal,closed +测试关闭产品4 >> status,normal,closed +测试关闭产品5 >> status,normal,closed +测试关闭不存在产品 >> 0 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -21,4 +28,4 @@ r($product->closeTest($productIDList[2])) && p('0:field,old,new') && e('status,n r($product->closeTest($productIDList[3])) && p('0:field,old,new') && e('status,normal,closed'); // 测试关闭产品4 r($product->closeTest($productIDList[4])) && p('0:field,old,new') && e('status,normal,closed'); // 测试关闭产品5 r($product->closeTest($productIDList[5])) && p() && e('0'); // 测试关闭不存在产品 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/product/create.php b/test/model/product/create.php index ebaaadb641..fa8a5a74bd 100755 --- a/test/model/product/create.php +++ b/test/model/product/create.php @@ -41,4 +41,4 @@ r($product->createObject($t_namecode)) && p('name,code') && e('cas r($product->createObject($t_pronamecode)) && p('program,name,code') && e('3,case4,testcase4'); // 测试传入program、name、code r($product->createObject($t_intypestatus)) && p('program,type,status') && e('4,branch,closed'); // 测试传入program、name、code、type、status r($product->createObject($t_noacl)) && p('acl:0') && e('『访问控制』不符合格式,应当为:『/open|private|custom/』。'); // 测试不填权限控制的情况 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/product/getallexecutionpairsbyproduct.php b/test/model/product/getallexecutionpairsbyproduct.php index a57c05a358..3b9cf57ede 100755 --- a/test/model/product/getallexecutionpairsbyproduct.php +++ b/test/model/product/getallexecutionpairsbyproduct.php @@ -9,6 +9,12 @@ title=productModel->getAllExecutionPairsByProduct(); cid=1 pid=1 +测试获取产品1的执行信息 >> 项目1/迭代1,项目11/迭代11,项目1/迭代91,项目11/迭代101,项目1/迭代181,项目11/迭代191,项目1/迭代271,项目11/迭代281,项目1/迭代361,项目11/迭代371,项目1/迭代451,项目11/迭代461,项目1/迭代541,项目11/迭代551 +测试获取产品2的执行信息 >> 项目2/迭代2,项目12/迭代12,项目2/迭代92,项目12/迭代102,项目2/迭代182,项目12/迭代192,项目2/迭代272,项目12/迭代282,项目2/迭代362,项目12/迭代372,项目2/迭代452,项目12/迭代462,项目2/迭代542,项目12/迭代552 +测试获取产品3的执行信息 >> 项目3/迭代3,项目13/迭代13,项目3/迭代93,项目13/迭代103,项目3/迭代183,项目13/迭代193,项目3/迭代273,项目13/迭代283,项目3/迭代363,项目13/迭代373,项目3/迭代453,项目13/迭代463,项目3/迭代543,项目13/迭代553 +测试获取产品4的执行信息 >> 项目4/迭代4,项目14/迭代14,项目4/迭代94,项目14/迭代104,项目4/迭代184,项目14/迭代194,项目4/迭代274,项目14/迭代284,项目4/迭代364,项目14/迭代374,项目4/迭代454,项目14/迭代464,项目4/迭代544,项目14/迭代554 +测试获取产品5的执行信息 >> 项目5/迭代5,项目15/迭代15,项目5/迭代95,项目15/迭代105,项目5/迭代185,项目15/迭代195,项目5/迭代275,项目15/迭代285,项目5/迭代365,项目15/迭代375,项目5/迭代455,项目15/迭代465,项目5/迭代545,项目15/迭代555 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -20,4 +26,4 @@ r($product->getAllExecutionPairsByProductTest($productIDList[1])) && p('102,112, r($product->getAllExecutionPairsByProductTest($productIDList[2])) && p('103,113,193,203,283,293,373,383,463,473,553,563,643,653') && e('项目3/迭代3,项目13/迭代13,项目3/迭代93,项目13/迭代103,项目3/迭代183,项目13/迭代193,项目3/迭代273,项目13/迭代283,项目3/迭代363,项目13/迭代373,项目3/迭代453,项目13/迭代463,项目3/迭代543,项目13/迭代553'); // 测试获取产品3的执行信息 r($product->getAllExecutionPairsByProductTest($productIDList[3])) && p('104,114,194,204,284,294,374,384,464,474,554,564,644,654') && e('项目4/迭代4,项目14/迭代14,项目4/迭代94,项目14/迭代104,项目4/迭代184,项目14/迭代194,项目4/迭代274,项目14/迭代284,项目4/迭代364,项目14/迭代374,项目4/迭代454,项目14/迭代464,项目4/迭代544,项目14/迭代554'); // 测试获取产品4的执行信息 r($product->getAllExecutionPairsByProductTest($productIDList[4])) && p('105,115,195,205,285,295,375,385,465,475,555,565,645,655') && e('项目5/迭代5,项目15/迭代15,项目5/迭代95,项目15/迭代105,项目5/迭代185,项目15/迭代195,项目5/迭代275,项目15/迭代285,项目5/迭代365,项目15/迭代375,项目5/迭代455,项目15/迭代465,项目5/迭代545,项目15/迭代555'); // 测试获取产品5的执行信息 -r($product->getAllExecutionPairsByProductTest($productIDList[5])) && p('0:') && e(''); // 测试获取不存在产品的执行信息 +r($product->getAllExecutionPairsByProductTest($productIDList[5])) && p('0:') && e(''); // 测试获取不存在产品的执行信息 \ No newline at end of file diff --git a/test/model/product/getbyid.php b/test/model/product/getbyid.php index d4c0a3432c..dc444d79f6 100755 --- a/test/model/product/getbyid.php +++ b/test/model/product/getbyid.php @@ -9,11 +9,11 @@ title=productModel->getById(); cid=1 pid=1 -测试获取产品1的信息 >> 正常产品1,code1,normal,po1,test1,dev1 -测试获取产品2的信息 >> 正常产品2,code2,normal,po2,test2,dev2 -测试获取产品3的信息 >> 正常产品3,code3,normal,po3,test3,dev3 -测试获取产品4的信息 >> 正常产品4,code4,normal,po4,test4,dev4 -测试获取产品5的信息 >> 正常产品5,code5,normal,po5,test5,dev5 +测试获取产品1的信息 >> 正常产品1,code1,normal,po1,test1,dev1 +测试获取产品2的信息 >> 正常产品2,code2,normal,po2,test2,dev2 +测试获取产品3的信息 >> 正常产品3,code3,normal,po3,test3,dev3 +测试获取产品4的信息 >> 正常产品4,code4,normal,po4,test4,dev4 +测试获取产品5的信息 >> 正常产品5,code5,normal,po5,test5,dev5 测试获取不存在产品的信息 >> 0 */ @@ -27,4 +27,4 @@ r($product->getByIdTest($productIDList[1])) && p('name,code,type,PO,QD,RD') && e r($product->getByIdTest($productIDList[2])) && p('name,code,type,PO,QD,RD') && e('正常产品3,code3,normal,po3,test3,dev3'); // 测试获取产品3的信息 r($product->getByIdTest($productIDList[3])) && p('name,code,type,PO,QD,RD') && e('正常产品4,code4,normal,po4,test4,dev4'); // 测试获取产品4的信息 r($product->getByIdTest($productIDList[4])) && p('name,code,type,PO,QD,RD') && e('正常产品5,code5,normal,po5,test5,dev5'); // 测试获取产品5的信息 -r($product->getByIdTest($productIDList[5])) && p('name,code,type,PO,QD,RD') && e('0'); // 测试获取不存在产品的信息 +r($product->getByIdTest($productIDList[5])) && p('name,code,type,PO,QD,RD') && e('0'); // 测试获取不存在产品的信息 \ No newline at end of file diff --git a/test/model/product/getbyidlist.php b/test/model/product/getbyidlist.php index 1c303e254e..3c918197d6 100755 --- a/test/model/product/getbyidlist.php +++ b/test/model/product/getbyidlist.php @@ -23,4 +23,4 @@ $productIDList3 = array('7', '8', '9'); r($product->getByIdListTest($productIDList1)) && p('1:name,PO,QD,RD;2:name,PO,QD,RD;3:name,PO,QD,RD') && e('正常产品1,po1,test1,dev1;正常产品2,po2,test2,dev2;正常产品3,po3,test3,dev3'); // 测试获取product 1 2 3的信息 r($product->getByIdListTest($productIDList2)) && p('4:name,PO,QD,RD;5:name,PO,QD,RD;6:name,PO,QD,RD') && e('正常产品4,po4,test4,dev4;正常产品5,po5,test5,dev5;正常产品6,po6,test6,dev6'); // 测试获取product 4 5 6的信息 -r($product->getByIdListTest($productIDList3)) && p('7:name,PO,QD,RD;8:name,PO,QD,RD;9:name,PO,QD,RD') && e('正常产品7,po7,test7,dev7;正常产品8,po8,test8,dev8;正常产品9,po9,test9,dev9'); // 测试获取product 7 8 9的信息 +r($product->getByIdListTest($productIDList3)) && p('7:name,PO,QD,RD;8:name,PO,QD,RD;9:name,PO,QD,RD') && e('正常产品7,po7,test7,dev7;正常产品8,po8,test8,dev8;正常产品9,po9,test9,dev9'); // 测试获取product 7 8 9的信息 \ No newline at end of file diff --git a/test/model/product/getexecutionpairsbyproduct.php b/test/model/product/getexecutionpairsbyproduct.php index e2b7f4d57c..7a97667745 100755 --- a/test/model/product/getexecutionpairsbyproduct.php +++ b/test/model/product/getexecutionpairsbyproduct.php @@ -9,6 +9,22 @@ title=productModel->getExecutionPairsByProduct(); cid=1 pid=1 +测试获取产品1的信息 >> 项目1/迭代1;项目11/迭代11 +测试获取产品1 项目11的信息 >> 迭代1; +测试获取产品1 项目21的信息 >> ;迭代11 +测试获取产品2的信息 >> 项目2/迭代2;项目12/迭代12 +测试获取产品2 项目12的信息 >> 迭代2; +测试获取产品2 项目22的信息 >> ;迭代12 +测试获取产品3的信息 >> 项目3/迭代3;项目13/迭代13 +测试获取产品3 项目13的信息 >> 迭代3; +测试获取产品3 项目23的信息 >> ;迭代13 +测试获取产品4的信息 >> 项目4/迭代4;项目14/迭代14 +测试获取产品4 项目14的信息 >> 迭代4; +测试获取产品4 项目24的信息 >> ;迭代14 +测试获取产品5的信息 >> 项目5/迭代5;项目15/迭代15 +测试获取产品5 项目15的信息 >> 迭代5; +测试获取产品5 项目25的信息 >> ;迭代15 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -30,4 +46,4 @@ r($product->getExecutionPairsByProductTest($productIDList[3], $projectIDList[6]) r($product->getExecutionPairsByProductTest($productIDList[3], $projectIDList[7])) && p('104;114') && e(';迭代14'); // 测试获取产品4 项目24的信息 r($product->getExecutionPairsByProducttest($productIDList[4])) && p('105;115') && e('项目5/迭代5;项目15/迭代15'); // 测试获取产品5的信息 r($product->getExecutionPairsByProducttest($productIDList[4], $projectIDList[8])) && p('105;115') && e('迭代5;'); // 测试获取产品5 项目15的信息 -r($product->getExecutionPairsByProducttest($productIDList[4], $projectIDList[9])) && p('105;115') && e(';迭代15'); // 测试获取产品5 项目25的信息 +r($product->getExecutionPairsByProducttest($productIDList[4], $projectIDList[9])) && p('105;115') && e(';迭代15'); // 测试获取产品5 项目25的信息 \ No newline at end of file diff --git a/test/model/product/getlatestproject.php b/test/model/product/getlatestproject.php index 4df3d77725..331fce5f10 100755 --- a/test/model/product/getlatestproject.php +++ b/test/model/product/getlatestproject.php @@ -23,4 +23,4 @@ $t_project101 = array('id'=>'10001'); r($product->testGetLatestProject($t_project25['id'])) && p('id') && e('395'); // 测试产品25关联的最后一个未关闭的项目,按begin字段排序 r($product->testGetLatestProject($t_project38['id'])) && p('id') && e('688'); // 测试产品38关联的最后一个未关闭的项目,按begin字段排序 -r($product->testGetLatestProject($t_project101['id'])) && p() && e('没有数据'); // 传入不存在的产品 +r($product->testGetLatestProject($t_project101['id'])) && p() && e('没有数据'); // 传入不存在的产品 \ No newline at end of file diff --git a/test/model/product/getlinepairs.php b/test/model/product/getlinepairs.php index abc78dcaf8..efc9d8bf2d 100755 --- a/test/model/product/getlinepairs.php +++ b/test/model/product/getlinepairs.php @@ -9,6 +9,13 @@ title=productModel->getLinePairs(); cid=1 pid=1 +测试获取程序集1的信息 >> 产品线1,产品线11 +测试获取程序集2的信息 >> 产品线2,产品线12 +测试获取程序集3的信息 >> 产品线3,产品线13 +测试获取程序集4的信息 >> 产品线4,产品线14 +测试获取程序集5的信息 >> 产品线5,产品线15 +测试获取不存在程序集的信息 >> 0 + */ $programIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -20,4 +27,4 @@ r($product->getLinePairsTest($programIDList[1])) && p('2,12') && e('产品线2, r($product->getLinePairsTest($programIDList[2])) && p('3,13') && e('产品线3,产品线13'); // 测试获取程序集3的信息 r($product->getLinePairsTest($programIDList[3])) && p('4,14') && e('产品线4,产品线14'); // 测试获取程序集4的信息 r($product->getLinePairsTest($programIDList[4])) && p('5,15') && e('产品线5,产品线15'); // 测试获取程序集5的信息 -r($product->getLinePairsTest($programIDList[5])) && p('1,11') && e('0'); // 测试获取不存在程序集的信息 +r($product->getLinePairsTest($programIDList[5])) && p('1,11') && e('0'); // 测试获取不存在程序集的信息 \ No newline at end of file diff --git a/test/model/product/getlist.php b/test/model/product/getlist.php index 46292fbab1..0e28a6ce14 100755 --- a/test/model/product/getlist.php +++ b/test/model/product/getlist.php @@ -10,7 +10,7 @@ cid=1 pid=1 返回项目集1下的产品数量 >> 11 -测试传入programID=0的情况 >> 10 +测试传入programID=0的情况 >> 120 传入不存在的项目集 >> 0 返回项目集1下的未关闭的产品数量 >> 7 获取所有的未关闭的产品数量 >> 80 @@ -35,4 +35,4 @@ r($product->getClosedProductsCount($t_numproject[1])) && p() && e r($product->getClosedProductsCount($t_numproject[0])) && p() && e('40'); // 返回所有的未关闭的产品数量 r($product->getInvolvedProductsCount($t_numproject[1])) && p() && e('0'); // 返回项目集1下的与当前用户有关系的产品数量 r($product->countProductsByLine($t_numproject[1], $t_numproject[1])) && p() && e('11'); // 返回项目集1下产品线1的产品数量 -r($product->countProductsByLine($t_numproject[1], $t_numproject[2])) && p() && e('0'); // 返回项目集1下产品线2的产品数量 +r($product->countProductsByLine($t_numproject[1], $t_numproject[2])) && p() && e('0'); // 返回项目集1下产品线2的产品数量 \ No newline at end of file diff --git a/test/model/product/getmultibranchpairs.php b/test/model/product/getmultibranchpairs.php index ffb7a821d1..e2222a2200 100755 --- a/test/model/product/getmultibranchpairs.php +++ b/test/model/product/getmultibranchpairs.php @@ -9,6 +9,13 @@ title=productModel->getMultiBranchPairs(); cid=1 pid=1 +测试获取项目集1的产品id >> ,46,57,68,79,90 +测试获取项目集2的产品id >> ,47,58,69,80,91 +测试获取项目集3的产品id >> ,48,59,70,81,92 +测试获取项目集4的产品id >> ,49,60,71,82,93 +测试获取项目集5的产品id >> ,50,61,72,83,94 +测试获取不存在项目集的产品id >> 0 + */ $programIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -20,4 +27,4 @@ r($product->getMultiBranchPairsTest($programIDList[1])) && p() && e(',47,58,69,8 r($product->getMultiBranchPairsTest($programIDList[2])) && p() && e(',48,59,70,81,92'); // 测试获取项目集3的产品id r($product->getMultiBranchPairsTest($programIDList[3])) && p() && e(',49,60,71,82,93'); // 测试获取项目集4的产品id r($product->getMultiBranchPairsTest($programIDList[4])) && p() && e(',50,61,72,83,94'); // 测试获取项目集5的产品id -r($product->getMultiBranchPairsTest($programIDList[5])) && p() && e('0'); // 测试获取不存在项目集的产品id +r($product->getMultiBranchPairsTest($programIDList[5])) && p() && e('0'); // 测试获取不存在项目集的产品id \ No newline at end of file diff --git a/test/model/product/getorderedproducts.php b/test/model/product/getorderedproducts.php index 027e8124f6..219c59df10 100755 --- a/test/model/product/getorderedproducts.php +++ b/test/model/product/getorderedproducts.php @@ -9,6 +9,10 @@ title=productModel->getOrderedProducts(); cid=1 pid=1 +测试获取状态为all的产品数量 >> 120 +测试获取状态为noclosed的产品数量 >> 80 +测试获取状态为closed的产品数量 >> 40 + */ $statusList = array('all', 'noclosed', 'closed'); @@ -17,4 +21,4 @@ $product = new productTest('admin'); r($product->getOrderedProductsTest($statusList[0])) && p() && e('120'); // 测试获取状态为all的产品数量 r($product->getOrderedProductsTest($statusList[1])) && p() && e('80'); // 测试获取状态为noclosed的产品数量 -r($product->getOrderedProductsTest($statusList[2])) && p() && e('40'); // 测试获取状态为closed的产品数量 +r($product->getOrderedProductsTest($statusList[2])) && p() && e('40'); // 测试获取状态为closed的产品数量 \ No newline at end of file diff --git a/test/model/product/getpairs.php b/test/model/product/getpairs.php index 2048d1bc73..b28143c342 100755 --- a/test/model/product/getpairs.php +++ b/test/model/product/getpairs.php @@ -34,4 +34,4 @@ r($product->getProductPairs($t_noproduct['programID'])) && p() && e(' r($product->getProductPairsCount($t_alproduct['programID'])) && p() && e('120'); // 返回所有产品的数量 r($product->getProductPairsCount($t_peoduct10['programID'])) && p() && e('10'); // 返回项目集10下的所有产品 r($product->getNoclosedPairs($t_notclose5['programID'])) && p('6') && e('正常产品6'); // 测试项目集10下的未关闭产品5 -r($product->getNoclosedPairsCount($t_peoduct10['programID'])) && p() && e('6'); // 返回项目集10下的未关闭产品的数量 +r($product->getNoclosedPairsCount($t_peoduct10['programID'])) && p() && e('6'); // 返回项目集10下的未关闭产品的数量 \ No newline at end of file diff --git a/test/model/product/getpairsbyprojectmodel.php b/test/model/product/getpairsbyprojectmodel.php index 0c08e1a3dd..1b38504f98 100755 --- a/test/model/product/getpairsbyprojectmodel.php +++ b/test/model/product/getpairsbyprojectmodel.php @@ -9,6 +9,11 @@ title=productModel->getPairsByProjectModel(); cid=1 pid=1 +测试获取model为all产品数量 >> 120 +测试获取model为scrum产品数量 >> 70 +测试获取model为waterfall产品数量 >> 40 +测试获取model为kanban产品数量 >> 40 + */ $modelList = array('all', 'scrum', 'waterfall', 'kanban'); @@ -18,4 +23,4 @@ $product = new productTest('admin'); r($product->getPairsByProjectModelTest($modelList[0])) && p('name') && e('120'); // 测试获取model为all产品数量 r($product->getPairsByProjectModelTest($modelList[1])) && p('name') && e('70'); // 测试获取model为scrum产品数量 r($product->getPairsByProjectModelTest($modelList[2])) && p('name') && e('40'); // 测试获取model为waterfall产品数量 -r($product->getPairsByProjectModelTest($modelList[3])) && p('name') && e('40'); // 测试获取model为kanban产品数量 +r($product->getPairsByProjectModelTest($modelList[3])) && p('name') && e('40'); // 测试获取model为kanban产品数量 \ No newline at end of file diff --git a/test/model/product/getproductidbyproject.php b/test/model/product/getproductidbyproject.php index 8b9048d14a..2b51074e3b 100755 --- a/test/model/product/getproductidbyproject.php +++ b/test/model/product/getproductidbyproject.php @@ -9,6 +9,13 @@ title=productModel->getProductIDByProject(); cid=1 pid=1 +测试获取项目11的产品信息 >> 1 +测试获取项目12的产品信息 >> 2 +测试获取项目13的产品信息 >> 3 +测试获取项目14的产品信息 >> 4 +测试获取项目15的产品信息 >> 5 +测试获取不存在的项目的产品信息 >> 0 + */ $projectIDList = array('11', '12', '13', '14', '15', '1000001'); @@ -20,4 +27,4 @@ r($product->getProductIDByProjectTest($projectIDList[1])) && p() && e('2'); // r($product->getProductIDByProjectTest($projectIDList[2])) && p() && e('3'); // 测试获取项目13的产品信息 r($product->getProductIDByProjectTest($projectIDList[3])) && p() && e('4'); // 测试获取项目14的产品信息 r($product->getProductIDByProjectTest($projectIDList[4])) && p() && e('5'); // 测试获取项目15的产品信息 -r($product->getProductIDByProjectTest($projectIDList[5])) && p() && e('0'); // 测试获取不存在的项目的产品信息 +r($product->getProductIDByProjectTest($projectIDList[5])) && p() && e('0'); // 测试获取不存在的项目的产品信息 \ No newline at end of file diff --git a/test/model/product/getproductpairsbyproject.php b/test/model/product/getproductpairsbyproject.php index c16ef0528e..bd32d4e9eb 100755 --- a/test/model/product/getproductpairsbyproject.php +++ b/test/model/product/getproductpairsbyproject.php @@ -9,20 +9,19 @@ title=productModel->getProductPairsByProject(); cid=1 pid=1 -测试获取项目11 状态为all的产品信息 >> 正常产品1;多平台产品81;多平台产品91 -测试获取项目12 状态为all的产品信息 >> 正常产品2;多平台产品82;多平台产品92 -测试获取项目13 状态为all的产品信息 >> 正常产品3;多平台产品83;多平台产品93 -测试获取项目14 状态为all的产品信息 >> 正常产品4;多平台产品84;多平台产品94 -测试获取项目15 状态为all的产品信息 >> 正常产品5;多平台产品85;多平台产品95 -测试获取不存在的项目状态为all的产品信息 >> 0 -测试获取项目11 状态为unclosed的产品信息 >> 正常产品1;多平台产品81;多平台产品91 -测试获取项目12 状态为unclosed的产品信息 >> 正常产品2;多平台产品82;多平台产品92 -测试获取项目13 状态为unclosed的产品信息 >> 正常产品3;多平台产品83;多平台产品93 -测试获取项目14 状态为unclosed的产品信息 >> 正常产品4;多平台产品84;多平台产品94 -测试获取项目15 状态为unclosed的产品信息 >> 正常产品5;多平台产品85;多平台产品95 +测试获取项目11 状态为all的产品信息 >> 正常产品1;多平台产品81;多平台产品91 +测试获取项目12 状态为all的产品信息 >> 正常产品2;多平台产品82;多平台产品92 +测试获取项目13 状态为all的产品信息 >> 正常产品3;多平台产品83;多平台产品93 +测试获取项目14 状态为all的产品信息 >> 正常产品4;多平台产品84;多平台产品94 +测试获取项目15 状态为all的产品信息 >> 正常产品5;多平台产品85;多平台产品95 +测试获取不存在的项目状态为all的产品信息 >> 0 +测试获取项目11 状态为unclosed的产品信息 >> 正常产品1;多平台产品81;多平台产品91 +测试获取项目12 状态为unclosed的产品信息 >> 正常产品2;多平台产品82;多平台产品92 +测试获取项目13 状态为unclosed的产品信息 >> 正常产品3;多平台产品83;多平台产品93 +测试获取项目14 状态为unclosed的产品信息 >> 正常产品4;多平台产品84;多平台产品94 +测试获取项目15 状态为unclosed的产品信息 >> 正常产品5;多平台产品85;多平台产品95 测试获取不存在的项目状态为unclosed的产品信息 >> 0 - */ $projectIDList = array('11', '12', '13', '14', '15', '1000001'); @@ -41,5 +40,4 @@ r($product->getProductPairsByProjectTest($projectIDList[1], $statusList[1])) && r($product->getProductPairsByProjectTest($projectIDList[2], $statusList[1])) && p('3;83;93') && e('正常产品3;多平台产品83;多平台产品93'); // 测试获取项目13 状态为unclosed的产品信息 r($product->getProductPairsByProjectTest($projectIDList[3], $statusList[1])) && p('4;84;94') && e('正常产品4;多平台产品84;多平台产品94'); // 测试获取项目14 状态为unclosed的产品信息 r($product->getProductPairsByProjectTest($projectIDList[4], $statusList[1])) && p('5;85;95') && e('正常产品5;多平台产品85;多平台产品95'); // 测试获取项目15 状态为unclosed的产品信息 -r($product->getProductPairsByProjectTest($projectIDList[5], $statusList[1])) && p() && e('0'); // 测试获取不存在的项目状态为unclosed的产品信息 - +r($product->getProductPairsByProjectTest($projectIDList[5], $statusList[1])) && p() && e('0'); // 测试获取不存在的项目状态为unclosed的产品信息 \ No newline at end of file diff --git a/test/model/product/getproducts.php b/test/model/product/getproducts.php index ee1f53b4ca..ca1dcf9629 100755 --- a/test/model/product/getproducts.php +++ b/test/model/product/getproducts.php @@ -9,6 +9,19 @@ title=productModel->getProducts(); cid=1 pid=1 +测试获取项目11 状态为all的产品信息 >> 正常产品1;多平台产品81;多平台产品91 +测试获取项目12 状态为all的产品信息 >> 正常产品2;多平台产品82;多平台产品92 +测试获取项目13 状态为all的产品信息 >> 正常产品3;多平台产品83;多平台产品93 +测试获取项目14 状态为all的产品信息 >> 正常产品4;多平台产品84;多平台产品94 +测试获取项目15 状态为all的产品信息 >> 正常产品5;多平台产品85;多平台产品95 +测试获取不存在的项目状态为all的产品信息 >> 0 +测试获取项目11 状态为unclosed的产品信息 >> 正常产品1;多平台产品81;多平台产品91 +测试获取项目12 状态为unclosed的产品信息 >> 正常产品2;多平台产品82;多平台产品92 +测试获取项目13 状态为unclosed的产品信息 >> 正常产品3;多平台产品83;多平台产品93 +测试获取项目14 状态为unclosed的产品信息 >> 正常产品4;多平台产品84;多平台产品94 +测试获取项目15 状态为unclosed的产品信息 >> 正常产品5;多平台产品85;多平台产品95 +测试获取不存在的项目状态为unclosed的产品信息 >> 0 + */ $projectIDList = array('11', '12', '13', '14', '15', '1000001'); @@ -27,4 +40,4 @@ r($product->getProductsTest($projectIDList[1], $statusList[1])) && p('2:name;82: r($product->getProductsTest($projectIDList[2], $statusList[1])) && p('3:name;83:name;93:name') && e('正常产品3;多平台产品83;多平台产品93'); // 测试获取项目13 状态为unclosed的产品信息 r($product->getProductsTest($projectIDList[3], $statusList[1])) && p('4:name;84:name;94:name') && e('正常产品4;多平台产品84;多平台产品94'); // 测试获取项目14 状态为unclosed的产品信息 r($product->getProductsTest($projectIDList[4], $statusList[1])) && p('5:name;85:name;95:name') && e('正常产品5;多平台产品85;多平台产品95'); // 测试获取项目15 状态为unclosed的产品信息 -r($product->getProductsTest($projectIDList[5], $statusList[1])) && p() && e('0'); // 测试获取不存在的项目状态为unclosed的产品信息 +r($product->getProductsTest($projectIDList[5], $statusList[1])) && p() && e('0'); // 测试获取不存在的项目状态为unclosed的产品信息 \ No newline at end of file diff --git a/test/model/product/getprojectlistbyproduct.php b/test/model/product/getprojectlistbyproduct.php index 3b5266ac4f..8e2c81feba 100755 --- a/test/model/product/getprojectlistbyproduct.php +++ b/test/model/product/getprojectlistbyproduct.php @@ -21,4 +21,4 @@ $t_retion = array('1', '1', '10001'); r($product->getAllProjectsByProduct($t_retion[0])) && p('11:name') && e('项目1'); // 返回产品1关联的项目11名字 r($product->getAllProjectsByProduct($t_retion[1])) && p('21:name') && e('项目11'); // 返回产品1关联的项目21名字 -r($product->getAllProjectsByProduct($t_retion[2])) && p() && e('没有数据'); // 传入不存在的产品 +r($product->getAllProjectsByProduct($t_retion[2])) && p() && e('没有数据'); // 传入不存在的产品 \ No newline at end of file diff --git a/test/model/product/getprojectpairsbyproduct.php b/test/model/product/getprojectpairsbyproduct.php index edcd8abec4..3fa2381dbc 100755 --- a/test/model/product/getprojectpairsbyproduct.php +++ b/test/model/product/getprojectpairsbyproduct.php @@ -25,4 +25,4 @@ r($product->getProjectPairsByProductID($t_return[0])) && p('11') && e('项目1 r($product->getProjectPairsByProductID($t_return[0])) && p('21') && e('项目11'); // 返回产品1关联的项目21名字 r($product->getProjectPairsByProductID($t_return[1])) && p() && e('没有数据'); // 传入不存在的产品 r($product->getAppendProject($t_return[2])) && p('15') && e('项目5'); // 返回id为15的项目名 -r($product->getAppendProject($t_return[3])) && p() && e('没有数据'); // 传入不存在的项目id +r($product->getAppendProject($t_return[3])) && p() && e('没有数据'); // 传入不存在的项目id \ No newline at end of file diff --git a/test/model/product/getprojectstatsbyproduct.php b/test/model/product/getprojectstatsbyproduct.php index 58aca93d2e..d6b8b54621 100755 --- a/test/model/product/getprojectstatsbyproduct.php +++ b/test/model/product/getprojectstatsbyproduct.php @@ -9,6 +9,26 @@ title=productModel->getProjectStatsByProduct(); cid=1 pid=1 +测试获取产品1的 browseType为all的信息 >> 项目1;项目11 +测试获取产品1的 browseType为unclosed的信息 >> 0 +测试获取产品1的 browseType为unplan的信息 >> 0 +测试获取产品1的 browseType为allstory的信息 >> 0 +测试获取产品2的 browseType为all的信息 >> 项目2;项目12 +测试获取产品2的 browseType为assignedtome的信息 >> 0 +测试获取产品2的 browseType为openedbyme的信息 >> 0 +测试获取产品2的 browseType为reviewedbyme的信息 >> 0 +测试获取产品3的 browseType为all的信息 >> 项目3;项目13 +测试获取产品3的 browseType为reviewbyme的信息 >> 0 +测试获取产品3的 browseType为closedbyme的信息 >> 0 +测试获取产品3的 browseType为draftstory的信息 >> 0 +测试获取产品4的 browseType为all的信息 >> 项目4;项目14 +测试获取产品4的 browseType为activestory的信息 >> 0 +测试获取产品4的 browseType为changedstory的信息 >> 0 +测试获取产品5的 browseType为all的信息 >> 项目5;项目15 +测试获取产品5的 browseType为willclose的信息 >> 0 +测试获取产品5的 browseType为closedstory的信息 >> 0 +测试获取不存在产品的信息 >> 0 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -34,4 +54,4 @@ r($product->getProjectStatsByProductTest($productIDList[3], $browseType[10])) && r($product->getProjectStatsByProductTest($productIDList[4])) && p('15;25') && e('项目5;项目15'); // 测试获取产品5的 browseType为all的信息 r($product->getProjectStatsByProductTest($productIDList[4], $browseType[11])) && p() && e('0'); // 测试获取产品5的 browseType为willclose的信息 r($product->getProjectStatsByProductTest($productIDList[4], $browseType[12])) && p() && e('0'); // 测试获取产品5的 browseType为closedstory的信息 -r($product->getProjectStatsByProductTest($productIDList[5])) && p() && e('0'); // 测试获取不存在产品的信息 +r($product->getProjectStatsByProductTest($productIDList[5])) && p() && e('0'); // 测试获取不存在产品的信息 \ No newline at end of file diff --git a/test/model/product/getroadmap.php b/test/model/product/getroadmap.php index 4b00b19d3a..0b9a02c1ea 100755 --- a/test/model/product/getroadmap.php +++ b/test/model/product/getroadmap.php @@ -9,6 +9,13 @@ title=productModel->getRoadmap(); cid=1 pid=1 +测试获取产品1的roadmap数量 >> 4 +测试获取产品2的roadmap数量 >> 1 +测试获取产品3的roadmap数量 >> 0 +测试获取产品4的roadmap数量 >> 0 +测试获取产品5的roadmap数量 >> 0 +测试获取不存在产品的roadmap数量 >> 0 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -20,4 +27,4 @@ r($product->getRoadmapTest($productIDList[1])) && p('total') && e('1'); // 测 r($product->getRoadmapTest($productIDList[2])) && p('total') && e('0'); // 测试获取产品3的roadmap数量 r($product->getRoadmapTest($productIDList[3])) && p('total') && e('0'); // 测试获取产品4的roadmap数量 r($product->getRoadmapTest($productIDList[4])) && p('total') && e('0'); // 测试获取产品5的roadmap数量 -r($product->getRoadmapTest($productIDList[5])) && p('total') && e('0'); // 测试获取不存在产品的roadmap数量 +r($product->getRoadmapTest($productIDList[5])) && p('total') && e('0'); // 测试获取不存在产品的roadmap数量 \ No newline at end of file diff --git a/test/model/product/getstatbyid.php b/test/model/product/getstatbyid.php index 10982edbc7..9f176a8792 100755 --- a/test/model/product/getstatbyid.php +++ b/test/model/product/getstatbyid.php @@ -9,6 +9,13 @@ title=productModel->getStatByID(); cid=1 pid=1 +测试获取产品1的stat信息 >> 正常产品1,0,4,2,4,2,14,9,1,0 +测试获取产品2的stat信息 >> 正常产品2,0,1,2,4,2,14,4,1,0 +测试获取产品3的stat信息 >> 正常产品3,0,0,2,4,2,14,4,1,0 +测试获取产品4的stat信息 >> 正常产品4,0,0,2,4,2,14,4,1,0 +测试获取产品5的stat信息 >> 正常产品5,0,0,2,4,2,14,4,1,0 +测试获取不存在产品的stat信息 >> 0 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -20,4 +27,4 @@ r($product->getStatByIDTest($productIDList[1])) && p('name,plans,releases,builds r($product->getStatByIDTest($productIDList[2])) && p('name,plans,releases,builds,cases,projects,executions,bugs,docs,progress') && e('正常产品3,0,0,2,4,2,14,4,1,0'); // 测试获取产品3的stat信息 r($product->getStatByIDTest($productIDList[3])) && p('name,plans,releases,builds,cases,projects,executions,bugs,docs,progress') && e('正常产品4,0,0,2,4,2,14,4,1,0'); // 测试获取产品4的stat信息 r($product->getStatByIDTest($productIDList[4])) && p('name,plans,releases,builds,cases,projects,executions,bugs,docs,progress') && e('正常产品5,0,0,2,4,2,14,4,1,0'); // 测试获取产品5的stat信息 -r($product->getStatByIDTest($productIDList[5])) && p('name,plans,releases,builds,cases,projects,executions,bugs,docs,progress') && e('0'); // 测试获取不存在产品的stat信息 +r($product->getStatByIDTest($productIDList[5])) && p('name,plans,releases,builds,cases,projects,executions,bugs,docs,progress') && e('0'); // 测试获取不存在产品的stat信息 \ No newline at end of file diff --git a/test/model/product/getstats.php b/test/model/product/getstats.php index 93a7cbae44..1364642b3d 100755 --- a/test/model/product/getstats.php +++ b/test/model/product/getstats.php @@ -9,6 +9,15 @@ title=productModel->getStats(); cid=1 pid=1 +测试获取产品1的stats信息 >> 正常产品1,0,4,9,9,0,0,0,0,0 +测试获取产品101的stats信息 >> 产品正常产品1,0,0,0,0,0,0,0,0,0 +测试获取产品2的stats信息 >> 正常产品2,0,1,4,4,0,0,0,0,0 +测试获取产品102的stats信息 >> 产品正常产品2,0,0,0,0,0,0,0,0,0 +测试获取产品3的stats信息 >> 正常产品3,0,0,4,4,0,0,0,0,0 +测试获取产品103的stats信息 >> 产品正常产品3,0,0,0,0,0,0,0,0,0 +测试获取产品4的stats信息 >> 正常产品4,0,0,4,4,0,0,0,0,0 +测试获取产品104的stats信息 >> 产品正常产品4,0,0,0,0,0,0,0,0,0 + */ $product = new productTest('admin'); @@ -20,4 +29,4 @@ r($product->getStatsTest()) && p('3:name,plans,releases,bugs,unResolved,closedBu r($product->getStatsTest()) && p('4:name,plans,releases,bugs,unResolved,closedBugs,fixedBugs,thisWeekBugs,assignToNull,progress') && e('正常产品3,0,0,4,4,0,0,0,0,0'); // 测试获取产品3的stats信息 r($product->getStatsTest()) && p('5:name,plans,releases,bugs,unResolved,closedBugs,fixedBugs,thisWeekBugs,assignToNull,progress') && e('产品正常产品3,0,0,0,0,0,0,0,0,0'); // 测试获取产品103的stats信息 r($product->getStatsTest()) && p('6:name,plans,releases,bugs,unResolved,closedBugs,fixedBugs,thisWeekBugs,assignToNull,progress') && e('正常产品4,0,0,4,4,0,0,0,0,0'); // 测试获取产品4的stats信息 -r($product->getStatsTest()) && p('7:name,plans,releases,bugs,unResolved,closedBugs,fixedBugs,thisWeekBugs,assignToNull,progress') && e('产品正常产品4,0,0,0,0,0,0,0,0,0'); // 测试获取产品104的stats信息 +r($product->getStatsTest()) && p('7:name,plans,releases,bugs,unResolved,closedBugs,fixedBugs,thisWeekBugs,assignToNull,progress') && e('产品正常产品4,0,0,0,0,0,0,0,0,0'); // 测试获取产品104的stats信息 \ No newline at end of file diff --git a/test/model/product/getstats4kanban.php b/test/model/product/getstats4kanban.php index 9473caf8a8..9121e19f43 100755 --- a/test/model/product/getstats4kanban.php +++ b/test/model/product/getstats4kanban.php @@ -9,6 +9,16 @@ title=productModel->getStats4Kanban(); cid=1 pid=1 +测试获取产品的看板stats信息 >> 项目集1,项目集2,项目集3 +测试获取产品的看板stats信息 >> 正常产品1;正常产品2;正常产品3 +测试获取产品的看板stats信息 >> 项目3;项目4;项目5 +测试获取产品的看板stats信息 >> 迭代544;迭代546;迭代552 +测试获取产品的看板stats信息 >> 44.44,9;100,10 +测试获取产品的看板stats信息 >> 14 +测试获取产品的看板stats信息 >> 22 +测试获取产品的看板stats信息 >> 72 +测试获取产品的看板stats信息 >> 2 + */ $product = new productTest('admin'); @@ -23,5 +33,4 @@ r($product->getStats4KanbanTest($typeList[7])) && p('612:progress,totalRea r($product->getStats4KanbanTest($typeList[2], true)) && p() && e('14'); // 测试获取产品的看板stats信息 r($product->getStats4KanbanTest($typeList[4], true)) && p() && e('22'); // 测试获取产品的看板stats信息 r($product->getStats4KanbanTest($typeList[5], true)) && p() && e('72'); // 测试获取产品的看板stats信息 -r($product->getStats4KanbanTest($typeList[8], true)) && p() && e('2'); // 测试获取产品的看板stats信息 - +r($product->getStats4KanbanTest($typeList[8], true)) && p() && e('2'); // 测试获取产品的看板stats信息 \ No newline at end of file diff --git a/test/model/product/getstories.php b/test/model/product/getstories.php index 4fbbce7cc1..b4075fcae2 100755 --- a/test/model/product/getstories.php +++ b/test/model/product/getstories.php @@ -9,6 +9,31 @@ title=productModel->getStories(); cid=1 pid=1 +测试获取产品1 browseType为unclosed的需求数量 >> 2 +测试获取产品2 browseType为unclosed的需求数量 >> 2 +测试获取产品3 browseType为unclosed的需求数量 >> 2 +测试获取产品4 browseType为unclosed的需求数量 >> 2 +测试获取产品5 browseType为unclosed的需求数量 >> 2 +测试获取不存在的 browseType为unclosed的需求数量 >> 0 +测试获取产品1 browseType为unplan的需求数量 >> 0 +测试获取产品1 browseType为allstory的需求数量 >> 2 +测试获取产品1 browseType为assignedtome的需求数量 >> 0 +测试获取产品2 browseType为openedbyme的需求数量 >> 0 +测试获取产品2 browseType为reviewedbyme的需求数量 >> 1 +测试获取产品2 browseType为reviewbyme的需求数量 >> 0 +测试获取产品2 browseType为closedbyme的需求数量 >> 0 +测试获取产品3 browseType为draftstory的需求数量 >> 0 +测试获取产品3 browseType为activestory的需求数量 >> 2 +测试获取产品3 browseType为changedstory的需求数量 >> 0 +测试获取产品3 browseType为willclose的需求数量 >> 1 +测试获取产品4 browseType为closedstory的需求数量 >> 0 +测试获取产品4 browseType为unclosed的需求数量 >> 2 +测试获取产品4 browseType为unplan的需求数量 >> 0 +测试获取产品5 browseType为allstory的需求数量 >> 2 +测试获取产品5 browseType为assignedtome的需求数量 >> 0 +测试获取产品5 browseType为openedbyme的需求数量 >> 0 +测试获取不存在产品 browseType为reviewedbyme的需求数量 >> 0 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -42,4 +67,4 @@ r($product->getStoriesTest($productIDList[3], $branch, $browseType[1], $queryID, r($product->getStoriesTest($productIDList[4], $branch, $browseType[2], $queryID, $moduleID)) && p() && e('2'); // 测试获取产品5 browseType为allstory的需求数量 r($product->getStoriesTest($productIDList[4], $branch, $browseType[3], $queryID, $moduleID)) && p() && e('0'); // 测试获取产品5 browseType为assignedtome的需求数量 r($product->getStoriesTest($productIDList[4], $branch, $browseType[4], $queryID, $moduleID)) && p() && e('0'); // 测试获取产品5 browseType为openedbyme的需求数量 -r($product->getStoriesTest($productIDList[5], $branch, $browseType[5], $queryID, $moduleID)) && p() && e('0'); // 测试获取不存在产品 browseType为reviewedbyme的需求数量 +r($product->getStoriesTest($productIDList[5], $branch, $browseType[5], $queryID, $moduleID)) && p() && e('0'); // 测试获取不存在产品 browseType为reviewedbyme的需求数量 \ No newline at end of file diff --git a/test/model/product/getteammemberpairs.php b/test/model/product/getteammemberpairs.php index 2a460045ae..b3f996ba21 100755 --- a/test/model/product/getteammemberpairs.php +++ b/test/model/product/getteammemberpairs.php @@ -9,6 +9,12 @@ title=productModel->getTeamMemberPairs(); cid=1 pid=1 +测试获取产品1的信息 >> po1,test1,dev1,0,1,2,3 +测试获取产品2的信息 >> po2,test2,dev2,0,1,2,3 +测试获取产品3的信息 >> po3,test3,dev3,0,1,2,3 +测试获取产品4的信息 >> po4,test4,dev4,0,1,2,3 +测试获取产品5的信息 >> po5,test5,dev5,0,1,2,3 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); @@ -19,4 +25,4 @@ r($product->getTeamMemberPairsTest($productIDList[0])) && p('po1,test1,dev1,admi r($product->getTeamMemberPairsTest($productIDList[1])) && p('po2,test2,dev2,pm93,user3,po3,user13') && e('po2,test2,dev2,0,1,2,3'); // 测试获取产品2的信息 r($product->getTeamMemberPairsTest($productIDList[2])) && p('po3,test3,dev3,pm94,user4,po4,user14') && e('po3,test3,dev3,0,1,2,3'); // 测试获取产品3的信息 r($product->getTeamMemberPairsTest($productIDList[3])) && p('po4,test4,dev4,pm95,user5,po5,user15') && e('po4,test4,dev4,0,1,2,3'); // 测试获取产品4的信息 -r($product->getTeamMemberPairsTest($productIDList[4])) && p('po5,test5,dev5,pm96,user6,po6,user16') && e('po5,test5,dev5,0,1,2,3'); // 测试获取产品5的信息 +r($product->getTeamMemberPairsTest($productIDList[4])) && p('po5,test5,dev5,pm96,user6,po6,user16') && e('po5,test5,dev5,0,1,2,3'); // 测试获取产品5的信息 \ No newline at end of file diff --git a/test/model/product/isclickable.php b/test/model/product/isclickable.php index e8b1b70cf5..afd798c650 100755 --- a/test/model/product/isclickable.php +++ b/test/model/product/isclickable.php @@ -25,4 +25,4 @@ $t_status = array('2', '75', 'close', 'start'); r($product->testIsClickable($t_status[0], $t_status[2])) && p() && e('true'); // status为normal,action为close r($product->testIsClickable($t_status[1], $t_status[2])) && p() && e('false'); // status为close,action为close r($product->testIsClickable($t_status[0], $t_status[3])) && p() && e('true'); // status为normal,action为start -r($product->testIsClickable($t_status[1], $t_status[3])) && p() && e('true'); // status为close,action为start +r($product->testIsClickable($t_status[1], $t_status[3])) && p() && e('true'); // status为close,action为start \ No newline at end of file diff --git a/test/model/product/manageline.php b/test/model/product/manageline.php index d2679d2fda..7c88edfdb8 100755 --- a/test/model/product/manageline.php +++ b/test/model/product/manageline.php @@ -9,6 +9,10 @@ title=productModel->manageLine(); cid=1 pid=1 +测试修改产品线名称 >> 产品线2 +测试修改所属项目集 >> 1 +测试创建新的产品线 >> 产品线21 + */ $product = new productTest('admin'); @@ -25,7 +29,6 @@ $modules = array(0 => '产品线21', 1 => ''); $programs = array(0 => '1', 1 => '1'); $lines3 = array('modules' => $modules, 'programs' => $programs); - $modules = array(0 => ''); $programs = array(0 => '1'); $lines4 = array('modules' => $modules, 'programs' => $programs); @@ -34,4 +37,4 @@ r($product->manageLineTest($lines1, 2)) && p('name') && e('产品线2'); // 测 r($product->manageLineTest($lines2, 1)) && p('root') && e('1'); // 测试修改所属项目集 r($product->manageLineTest($lines3)) && p('name') && e('产品线21'); // 测试创建新的产品线 r($product->manageLineTest($lines4)) && p() && e(''); // 测试创建没有项目集的产品线 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/product/processroadmap.php b/test/model/product/processroadmap.php index f7f7d8b41e..77abcbe545 100755 --- a/test/model/product/processroadmap.php +++ b/test/model/product/processroadmap.php @@ -9,13 +9,20 @@ title=productModel->processRoadmap(); cid=1 pid=1 +测试获取产品1下的发布roadmap >> 产品1正常的发布1;产品1正常的发布3;产品1正常的里程碑发布5;产品1停止维护的里程碑发布6 +测试获取产品2下的发布roadmap >> 产品2发布!@#$$%^&*()测试发布的名称到底可以有多长asdlfkjla8 +测试获取产品3下的发布roadmap >> 0 +测试获取产品4下的发布roadmap >> 0 +测试获取产品5下的发布roadmap >> 0 +测试获取不存在产品下的发布roadmap >> 0 + */ $productIDList = array('1', '2', '3', '4', '5', '1000001'); $product = new productTest('admin'); r($product->processRoadmapTest($productIDList[0])) && p('0:name;1:name;2:name;3:name') && e('产品1正常的发布1;产品1正常的发布3;产品1正常的里程碑发布5;产品1停止维护的里程碑发布6'); // 测试获取产品1下的发布roadmap -r($product->processRoadmapTest($productIDList[1])) && p('0:name') && e('产品2发布!@#$$$%^&*()测试发布的名称到底可以有多长asdlfkjla8'); // 测试获取产品2下的发布roadmap +r($product->processRoadmapTest($productIDList[1])) && p('0:name') && e('产品2发布!@#$$%^&*()测试发布的名称到底可以有多长asdlfkjla8'); // 测试获取产品2下的发布roadmap r($product->processRoadmapTest($productIDList[2])) && p() && e('0'); // 测试获取产品3下的发布roadmap r($product->processRoadmapTest($productIDList[3])) && p() && e('0'); // 测试获取产品4下的发布roadmap r($product->processRoadmapTest($productIDList[4])) && p() && e('0'); // 测试获取产品5下的发布roadmap diff --git a/test/model/product/statisticdata.php b/test/model/product/statisticdata.php index bb90f7740b..93fbfd4832 100755 --- a/test/model/product/statisticdata.php +++ b/test/model/product/statisticdata.php @@ -9,6 +9,16 @@ title=productModel->statisticData(); cid=1 pid=1 +测试获取统计数据集中产品2的信息 >> 项目集1,2,2,2,2,4,0,0,1 +测试获取统计数据集中产品3的信息 >> 项目集2,2,2,2,2,4,0,0,0 +测试获取统计数据集中产品4的信息 >> 项目集3,2,2,2,2,4,0,0,0 +测试获取统计数据集中产品5的信息 >> 项目集4,2,2,2,2,4,0,0,0 +测试获取统计数据集中产品6的信息 >> 项目集5,2,0,2,1,4,0,0,0 +测试获取统计数据集中产品7的信息 >> 项目集6,2,0,2,1,4,0,0,0 +测试获取统计数据集中产品8的信息 >> 项目集7,2,0,2,1,4,0,0,0 +测试获取统计数据集中产品9的信息 >> 项目集8,2,0,2,1,4,0,1,0 +测试获取统计数据集中产品10的信息 >> 项目集9,2,0,2,1,4,0,3,0 + */ $product = new productTest('admin'); @@ -23,4 +33,4 @@ r($product->statisticDataTest($productStats[10])) && p('programName,totalRequir r($product->statisticDataTest($productStats[12])) && p('programName,totalRequirements,activeRequirements,totalStories,activeStories,unResolvedBugs,closedBugs,plans,releases') && e('项目集6,2,0,2,1,4,0,0,0'); // 测试获取统计数据集中产品7的信息 r($product->statisticDataTest($productStats[14])) && p('programName,totalRequirements,activeRequirements,totalStories,activeStories,unResolvedBugs,closedBugs,plans,releases') && e('项目集7,2,0,2,1,4,0,0,0'); // 测试获取统计数据集中产品8的信息 r($product->statisticDataTest($productStats[16])) && p('programName,totalRequirements,activeRequirements,totalStories,activeStories,unResolvedBugs,closedBugs,plans,releases') && e('项目集8,2,0,2,1,4,0,1,0'); // 测试获取统计数据集中产品9的信息 -r($product->statisticDataTest($productStats[18])) && p('programName,totalRequirements,activeRequirements,totalStories,activeStories,unResolvedBugs,closedBugs,plans,releases') && e('项目集9,2,0,2,1,4,0,3,0'); // 测试获取统计数据集中产品10的信息 +r($product->statisticDataTest($productStats[18])) && p('programName,totalRequirements,activeRequirements,totalStories,activeStories,unResolvedBugs,closedBugs,plans,releases') && e('项目集9,2,0,2,1,4,0,3,0'); // 测试获取统计数据集中产品10的信息 \ No newline at end of file diff --git a/test/model/product/statisticprogram.php b/test/model/product/statisticprogram.php index 07eeb54c67..66cc50f1a8 100755 --- a/test/model/product/statisticprogram.php +++ b/test/model/product/statisticprogram.php @@ -9,6 +9,23 @@ title=productModel->statisticProgram(); cid=1 pid=1 +测试获取统计数据集中产品1的stats信息 >> 正常产品1,0,4,9 +测试获取统计数据集中产品12的stats信息 >> 正常产品12,0,0,3 +测试获取统计数据集中产品45的stats信息 >> 多分支产品45,2,0,3 +测试获取统计数据集中产品89的stats信息 >> 多平台产品89,0,0,3 +测试获取统计数据集中产品100的stats信息 >> 多平台产品100,0,0,3 +测试获取统计数据集中产品2的stats信息 >> 正常产品2,0,1,4 +测试获取统计数据集中产品13的stats信息 >> 正常产品13,0,0,3 +测试获取统计数据集中产品46的stats信息 >> 多分支产品46,2,0,3 +测试获取统计数据集中产品90的stats信息 >> 多平台产品90,0,0,3 +测试获取统计数据集中产品3的stats信息 >> 正常产品3,0,0,4 +测试获取统计数据集中产品4的stats信息 >> 正常产品4,0,0,4 +测试获取统计数据集中产品5的stats信息 >> 正常产品5,0,0,4 +测试获取统计数据集中产品6的stats信息 >> 正常产品6,0,0,4 +测试获取统计数据集中产品7的stats信息 >> 正常产品7,0,0,4 +测试获取统计数据集中产品8的stats信息 >> 正常产品8,0,0,4 +测试获取统计数据集中产品9的stats信息 >> 正常产品9,1,0,4 + */ $product = new productTest('admin'); @@ -30,4 +47,4 @@ r($product->statisticProgramTest($productStats, '4')) && p('5:name,plans,release r($product->statisticProgramTest($productStats, '5')) && p('6:name,plans,releases,bugs') && e('正常产品6,0,0,4'); // 测试获取统计数据集中产品6的stats信息 r($product->statisticProgramTest($productStats, '6')) && p('7:name,plans,releases,bugs') && e('正常产品7,0,0,4'); // 测试获取统计数据集中产品7的stats信息 r($product->statisticProgramTest($productStats, '7')) && p('8:name,plans,releases,bugs') && e('正常产品8,0,0,4'); // 测试获取统计数据集中产品8的stats信息 -r($product->statisticProgramTest($productStats, '8')) && p('9:name,plans,releases,bugs') && e('正常产品9,1,0,4'); // 测试获取统计数据集中产品9的stats信息 +r($product->statisticProgramTest($productStats, '8')) && p('9:name,plans,releases,bugs') && e('正常产品9,1,0,4'); // 测试获取统计数据集中产品9的stats信息 \ No newline at end of file diff --git a/test/model/product/update.php b/test/model/product/update.php index de15988cf6..b05ec1f565 100755 --- a/test/model/product/update.php +++ b/test/model/product/update.php @@ -36,4 +36,4 @@ r($product->updateObject('product', 2, $t_unname)) && p() && e(' r($product->updateObject('product', 2, $t_unid)) && p() && e('没有数据更新'); // 测试不更改产品代号 r($product->updateObject('product', 13, $t_repeaproduct)) && p('name:0') && e('『产品名称』已经有『jack』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); // 测试同一项目集下产品名称不能重复 r($product->updateObject('product', 13, $t_repeatid)) && p('code:0') && e('『产品代号』已经有『newcode2』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。'); // 测试同一项目集下产品代号不能重复 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file diff --git a/test/model/product/updateprojects.php b/test/model/product/updateprojects.php index e68682421d..b3baf23091 100755 --- a/test/model/product/updateprojects.php +++ b/test/model/product/updateprojects.php @@ -9,6 +9,12 @@ title=测试productModel->updateProjects(); cid=1 pid=1 +测试更新产品101的项目信息 >> 731,1,,1,731, +测试更新产品102的项目信息 >> 0 +测试更新产品103的项目信息 >> 0 +测试更新产品111的项目信息 >> 733,1,,1,733,;734,1,,1,734,;735,1,,1,735,;736,1,,1,736,;737,1,,1,737, +测试更新产品112的项目信息 >> 738,1,,1,738,;739,1,,1,739,;740,1,,1,740,;741,1,,1,741,;742,1,,1,742, + */ $productIDList = array('101', '102', '103', '111', '112'); @@ -19,4 +25,4 @@ r($product->updateProjectsTest($productIDList[1])) && p('0:id,parent,path') r($product->updateProjectsTest($productIDList[2])) && p('0:id,parent,path') && e('0'); // 测试更新产品103的项目信息 r($product->updateProjectsTest($productIDList[3])) && p('0:id,parent,path;1:id,parent,path;2:id,parent,path;3:id,parent,path;4:id,parent,path') && e('733,1,,1,733,;734,1,,1,734,;735,1,,1,735,;736,1,,1,736,;737,1,,1,737,'); // 测试更新产品111的项目信息 r($product->updateProjectsTest($productIDList[4])) && p('0:id,parent,path;1:id,parent,path;2:id,parent,path;3:id,parent,path;4:id,parent,path') && e('738,1,,1,738,;739,1,,1,739,;740,1,,1,740,;741,1,,1,741,;742,1,,1,742,'); // 测试更新产品112的项目信息 -system("./ztest init"); +system("./ztest init"); \ No newline at end of file From 5b1c7675de7f771b38484130d2afe6ba2b245f18 Mon Sep 17 00:00:00 2001 From: tianshujie Date: Tue, 19 Apr 2022 11:03:08 +0800 Subject: [PATCH 41/42] * Delete extra Spaces. --- module/bug/control.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index f36b02d202..92f7ba569d 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -570,7 +570,7 @@ class bug extends control if($projectID) { - $project = $this->loadModel('project')->getByID($projectID); + $project = $this->loadModel('project')->getByID($projectID); if(empty($bugID) or $this->app->tab != 'qa') $projects = array($projectID => $project->name); } } @@ -580,7 +580,7 @@ class bug extends control $productList = $this->config->CRProduct ? $this->product->getOrderedProducts('all', 40, $projectID) : $this->product->getOrderedProducts('normal', 40, $projectID); foreach($productList as $product) $products[$product->id] = $product->name; - $project = $this->loadModel('project')->getByID($projectID); + $project = $this->loadModel('project')->getByID($projectID); if(empty($bugID) or $this->app->tab != 'qa') $projects += array($projectID => $project->name); /* Set project menu. */ From 0eb4023b74cf4ced91f3d4a894bebb8e8930dcf4 Mon Sep 17 00:00:00 2001 From: xieqiyu Date: Tue, 19 Apr 2022 11:25:05 +0800 Subject: [PATCH 42/42] * Fix bug#13863. --- module/block/view/todoblock.html.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/module/block/view/todoblock.html.php b/module/block/view/todoblock.html.php index 2c55aa2355..070cea49f2 100644 --- a/module/block/view/todoblock.html.php +++ b/module/block/view/todoblock.html.php @@ -83,7 +83,7 @@ if(!$selfCall) die(include('./todolist.html.php'));
    - save, "onclick='ajaxCreateTodo(this)'", "btn btn-primary btn-wide");?> + save, "onclick='ajaxCreateTodo(this)'", "btn btn-primary btn-wide commitButton");?>
    @@ -182,6 +182,9 @@ if(!$selfCall) die(include('./todolist.html.php')); setTimeout('clearError()', 2000) return false; } + + $('.commitButton').addClass('disabled'); + $.ajax( { type: "POST",