Files
MYSOPHAL/js/kanban.min.js
2025-08-07 13:15:31 +01:00

1 line
31 KiB
JavaScript

(function(){window.GLPIKanban=function(){var e=this;this.element="";this.columns={};this.ajax_root=CFG_GLPI.root_doc+"/ajax/";this.max_team_images=3;this.team_image_size=24;this.item=null;this.supported_itemtypes={};this.allow_add_item=false;this.allow_create_column=false;this.allow_modify_view=false;this.limit_addcard_columns=[];this.allow_order_card=false;this.dark_theme=false;this.column_field={id:"",extra_fields:{}};this.show_toolbar=true;this.filters={_text:""};this.add_column_form="";this.create_column_form="";this.team_badge_cache={User:{},Group:{},Supplier:{},Contact:{}};this.background_refresh_interval=0;var a=null;this.user_state={is_dirty:false,state:{}};this.last_refresh=null;this.is_sorting_active=false;var n=function(a){var n=["element","max_team_images","team_image_size","item","supported_itemtypes","allow_add_item","allow_add_column","dark_theme","background_refresh_interval","column_field","allow_modify_view","limit_addcard_columns","allow_order_card","allow_create_column"];if(a.length===1){for(var t=0;t<n.length;t++){var i=n[t];if(a[0][i]!==undefined){e[i]=a[0][i]}}}if(e.filters._text===undefined){e.filters._text=""}e.filter()};var t=function(){if(e.show_toolbar){i()}var a=$("<div class='kanban-container'><div class='kanban-columns'></div></div>").appendTo($(e.element));var n="<ul id='kanban-add-dropdown' class='kanban-dropdown' style='display: none'>";Object.keys(e.supported_itemtypes).forEach((function(a){n+="<li id='kanban-add-"+a+"'>"+e.supported_itemtypes[a]["name"]+"</li>"}));n+="</ul>";a.append(n);var t="<ul id='kanban-overflow-dropdown' class='kanban-dropdown' style='display: none'>";var o="<ul id='kanban-bulk-add-dropdown' class='' style='display: none'>";Object.keys(e.supported_itemtypes).forEach((function(a){o+="<li id='kanban-bulk-add-"+a+"'>"+e.supported_itemtypes[a]["name"]+"</li>"}));o+="</ul>";var r='<a href="#">'+'<i class="fas fa-list"></i>'+__("Bulk add")+"</a>";t+='<li class="dropdown-trigger">'+r+o+"</li>";if(e.allow_modify_view){t+="<li class='kanban-remove' data-forbid-protected='true'>"+'<i class="fas fa-trash-alt"></i>'+__("Delete")+"</li>"}t+="</ul>";a.append(t);$("#kanban-overflow-dropdown li.dropdown-trigger").on("click",(function(e){$(this).toggleClass("active");$(this).find("ul").toggle();e.stopPropagation();e.preventDefault()}));var l=function(){if(Object.keys(e.user_state.state).length===0){D(true,true)}};e.refresh(l,null,null,true);if(e.allow_modify_view){I();if(e.allow_create_column){z()}}};var i=function(){var a=$("<div class='kanban-toolbar'></div>").appendTo(e.element);$("<select name='kanban-board-switcher'></select>").appendTo(a);var n=$("<input name='filter' type='text' placeholder='"+__("Search or filter results")+"'/>").appendTo(a);if(e.allow_modify_view){var t="<input type='button' class='kanban-add-column submit' value='"+__("Add column")+"'/>";a.append(t)}n.on("input",(function(){var a=$(this).val();if(a===null){a=""}e.filters._text=a;e.filter()}))};var o=function(a){return"#column-"+e.column_field.id+"-"+a};var r=function(e){var a=[e];if(typeof e!=="string"){a=$(e).prop("id").split("-")}else{a=e.split("-")}return a[a.length-1]};var l=function(){e.temp_forms={};var a=$(e.element+" .kanban-column");$.each(a,(function(a,n){var t=$(n).find(".kanban-add-form");if(t.length>0){e.temp_forms[n.id]=[];$.each(t,(function(a,t){e.temp_forms[n.id].push($(t).clone())}))}}))};var s=function(){if(e.temp_forms!==undefined&&Object.keys(e.temp_forms).length>0){$.each(e.temp_forms,(function(e,a){var n=$("#"+e);if(n.length>0){var t=n.find(".kanban-body").first();$.each(a,(function(e,a){$(a).appendTo(t)}))}}));e.temp_forms={}}};var c=function(){e.temp_kanban_scroll={left:$(e.element+" .kanban-container").scrollLeft(),top:$(e.element+" .kanban-container").scrollTop()};e.temp_column_scrolls={};var a=$(e.element+" .kanban-column");$.each(a,(function(a,n){var t=$(n).find(".kanban-body");if(t.scrollTop()!==0){e.temp_column_scrolls[n.id]=t.scrollTop()}}))};var d=function(){if(e.temp_kanban_scroll!==null){$(e.element+" .kanban-container").scrollLeft(e.temp_kanban_scroll.left);$(e.element+" .kanban-container").scrollTop(e.temp_kanban_scroll.top)}if(e.temp_column_scrolls!==null){$.each(e.temp_column_scrolls,(function(e,a){$("#"+e+" .kanban-body").scrollTop(a)}))}e.temp_kanban_scroll={};e.temp_column_scrolls={}};var u=function(){c();l();$(e.element+" .kanban-column").remove()};var f=function(a){if(a===undefined){a=$(e.element+" .kanban-container .kanban-columns").first()}var n=[];$.each(e.user_state.state,(function(t,i){if(i["visible"]!==false&&i!=="false"){P(i["column"],e.columns[i["column"]],a)}n.push(i["column"])}));$.each(e.columns,(function(e,t){if(!n.includes(e)){if(t["id"]===undefined){P(e,t,a)}}}));s();d()};var m=function(){var a=$("#kanban-add-dropdown");var n=$("#kanban-overflow-dropdown");_();if(Object.keys(e.supported_itemtypes).length>0){$(e.element+" .kanban-container").on("click",".kanban-add",(function(e){var n=$(e.target);var t=$(a.data("trigger-button")).prop("id")!==n.prop("id");a.css({position:"fixed",left:n.offset().left,top:n.offset().top+n.outerHeight(true),display:a.css("display")==="none"||t?"inline":"none"});a.data("trigger-button",n)}))}$(window).on("click",(function(n){if(!$(n.target).hasClass("kanban-add")){a.css({display:"none"})}if(e.allow_modify_view){if(!$.contains($(e.add_column_form)[0],n.target)){$(e.add_column_form).css({display:"none"})}if(e.allow_create_column){if(!$.contains($(e.create_column_form)[0],n.target)&&!$.contains($(e.add_column_form)[0],n.target)){$(e.create_column_form).css({display:"none"})}}}}));if(Object.keys(e.supported_itemtypes).length>0){$(e.element+" .kanban-container").on("click",".kanban-overflow-actions",(function(e){var a=$(e.target);var t=$(n.data("trigger-button")).prop("id")!==a.prop("id");n.css({position:"fixed",left:a.offset().left,top:a.offset().top+a.outerHeight(true),display:n.css("display")==="none"||t?"inline":"none"});n.find("ul").css({display:"none"});n.find("li").removeClass("active");var i=$(e.target.closest(".kanban-column"));if(i.hasClass("kanban-protected")){n.find('li[data-forbid-protected="true"]').hide()}else{n.find('li[data-forbid-protected="true"]').show()}n.data("trigger-button",a)}))}$(window).on("click",(function(a){if(!$(a.target).hasClass("kanban-overflow-actions")){n.css({display:"none"})}if(e.allow_modify_view){if(!$.contains($(e.add_column_form)[0],a.target)){$(e.add_column_form).css({display:"none"})}if(e.allow_create_column){if(!$.contains($(e.create_column_form)[0],a.target)&&!$.contains($(e.add_column_form)[0],a.target)){$(e.create_column_form).css({display:"none"})}}}}));$(e.element+" .kanban-container").on("click",".kanban-remove",(function(e){var a=$(e.target.closest(".kanban-dropdown")).data("trigger-button").closest(".kanban-column");k(r(a))}));$(e.element+" .kanban-container").on("click",".kanban-collapse-column",(function(a){e.toggleCollapseColumn(a.target.closest(".kanban-column"))}));$(e.element).on("click",".kanban-add-column",(function(){p()}));$(e.add_column_form).on("input","input[name='column-name-filter']",(function(){var a=$(this);$(e.add_column_form+" li").hide();$(e.add_column_form+" li").filter((function(){return $(this).text().toLowerCase().includes(a.val().toLowerCase())})).show()}));$(e.add_column_form).on("change","input[type='checkbox']",(function(){var e=$(this).parent().data("list-id");if(e!==undefined){if($(this).is(":checked")){h(e)}else{k(e)}}}));$(e.add_column_form).on("submit","form",(function(e){e.preventDefault()}));$(e.add_column_form).on("click",".kanban-create-column",(function(){var a=$(e.element+" .kanban-toolbar");$(e.add_column_form).css({display:"none"});$(e.create_column_form).css({display:"block",position:"fixed",left:a.offset().left+a.outerWidth(true)-$(e.create_column_form).outerWidth(true),top:a.offset().top+a.outerHeight(true)})}));$(e.create_column_form).on("submit","form",(function(a){a.preventDefault();var n=$(e.element+" .kanban-toolbar");$(e.create_column_form).css({display:"none"});var t=$(e.create_column_form+" input[name='name']").val();$(e.create_column_form+" input[name='name']").val("");var i=$(e.create_column_form+" input[name='color']").val();M(t,{color:i},(function(){p();$(e.add_column_form).css({display:"block",position:"fixed",left:n.offset().left+n.outerWidth(true)-$(e.add_column_form).outerWidth(true),top:n.offset().top+n.outerHeight(true)})}))}));$("#kanban-add-dropdown li").on("click",(function(a){a.preventDefault();var n=$(a.target);var t=n.parent();var i=$($(t.data("trigger-button")).closest(".kanban-column"));var o=n.prop("id").split("-")[2];e.clearAddItemForms(i);e.showAddItemForm(i,o);E()}));$("#kanban-bulk-add-dropdown li").on("click",(function(a){a.preventDefault();var n=$(a.target);var t=n.closest(".kanban-dropdown");var i=$($(t.data("trigger-button")).closest(".kanban-column"));var o=n.prop("id").split("-")[3];t.css({display:"none"});e.clearAddItemForms(i);e.showBulkAddItemForm(i,o);E()}));var t=$("select[name='kanban-board-switcher']").first();$(e.element+" .kanban-toolbar").on("select2:select",t,(function(a){var n=a.params.data.id;$.ajax({type:"GET",url:e.ajax_root+"kanban.php",data:{action:"get_url",itemtype:e.item.itemtype,items_id:n},contentType:"application/json",success:function(e){window.location=e}})}));$(e.element).on("input",".kanban-add-form input, .kanban-add-form textarea",(function(){E()}));if(!e.allow_order_card){$(e.element).on("mouseenter",".kanban-column",(function(){if(e.is_sorting_active){return}$(this).find(".kanban-body > li").removeClass("temporarily-readonly");$(this).siblings().find(".kanban-body > li").addClass("temporarily-readonly")}));$(e.element).on("mouseleave",".kanban-column",(function(){if(e.is_sorting_active){return}$(e.element).find(".kanban-body > li").removeClass("temporarily-readonly")}))}$(e.element+" .kanban-container").on("submit",".kanban-add-form",(function(a){a.preventDefault();var n=$(a.target);var t={};t["inputs"]=n.serialize();t["itemtype"]=n.prop("id").split("_")[2];t["action"]="add_item";$.ajax({method:"POST",url:e.ajax_root+"kanban.php",data:t}).done((function(){e.refresh()}))}))};var p=function(){var a=[];$(e.element+" .kanban-columns .kanban-column").each((function(){var e=this.id.split("-");a.push(e[e.length-1])}));var n=$(e.add_column_form);var t=$(e.element+" .kanban-toolbar");$.ajax({method:"GET",url:e.ajax_root+"kanban.php",data:{action:"list_columns",itemtype:e.item.itemtype,column_field:e.column_field.id}}).done((function(i){var o=$(e.add_column_form+" .kanban-item-content");o.empty();o.append("<input type='text' name='column-name-filter' placeholder='"+__("Search")+"'/>");var r="<ul class='kanban-columns-list'>";$.each(i,(function(e,n){var t="<li data-list-id='"+e+"'>";if(a.includes(e)){t+="<input type='checkbox' checked='true'/>"}else{t+="<input type='checkbox'/>"}t+="<span class='kanban-color-preview' style='background-color: "+n["header_color"]+"'></span>";t+=n["name"]+"</li>";r+=t}));r+="</ul>";o.append(r);o.append();n.css({display:"block",position:"fixed",left:t.offset().left+t.outerWidth(true)-n.outerWidth(true),top:t.offset().top+t.outerHeight(true)})}))};var _=function(){var a=$(e.element+" .kanban-body");$.each(a,(function(e){var a=$(e);if(a.data("sortable")){a.sortable("destroy")}}));a.sortable({connectWith:".kanban-body",containment:".kanban-container",appendTo:".kanban-container",items:".kanban-item:not(.readonly):not(.temporarily-readonly)",placeholder:"sortable-placeholder",start:function(a,n){e.is_sorting_active=true;var t=n.item;var i=t.closest(".kanban-column").attr("id");t.data("source-col",i);t.data("source-pos",t.index())},update:function(a,n){if(this===n.item.parent()[0]){return e.onKanbanCardSort(n,this)}},change:function(a,n){var t=n.item;var i=t.data("source-col");var o=t.data("source-pos");var r=n.placeholder.closest(".kanban-column").attr("id");var l=$("#"+r+' ul.ui-sortable > li:not([id="'+t.attr("id")+'"])');var s=l.index(n.placeholder);t.data("current-pos",s);if(!e.allow_order_card){if(r===i){if(s!==o){n.placeholder.addClass("invalid-position")}else{n.placeholder.removeClass("invalid-position")}}else{if(!$(n.placeholder).is(":last-child")){n.placeholder.addClass("invalid-position")}else{n.placeholder.removeClass("invalid-position")}}}},stop:function(a,n){e.is_sorting_active=false;n.item.closest(".kanban-column").trigger("mouseenter")}});if(e.allow_modify_view){$(e.element+" .kanban-columns").sortable({connectWith:e.element+" .kanban-columns",appendTo:".kanban-container",items:".kanban-column:not(.kanban-protected)",placeholder:"sortable-placeholder",handle:".kanban-column-header",tolerance:"pointer",stop:function(e,a){var n=$(a.item[0]);y(r(a.item[0]),n.index())}});$(e.element+" .kanban-columns .kanban-column:not(.kanban-protected) .kanban-column-header").addClass("grab")}};var v=function(a){var n="<span class='kanban-column-toolbar'>";var t=parseInt(r(a["id"]));if(e.allow_add_item&&(e.limit_addcard_columns.length===0||e.limit_addcard_columns.includes(t))){n+="<i id='kanban_add_"+a["id"]+"' class='kanban-add pointer fas fa-plus' title='"+__("Add")+"'></i>";n+="<i id='kanban_overflow_actions' class='kanban-overflow-actions pointer fas fa-ellipsis-h' title='"+__("More")+"'></i>"}n+="</span>";return n};this.hideEmpty=function(){var e=$(".kanban-body");e.each((function(e,a){if(a.childElementCount===0){a.parentElement.style.display="none"}}))};this.showEmpty=function(){var e=$(".kanban-column");e.each((function(e,a){a.style.display="block"}))};this.onKanbanCardSort=function(a,n){var t=n.parentElement;var i=$(a.sender);var o=$(a.item[0]);var r=o.attr("id").split("-");var l=$(t).attr("id").split("-");var s=l[l.length-1];if(r.length===2&&i!==null&&!(!e.allow_order_card&&i.length===0)){$.ajax({type:"POST",url:e.ajax_root+"kanban.php",data:{action:"update",itemtype:r[0],items_id:r[1],column_field:e.column_field.id,column_value:s},contentType:"application/json",error:function(){$(n).sortable("cancel");return false},success:function(){var a=o.data("current-pos");if(!e.allow_order_card){o.appendTo($(t).find(".kanban-body").first());a=o.index()}e.updateColumnCount($(i).closest(".kanban-column"));e.updateColumnCount($(t).closest(".kanban-column"));o.removeData("source-col");b(o.attr("id"),t.id,a);return true}})}else{$(n).sortable("cancel");return false}};var b=function(a,n,t,i,o){if(typeof n==="string"&&n.lastIndexOf("column",0)===0){n=r(n)}$.ajax({type:"POST",url:e.ajax_root+"kanban.php",data:{action:"move_item",card:a,column:n,position:t,kanban:e.item},contentType:"application/json",error:function(){if(i){i()}},success:function(){if(o){o()}}})};var h=function(a){$.ajax({type:"POST",url:e.ajax_root+"kanban.php",data:{action:"show_column",column:a,kanban:e.item},contentType:"application/json",complete:function(){$.each(e.user_state.state,(function(n,t){if(parseInt(t["column"])===parseInt(a)){e.user_state.state[n]["visible"]=true;return false}}));U(a,false,true);$(e.element+" .kanban-add-column-form li[data-list-id='"+a+"']").prop("checked",true)}})};var k=function(a){$.ajax({type:"POST",url:e.ajax_root+"kanban.php",data:{action:"hide_column",column:a,kanban:e.item},contentType:"application/json",complete:function(){$(o(a)).remove();$.each(e.user_state.state,(function(n,t){if(parseInt(t["column"])===parseInt(a)){e.user_state.state[n]["visible"]=false;return false}}));$(e.element+" .kanban-add-column-form li[data-list-id='"+a+"']").prop("checked",false)}})};var y=function(a,n){$.ajax({type:"POST",url:e.ajax_root+"kanban.php",data:{action:"move_column",column:a,position:n,kanban:e.item},contentType:"application/json"})};var g=function(a){var n=a["itemtype"];var t=a["items_id"];if(e.team_badge_cache[n]===undefined||e.team_badge_cache[n][t]===undefined){if(n==="User"){var i=null;$.ajax({url:e.ajax_root+"getUserPicture.php",async:false,data:{users_id:[t],size:e.team_image_size},contentType:"application/json",dataType:"json"}).done((function(e){if(e[t]!==undefined){i=e[t]}else{i=null}}));if(i){e.team_badge_cache[n][t]="<span>"+i+"</span>"}else{e.team_badge_cache[n][t]=T(a)}}else{switch(n){case"Group":e.team_badge_cache[n][t]=C(a,"fa-users");break;case"Supplier":e.team_badge_cache[n][t]=C(a,"fa-briefcase");break;case"Contact":e.team_badge_cache[n][t]=C(a,"fa-user");break;default:e.team_badge_cache[n][t]=C(a,"fa-user")}}}return e.team_badge_cache[n][t]};var w=function(a){var n=[];$.each(e.columns,(function(a,t){if(t["items"]!==undefined){$.each(t["items"],(function(a,t){if(t["_team"]!==undefined){Object.values(t["_team"]).slice(0,e.max_team_images).forEach((function(a){if(a["itemtype"]==="User"){if(e.team_badge_cache["User"][a["items_id"]]===undefined){n[a["items_id"]]=a}}}))}}))}}));if(n.length===0){return}$.ajax({url:e.ajax_root+"getUserPicture.php",async:false,data:{users_id:Object.keys(n),size:e.team_image_size},contentType:"application/json",dataType:"json"}).done((function(t){Object.keys(n).forEach((function(a){var i=n[a];if(t[a]!==undefined){e.team_badge_cache["User"][a]="<span>"+t[a]+"</span>"}else{e.team_badge_cache["User"][a]=T(i)}}));if(a!==undefined&&a["trim_cache"]!==undefined){var i=JSON.parse(window.sessionStorage.getItem("badge_colors"));Object.keys(e.team_badge_cache["User"]).forEach((function(a){if(n[a]===undefined){delete e.team_badge_cache["User"][a];delete i["User"][a]}}));window.sessionStorage.setItem("badge_colors",JSON.stringify(i))}}))};var x=function(e,a,n){var t,i,o;if(a===0){t=i=o=n}else{var r=function e(a,n,t){if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return a+(n-a)*6*t;if(t<1/2)return n;if(t<2/3)return a+(n-a)*(2/3-t)*6;return a};var l=n<.5?n*(1+a):n+a-n*a;var s=2*n-l;t=r(s,l,e+1/3);i=r(s,l,e);o=r(s,l,e-1/3)}t=("0"+(t*255).toString(16)).substr(-2);i=("0"+(i*255).toString(16)).substr(-2);o=("0"+(o*255).toString(16)).substr(-2);return"#"+t+i+o};var j=function(a){var n=JSON.parse(window.sessionStorage.getItem("badge_colors"));var t=a["itemtype"];var i=Math.random();var o=Math.random()*10+(e.dark_theme?25:70);var r=x(i,1,o/100);if(n!==null&&n[t]!==null&&n[t][a["id"]]){r=n[t][a["id"]]}else{if(n===null){n={User:{},Group:{},Supplier:{},Contact:{}}}n[t][a["id"]]=r;window.sessionStorage.setItem("badge_colors",JSON.stringify(n))}return r};var T=function(a){var n="";if(a["firstname"]){n+=a["firstname"][0]}if(a["realname"]){n+=a["realname"][0]}n=n.toUpperCase();if(n.length===0){return C(a,"fa-user")}var t=document.createElement("canvas");t.width=e.team_image_size;t.height=e.team_image_size;var i=t.getContext("2d");i.strokeStyle="#f1f1f1";i.fillStyle=j(a);i.beginPath();i.arc(e.team_image_size/2,e.team_image_size/2,e.team_image_size/2,0,2*Math.PI);i.fill();i.fillStyle=e.dark_theme?"white":"black";i.textAlign="center";i.font="bold "+e.team_image_size/2+"px sans-serif";i.textBaseline="middle";i.fillText(n,e.team_image_size/2,e.team_image_size/2);var o=t.toDataURL("image/png");return"<span><img src='"+o+"' title='"+a["name"]+"'/></span>"};var C=function(a,n){var t=j(a);return"<span class='fa-stack fa-lg' style='font-size: "+e.team_image_size/2+"px'> <i class='fas fa-circle fa-stack-2x' style='color: "+t+"' title='"+a["name"]+"'></i> <i class='fas "+n+" fa-stack-1x' title='"+a["name"]+"'></i> </span>"};var S=function(a){var n=document.createElement("canvas");n.width=e.team_image_size;n.height=e.team_image_size;var t=n.getContext("2d");t.strokeStyle="#f1f1f1";var i=e.dark_theme?40:80;t.fillStyle="hsl(255, 0%,"+i+"%,1)";t.beginPath();t.arc(e.team_image_size/2,e.team_image_size/2,e.team_image_size/2,0,2*Math.PI);t.fill();t.fillStyle=e.dark_theme?"white":"black";t.textAlign="center";t.font="bold "+e.team_image_size/2+"px sans-serif";t.textBaseline="middle";t.fillText("+"+a,e.team_image_size/2,e.team_image_size/2);var o=n.toDataURL("image/png");return"<span><img src='"+o+"' title='"+__("%d other team members").replace("%d",a)+"'/></span>"};var O=function(e){var a=e.substring(1);var n=parseInt(a,16);var t=n>>16&255;var i=n>>8&255;var o=n>>0&255;var r=.2126*t+.7152*i+.0722*o;return r>110};this.updateColumnCount=function(e){if(!(e instanceof jQuery)){e=$(e)}var a=$(e).find(".kanban-body:first");var n=$(e).find(".kanban_nb:first");var t=a.find("li:not(.filtered-out)");n.text(t.length)};this.clearAddItemForms=function(e){if(!(e instanceof jQuery)){e=$(e)}e.find("form").remove()};this.showAddItemForm=function(a,n){if(!(a instanceof jQuery)){a=$(a)}var t=Math.floor(Math.random()*999999);var i="form_add_"+n+"_"+t;var o="<form id='"+i+"' class='kanban-add-form kanban-form no-track'>";var r="<div class='kanban-item-header'>";r+="<span class='kanban-item-title'>"+e.supported_itemtypes[n]["name"]+"</span>";r+="<i class='fas fa-times' title='Close' onclick='$(this).parent().parent().remove()'></i></div>";o+=r;o+="<div class='kanban-item-content'>";$.each(e.supported_itemtypes[n]["fields"],(function(e,a){var n=a["type"]!==undefined?a["type"]:"text";var t=a["value"]!==undefined?a["value"]:"";if(n.toLowerCase()==="textarea"){o+="<textarea name='"+e+"'";if(a["placeholder"]!==undefined){o+=" placeholder='"+a["placeholder"]+"'"}if(t!==undefined){o+=" value='"+t+"'"}o+="></textarea>"}else if(n.toLowerCase()==="raw"){o+=t}else{o+="<input type='"+n+"' name='"+e+"'";if(a["placeholder"]!==undefined){o+=" placeholder='"+a["placeholder"]+"'"}if(t!==undefined){o+=" value='"+t+"'"}o+="/>"}}));o+="</div>";var l=a.prop("id").split("-");var s=l[l.length-1];o+="<input type='hidden' name='"+e.column_field.id+"' value='"+s+"'/>";o+="<input type='submit' value='"+__("Add")+"' name='add' class='submit'/>";o+="</form>";$(a.find(".kanban-body")[0]).append(o);$("#"+i).get(0).scrollIntoView(false)};this.showBulkAddItemForm=function(a,n){if(!(a instanceof jQuery)){a=$(a)}var t=Math.floor(Math.random()*999999);var i="form_add_"+n+"_"+t;var o="<form id='"+i+"' class='kanban-add-form kanban-form no-track'>";var r="<div class='kanban-item-header'>";r+="<span class='kanban-item-title'>"+e.supported_itemtypes[n]["name"]+"</span>";r+="<i class='fas fa-times' title='Close' onclick='$(this).parent().parent().remove()'></i>";r+='<div><span class="kanban-item-subtitle">'+__("One item per line")+"</span></div></div>";o+=r;o+="<div class='kanban-item-content'>";o+="<textarea name='bulk_item_list'></textarea>";$.each(e.supported_itemtypes[n]["fields"],(function(e,a){var n=a["type"]!==undefined?a["type"]:"text";var t=a["value"]!==undefined?a["value"]:"";if(n==="hidden"){o+="<input type='hidden' name='"+e+"'";if(t!==undefined){o+=" value='"+t+"'"}o+="/>"}}));o+="</div>";var l=a.prop("id").split("-");var s=l[l.length-1];o+="<input type='hidden' name='"+e.column_field.id+"' value='"+s+"'/>";o+="<input type='submit' value='"+__("Add")+"' name='add' class='submit'/>";o+="</form>";$(a.find(".kanban-body")[0]).append(o);$("#"+i).get(0).scrollIntoView(false);$("#"+i).on("submit",(function(a){a.preventDefault();var n=$(a.target);var t={};t["inputs"]=n.serialize();t["itemtype"]=n.prop("id").split("_")[2];t["action"]="bulk_add_item";$.ajax({method:"POST",url:e.ajax_root+"kanban.php",data:t}).done((function(){$("#"+i).remove();e.refresh()}))}))};var I=function(){var a=Math.floor(Math.random()*999999);var n="form_add_column_"+a;e.add_column_form="#"+n;var t="<div id='"+n+"' class='kanban-form kanban-add-column-form' style='display: none'>";t+="<form class='no-track'>";var i="<div class='kanban-item-header'>";i+="<span class='kanban-item-title'>"+__("Add a column from existing status")+"</span></div>";t+=i;t+="<div class='kanban-item-content'></div>";if(e.allow_create_column){t+="<hr>"+__("Or add a new status");t+="<input type='button' class='submit kanban-create-column' value='"+__("Create status")+"'/>"}t+="</form></div>";$(e.element).prepend(t)};var z=function(){var a=Math.floor(Math.random()*999999);var n="form_create_column_"+a;e.create_column_form="#"+n;var t="<div id='"+n+"' class='kanban-form kanban-create-column-form' style='display: none'>";t+="<form class='no-track'>";var i="<div class='kanban-item-header'>";i+="<span class='kanban-item-title'>"+__("Create status")+"</span></div>";t+=i;t+="<div class='kanban-item-content'>";t+="<input name='name'/>";$.each(e.column_field.extra_fields,(function(e,a){if(e===undefined){return true}var n=a.value!==undefined?a.value:"";if(a.type===undefined||a.type==="text"){t+="<input name='"+e+"' value='"+n+"'/>"}else if(a.type==="color"){if(n.length===0){n="#000000"}t+="<input type='color' name='"+e+"' value='"+n+"'/>"}}));t+="</div>";t+="<input type='button' class='submit kanban-create-column' value='"+__("Create status")+"'/>";t+="</form></div>";$(e.element).prepend(t)};var E=function(){window.setTimeout(a,1e4)};this.refresh=function(a,n,t,i){var o=function(){$.ajax({method:"GET",url:e.ajax_root+"kanban.php",data:{action:"refresh",itemtype:e.item.itemtype,items_id:e.item.items_id,column_field:e.column_field.id},contentType:"application/json",dataType:"json"}).done((function(n,t,i){w({trim_cache:true});u();e.columns=n;f();e.filter();if(a){a(n,t,i)}})).fail((function(e,a,t){if(n){n(e,a,t)}})).always((function(){if(t){t()}}))};if(i===undefined||i===true){o()}else{D(false,false,null,null,(function(){L(o)}))}};var P=function(a,n,t,i){if(t==null){t=$(e.element+" .kanban-container .kanban-columns").first()}i=i!==undefined?i:false;n["id"]="column-"+e.column_field.id+"-"+a;var o="";var r=-1;$.each(e.user_state.state,(function(e,n){if(parseInt(n["column"])===parseInt(a)){r=e;if(n["folded"]===true||n["folded"]==="true"){o="collapsed";return false}}}));var l=n["_protected"]?"kanban-protected":"";var s="kanban-column "+o+" "+l;var c=typeof n["header_color"]!=="undefined"?n["header_color"]:"transparent";var d="<div id='"+n["id"]+"' style='border-top: 5px solid "+c+"' class='"+s+"'></div>";var u=null;if(r<0){u=$(d).appendTo(t)}else{var f=$(t).find(".kanban-column:nth-child("+r+")");if(f.length===1){u=$(d).insertAfter(f)}else{u=$(d).appendTo(t)}}var m=n["items"]!==undefined?n["items"]:[];var p=n["header_color"];var b=p?O(p):!e.dark_theme;var h=b?"kanban-text-dark":"kanban-text-light";var k=$("<header class='kanban-column-header'></header>");var y=$("<div class='kanban-column-header-content'></div>").appendTo(k);var g=n["items"]!==undefined?n["items"].length:0;var w=$("<span class=''></span>").appendTo(y);var x=$("<span class=''></span>").appendTo(y);if(e.allow_modify_view){$(w).append("<i class='fas fa-caret-right fa-lg kanban-collapse-column pointer' title='"+__("Toggle collapse")+"'/>")}$(w).append("<span class='kanban-column-title "+h+"' style='background-color: "+n["header_color"]+";'>"+n["name"]+"</span></span>");$(x).append("<span class='kanban_nb'>"+g+"</span>");$(x).append(v(n));$(u).prepend(k);$("<ul class='kanban-body'></ul>").appendTo(u);var j=[];$.each(e.user_state.state,(function(e,n){if(n["column"]===a){$.each(n["cards"],(function(e,a){$.each(m,(function(e,n){if(n["id"]===a){A(u,n);j.push(n["id"]);return false}}))}))}}));$.each(m,(function(e,a){if(j.indexOf(a["id"])<0){A(u,a,i)}}));_()};var A=function(a,n,t){if(t){var i=$("#"+n["id"]);if(i!==undefined){var o=i.closest(".kanban-column");i.remove();e.updateColumnCount(o)}}var r=$(a).find(".kanban-body").first();var l=n["_readonly"]!==undefined&&(n["_readonly"]===true||n["_readonly"]===1);var s="<li id='"+n["id"]+"' class='kanban-item "+(l?"readonly":"")+"'>";s+="<div class='kanban-item-header'>"+n["title"]+"</div>";s+="<div class='kanban-item-content'>"+(n["content"]||"")+"</div>";s+="<div class='kanban-item-team'>";if(n["_team"]!==undefined&&Object.values(n["_team"]).length>0){$.each(Object.values(n["_team"]).slice(0,e.max_team_images),(function(e,a){s+=g(a)}));if(n["_team"].length>e.max_team_images){s+=S(n["_team"].length-e.max_team_images)}}s+="</div>";s+="</li>";$(s).appendTo(r);e.updateColumnCount(a)};this.clearFiltered=function(){$(e.element+" .kanban-item").each((function(e,a){$(a).removeClass("filtered-out")}))};this.filter=function(){e.clearFiltered();$(e.element+" .kanban-item").each((function(a,n){var t=$(n).find(".kanban-item-header a").text();try{if(!t.match(new RegExp(e.filters._text,"i"))){$(n).addClass("filtered-out")}}catch(a){if(!t.toLowerCase().includes(e.filters._text.toLowerCase())){$(n).addClass("filtered-out")}}}));$(e.element+" .kanban-column").each((function(a,n){e.updateColumnCount(n)}))};this.toggleCollapseColumn=function(a){if(!(a instanceof jQuery)){a=$(a)}a.toggleClass("collapsed");var n=a.hasClass("collapsed")?"collapse_column":"expand_column";$.ajax({type:"POST",url:e.ajax_root+"kanban.php",data:{action:n,column:r(a),kanban:e.item},contentType:"application/json"})};var U=function(a,n,t,i){n=n!==undefined?n:false;var o=false;$.each(e.user_state.state,(function(e,n){if(parseInt(n["column"])===parseInt(a)){if(!n["visible"]){o=true}return false}}));if(o){if(i){i()}return}$.ajax({method:"GET",url:e.ajax_root+"kanban.php",contentType:"application/json",dataType:"json",async:false,data:{action:"get_column",itemtype:e.item.itemtype,items_id:e.item.items_id,column_field:e.column_field.id,column_id:a}}).done((function(n){if(n!==undefined){e.columns[a]=n[a];P(a,e.columns[a],null,t)}})).always((function(){if(i){i()}}))};var M=function(a,n,t){if(a===undefined||a.length===0){if(t){t()}return}$.ajax({method:"POST",url:e.ajax_root+"kanban.php",contentType:"application/json",dataType:"json",data:{action:"create_column",itemtype:e.item.itemtype,items_id:e.item.items_id,column_field:e.column_field.id,column_name:a,params:n}}).always((function(){if(t){t()}}))};var G=function(){var a={is_dirty:true,state:{}};$(e.element+" .kanban-column").each((function(n,t){var i=$(t);var o=i.prop("id").split("-");var r=o[o.length-1];if(e.user_state.state[n]===undefined||r!==e.user_state.state[n]["column"]||e.user_state.state[n]["folded"]!==i.hasClass("collapsed")){a.is_dirty=true}a.state[n]={column:r,folded:i.hasClass("collapsed"),cards:{}};$.each(i.find(".kanban-item"),(function(t,i){a.state[n]["cards"][t]=$(i).prop("id");if(e.user_state.state[n]!==undefined&&e.user_state.state[n]["cards"]!==undefined&&e.user_state.state[n]["cards"][t]!==undefined&&e.user_state.state[n]["cards"][t]!==a.state[n]["cards"][t]){a.is_dirty=true}}))}));e.user_state=a};var L=function(a){$.ajax({type:"GET",url:e.ajax_root+"kanban.php",data:{action:"load_column_state",itemtype:e.item.itemtype,items_id:e.item.items_id,last_load:e.last_refresh},contentType:"application/json"}).done((function(n){if(n["state"]===undefined||n["state"]===null||Object.keys(n["state"]).length===0){if(a){a(false)}return}e.user_state={is_dirty:false,state:n["state"]};var t=Object.keys(n["state"]);for(var i=0;i<t.length;i++){var o=t[i];var r=n["state"][o];var l=$("#column-"+e.column_field.id+"-"+r.column);if(l.length===0){U(r.column,true,false)}$(e.element+" .kanban-columns .kanban-column:nth-child("+o+")").after(l);if(r.folded==="true"){l.addClass("collapsed")}}e.last_refresh=n["timestamp"];if(a){a(true)}}))};var D=function(a,n,t,i,o){a=a!==undefined?a:false;if(!n&&!e.user_state.is_dirty){if(o){o()}return}if(a){G()}if(e.user_state.state===undefined||e.user_state.state===null||Object.keys(e.user_state.state).length===0){if(o){o()}return}$.ajax({type:"POST",url:e.ajax_root+"kanban.php",data:{action:"save_column_state",itemtype:e.item.itemtype,items_id:e.item.items_id,state:e.user_state.state},contentType:"application/json"}).done((function(a,n,i){e.user_state.is_dirty=false;if(t){t(a,n,i)}})).fail((function(e,a,n){if(i){i(e,a,n)}})).always((function(){if(o){o()}}))};var F=function(){if(e.background_refresh_interval<=0){return}a=function(){var n=$(".ui-sortable-helper");if(n.length>0){E();return}e.refresh(null,null,(function(){window.setTimeout(a,e.background_refresh_interval*60*1e3)}),false)};window.setTimeout(a,e.background_refresh_interval*60*1e3)};this.init=function(){L((function(){t();$(document).ready((function(){$.ajax({type:"GET",url:e.ajax_root+"kanban.php",data:{action:"get_switcher_dropdown",itemtype:e.item.itemtype,items_id:e.item.items_id},contentType:"application/json",success:function(a){var n=$(e.element+" .kanban-toolbar select[name='kanban-board-switcher']");n.replaceWith(a)}});m();F()}))}))};n(arguments)}})();