From 7bb8a64638a04ef583837c22db3216f9a8bd8779 Mon Sep 17 00:00:00 2001 From: wangzemei Date: Mon, 11 Jul 2022 06:04:07 +0000 Subject: [PATCH 1/5] * Fix bug #25041 --- www/js/zui/kanban/min.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/js/zui/kanban/min.js b/www/js/zui/kanban/min.js index 01aac76240..1816ecb40d 100644 --- a/www/js/zui/kanban/min.js +++ b/www/js/zui/kanban/min.js @@ -1,7 +1,7 @@ /*! - * ZUI: ZUI kanban - v1.10.0 - 2022-07-06 + * ZUI: ZUI kanban - v1.10.0 - 2022-07-11 * http://openzui.com * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2022 cnezsoft.com; Licensed MIT */ -!function(){"use strict";function e(e,a){return n&&!a?requestAnimationFrame(e):setTimeout(e,a||0)}function a(e){return n?cancelAnimationFrame(e):void clearTimeout(e)}var n="function"==typeof window.requestAnimationFrame;$.zui({asap:e,clearAsap:a})}(),function(e){"use strict";function a(a,n){"string"==typeof a&&(a=e(a)),a instanceof e&&(a=a[0]);var t=a.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;if(n)return t.left>=0&&t.top>=0&&t.left+t.width<=i&&t.top+t.height<=r;var o=t.top<=r&&t.top+t.height>=0,d=t.left<=i&&t.left+t.width>=0;return o&&d}var n="zui.virtualRender",t=function(a,r){"function"==typeof r&&(r={render:r});var i=this;i.name=n,i.$=e(a),i.options=r=e.extend({trigger:"scroll resize"},t.DEFAULTS,this.$.data(),r),i.rendered=!1;var o=r.container;"function"==typeof o&&(o=o(i));var d=e(o?o:window);i.tryRender()||(i.$container=d,i.scrollListener=i.tryRender.bind(i),r.pendingClass&&i.$.addClass(r.pendingClass),d.on(r.trigger,i.scrollListener))};t.prototype.tryRender=function(){var n=this;return!(n.rendered||!a(n.$))&&(n.renderTaskID&&e.zui.clearAsap(n.renderTaskID),n.renderTaskID=e.zui.asap(function(){n.renderTaskID=null;var e=n.options.render(n.$);e!==!1&&(n.rendered=!0,n.destroy())},n.options.delay),!0)},t.prototype.destroy=function(){var a=this;a.renderTaskID&&e.zui.clearAsap(a.renderTaskID),a.scrollListener&&(a.$container.off(a.options.trigger,a.scrollListener),a.scrollListener=null);var t=a.options.pendingClass;t&&a.$.removeClass(t),a.$.removeData(n)},t.DEFAULTS={pendingClass:"virtual-pending"},e.fn.virtualRender=function(a){return this.each(function(){var r=e(this),i=r.data(n);if(i){if("string"==typeof a)return i[a]();i.destroy()}r.data(n,i=new t(this,a))})},e.zui.isElementInViewport=a}(jQuery),function(e){"use strict";var a="zui.virtuallist",n=function(t,r){"function"==typeof r&&(r={render:r});var i=this;i.name=a,i.$=e(t),i.options=r=e.extend({},n.DEFAULTS,this.$.data(),r),i.scrollTop=this.options.scrollTop||0,i.render(r.list,r.scrollTop);var o=0;i.$.on("scroll."+a,function(){if(i.$.data("ignore-next-scroll"))return i.$.data("ignore-next-scroll",!1);if(!i.rendering){var a=i.$.scrollTop();a!==i.scrollTop&&(i.scrollTop=a,o&&e.zui.clearAsap(o),o=e.zui.asap(function(){o=0,i.render()}))}}),i.$.on("resize."+a,function(){i.rendering||(o&&e.zui.clearAsap(o),o=e.zui.asap(function(){o=0,i.render()}))})};n.prototype.render=function(a,n){var t=this;a?t.list=a:a=t.list,n&&e.extend(this.options,n),t.rendering=!0;var r=t.scrollTop,i=t.$,o=t.options.itemClassName,d=t.options.itemHeight,s=t.options.countPerRow,l=Number.parseFloat(i.css("padding-top"),10),c=Array.isArray(a),u="number"==typeof a?a:a.length,h=i.outerHeight(),p="virtual-list-item-expired",b=i.children(".virtual-list-holder-top"),v=i.children(".virtual-list-holder-bottom");b.length||(b=e('
').prependTo(i)),v.length||(v=e('
').appendTo(i)),i.children("."+o).addClass(p).addClass("hidden");var f=Math.max(0,s*Math.floor((r-l)/d-1)),m=Math.min(u-1,1+s*Math.ceil((r-l+h)/d)),g=Math.ceil(f/s)*d,k=Math.ceil((u-m-1)/s)*d;b.height(g);for(var C=f;C<=m;C++){var x=t.options.render(C,a,c?a[C]:null);x.addClass(o).removeClass(p).removeClass("hidden")}return v.height(k),i.children("."+p).remove(),b.prependTo(i),v.appendTo(i),t.scrollHeight=t.$[0].scrollHeight,t.rendering=!1,r=Math.min(t.scrollHeight-h,Math.max(g,r)),t.scrollTop=r,r!==t.$.scrollTop()&&t.$.data("ignore-next-scroll",!0).scrollTop(r),!0},n.prototype.destroy=function(){that.$.off("."+a)},n.DEFAULTS={itemClassName:"virtual-list-item",countPerRow:1},e.fn.virtualList=function(t){return this.each(function(){var r=e(this),i=r.data(a);if(i){if("string"==typeof t)return i[t]();i.destroy()}r.data(a,i=new n(this,t))})}}(jQuery),function(e){"use strict";var a="zui.kanban",n="object"==typeof CSS&&CSS.supports("display","flex"),t=function(n,r){var i=this;if(i.name=a,i.$=e(n).addClass("kanban"),r=i.setOptions(e.extend({},t.DEFAULTS,this.$.data(),r)),r.onAction){var o=function(a){var n=e(this);r.onAction(n.data("action"),n,a,i)};i.$.on("click",".action",o).on("dblclick",".action-dbc",o)}var d=r.droppable;if("auto"===d&&(d=!r.readonly),d){var s=r.sortable;"function"==typeof s?s={finish:s}:s&&"object"!=typeof s&&(s={});var l=0;"function"==typeof d?d={drop:d}:"object"!=typeof d&&(d={});var c=e.extend({dropOnMouseleave:!0,selector:".kanban-item",target:".kanban-lane-col:not(.kanban-col-sorting)",mouseButton:"left"},d,{before:function(a){if(d.before){var n=d.before(a);if(n===!1)return n}if(s){var t=a.element.closest(".kanban-lane-items");t.closest(".kanban-col").addClass("kanban-col-sorting"),i._sortResult=null,i._$sortItems=t;var r=t.data("zui.sortable");r||t.sortable(e.extend({},s,{selector:".kanban-item",trigger:".kanban-card",dragCssClass:"kanban-item-sorting",noShadow:!0,finish:function(e){e.changed&&e.list.length>1&&(i._sortResult=e)}})).triggerHandler(a.event)}},drop:function(e){d.drop&&d.drop(e),r.onAction&&r.onAction("dropItem",e.element,e,i)},start:function(a){i.$.addClass("kanban-dragging"),l&&clearTimeout(l),l=setTimeout(function(){e(a.shadowElement).addClass("in"),l=0},50),d.start&&d.start(a)},always:function(e){if(i.$.removeClass("kanban-dragging"),l&&(clearTimeout(l),l=0),s){var a=i._sortResult;i._$sortItems.sortable("destroy").closest(".kanban-col").removeClass("kanban-col-sorting"),a&&s.finish&&a.target&&a.target.closest(".kanban-lane-col")[0]===e.target[0]&&s.finish(i._sortResult)}d.always&&d.always(e)}});i.$.droppable(c)}r.onCreate&&r.onCreate(i)};t.prototype.setOptions=function(a){var t=this,r=e.extend({},t.options,{data:t.data},a);t.options=r,r.useFlex&&!n&&(r.useFlex=!1),t.$.toggleClass("no-flex",!r.useFlex).toggleClass("use-flex",!!r.useFlex);var i=!!e.fn.virtualRender&&r.virtualize;return i&&("object"!=typeof i&&(i={lane:!0}),t.virtualize=e.extend({},i)),t.data=r.data||[],t.render(t.data),r},t.prototype.render=function(a){var n=this;a&&(n.data=a),n.data&&!Array.isArray(n.data)&&(n.data=[n.data]);var t,r=n.options,i=n.data||[];r.fixScroll&&(t=e(window).scrollTop(),e(window).height()+t===document.body.scrollHeight&&(t="bottom")),r.beforeRender&&r.beforeRender(n,i),n.$.toggleClass("kanban-readonly",!!r.readonly).toggleClass("kanban-no-lane-name",!!r.noLaneName),n.$.children(".kanban-board").addClass("kanban-expired"),n.maxKanbanBoardWidth=0;for(var o=0;o1&&n.$.children(".kanban-board").css("min-width",n.maxKanbanBoardWidth),t&&e(window).scrollTop("bottom"===t?document.body.scrollHeight:t),r.onRender&&r.onRender(n)},t.prototype.layoutKanban=function(e,a){for(var n=this,t=n.options,r=t.noLaneName?0:t.laneNameWidth,i=0,o={},d=!1,s=[],l=0;l0&&t.subLaneSpace&&(g.$height+=t.subLaneSpace)}}else for(var y=g.items||g.cards||{},C=0;C-1){var r=n.data[t];a=e.extend(r,a),n.data[t]=a}else n.data.push(a)}a.id||(a.id=e.zui.uuid());var i=a.id,o=n.options,d=n.$,s=d.children('.kanban-board[data-id="'+i+'"]');s.length?s.removeClass("kanban-expired"):s=e('
').appendTo(d),n.layoutKanban(a,s),n.renderKanbanHeader(a,s),s.children(".kanban-lane").addClass("kanban-expired");for(var l=a.lanes||[],c=null,u=0;u
').prependTo(n),r.useFlex||o.addClass("clearfix")),o.css("height",(i?2:1)*r.headerHeight).toggleClass("kanban-header-has-parent",!!i);var d=o.children(".kanban-cols");d.css("left",a.$layout.laneNameWidth).children(".kanban-col").addClass("kanban-expired");for(var s=a.columns,l=a.$layout.columnsMap||{},c=null,u=null,h=0;h.kanban-col").addClass("kanban-expired"):d=e(['
','
','
','','',o.showCount?'':"","
","
",'
',"
","
"].join("")),s&&s.length?s.after(d):n.prepend(d),d.data("col",a).attr("data-type",a.type);var l=r.$layout.columnWidth;o.useFlex&&a.subs?d.css("flex",(a.subs.length||0)+" "+(a.subs.length||0)+" "+l*(a.subs.length||0)+"%"):d.css({width:l*(a.subs.length||0)+"%",left:a.$index*l+"%"});var c=d.children(".kanban-header-col");c.find(".title>.icon").attr("class","icon icon-"+(a.icon||""));var u=c.find(".title>.text").text(a.name).attr("title",a.name);if(a.color&&u.css("color",a.color),o.showCount){var h=void 0!==a.count?a.count:a.$cardsCount||0;o.showZeroCount||h||(h="");var p=c.find(".title>.count").text(h);o.onRenderCount&&o.onRenderCount(p,h,a,i)}o.onRenderHeaderCol&&o.onRenderHeaderCol(d,a,n,r)},t.prototype.renderHeaderCol=function(a,n,t,r,i){var o=this,d=o.options;if(a.parentType&&t){var s=n.children('.kanban-header-parent-col[data-id="'+t.id+'"]');n=s.children(".kanban-header-sub-cols")}var l=n.children('.kanban-header-col[data-id="'+a.id+'"]'),c=r?n.children('.kanban-header-col[data-id="'+r.id+'"]:not(.kanban-expired)'):null;l.length?l.removeClass("kanban-expired"):l=e(['
','
','','',d.showCount?'':"","
",'
',"
"].join("")),c&&c.length?c.after(l):n.prepend(l),l.data("col",a).attr("data-type",a.type);var u=t&&t.subs&&t.subs.length?100/t.subs.length:i.$layout.columnWidth;d.useFlex?l.css("flex","1 1 "+u+"%"):l.css({left:(t?a.$subIndex:a.$index)*u+"%",width:u+"%"}),l.find(".title>.icon").attr("class","icon icon-"+(a.icon||""));var h=l.find(".title>.text").text(a.name).attr("title",a.name);if(a.color&&h.css("color",a.color),d.showCount){var p=void 0!==a.count?a.count:a.$cardsCount||0;d.showZeroCount||p||(p="");var b=l.find(".title>.count").text(p);d.onRenderCount&&d.onRenderCount(b,p,a,o)}d.onRenderHeaderCol&&d.onRenderHeaderCol(l,a,n,i)},t.prototype.renderLane=function(a,t,r,i,o){var d=this,s=d.options;i=i||d.$.children('.kanban-board[data-id="'+a.kanban+'"]');var l=i.children('.kanban-lane[data-id="'+a.id+'"]'),c=t?i.children('.kanban-lane[data-id="'+t.id+'"]:not(.kanban-expired)'):null;l.length?l.removeClass("kanban-expired"):(l=e('
'),n||l.addClass("clearfix")),c&&c.length?c.after(l):i.children(".kanban-header").after(l);var u=a.subLanes?a.subLanes.length:0;l.attr("data-index",a.$index).data("lane",a).toggleClass("has-sub-lane",u>0).css({height:a.$height||"auto"}),d.virtualizeRender(o,"lane",l,function(){if(!s.noLaneName){var n=l.children('.kanban-lane-name[data-id="'+a.id+'"]');n.length||(n=e('
').prependTo(l)),n.empty().css("width",s.laneNameWidth).attr("title",a.name).append(e('').text(a.name)),a.color&&n.css("background-color",a.color),s.onRenderLaneName&&s.onRenderLaneName(n,a,i,r,o)}l.children(".kanban-cols,.kanban-sub-lanes").addClass("kanban-expired");var t;t=a.subLanes?d.renderSubLanes(a,r,l,o):d.renderLaneCols(r,a.items||a.cards||{},l,a,o),s.useFlex||t.css("left",o.$layout.laneNameWidth),l.children(".kanban-expired").remove()},{lane:a,columns:r,kanban:o})},t.prototype.virtualizeRender=function(a,n,t,r,i){var o=this,d=o.virtualize,s=d?d[n]:null;return s?("function"==typeof s&&(s=s(i,t)),"number"==typeof s&&t.height(s),void t.virtualRender(e.extend({render:r},o.options.virtualRenderOptions))):r()},t.prototype.renderSubLanes=function(a,n,t,r){var i=this,o=t.children(".kanban-sub-lanes");o.length?o.removeClass("kanban-expired"):o=e('
').appendTo(t),o.children(".kanban-sub-lane").addClass("kanban-expired");for(var d=0;d
').appendTo(r),n||d.addClass("clearfix")),d.attr("data-index",o).data("lane",a).css({height:a.$height||"auto"}),d.children(".kanban-col").addClass("kanban-expired");var s=a.items||a.cards;s&&this.renderLaneCols(t,s,d,a,i),d.children(".kanban-expired").remove()},t.prototype.renderLaneCols=function(a,n,t,r,i){var o=this,d=t.children(".kanban-cols");d.length?d.removeClass("kanban-expired"):d=e('
').appendTo(t),d.children(".kanban-col").addClass("kanban-expired");for(var s=null,l=0;l0?n[a-1]:null;return o.$index=a,o.$col=e,o.$lane=t,i.renderCard(o,d,s,e,t,r)}})}else{d.children(".kanban-item").addClass("kanban-expired");for(var c=0;c0?a[c-1]:null;u.$index=c,u.$col=e,u.$lane=t,i.renderCard(u,d,h,e,t,r)}d.children(".kanban-expired").remove()}d.css("padding",o.cardSpace/2).toggleClass("kanban-items-grid",s>1).attr("data-cards-per-row",s).data("cards",a)},t.prototype.renderLaneCol=function(a,n,t){var r=this,i=r.options,o=n.children('.kanban-lane-col[data-id="'+a.id+'"]'),d=t?n.children('.kanban-lane-col[data-id="'+t.id+'"]:not(.kanban-expired)'):null;o.length?o.removeClass("kanban-expired"):(o=e(['
','
',"
"].join("")),r.options.readonly||o.append(['
','","
"].join("")),i.laneItemsClass&&o.find(".kanban-lane-items").addClass(i.laneItemsClass),i.laneColClass&&o.addClass(i.laneColClass)),d&&d.length?d.after(o):n.prepend(o),o.attr({"data-parent":a.parentType?a.parentType:null,"data-type":a.type}).data("col",a);var s=a.$kanbanData.$layout.columnWidth;return i.useFlex?o.css("flex","1 1 "+s+"%"):o.css({left:a.$index*s+"%",width:s+"%"}),o},t.prototype.renderCard=function(a,n,t,r,i,o){var d=this.options,s=n.children('.kanban-item[data-id="'+a.id+'"]'),l=t?n.children('.kanban-item[data-id="'+t.id+'"]:not(.kanban-expired)'):null;s.length?s.removeClass("kanban-expired"):(s=e('
'),d.wrapCard&&s.append('
')),l&&l.length?l.after(s):n.prepend(s);var c=r.cardsPerRow||i.cardsPerRow||o.cardsPerRow||d.cardsPerRow;s.data("item",a).css({padding:d.cardSpace/2,width:c>1?100/c+"%":""});var u=d.wrapCard?s.children(".kanban-card"):s;u.css("height",d.cardHeight);var h=d.cardRender||d.itemRender;if(h)h(a,u,r,i,o);else{var p=u.find(".title");p.length||(p=e('
').appendTo(u)),p.text(a.name||a.title)}return s},t.DEFAULTS={minColWidth:100,maxColHeight:400,minColHeight:90,minSubColHeight:40,subLaneSpace:2,laneNameWidth:20,fixScroll:!0,headerHeight:32,cardHeight:40,cardSpace:10,cardsPerRow:1,wrapCard:!0,fluidBoardWidth:!0,addItemText:"添加条目",useFlex:!0,droppable:"auto",laneColClass:"",showCount:!0},e.fn.kanban=function(n){return this.each(function(){var r=e(this),i=r.data(a),o="object"==typeof n&&n;i||r.data(a,i=new t(this,o)),"string"==typeof n&&i[n]()})},t.NAME=a,e.fn.kanban.Constructor=t}(jQuery); \ No newline at end of file +!function(){"use strict";function e(e,a){return n&&!a?requestAnimationFrame(e):setTimeout(e,a||0)}function a(e){return n?cancelAnimationFrame(e):void clearTimeout(e)}var n="function"==typeof window.requestAnimationFrame;$.zui({asap:e,clearAsap:a})}(),function(e){"use strict";function a(a,n){"string"==typeof a&&(a=e(a)),a instanceof e&&(a=a[0]);var t=a.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,i=window.innerWidth||document.documentElement.clientWidth;if(n)return t.left>=0&&t.top>=0&&t.left+t.width<=i&&t.top+t.height<=r;var o=t.top<=r&&t.top+t.height>=0,d=t.left<=i&&t.left+t.width>=0;return o&&d}var n="zui.virtualRender",t=function(a,r){"function"==typeof r&&(r={render:r});var i=this;i.name=n,i.$=e(a),i.options=r=e.extend({trigger:"scroll resize"},t.DEFAULTS,this.$.data(),r),i.rendered=!1;var o=r.container;"function"==typeof o&&(o=o(i));var d=e(o?o:window);i.tryRender()||(i.$container=d,i.scrollListener=i.tryRender.bind(i),r.pendingClass&&i.$.addClass(r.pendingClass),d.on(r.trigger,i.scrollListener))};t.prototype.tryRender=function(){var n=this;return!(n.rendered||!a(n.$))&&(n.renderTaskID&&e.zui.clearAsap(n.renderTaskID),n.renderTaskID=e.zui.asap(function(){n.renderTaskID=null;var e=n.options.render(n.$);e!==!1&&(n.rendered=!0,n.destroy())},n.options.delay),!0)},t.prototype.destroy=function(){var a=this;a.renderTaskID&&e.zui.clearAsap(a.renderTaskID),a.scrollListener&&(a.$container.off(a.options.trigger,a.scrollListener),a.scrollListener=null);var t=a.options.pendingClass;t&&a.$.removeClass(t),a.$.removeData(n)},t.DEFAULTS={pendingClass:"virtual-pending"},e.fn.virtualRender=function(a){return this.each(function(){var r=e(this),i=r.data(n);if(i){if("string"==typeof a)return i[a]();i.destroy()}r.data(n,i=new t(this,a))})},e.zui.isElementInViewport=a}(jQuery),function(e){"use strict";var a="zui.virtuallist",n=function(t,r){"function"==typeof r&&(r={render:r});var i=this;i.name=a,i.$=e(t),i.options=r=e.extend({},n.DEFAULTS,this.$.data(),r),i.scrollTop=this.options.scrollTop||0,i.render(r.list,r.scrollTop);var o=0;i.$.on("scroll."+a,function(){if(i.$.data("ignore-next-scroll"))return i.$.data("ignore-next-scroll",!1);if(!i.rendering){var a=i.$.scrollTop();a!==i.scrollTop&&(i.scrollTop=a,o&&e.zui.clearAsap(o),o=e.zui.asap(function(){o=0,i.render()}))}}),i.$.on("resize."+a,function(){i.rendering||(o&&e.zui.clearAsap(o),o=e.zui.asap(function(){o=0,i.render()}))})};n.prototype.render=function(a,n){var t=this;a?t.list=a:a=t.list,n&&e.extend(this.options,n),t.rendering=!0;var r=t.scrollTop,i=t.$,o=t.options.itemClassName,d=t.options.itemHeight,s=t.options.countPerRow,l=Number.parseFloat(i.css("padding-top"),10),c=Array.isArray(a),u="number"==typeof a?a:a.length,h=i.outerHeight(),p="virtual-list-item-expired",b=i.children(".virtual-list-holder-top"),v=i.children(".virtual-list-holder-bottom");b.length||(b=e('
').prependTo(i)),v.length||(v=e('
').appendTo(i)),i.children("."+o).addClass(p).addClass("hidden");var f=Math.max(0,s*Math.floor((r-l)/d-1)),m=Math.min(u-1,1+s*Math.ceil((r-l+h)/d)),g=Math.ceil(f/s)*d,k=Math.ceil((u-m-1)/s)*d;b.height(g);for(var C=f;C<=m;C++){var x=t.options.render(C,a,c?a[C]:null);x.addClass(o).removeClass(p).removeClass("hidden")}return v.height(k),i.children("."+p).remove(),b.prependTo(i),v.appendTo(i),t.scrollHeight=t.$[0].scrollHeight,t.rendering=!1,r=Math.min(t.scrollHeight-h,Math.max(g,r)),t.scrollTop=r,r!==t.$.scrollTop()&&t.$.data("ignore-next-scroll",!0).scrollTop(r),!0},n.prototype.destroy=function(){that.$.off("."+a)},n.DEFAULTS={itemClassName:"virtual-list-item",countPerRow:1},e.fn.virtualList=function(t){return this.each(function(){var r=e(this),i=r.data(a);if(i){if("string"==typeof t)return i[t]();i.destroy()}r.data(a,i=new n(this,t))})}}(jQuery),function(e){"use strict";var a="zui.kanban",n="object"==typeof CSS&&CSS.supports("display","flex"),t=function(n,r){var i=this;if(i.name=a,i.$=e(n).addClass("kanban"),r=i.setOptions(e.extend({},t.DEFAULTS,this.$.data(),r)),r.onAction){var o=function(a){var n=e(this);r.onAction(n.data("action"),n,a,i)};i.$.on("click",".action",o).on("dblclick",".action-dbc",o)}var d=r.droppable;if("auto"===d&&(d=!r.readonly),d){var s=r.sortable;"function"==typeof s?s={finish:s}:s&&"object"!=typeof s&&(s={});var l=0;"function"==typeof d?d={drop:d}:"object"!=typeof d&&(d={});var c=e.extend({dropOnMouseleave:!0,selector:".kanban-item",target:".kanban-lane-col:not(.kanban-col-sorting)",mouseButton:"left"},d,{before:function(a){if(d.before){var n=d.before(a);if(n===!1)return n}if(s){var t=a.element.closest(".kanban-lane-items");t.closest(".kanban-col").addClass("kanban-col-sorting"),i._sortResult=null,i._$sortItems=t;var r=t.data("zui.sortable");r||t.sortable(e.extend({},s,{selector:".kanban-item",trigger:".kanban-card",dragCssClass:"kanban-item-sorting",noShadow:!0,finish:function(e){e.changed&&e.list.length>1&&(i._sortResult=e)}})).triggerHandler(a.event)}},drop:function(e){d.drop&&d.drop(e),r.onAction&&r.onAction("dropItem",e.element,e,i)},start:function(a){i.$.addClass("kanban-dragging"),l&&clearTimeout(l),l=setTimeout(function(){e(a.shadowElement).addClass("in"),l=0},50),d.start&&d.start(a)},always:function(e){if(i.$.removeClass("kanban-dragging"),l&&(clearTimeout(l),l=0),s){var a=i._sortResult;i._$sortItems.sortable("destroy").closest(".kanban-col").removeClass("kanban-col-sorting"),a&&s.finish&&a.target&&a.target.closest(".kanban-lane-col")[0]===e.target[0]&&s.finish(i._sortResult)}d.always&&d.always(e)}});i.$.droppable(c)}r.onCreate&&r.onCreate(i)};t.prototype.setOptions=function(a){var t=this,r=e.extend({},t.options,{data:t.data},a);t.options=r,r.useFlex&&!n&&(r.useFlex=!1),t.$.toggleClass("no-flex",!r.useFlex).toggleClass("use-flex",!!r.useFlex);var i=!!e.fn.virtualRender&&r.virtualize;return i&&("object"!=typeof i&&(i={lane:!0}),t.virtualize=e.extend({},i)),t.data=r.data||[],t.render(t.data),r},t.prototype.render=function(a){var n=this;a&&(n.data=a),n.data&&!Array.isArray(n.data)&&(n.data=[n.data]);var t,r=n.options,i=n.data||[];r.fixScroll&&(t=e(window).scrollTop(),e(window).height()+t===document.body.scrollHeight&&(t="bottom")),r.beforeRender&&r.beforeRender(n,i),n.$.toggleClass("kanban-readonly",!!r.readonly).toggleClass("kanban-no-lane-name",!!r.noLaneName),n.$.children(".kanban-board").addClass("kanban-expired"),n.maxKanbanBoardWidth=0;for(var o=0;o1&&n.$.children(".kanban-board").css("min-width",n.maxKanbanBoardWidth),t&&e(window).scrollTop("bottom"===t?document.body.scrollHeight:t),r.onRender&&r.onRender(n)},t.prototype.layoutKanban=function(e,a){for(var n=this,t=n.options,r=t.noLaneName?0:t.laneNameWidth,i=0,o={},d=!1,s=[],l=0;l0&&t.subLaneSpace&&(g.$height+=t.subLaneSpace)}}else for(var y=g.items||g.cards||{},C=0;C-1){var r=n.data[t];a=e.extend(r,a),n.data[t]=a}else n.data.push(a)}a.id||(a.id=e.zui.uuid());var i=a.id,o=n.options,d=n.$,s=d.children('.kanban-board[data-id="'+i+'"]');s.length?s.removeClass("kanban-expired"):s=e('
').appendTo(d),n.layoutKanban(a,s),n.renderKanbanHeader(a,s),s.children(".kanban-lane").addClass("kanban-expired");for(var l=a.lanes||[],c=null,u=0;u
').prependTo(n),r.useFlex||o.addClass("clearfix")),o.css("height",(i?2:1)*r.headerHeight).toggleClass("kanban-header-has-parent",!!i);var d=o.children(".kanban-cols");d.css("left",a.$layout.laneNameWidth).children(".kanban-col").addClass("kanban-expired");for(var s=a.columns,l=a.$layout.columnsMap||{},c=null,u=null,h=0;h.kanban-col").addClass("kanban-expired"):d=e(['
','
','
','','',o.showCount?'':"","
","
",'
',"
","
"].join("")),s&&s.length?s.after(d):n.prepend(d),d.data("col",a).attr("data-type",a.type);var l=r.$layout.columnWidth;o.useFlex&&a.subs?d.css("flex",(a.subs.length||0)+" "+(a.subs.length||0)+" "+l*(a.subs.length||0)+"%"):d.css({width:l*(a.subs.length||0)+"%",left:a.$index*l+"%"});var c=d.children(".kanban-header-col");c.find(".title>.icon").attr("class","icon icon-"+(a.icon||""));var u=c.find(".title>.text").text(a.name).attr("title",a.name);if(a.color&&u.css("color",a.color),o.showCount){var h=void 0!==a.count?a.count:a.$cardsCount||0;o.showZeroCount||h||(h="");var p=c.find(".title>.count").text(h);o.onRenderCount&&o.onRenderCount(p,h,a,i)}o.onRenderHeaderCol&&o.onRenderHeaderCol(d,a,n,r)},t.prototype.renderHeaderCol=function(a,n,t,r,i){var o=this,d=o.options,s=a.parentType&&t;if(s){var l=n.children('.kanban-header-parent-col[data-id="'+t.id+'"]');n=l.children(".kanban-header-sub-cols")}var c=n.children('.kanban-header-col[data-id="'+a.id+'"]'),u=r?n.children('.kanban-header-col[data-id="'+r.id+'"]:not(.kanban-expired)'):null;!s&&c.length&&c.hasClass("kanban-header-parent-col")&&(c.remove(),c.length=0),c.length?c.removeClass("kanban-expired"):c=e(['
','
','','',d.showCount?'':"","
",'
',"
"].join("")),u&&u.length?u.after(c):n.prepend(c),c.data("col",a).attr("data-type",a.type);var h=t&&t.subs&&t.subs.length?100/t.subs.length:i.$layout.columnWidth;d.useFlex?c.css("flex","1 1 "+h+"%"):c.css({left:(t?a.$subIndex:a.$index)*h+"%",width:h+"%"}),c.find(".title>.icon").attr("class","icon icon-"+(a.icon||""));var p=c.find(".title>.text").text(a.name).attr("title",a.name);if(a.color&&p.css("color",a.color),d.showCount){var b=void 0!==a.count?a.count:a.$cardsCount||0;d.showZeroCount||b||(b="");var v=c.find(".title>.count").text(b);d.onRenderCount&&d.onRenderCount(v,b,a,o)}d.onRenderHeaderCol&&d.onRenderHeaderCol(c,a,n,i)},t.prototype.renderLane=function(a,t,r,i,o){var d=this,s=d.options;i=i||d.$.children('.kanban-board[data-id="'+a.kanban+'"]');var l=i.children('.kanban-lane[data-id="'+a.id+'"]'),c=t?i.children('.kanban-lane[data-id="'+t.id+'"]:not(.kanban-expired)'):null;l.length?l.removeClass("kanban-expired"):(l=e('
'),n||l.addClass("clearfix")),c&&c.length?c.after(l):i.children(".kanban-header").after(l);var u=a.subLanes?a.subLanes.length:0;l.attr("data-index",a.$index).data("lane",a).toggleClass("has-sub-lane",u>0).css({height:a.$height||"auto"}),d.virtualizeRender(o,"lane",l,function(){if(!s.noLaneName){var n=l.children('.kanban-lane-name[data-id="'+a.id+'"]');n.length||(n=e('
').prependTo(l)),n.empty().css("width",s.laneNameWidth).attr("title",a.name).append(e('').text(a.name)),a.color&&n.css("background-color",a.color),s.onRenderLaneName&&s.onRenderLaneName(n,a,i,r,o)}l.children(".kanban-cols,.kanban-sub-lanes").addClass("kanban-expired");var t;t=a.subLanes?d.renderSubLanes(a,r,l,o):d.renderLaneCols(r,a.items||a.cards||{},l,a,o),s.useFlex||t.css("left",o.$layout.laneNameWidth),l.children(".kanban-expired").remove()},{lane:a,columns:r,kanban:o})},t.prototype.virtualizeRender=function(a,n,t,r,i){var o=this,d=o.virtualize,s=d?d[n]:null;return s?("function"==typeof s&&(s=s(i,t)),"number"==typeof s&&t.height(s),void t.virtualRender(e.extend({render:r},o.options.virtualRenderOptions))):r()},t.prototype.renderSubLanes=function(a,n,t,r){var i=this,o=t.children(".kanban-sub-lanes");o.length?o.removeClass("kanban-expired"):o=e('
').appendTo(t),o.children(".kanban-sub-lane").addClass("kanban-expired");for(var d=0;d
').appendTo(r),n||d.addClass("clearfix")),d.attr("data-index",o).data("lane",a).css({height:a.$height||"auto"}),d.children(".kanban-col").addClass("kanban-expired");var s=a.items||a.cards;s&&this.renderLaneCols(t,s,d,a,i),d.children(".kanban-expired").remove()},t.prototype.renderLaneCols=function(a,n,t,r,i){var o=this,d=t.children(".kanban-cols");d.length?d.removeClass("kanban-expired"):d=e('
').appendTo(t),d.children(".kanban-col").addClass("kanban-expired");for(var s=null,l=0;l0?n[a-1]:null;return o.$index=a,o.$col=e,o.$lane=t,i.renderCard(o,d,s,e,t,r)}})}else{d.children(".kanban-item").addClass("kanban-expired");for(var c=0;c0?a[c-1]:null;u.$index=c,u.$col=e,u.$lane=t,i.renderCard(u,d,h,e,t,r)}d.children(".kanban-expired").remove()}d.css("padding",o.cardSpace/2).toggleClass("kanban-items-grid",s>1).attr("data-cards-per-row",s).data("cards",a)},t.prototype.renderLaneCol=function(a,n,t){var r=this,i=r.options,o=n.children('.kanban-lane-col[data-id="'+a.id+'"]'),d=t?n.children('.kanban-lane-col[data-id="'+t.id+'"]:not(.kanban-expired)'):null;o.length?o.removeClass("kanban-expired"):(o=e(['
','
',"
"].join("")),r.options.readonly||o.append(['
','","
"].join("")),i.laneItemsClass&&o.find(".kanban-lane-items").addClass(i.laneItemsClass),i.laneColClass&&o.addClass(i.laneColClass)),d&&d.length?d.after(o):n.prepend(o),o.attr({"data-parent":a.parentType?a.parentType:null,"data-type":a.type}).data("col",a);var s=a.$kanbanData.$layout.columnWidth;return i.useFlex?o.css("flex","1 1 "+s+"%"):o.css({left:a.$index*s+"%",width:s+"%"}),o},t.prototype.renderCard=function(a,n,t,r,i,o){var d=this.options,s=n.children('.kanban-item[data-id="'+a.id+'"]'),l=t?n.children('.kanban-item[data-id="'+t.id+'"]:not(.kanban-expired)'):null;s.length?s.removeClass("kanban-expired"):(s=e('
'),d.wrapCard&&s.append('
')),l&&l.length?l.after(s):n.prepend(s);var c=r.cardsPerRow||i.cardsPerRow||o.cardsPerRow||d.cardsPerRow;s.data("item",a).css({padding:d.cardSpace/2,width:c>1?100/c+"%":""});var u=d.wrapCard?s.children(".kanban-card"):s;u.css("height",d.cardHeight);var h=d.cardRender||d.itemRender;if(h)h(a,u,r,i,o);else{var p=u.find(".title");p.length||(p=e('
').appendTo(u)),p.text(a.name||a.title)}return s},t.DEFAULTS={minColWidth:100,maxColHeight:400,minColHeight:90,minSubColHeight:40,subLaneSpace:2,laneNameWidth:20,fixScroll:!0,headerHeight:32,cardHeight:40,cardSpace:10,cardsPerRow:1,wrapCard:!0,fluidBoardWidth:!0,addItemText:"添加条目",useFlex:!0,droppable:"auto",laneColClass:"",showCount:!0},e.fn.kanban=function(n){return this.each(function(){var r=e(this),i=r.data(a),o="object"==typeof n&&n;i||r.data(a,i=new t(this,o)),"string"==typeof n&&i[n]()})},t.NAME=a,e.fn.kanban.Constructor=t}(jQuery); \ No newline at end of file From e5ffd04c34b14409199c6c720dff569d462f9548 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Tue, 12 Jul 2022 09:45:31 +0800 Subject: [PATCH 2/5] * Finish task #60565,60566. --- module/gitlab/control.php | 461 ++++--------------- module/gitlab/js/managebranchpriv.js | 72 +++ module/gitlab/js/managetagpriv.js | 72 +++ module/gitlab/lang/de.php | 9 +- module/gitlab/lang/en.php | 9 +- module/gitlab/lang/fr.php | 9 +- module/gitlab/lang/vi.php | 9 +- module/gitlab/lang/zh-cn.php | 9 +- module/gitlab/model.php | 156 +++---- module/gitlab/view/browsebranchpriv.html.php | 81 ---- module/gitlab/view/browseproject.html.php | 4 +- module/gitlab/view/browsetagpriv.html.php | 82 ---- module/gitlab/view/createbranchpriv.html.php | 47 -- module/gitlab/view/createtagpriv.html.php | 43 -- module/gitlab/view/edittagpriv.html.php | 44 -- module/gitlab/view/managebranchpriv.html.php | 82 ++++ module/gitlab/view/managetagpriv.html.php | 76 +++ module/group/lang/resource.php | 18 +- 18 files changed, 485 insertions(+), 798 deletions(-) create mode 100644 module/gitlab/js/managebranchpriv.js create mode 100644 module/gitlab/js/managetagpriv.js delete mode 100644 module/gitlab/view/browsebranchpriv.html.php delete mode 100644 module/gitlab/view/browsetagpriv.html.php delete mode 100644 module/gitlab/view/createbranchpriv.html.php delete mode 100644 module/gitlab/view/createtagpriv.html.php delete mode 100644 module/gitlab/view/edittagpriv.html.php create mode 100644 module/gitlab/view/managebranchpriv.html.php create mode 100644 module/gitlab/view/managetagpriv.html.php diff --git a/module/gitlab/control.php b/module/gitlab/control.php index 5c8074064a..0f3d774d41 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -911,176 +911,6 @@ class gitlab extends control $this->display(); } - /** - * Browse gitlab protect branch. - * - * @param int $gitlabID - * @param int $projectID - * @param string $orderBy - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID - * @access public - * @return void - */ - public function browseBranchPriv($gitlabID, $projectID, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 15, $pageID = 1) - { - $project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); - - if(!$this->app->user->admin) - { - $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); - if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); - if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); - } - - $keyword = fixer::input('post')->setDefault('keyword', '')->get('keyword'); - $branches = $this->gitlab->apiGetBranchPrivs($gitlabID, $projectID, $keyword, $orderBy); - - /* Pager. */ - $this->app->loadClass('pager', $static = true); - $recTotal = count($branches); - $pager = new pager($recTotal, $recPerPage, $pageID); - $branchList = array_chunk($branches, $pager->recPerPage); - - $this->view->keyword = $keyword; - $this->view->pager = $pager; - $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseBranchPriv; - $this->view->levelLang = $this->lang->gitlab->branch->branchCreationLevelList; - $this->view->gitlabID = $gitlabID; - $this->view->projectID = $projectID; - $this->view->project = $project; - $this->view->orderBy = $orderBy; - $this->view->branchList = empty($branchList) ? $branchList: $branchList[$pageID - 1]; - $this->display(); - } - - /** - * Set a gitlab protect branch. - * - * @param int $gitlabID - * @param int $projectID - * @param string $branch - * @access public - * @return void - */ - public function createBranchPriv($gitlabID, $projectID, $branch = '') - { - if(!$this->app->user->admin) - { - $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); - if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); - - $project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); - if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); - } - - /* Fix error when request type is PATH_INFO and the branch name contains '-'.*/ - if($branch) $branch = urldecode(helper::safe64Decode($branch)); - - if($_POST) - { - $this->gitlab->createBranchPriv($gitlabID, $projectID, $branch); - - if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browseBranchPriv', "gitlabID=$gitlabID&projectID=$projectID"))); - } - - $branchPriv = new stdClass(); - $branchPriv->name = ''; - $branchPriv->mergeAccessLevel = 40; // Initialize data, and the operation authority is the maintainers by default. - $branchPriv->pushAccessLevel = 40; // Initialize data, and the operation authority is the maintainers by default. - - $title = $this->lang->gitlab->createBranchPriv; - - if($branch) - { - $title = $this->lang->gitlab->editBranchPriv; - $branchPriv = $this->gitlab->apiGetSingleBranchPriv($gitlabID, $projectID, $branch); - $branchPriv->name = helper::safe64Encode(urlencode($branchPriv->name)); - $branchPriv->mergeAccessLevel = $this->gitlab->checkAccessLevel($branchPriv->merge_access_levels); - $branchPriv->pushAccessLevel = $this->gitlab->checkAccessLevel($branchPriv->push_access_levels); - } - - $gitlabBranches = $this->gitlab->apiGetBranches($gitlabID, $projectID); - $protectBranches = $this->gitlab->apiGetBranchPrivs($gitlabID, $projectID, '', 'name_asc'); - $protectNames = array_keys($protectBranches); - - $branches = array(); - foreach($gitlabBranches as $oneBranch) - { - if(!in_array($oneBranch->name, $protectNames) || $oneBranch->name == $branch) - { - $branchName = helper::safe64Encode(urlencode($oneBranch->name)); - $branches[$branchName] = $oneBranch->name; - } - } - - $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $title; - $this->view->pageTitle = $title; - $this->view->gitlabID = $gitlabID; - $this->view->branch = $branch; - $this->view->projectID = $projectID; - $this->view->branches = $branches; - $this->view->branchPriv = $branchPriv; - $this->display(); - } - - /** - * Edit a gitlab branch protect. - * - * @param int $gitlabID - * @param int $projectID - * @param string $branch - * @access public - * @return void - */ - public function editBranchPriv($gitlabID, $projectID, $branch) - { - echo $this->fetch('gitlab', 'createBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branch"); - } - - /** - * Delete a gitlab protect branch. - * - * @param int $gitlabID - * @param int $projectID - * @param string $branch - * @param string $confirm - * @access public - * @return void - */ - public function deleteBranchPriv($gitlabID, $projectID, $branch, $confirm = 'no') - { - if(!$this->app->user->admin) - { - $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); - if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); - - $project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); - if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); - } - - if($confirm != 'yes') - { - $branch = urlencode($branch); - return print(js::confirm($this->lang->gitlab->branch->confirmDelete , inlink('deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branch&confirm=yes"))); - } - - /* Fix error when request type is PATH_INFO and the branch name contains '-'.*/ - $branch = urldecode(helper::safe64Decode($branch)); - $reponse = $this->gitlab->apiDeleteBranchPriv($gitlabID, $projectID, $branch); - - /* If the status code beginning with 20 is returned or empty is returned, it is successful. */ - if(!$reponse or substr($reponse->message, 0, 2) == '20') - { - $this->loadModel('action')->create('gitlabbranchPriv', $branch, 'deleted', '', $branch); - return print(js::reload('parent')); - } - - echo js::alert($reponse->message); - } - /** * Browse gitlab tag. * @@ -1135,206 +965,6 @@ class gitlab extends control $this->display(); } - /** - * Browse gitlab protect tag. - * - * @param int $gitlabID - * @param int $projectID - * @param string $orderBy - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID - * @access public - * @return void - */ - public function browseTagPriv($gitlabID, $projectID, $orderBy = 'name_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) - { - $project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); - - if(!$this->app->user->admin) - { - $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); - if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); - - if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); - } - - $this->session->set('gitlabTagPrivList', $this->app->getURI(true)); - $keyword = fixer::input('post')->setDefault('keyword', '')->get('keyword'); - - $gitlabTags = array(); - $allTags = $this->gitlab->apiGetTags($gitlabID, $projectID); - foreach($allTags as $tag) - { - $gitlabTags[$tag->name] = $tag; - } - - $tagList = array(); - $gitlabProtectTags = $this->gitlab->apiGetTagPrivs($gitlabID, $projectID); - foreach($gitlabProtectTags as $gitlabProtectTag) - { - $tag = new stdClass(); - $tag->name = $gitlabProtectTag->name; - $tag->lastCommitter = isset($gitlabTags[$tag->name]) ? $gitlabTags[$tag->name]->commit->committer_name : ''; - $tag->accessLevels = $gitlabProtectTag->create_access_levels; - - $tagList[] = $tag; - } - - /* Data search. */ - if($keyword) - { - foreach($tagList as $key => $tag) - { - if(strpos($tag->name, $keyword) === false) unset($tagList[$key]); - } - $tagList = array_values($tagList); - } - - /* Data sort. */ - list($order, $sort) = explode('_', $orderBy); - $orderList = array(); - foreach($tagList as $tag) $orderList[] = $tag->$order; - array_multisort($orderList, $sort == 'desc' ? SORT_DESC : SORT_ASC, $tagList); - - /* Pager. */ - $this->app->loadClass('pager', $static = true); - $recTotal = count($tagList); - $pager = new pager($recTotal, $recPerPage, $pageID); - $tagList = array_chunk($tagList, $pager->recPerPage); - - $this->view->gitlab = $this->gitlab->getByID($gitlabID); - $this->view->pager = $pager; - $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseTagPriv; - $this->view->gitlabID = $gitlabID; - $this->view->projectID = $projectID; - $this->view->keyword = $keyword; - $this->view->project = $project; - $this->view->gitlabTagList = empty($tagList) ? $tagList: $tagList[$pageID - 1]; - $this->view->orderBy = $orderBy; - $this->display(); - } - - /** - * Set a gitlab protect tag. - * - * @param int $gitlabID - * @param int $projectID - * @access public - * @return void - */ - public function createTagPriv($gitlabID, $projectID) - { - if(!$this->app->user->admin) - { - $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); - if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); - - $project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); - if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); - } - - if($_POST) - { - $this->gitlab->createTagPriv($gitlabID, $projectID); - - if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browseTagPriv', "gitlabID=$gitlabID&projectID=$projectID"))); - } - - $gitlabTags = $this->gitlab->apiGetTags($gitlabID, $projectID); - $protectTags = $this->gitlab->apiGetTagPrivs($gitlabID, $projectID, '', 'name_asc'); - $protectNames = array_keys($protectTags); - - $tags = array(); - foreach($gitlabTags as $tag) - { - if(!in_array($tag->name, $protectNames)) $tags[$tag->name] = $tag->name; - } - - $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->createTagPriv; - $this->view->gitlabID = $gitlabID; - $this->view->projectID = $projectID; - $this->view->tags = $tags; - $this->display(); - } - - /** - * Edit a gitlab protect tag. - * - * @param int $gitlabID - * @param int $projectID - * @param string $tag - * @access public - * @return void - */ - public function editTagPriv($gitlabID, $projectID, $tag = '') - { - if(!$this->app->user->admin) - { - $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); - if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); - - $project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); - if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); - } - - /* Fix error when request type is PATH_INFO and the tag name contains '-'.*/ - $tag = urldecode(helper::safe64Decode($tag)); - - if($_POST) - { - $this->gitlab->createTagPriv($gitlabID, $projectID, $tag); - - if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browseTagPriv', "gitlabID=$gitlabID&projectID=$projectID"))); - } - - $tagPriv = $this->gitlab->apiGetSingleTagPriv($gitlabID, $projectID, $tag); - $tagPriv->createAccessLevel = $this->gitlab->checkAccessLevel($tagPriv->create_access_levels); - - $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->editTagPriv; - $this->view->gitlabID = $gitlabID; - $this->view->projectID = $projectID; - $this->view->tagPriv = $tagPriv; - $this->view->tag = $tag; - $this->display(); - } - - /** - * Delete a gitlab protect tag. - * - * @param int $gitlabID - * @param int $projectID - * @param string $tag - * @access public - * @return void - */ - public function deleteTagPriv($gitlabID, $projectID, $tag) - { - if(!$this->app->user->admin) - { - $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); - if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); - - $project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID); - if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); - } - - /* Fix error when request type is PATH_INFO and the tag name contains '-'.*/ - $tag = urldecode(helper::safe64Decode($tag)); - $reponse = $this->gitlab->apiDeleteTagPriv($gitlabID, $projectID, $tag); - - /* If the status code beginning with 20 is returned or empty is returned, it is successful. */ - if(!$reponse or substr($reponse->message, 0, 2) == '20') - { - $this->loadModel('action')->create('gitlabtagpriv', 0, 'deleted', '', $tag); - return print(js::reload('parent')); - } - - echo js::alert($reponse->message); - } - /** * Import gitlab issue to zentaopms. * @@ -1746,4 +1376,95 @@ class gitlab extends control echo js::alert($reponse->message); } + + /** + * Manage a gitlab branch protected. + * + * @param int $repoID + * @param int $projectID + * @access public + * @return void + */ + public function manageBranchPriv($gitlabID, $projectID) + { + if(!$this->app->user->admin) + { + $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); + if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); + if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); + } + + $hasAccessBranches = $this->gitlab->apiGetBranchPrivs($gitlabID, $projectID, '', 'name_asc'); + foreach($hasAccessBranches as $branch) + { + $branch->pushAccess = $this->gitlab->checkAccessLevel($branch->push_access_levels); + $branch->mergeAccess = $this->gitlab->checkAccessLevel($branch->merge_access_levels); + } + + if(!empty($_POST)) + { + $result = $this->gitlab->manageBranchPrivs($gitlabID, $projectID, $hasAccessBranches); + if(!empty($result)) return $this->send(array('result' => 'fail', 'message' => sprintf($this->lang->gitlab->svaeFailed, implode(', ', $result)))); + + return $this->send(array('message' => $this->lang->saveSuccess, 'result' => 'success', 'locate' => inlink('browseProject', "gitlabID=$gitlabID"))); + } + $allBranches = $this->gitlab->apiGetBranches($gitlabID, $projectID); + $noAccessBranches = array(); + foreach($allBranches as $branch) + { + if(!isset($hasAccessBranches[$branch->name])) $noAccessBranches[$branch->name] = $branch->name; + } + + $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseBranchPriv; + $this->view->gitlabID = $gitlabID; + $this->view->projectID = $projectID; + $this->view->hasAccessBranches = $hasAccessBranches; + $this->view->noAccessBranches = $noAccessBranches; + $this->display(); + } + + /** + * Manage a gitlab tag protected. + * + * @param int $repoID + * @param int $projectID + * @access public + * @return void + */ + public function manageTagPriv($gitlabID, $projectID) + { + if(!$this->app->user->admin) + { + $openID = $this->gitlab->getUserIDByZentaoAccount($gitlabID, $this->app->user->account); + if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); + if(!$this->gitlab->checkUserAccess($gitlabID, $projectID, $project)) return print(js::alert($this->lang->gitlab->noAccess) . js::locate($this->createLink('gitlab', 'browse'))); + } + + $hasAccessTags = $this->gitlab->apiGetTagPrivs($gitlabID, $projectID, '', 'name_asc'); + foreach($hasAccessTags as $tag) + { + $tag->createAccess = $this->gitlab->checkAccessLevel($tag->create_access_levels); + } + + if(!empty($_POST)) + { + $result = $this->gitlab->manageTagPrivs($gitlabID, $projectID, $hasAccessTags); + if(!empty($result)) return $this->send(array('result' => 'fail', 'message' => sprintf($this->lang->gitlab->svaeFailed, implode(', ', $result)))); + + return $this->send(array('message' => $this->lang->saveSuccess, 'result' => 'success', 'locate' => inlink('browseProject', "gitlabID=$gitlabID"))); + } + $allTags = $this->gitlab->apiGetTags($gitlabID, $projectID); + $noAccessTags = array(); + foreach($allTags as $tag) + { + if(!isset($hasAccessTags[$tag->name])) $noAccessTags[$tag->name] = $tag->name; + } + + $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseTagPriv; + $this->view->gitlabID = $gitlabID; + $this->view->projectID = $projectID; + $this->view->hasAccessTags = $hasAccessTags; + $this->view->noAccessTags = $noAccessTags; + $this->display(); + } } diff --git a/module/gitlab/js/managebranchpriv.js b/module/gitlab/js/managebranchpriv.js new file mode 100644 index 0000000000..ca2a04c27b --- /dev/null +++ b/module/gitlab/js/managebranchpriv.js @@ -0,0 +1,72 @@ +/* Update other picker on change */ +$.zui.Picker.DEFAULTS.onChange = function(event) +{ + var picker = event.picker; + if(!picker.$formItem.is('[name^=branches]')) return; + + var select = picker.$formItem[0]; + var newItem = event.value.length ? $.extend({}, picker.getListItem(event.value), {disabled: true}) : $.extend({}, picker.getListItem(event.oldValue), {disabled: false}); + + $('.user-picker[name^=branches]').each(function() + { + if(this === select) return; + + var $select = $(this); + var selectPicker = $select.data('zui.picker'); + + if(selectPicker) selectPicker.updateOptionList([$.extend({}, newItem)]); + }); +} + +/** + * Save team members. + * + * @access public + * @return void + */ +function savePriv() +{ + $('#saveBtn').addClass('hidden'); + $('#submit').removeClass('hidden'); + $('#submit').click(); +} + +/** + * Add item. + * + * @param object $obj + * @access public + * @return void + */ +function addItem(obj) +{ + var item = $('#addItem').html().replace(/%i%/g, itemIndex); + var $tr = $('' + item + '').insertAfter($(obj).closest('tr')); + var $accounts = $tr.find('select:first').addClass('user-picker').trigger('list:updated').picker({type: 'user'}); + itemIndex++; + + var disabledItems = []; + $('.user-picker[name^=branches]').each(function() + { + if(this === $accounts[0]) return; + var $select = $(this); + var picker = $select.data('zui.picker'); + if(!picker) return; + var selectItem = picker.getListItem(picker.getValue()); + if(selectItem) disabledItems.push($.extend({}, selectItem, {disabled: true})); + }); + if(disabledItems.length) $accounts.data('zui.picker').updateOptionList(disabledItems); +} + +/** + * Delete item. + * + * @param object $obj + * @access public + * @return void + */ +function deleteItem(obj) +{ + if($('#teamForm .table-form tbody').children().length < 2) return false; + $(obj).closest('tr').remove(); +} diff --git a/module/gitlab/js/managetagpriv.js b/module/gitlab/js/managetagpriv.js new file mode 100644 index 0000000000..6e290efb1f --- /dev/null +++ b/module/gitlab/js/managetagpriv.js @@ -0,0 +1,72 @@ +/* Update other picker on change */ +$.zui.Picker.DEFAULTS.onChange = function(event) +{ + var picker = event.picker; + if(!picker.$formItem.is('[name^=tags]')) return; + + var select = picker.$formItem[0]; + var newItem = event.value.length ? $.extend({}, picker.getListItem(event.value), {disabled: true}) : $.extend({}, picker.getListItem(event.oldValue), {disabled: false}); + + $('.user-picker[name^=tags]').each(function() + { + if(this === select) return; + + var $select = $(this); + var selectPicker = $select.data('zui.picker'); + + if(selectPicker) selectPicker.updateOptionList([$.extend({}, newItem)]); + }); +} + +/** + * Save team members. + * + * @access public + * @return void + */ +function savePriv() +{ + $('#saveBtn').addClass('hidden'); + $('#submit').removeClass('hidden'); + $('#submit').click(); +} + +/** + * Add item. + * + * @param object $obj + * @access public + * @return void + */ +function addItem(obj) +{ + var item = $('#addItem').html().replace(/%i%/g, itemIndex); + var $tr = $('' + item + '').insertAfter($(obj).closest('tr')); + var $accounts = $tr.find('select:first').addClass('user-picker').trigger('list:updated').picker({type: 'user'}); + itemIndex++; + + var disabledItems = []; + $('.user-picker[name^=tags]').each(function() + { + if(this === $accounts[0]) return; + var $select = $(this); + var picker = $select.data('zui.picker'); + if(!picker) return; + var selectItem = picker.getListItem(picker.getValue()); + if(selectItem) disabledItems.push($.extend({}, selectItem, {disabled: true})); + }); + if(disabledItems.length) $accounts.data('zui.picker').updateOptionList(disabledItems); +} + +/** + * Delete item. + * + * @param object $obj + * @access public + * @return void + */ +function deleteItem(obj) +{ + if($('#teamForm .table-form tbody').children().length < 2) return false; + $(obj).closest('tr').remove(); +} diff --git a/module/gitlab/lang/de.php b/module/gitlab/lang/de.php index 169875c665..41d82d8582 100644 --- a/module/gitlab/lang/de.php +++ b/module/gitlab/lang/de.php @@ -34,7 +34,7 @@ $lang->gitlab->browseUser = "User"; $lang->gitlab->browseGroup = "Group"; $lang->gitlab->browseBranch = "GitLab Branch List"; $lang->gitlab->browseTag = "GitLab Tag List"; -$lang->gitlab->browseTagPriv = "GitLab Tag protected List"; +$lang->gitlab->browseTagPriv = "Protected tag"; $lang->gitlab->gitlabIssue = "GitLab Issue"; $lang->gitlab->zentaoProduct = 'Zentao Product'; $lang->gitlab->objectType = 'Type'; // task, bug, story @@ -52,14 +52,9 @@ $lang->gitlab->createBranch = 'Add branch'; $lang->gitlab->manageGroupMembers = 'Manage group member'; $lang->gitlab->createWebhook = 'Create Webhook'; $lang->gitlab->browseBranchPriv = 'Protect branch'; -$lang->gitlab->createBranchPriv = 'Cerate branch protected'; -$lang->gitlab->editBranchPriv = 'Edit branch protected'; -$lang->gitlab->deleteBranchPriv = 'Delete branch protected'; $lang->gitlab->createTag = 'Create Tag'; $lang->gitlab->deleteTag = 'Delete tag'; -$lang->gitlab->createTagPriv = 'Create tag protected'; -$lang->gitlab->editTagPriv = 'Edit tag protected'; -$lang->gitlab->deleteTagPriv = 'Delete tag protected'; +$lang->gitlab->svaeFailed = '『%s』save failed'; $lang->gitlab->id = 'ID'; $lang->gitlab->name = "Server Name"; diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php index 169875c665..41d82d8582 100644 --- a/module/gitlab/lang/en.php +++ b/module/gitlab/lang/en.php @@ -34,7 +34,7 @@ $lang->gitlab->browseUser = "User"; $lang->gitlab->browseGroup = "Group"; $lang->gitlab->browseBranch = "GitLab Branch List"; $lang->gitlab->browseTag = "GitLab Tag List"; -$lang->gitlab->browseTagPriv = "GitLab Tag protected List"; +$lang->gitlab->browseTagPriv = "Protected tag"; $lang->gitlab->gitlabIssue = "GitLab Issue"; $lang->gitlab->zentaoProduct = 'Zentao Product'; $lang->gitlab->objectType = 'Type'; // task, bug, story @@ -52,14 +52,9 @@ $lang->gitlab->createBranch = 'Add branch'; $lang->gitlab->manageGroupMembers = 'Manage group member'; $lang->gitlab->createWebhook = 'Create Webhook'; $lang->gitlab->browseBranchPriv = 'Protect branch'; -$lang->gitlab->createBranchPriv = 'Cerate branch protected'; -$lang->gitlab->editBranchPriv = 'Edit branch protected'; -$lang->gitlab->deleteBranchPriv = 'Delete branch protected'; $lang->gitlab->createTag = 'Create Tag'; $lang->gitlab->deleteTag = 'Delete tag'; -$lang->gitlab->createTagPriv = 'Create tag protected'; -$lang->gitlab->editTagPriv = 'Edit tag protected'; -$lang->gitlab->deleteTagPriv = 'Delete tag protected'; +$lang->gitlab->svaeFailed = '『%s』save failed'; $lang->gitlab->id = 'ID'; $lang->gitlab->name = "Server Name"; diff --git a/module/gitlab/lang/fr.php b/module/gitlab/lang/fr.php index 169875c665..41d82d8582 100644 --- a/module/gitlab/lang/fr.php +++ b/module/gitlab/lang/fr.php @@ -34,7 +34,7 @@ $lang->gitlab->browseUser = "User"; $lang->gitlab->browseGroup = "Group"; $lang->gitlab->browseBranch = "GitLab Branch List"; $lang->gitlab->browseTag = "GitLab Tag List"; -$lang->gitlab->browseTagPriv = "GitLab Tag protected List"; +$lang->gitlab->browseTagPriv = "Protected tag"; $lang->gitlab->gitlabIssue = "GitLab Issue"; $lang->gitlab->zentaoProduct = 'Zentao Product'; $lang->gitlab->objectType = 'Type'; // task, bug, story @@ -52,14 +52,9 @@ $lang->gitlab->createBranch = 'Add branch'; $lang->gitlab->manageGroupMembers = 'Manage group member'; $lang->gitlab->createWebhook = 'Create Webhook'; $lang->gitlab->browseBranchPriv = 'Protect branch'; -$lang->gitlab->createBranchPriv = 'Cerate branch protected'; -$lang->gitlab->editBranchPriv = 'Edit branch protected'; -$lang->gitlab->deleteBranchPriv = 'Delete branch protected'; $lang->gitlab->createTag = 'Create Tag'; $lang->gitlab->deleteTag = 'Delete tag'; -$lang->gitlab->createTagPriv = 'Create tag protected'; -$lang->gitlab->editTagPriv = 'Edit tag protected'; -$lang->gitlab->deleteTagPriv = 'Delete tag protected'; +$lang->gitlab->svaeFailed = '『%s』save failed'; $lang->gitlab->id = 'ID'; $lang->gitlab->name = "Server Name"; diff --git a/module/gitlab/lang/vi.php b/module/gitlab/lang/vi.php index 169875c665..41d82d8582 100644 --- a/module/gitlab/lang/vi.php +++ b/module/gitlab/lang/vi.php @@ -34,7 +34,7 @@ $lang->gitlab->browseUser = "User"; $lang->gitlab->browseGroup = "Group"; $lang->gitlab->browseBranch = "GitLab Branch List"; $lang->gitlab->browseTag = "GitLab Tag List"; -$lang->gitlab->browseTagPriv = "GitLab Tag protected List"; +$lang->gitlab->browseTagPriv = "Protected tag"; $lang->gitlab->gitlabIssue = "GitLab Issue"; $lang->gitlab->zentaoProduct = 'Zentao Product'; $lang->gitlab->objectType = 'Type'; // task, bug, story @@ -52,14 +52,9 @@ $lang->gitlab->createBranch = 'Add branch'; $lang->gitlab->manageGroupMembers = 'Manage group member'; $lang->gitlab->createWebhook = 'Create Webhook'; $lang->gitlab->browseBranchPriv = 'Protect branch'; -$lang->gitlab->createBranchPriv = 'Cerate branch protected'; -$lang->gitlab->editBranchPriv = 'Edit branch protected'; -$lang->gitlab->deleteBranchPriv = 'Delete branch protected'; $lang->gitlab->createTag = 'Create Tag'; $lang->gitlab->deleteTag = 'Delete tag'; -$lang->gitlab->createTagPriv = 'Create tag protected'; -$lang->gitlab->editTagPriv = 'Edit tag protected'; -$lang->gitlab->deleteTagPriv = 'Delete tag protected'; +$lang->gitlab->svaeFailed = '『%s』save failed'; $lang->gitlab->id = 'ID'; $lang->gitlab->name = "Server Name"; diff --git a/module/gitlab/lang/zh-cn.php b/module/gitlab/lang/zh-cn.php index d9ac66d15f..7273c0c8ef 100644 --- a/module/gitlab/lang/zh-cn.php +++ b/module/gitlab/lang/zh-cn.php @@ -34,7 +34,7 @@ $lang->gitlab->browseUser = "用户"; $lang->gitlab->browseGroup = "群组"; $lang->gitlab->browseBranch = "GitLab分支列表"; $lang->gitlab->browseTag = "GitLab标签列表"; -$lang->gitlab->browseTagPriv = "GitLab标签保护列表"; +$lang->gitlab->browseTagPriv = "标签保护管理"; $lang->gitlab->gitlabIssue = "{$lang->gitlab->common} issue"; $lang->gitlab->zentaoProduct = '禅道产品'; $lang->gitlab->objectType = '类型'; // task, bug, story @@ -52,14 +52,9 @@ $lang->gitlab->createBranch = '添加分支'; $lang->gitlab->manageGroupMembers = '群组成员管理'; $lang->gitlab->createWebhook = '创建Webhook'; $lang->gitlab->browseBranchPriv = '分支保护管理'; -$lang->gitlab->createBranchPriv = '创建分支保护'; -$lang->gitlab->editBranchPriv = '编辑分支保护'; -$lang->gitlab->deleteBranchPriv = '删除分支保护'; $lang->gitlab->createTag = '创建标签'; $lang->gitlab->deleteTag = '删除标签'; -$lang->gitlab->createTagPriv = '创建标签保护'; -$lang->gitlab->editTagPriv = '编辑标签保护'; -$lang->gitlab->deleteTagPriv = '删除标签保护'; +$lang->gitlab->svaeFailed = '『%s』保存失败'; $lang->gitlab->id = 'ID'; $lang->gitlab->name = "服务器名称"; diff --git a/module/gitlab/model.php b/module/gitlab/model.php index aa7d73dca6..6cef6d84c1 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -2549,59 +2549,54 @@ class gitlabModel extends model } /** - * Get single protct branch by API. + * Manage branch privs. * * @param int $gitlabID * @param int $projectID - * @param string $branch + * @param array $protected * @access public - * @return object + * @return array */ - public function apiGetSingleBranchPriv($gitlabID, $projectID, $branch) + public function manageBranchPrivs($gitlabID, $projectID, $protected = array()) { - if(empty($gitlabID)) return false; - $branch = urlencode($branch); - $url = sprintf($this->getApiRoot($gitlabID), "/projects/$projectID/protected_branches/$branch"); - return json_decode(commonModel::http($url)); - } + $data = (array)fixer::input('post')->get(); + extract($data); + $failure = array(); - /** - * Create gitlab potect branch. - * - * @param int $gitlabID - * @param int $projectID - * @param string $branch - * @access public - * @return bool - */ - public function createBranchPriv($gitlabID, $projectID, $branch = '') - { - $priv = fixer::input('post')->get(); - if(empty($priv->name)) + /* Remove privs. */ + foreach($protected as $name => $branch) { - dao::$errors['name'][] = $this->lang->gitlab->branch->emptyPrivNameError; - return false; + if(!in_array($name, $branches)) + { + $result = $this->apiDeleteBranchPriv($gitlabID, $projectID, $name); + if($result and substr($result->message, 0, 2) != '20') $failure[] = $name; + } } - $priv->name = urldecode(helper::safe64Decode($priv->name)); - $singleBranch = $this->apiGetSingleBranchPriv($gitlabID, $projectID, $priv->name); - if(empty($branch) && !empty($singleBranch->id)) + $priv = new stdClass(); + foreach($branches as $key => $name) { - dao::$errors['name'][] = $this->lang->gitlab->branch->issetPrivNameError; - return false; + /* Process exists data. */ + if(isset($protected[$name])) + { + if($protected[$name]->pushAccess == $pushLevels[$key] and $protected[$name]->mergeAccess == $mergeLevels[$key]) + { + continue; + } + else + { + $result = $this->apiDeleteBranchPriv($gitlabID, $projectID, $name); + if(isset($result->message) and substr($result->message, 0, 2) != '20') $failure[] = $name; + } + } + + $priv->name = $name; + $priv->push_access_level = $pushLevels[$key]; + $priv->merge_access_level = $mergeLevels[$key]; + $response = $this->apiCreateBranchPriv($gitlabID, $projectID, $priv); + if(isset($response->message) and substr($response->message, 0, 2) != '20') $failure[] = $name; } - - if(!empty($branch) && !empty($singleBranch->id)) $this->apiDeleteBranchPriv($gitlabID, $projectID, $branch); - $response = $this->apiCreateBranchPriv($gitlabID, $projectID, $priv); - - if(!empty($response->id)) - { - $action = empty($branch) ? 'created' : 'edited'; - $this->loadModel('action')->create('gitlabbranchpriv', $response->id, $action, '', $response->name); - return true; - } - - return $this->apiErrorHandling($response); + return array_unique($failure); } /** @@ -2630,7 +2625,7 @@ class gitlabModel extends model * @param int $projectID * @param string $branch * @access public - * @return object + * @return array */ public function apiDeleteBranchPriv($gitlabID, $projectID, $branch) { @@ -2642,58 +2637,53 @@ class gitlabModel extends model } /** - * Create gitlab protect tag. + * Manage tag privs. * * @param int $gitlabID * @param int $projectID - * @param string $tag + * @param array $protected * @access public - * @return bool + * @return array */ - public function createTagPriv($gitlabID, $projectID, $tag = '') + public function manageTagPrivs($gitlabID, $projectID, $protected = array()) { - $priv = fixer::input('post')->get(); - if(empty($priv->name)) + $data = (array)fixer::input('post')->get(); + extract($data); + $failure = array(); + + /* Remove privs. */ + foreach($protected as $name => $tag) { - dao::$errors['name'][] = $this->lang->gitlab->tag->emptyPrivNameError; - return false; + if(!in_array($name, $tags)) + { + $result = $this->apiDeleteTagPriv($gitlabID, $projectID, $name); + if($result and substr($result->message, 0, 2) != '20') $failure[] = $name; + } } - $singleTag = $this->apiGetSingleTagPriv($gitlabID, $projectID, $priv->name); - if(empty($tag) && !empty($singleTag->id)) + $priv = new stdClass(); + foreach($tags as $key => $name) { - dao::$errors['name'][] = $this->lang->gitlab->tag->issetPrivNameError; - return false; + /* Process exists data. */ + if(isset($protected[$name])) + { + if($protected[$name]->createAccess == $createLevels[$key]) + { + continue; + } + else + { + $result = $this->apiDeleteTagPriv($gitlabID, $projectID, $name); + if(isset($result->message) and substr($result->message, 0, 2) != '20') $failure[] = $name; + } + } + + $priv->name = $name; + $priv->create_access_level = $createLevels[$key]; + $response = $this->apiCreateTagPriv($gitlabID, $projectID, $priv); + if(isset($response->message) and substr($response->message, 0, 2) != '20') $failure[] = $name; } - - if(!empty($tag) && !empty($singleTag->name)) $this->apiDeleteTagPriv($gitlabID, $projectID, $tag); - $response = $this->apiCreateTagPriv($gitlabID, $projectID, $priv); - - if(!empty($response->id)) - { - $action = empty($tag) ? 'created' : 'edited'; - $this->loadModel('action')->create('gitlabtagpriv', $response->id, $action, '', $response->name); - return true; - } - - return $this->apiErrorHandling($response); - } - - /** - * Get single protct tag by API. - * - * @param int $gitlabID - * @param int $projectID - * @param string $tag - * @access public - * @return object - */ - public function apiGetSingleTagPriv($gitlabID, $projectID, $tag) - { - if(empty($gitlabID)) return false; - $tag = urlencode($tag); - $url = sprintf($this->getApiRoot($gitlabID), "/projects/$projectID/protected_tags/$tag"); - return json_decode(commonModel::http($url)); + return array_unique($failure); } /** diff --git a/module/gitlab/view/browsebranchpriv.html.php b/module/gitlab/view/browsebranchpriv.html.php deleted file mode 100644 index 181c913742..0000000000 --- a/module/gitlab/view/browsebranchpriv.html.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @package gitlab - * @version $Id$ - * @link http://www.zentao.net - */ -?> - - - -
-

- noData;?> - - createLink('gitlab', 'createBranchPriv', "gitlabID=$gitlabID&projectID=$projectID"), " " . $lang->gitlab->createBranchPriv, '', "class='btn btn-info'");?> - -

-
- -
-
- - recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?> - - - - - - - - - - $branch): ?> - merge_access_level = $this->gitlab->checkAccessLevel($branch->merge_access_levels); ?> - push_access_level = $this->gitlab->checkAccessLevel($branch->push_access_levels); ?> - - - - - - - - -
gitlab->branch->name);?>gitlab->branch->mergeAllowed;?>gitlab->branch->pushAllowed;?>actions;?>
name;?>merge_access_level];?>push_access_level];?> - name)); - if(common::hasPriv('gitlab', 'editBranchPriv')) common::printLink('gitlab', 'editBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branchName", " ", '', "title={$lang->gitlab->editBranchPriv} class='btn btn-primary'"); - if(common::hasPriv('gitlab', 'deleteBranchPriv')) echo html::a($this->createLink('gitlab', 'deleteBranchPriv', "gitlabID=$gitlabID&projectID=$projectID&branch=$branchName"), '', 'hiddenwin', "title='{$lang->gitlab->deleteBranchPriv}' class='btn'"); - ?> -
- - - -
-
- - diff --git a/module/gitlab/view/browseproject.html.php b/module/gitlab/view/browseproject.html.php index 93fddbd2f7..e2e9c57d1d 100644 --- a/module/gitlab/view/browseproject.html.php +++ b/module/gitlab/view/browseproject.html.php @@ -60,8 +60,8 @@ last_activity_at, 0, 10);?> id", '', 'list', 'branch-lock', '', '', false, '', '', 0, ($gitlabProject->isMaintainer and $gitlabProject->default_branch)); - echo common::buildIconButton('gitlab', 'browseTagPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'tag-lock', '', '', false, '', '', 0, ($gitlabProject->isMaintainer and $gitlabProject->default_branch)); + echo common::buildIconButton('gitlab', 'manageBranchPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'branch-lock', '', '', false, '', '', 0, ($gitlabProject->isMaintainer and $gitlabProject->default_branch)); + echo common::buildIconButton('gitlab', 'manageTagPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'tag-lock', '', '', false, '', '', 0, ($gitlabProject->isMaintainer and $gitlabProject->default_branch)); echo common::buildIconButton('gitlab', 'manageProjectMembers', 'repoID=' . zget($repoPairs, $gitlabProject->id), '', 'list', 'team', '', '', false, '', '', 0, isset($repoPairs[$gitlabProject->id])); echo common::buildIconButton('gitlab', 'createWebhook', 'repoID=' . zget($repoPairs, $gitlabProject->id), '', 'list', 'change', 'hiddenwin', '', false, '', '', 0, isset($repoPairs[$gitlabProject->id])); echo common::buildIconButton('gitlab', 'importIssue', 'repoID=' . zget($repoPairs, $gitlabProject->id), '', 'list', 'link', '', '', false, '', '', 0, isset($repoPairs[$gitlabProject->id])); diff --git a/module/gitlab/view/browsetagpriv.html.php b/module/gitlab/view/browsetagpriv.html.php deleted file mode 100644 index 792e05531e..0000000000 --- a/module/gitlab/view/browsetagpriv.html.php +++ /dev/null @@ -1,82 +0,0 @@ - - * @package gitlab - * @version $Id$ - * @link http://www.zentao.net - */ -?> - -recTotal}&recPerPage={$pager->recPerPage}&pageID=1")?> - - - -
-

- noData;?> - - createLink('gitlab', 'createTagPriv', "gitlabID=$gitlabID&projectID=$projectID"), " " . $lang->gitlab->createTagPriv, '', "class='btn btn-info'");?> - -

-
- -
-
- - recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?> - - - - - - - - - - $gitlabTag): ?> - accessLevel = $this->gitlab->checkAccessLevel($gitlabTag->accessLevels); ?> - - - - - - - - -
gitlab->tag->name);?>gitlab->tag->lastCommitter;?>gitlab->tag->accessLevel);?>actions;?>
name;?>lastCommitter;?>gitlab->branch->branchCreationLevelList, $gitlabTag->accessLevel);?> - name)); - common::printLink('gitlab', 'editTagPriv', "gitlabID=$gitlabID&projectID=$projectID&tag_name=$tagName", " ", '', "title={$lang->gitlab->editTagPriv} class='btn btn-primary'"); - common::printLink('gitlab', 'deleteTagPriv', "gitlabID=$gitlabID&projectID={$projectID}&tag_name=$tagName", " ", '', "title='{$lang->gitlab->deleteTagPriv}' class='btn btn-primary' target='hiddenwin' onclick='if(confirm(\"{$lang->gitlab->tag->protectConfirmDel}\")==false) return false;'"); - ?> -
- - - -
-
- - diff --git a/module/gitlab/view/createbranchpriv.html.php b/module/gitlab/view/createbranchpriv.html.php deleted file mode 100644 index 52c3e691f2..0000000000 --- a/module/gitlab/view/createbranchpriv.html.php +++ /dev/null @@ -1,47 +0,0 @@ - - * @package gitlab - * @version $Id$ - * @link http://www.zentao.net - */ -?> - -
-
-
-
-

-
-
- name) echo html::hidden('name', $branchPriv->name);?> - - - - - - - - - - - - - - - - - -
gitlab->branch->name;?>name, "class='form-control chosen' " . ($branch ? 'disabled' : ''));?>
gitlab->branch->mergeAllowed;?>gitlab->branch->branchCreationLevelList, $branchPriv->mergeAccessLevel, "class='form-control'");?>
gitlab->branch->pushAllowed;?>gitlab->branch->branchCreationLevelList, $branchPriv->pushAccessLevel, "class='form-control'");?>
- - goback, '', 'class="btn btn-wide"');?> -
-
-
-
-
- diff --git a/module/gitlab/view/createtagpriv.html.php b/module/gitlab/view/createtagpriv.html.php deleted file mode 100644 index cf45b66372..0000000000 --- a/module/gitlab/view/createtagpriv.html.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @package gitlab - * @version $Id$ - * @link https://www.zentao.net - */ -?> - -
-
-
-
-

gitlab->createTagPriv;?>

-
-
- - - - - - - - - - - - - - -
gitlab->tag->name;?>
gitlab->tag->accessLevel;?>gitlab->branch->branchCreationLevelList, '40', "class='form-control chosen'");?>
- - goback, '', 'class="btn btn-wide"');?> -
-
-
-
-
- diff --git a/module/gitlab/view/edittagpriv.html.php b/module/gitlab/view/edittagpriv.html.php deleted file mode 100644 index aec4bbcbf2..0000000000 --- a/module/gitlab/view/edittagpriv.html.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @package gitlab - * @version $Id$ - * @link https://www.zentao.net - */ -?> - -
-
-
-
-

gitlab->editTagPriv;?>

-
-
- - - - - - - - - - - - - - - -
gitlab->tag->name;?>
gitlab->tag->accessLevel;?>gitlab->branch->branchCreationLevelList, $tagPriv->createAccessLevel, "class='form-control chosen'");?>
- - goback, '', 'class="btn btn-wide"');?> -
-
-
-
-
- diff --git a/module/gitlab/view/managebranchpriv.html.php b/module/gitlab/view/managebranchpriv.html.php new file mode 100644 index 0000000000..c33f4272ff --- /dev/null +++ b/module/gitlab/view/managebranchpriv.html.php @@ -0,0 +1,82 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
gitlab->branch->name;?>gitlab->branch->mergeAllowed;?>gitlab->branch->pushAllowed;?>actions;?>
name, "class='form-control' readonly");?>gitlab->branch->branchCreationLevelList, $branch->mergeAccess, "class='form-control chosen'");?> + gitlab->branch->branchCreationLevelList, $branch->pushAccess, "class='form-control chosen'");?> + name);?> + + ", '', "onclick='addItem(this)' class='btn btn-link'");?> + ", '', "onclick='deleteItem(this)' class='btn btn-link'");?> +
'') + $noAccessBranches, '', "class='form-control user-picker'");?>gitlab->branch->branchCreationLevelList, 40, "class='form-control chosen'");?>gitlab->branch->branchCreationLevelList, 40, "class='form-control chosen'");?> + ", '', "onclick='addItem(this)' class='btn btn-link'");?> + ", '', "onclick='deleteItem(this)' class='btn btn-link'");?> +
+ save, 'onclick="savePriv()" id="saveBtn"', 'btn btn-wide btn-primary'); + echo html::backButton(); + ?> +
+ +
+
+
+ + + + + + + + + +
+ diff --git a/module/gitlab/view/managetagpriv.html.php b/module/gitlab/view/managetagpriv.html.php new file mode 100644 index 0000000000..c22ed7462a --- /dev/null +++ b/module/gitlab/view/managetagpriv.html.php @@ -0,0 +1,76 @@ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
gitlab->tag->name;?>gitlab->tag->accessLevel;?>actions;?>
name, "class='form-control' readonly");?>gitlab->branch->branchCreationLevelList, $tag->createAccess, "class='form-control chosen'");?> + name);?> + ", '', "onclick='addItem(this)' class='btn btn-link'");?> + ", '', "onclick='deleteItem(this)' class='btn btn-link'");?> +
'') + $noAccessTags, '', "class='form-control user-picker'");?>gitlab->branch->branchCreationLevelList, 40, "class='form-control chosen'");?> + ", '', "onclick='addItem(this)' class='btn btn-link'");?> + ", '', "onclick='deleteItem(this)' class='btn btn-link'");?> +
+ save, 'onclick="savePriv()" id="saveBtn"', 'btn btn-wide btn-primary'); + echo html::backButton(); + ?> +
+ +
+
+
+ + + + + + + + +
+ diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 9893779893..361267c995 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1344,17 +1344,11 @@ $lang->resource->gitlab->browseBranch = 'browseBranch'; $lang->resource->gitlab->webhook = 'webhook'; $lang->resource->gitlab->createWebhook = 'createWebhook'; $lang->resource->gitlab->manageProjectMembers = 'manageProjectMembers'; -$lang->resource->gitlab->browseBranchPriv = 'browseBranchPriv'; -$lang->resource->gitlab->createBranchPriv = 'createBranchPriv'; -$lang->resource->gitlab->editBranchPriv = 'editBranchPriv'; -$lang->resource->gitlab->deleteBranchPriv = 'deleteBranchPriv'; +$lang->resource->gitlab->manageBranchPriv = 'browseBranchPriv'; +$lang->resource->gitlab->manageTagPriv = 'browseTagPriv'; $lang->resource->gitlab->browseTag = 'browseTag'; $lang->resource->gitlab->createTag = 'createTag'; $lang->resource->gitlab->deleteTag = 'deleteTag'; -$lang->resource->gitlab->browseTagPriv = 'browseTagPriv'; -$lang->resource->gitlab->createTagPriv = 'createTagPriv'; -$lang->resource->gitlab->editTagPriv = 'editTagPriv'; -$lang->resource->gitlab->deleteTagPriv = 'deleteTagPriv'; $lang->gitlab->methodOrder[5] = 'browse'; $lang->gitlab->methodOrder[10] = 'create'; @@ -1381,9 +1375,11 @@ $lang->gitlab->methodOrder[115] = 'browseBranch'; $lang->gitlab->methodOrder[120] = 'webhook'; $lang->gitlab->methodOrder[125] = 'createWebhook'; $lang->gitlab->methodOrder[130] = 'manageProjectMembers'; -$lang->gitlab->methodOrder[135] = 'browseTag'; -$lang->gitlab->methodOrder[140] = 'browseTagPriv'; -$lang->gitlab->methodOrder[145] = 'deleteTagPriv'; +$lang->gitlab->methodOrder[135] = 'manageBranchPriv'; +$lang->gitlab->methodOrder[140] = 'manageTagPriv'; +$lang->gitlab->methodOrder[145] = 'browseTag'; +$lang->gitlab->methodOrder[150] = 'createTag'; +$lang->gitlab->methodOrder[155] = 'deleteTag'; /* Gitea. */ $lang->resource->gitea = new stdclass(); From 8e2c8317227fb8b939551924addcc4d6657fcfa6 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Tue, 12 Jul 2022 09:51:36 +0800 Subject: [PATCH 3/5] * Modify param name. --- module/gitlab/js/managebranchpriv.js | 4 ++-- module/gitlab/js/managetagpriv.js | 4 ++-- module/gitlab/view/managebranchpriv.html.php | 2 +- module/gitlab/view/managetagpriv.html.php | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/module/gitlab/js/managebranchpriv.js b/module/gitlab/js/managebranchpriv.js index ca2a04c27b..b00adf44e6 100644 --- a/module/gitlab/js/managebranchpriv.js +++ b/module/gitlab/js/managebranchpriv.js @@ -19,7 +19,7 @@ $.zui.Picker.DEFAULTS.onChange = function(event) } /** - * Save team members. + * Save branch priv. * * @access public * @return void @@ -67,6 +67,6 @@ function addItem(obj) */ function deleteItem(obj) { - if($('#teamForm .table-form tbody').children().length < 2) return false; + if($('#privForm .table-form tbody').children().length < 2) return false; $(obj).closest('tr').remove(); } diff --git a/module/gitlab/js/managetagpriv.js b/module/gitlab/js/managetagpriv.js index 6e290efb1f..1afcbfd09a 100644 --- a/module/gitlab/js/managetagpriv.js +++ b/module/gitlab/js/managetagpriv.js @@ -19,7 +19,7 @@ $.zui.Picker.DEFAULTS.onChange = function(event) } /** - * Save team members. + * Save tag priv. * * @access public * @return void @@ -67,6 +67,6 @@ function addItem(obj) */ function deleteItem(obj) { - if($('#teamForm .table-form tbody').children().length < 2) return false; + if($('#privForm .table-form tbody').children().length < 2) return false; $(obj).closest('tr').remove(); } diff --git a/module/gitlab/view/managebranchpriv.html.php b/module/gitlab/view/managebranchpriv.html.php index c33f4272ff..714a03bda1 100644 --- a/module/gitlab/view/managebranchpriv.html.php +++ b/module/gitlab/view/managebranchpriv.html.php @@ -7,7 +7,7 @@
-
+ diff --git a/module/gitlab/view/managetagpriv.html.php b/module/gitlab/view/managetagpriv.html.php index c22ed7462a..bbb53f69dd 100644 --- a/module/gitlab/view/managetagpriv.html.php +++ b/module/gitlab/view/managetagpriv.html.php @@ -7,7 +7,7 @@
- +
From 223ab3a2f8fe39c3bf2d2876e86021cb5882ffb5 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Tue, 12 Jul 2022 13:13:04 +0800 Subject: [PATCH 4/5] * Adjust code. --- module/gitlab/js/managebranchpriv.js | 6 +++--- module/gitlab/js/managetagpriv.js | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/module/gitlab/js/managebranchpriv.js b/module/gitlab/js/managebranchpriv.js index b00adf44e6..4a8fcb1cf7 100644 --- a/module/gitlab/js/managebranchpriv.js +++ b/module/gitlab/js/managebranchpriv.js @@ -40,8 +40,8 @@ function savePriv() */ function addItem(obj) { - var item = $('#addItem').html().replace(/%i%/g, itemIndex); - var $tr = $('' + item + '').insertAfter($(obj).closest('tr')); + var item = $('#addItem').html().replace(/%i%/g, itemIndex); + var $tr = $('' + item + '').insertAfter($(obj).closest('tr')); var $accounts = $tr.find('select:first').addClass('user-picker').trigger('list:updated').picker({type: 'user'}); itemIndex++; @@ -50,7 +50,7 @@ function addItem(obj) { if(this === $accounts[0]) return; var $select = $(this); - var picker = $select.data('zui.picker'); + var picker = $select.data('zui.picker'); if(!picker) return; var selectItem = picker.getListItem(picker.getValue()); if(selectItem) disabledItems.push($.extend({}, selectItem, {disabled: true})); diff --git a/module/gitlab/js/managetagpriv.js b/module/gitlab/js/managetagpriv.js index 1afcbfd09a..d7ab47bfd1 100644 --- a/module/gitlab/js/managetagpriv.js +++ b/module/gitlab/js/managetagpriv.js @@ -40,8 +40,8 @@ function savePriv() */ function addItem(obj) { - var item = $('#addItem').html().replace(/%i%/g, itemIndex); - var $tr = $('' + item + '').insertAfter($(obj).closest('tr')); + var item = $('#addItem').html().replace(/%i%/g, itemIndex); + var $tr = $('' + item + '').insertAfter($(obj).closest('tr')); var $accounts = $tr.find('select:first').addClass('user-picker').trigger('list:updated').picker({type: 'user'}); itemIndex++; @@ -50,7 +50,7 @@ function addItem(obj) { if(this === $accounts[0]) return; var $select = $(this); - var picker = $select.data('zui.picker'); + var picker = $select.data('zui.picker'); if(!picker) return; var selectItem = picker.getListItem(picker.getValue()); if(selectItem) disabledItems.push($.extend({}, selectItem, {disabled: true})); From ae7c259ab1d3809a2c2516d164f51dd1051c0764 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Tue, 12 Jul 2022 13:18:54 +0800 Subject: [PATCH 5/5] * Adjust codes. --- module/gitlab/model.php | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/module/gitlab/model.php b/module/gitlab/model.php index 6cef6d84c1..6ba139764b 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -2579,15 +2579,10 @@ class gitlabModel extends model /* Process exists data. */ if(isset($protected[$name])) { - if($protected[$name]->pushAccess == $pushLevels[$key] and $protected[$name]->mergeAccess == $mergeLevels[$key]) - { - continue; - } - else - { - $result = $this->apiDeleteBranchPriv($gitlabID, $projectID, $name); - if(isset($result->message) and substr($result->message, 0, 2) != '20') $failure[] = $name; - } + if($protected[$name]->pushAccess == $pushLevels[$key] and $protected[$name]->mergeAccess == $mergeLevels[$key]) continue; + + $result = $this->apiDeleteBranchPriv($gitlabID, $projectID, $name); + if(isset($result->message) and substr($result->message, 0, 2) != '20') $failure[] = $name; } $priv->name = $name; @@ -2667,15 +2662,10 @@ class gitlabModel extends model /* Process exists data. */ if(isset($protected[$name])) { - if($protected[$name]->createAccess == $createLevels[$key]) - { - continue; - } - else - { - $result = $this->apiDeleteTagPriv($gitlabID, $projectID, $name); - if(isset($result->message) and substr($result->message, 0, 2) != '20') $failure[] = $name; - } + if($protected[$name]->createAccess == $createLevels[$key]) continue; + + $result = $this->apiDeleteTagPriv($gitlabID, $projectID, $name); + if(isset($result->message) and substr($result->message, 0, 2) != '20') $failure[] = $name; } $priv->name = $name;