var tableUrl = "/api/arms/pdjira/getMonitor.do"; var dataList = [ { data: "c_id" }, { data: "c_parentid" }, { data: "c_position" }, { data: "c_left" }, { data: "c_right" }, { data: "c_level" }, { data: "c_title" }, { data: "c_type" }, { data: "c_pdjira_detail" }, { data: "c_pdjira_con_name" }, { data: "c_pdjira_con_user" }, { data: "c_pdjira_con_pass" }, { data: "c_pdjira_con_token" }, { data: "c_pdjira_con_jql" }, { data: "jiraConPassMode" }, ]; $(function () { setSideMenu("jira_regist"); setTable(tableUrl, dataList); $("body").find("[aria-controls='jstreeTable']").css("width", "100px"); }); // --- jstree 설정 -- // function jsTreeClick(selectedNodeID) { console.log(selectedNodeID); } $(function () { pdServiceJsTreeBuild(); }); function pdServiceJsTreeBuild() { console.log("href: " + $(location).attr("href")); console.log("protocol: " + $(location).attr("protocol")); console.log("host: " + $(location).attr("host")); console.log("pathname: " + $(location).attr("pathname")); console.log("search: " + $(location).attr("search")); console.log("hostname: " + $(location).attr("hostname")); console.log("port: " + $(location).attr("port")); var isDevelopingToRoute = "/auth-user"; $("#pdServiceTree") .bind("before.jstree", function (e, data) { $("#alog").append(data.func + "
"); $("li:not([rel='drive']).jstree-open > a > .jstree-icon").css( "background-image", "url(http://www.a-rms.net/313devgrp/reference/jquery-plugins/jstree-v.pre1.0/themes/toolbar_open.png)" ); $("li:not([rel='drive']).jstree-closed > a > .jstree-icon").css( "background-image", "url(http://www.a-rms.net/313devgrp/reference/jquery-plugins/jstree-v.pre1.0/themes/ic_explorer.png)" ); }) .jstree({ // List of active plugins plugins: [ "themes", "json_data", "ui", "crrm", "cookies", "dnd", "search", "types", "hotkeys", "contextmenu", "checkbox", ], themes: { theme: ["lightblue4"] }, //contextmenu contextmenu: { items: { // Could be a function that should return an object like this one create: { separator_before: true, separator_after: true, label: "Create", action: false, submenu: { create_file: { seperator_before: false, seperator_after: false, label: "File", action: function (obj) { this.create(obj, "last", { attr: { rel: "default", }, }); }, }, create_folder: { seperator_before: false, seperator_after: false, label: "Folder", action: function (obj) { this.create(obj, "last", { attr: { rel: "folder", }, }); }, }, }, }, ccp: { separator_before: false, separator_after: true, label: "Edit", action: false, submenu: { cut: { seperator_before: false, seperator_after: false, label: "Cut", action: function (obj) { this.cut(obj, "last", { attr: { rel: "default", }, }); }, }, paste: { seperator_before: false, seperator_after: false, label: "Paste", action: function (obj) { this.paste(obj, "last", { attr: { rel: "folder", }, }); }, }, changeType: { seperator_before: false, seperator_after: false, label: "Change Type", submenu: { toFile: { seperator_before: false, seperator_after: false, label: "toFile", action: function (obj) { this.set_type("default"); }, }, toFolder: { seperator_before: false, seperator_after: false, label: "toFolder", action: function (obj) { this.set_type("folder"); }, }, }, }, }, }, }, }, // I usually configure the plugin that handles the data first // This example uses JSON as it is most common json_data: { // This tree is ajax enabled - as this is most common, and maybe a bit more complex // All the options are almost the same as jQuery's AJAX (read the docs) ajax: { // the URL to fetch the data url: isDevelopingToRoute + "/api/arms/pdservice/getChildNode.do", // the `data` function is executed in the instance's scope // the parameter is the node being loaded // (may be -1, 0, or undefined when loading the root nodes) data: function (n) { // the result is fed to the AJAX request `data` option console.log(n); return { c_id: n.attr ? n.attr("id").replace("node_", "").replace("copy_", "") : 1, }; }, success: function (n) { jSuccess("Product(service) Data Load Complete"); }, }, }, // Configuring the search plugin search: { // As this has been a common question - async search // Same as above - the `ajax` config option is actually jQuery's AJAX object ajax: { url: isDevelopingToRoute + "/api/arms/pdservice/searchNode.do", // You get the search string as a parameter data: function (str) { return { searchString: str, }; }, success: function (n) { jSuccess("search data complete"); }, }, }, // Using types - most of the time this is an overkill // read the docs carefully to decide whether you need types types: { // I set both options to -2, as I do not need depth and children count checking // Those two checks may slow jstree a lot, so use only when needed max_depth: -2, max_children: -2, // I want only `drive` nodes to be root nodes // This will prevent moving or creating any other type as a root node valid_children: ["drive"], types: { // The default type default: { // I want this type to have no children (so only leaf nodes) // In my case - those are files valid_children: "none", // If we specify an icon for the default type it WILL OVERRIDE the theme icons icon: { image: "../dist/js/jstree-v.pre1.0/themes/attibutes.png", }, }, // The `folder` type folder: { // can have files and other folders inside of it, but NOT `drive` nodes valid_children: ["default", "folder"], icon: { image: "../dist/js/jstree-v.pre1.0/themes/ic_explorer.png", }, }, // The `drive` nodes drive: { // can have files and folders inside, but NOT other `drive` nodes valid_children: ["default", "folder"], icon: { image: "../dist/js/jstree-v.pre1.0/themes/home.png", }, // those prevent the functions with the same name to be used on `drive` nodes // internally the `before` event is used start_drag: false, move_node: false, delete_node: false, remove: false, }, }, }, // UI & core - the nodes to initially select and open will be overwritten by the cookie plugin // the UI plugin - it handles selecting/deselecting/hovering nodes ui: { // this makes the node with ID node_4 selected onload initially_select: ["node_4"], }, // the core plugin - not many options here core: { // just open those two nodes up // as this is an AJAX enabled tree, both will be downloaded from the server initially_open: ["node_2", "node_3"], }, }) .bind("create.jstree", function (e, data) { $.post( isDevelopingToRoute + "/api/arms/pdservice/addNode.do", { ref: data.rslt.parent.attr("id").replace("node_", "").replace("copy_", ""), c_position: data.rslt.position, c_title: data.rslt.name, c_type: data.rslt.obj.attr("rel"), }, function (r) { if (r.status) { $(data.rslt.obj).attr("id", "node_" + r.id); jNotify("Notification : Add Node, Complete !"); } else { $.jstree.rollback(data.rlbk); } if (typeof Chat != "undefined") { Chat.sendMessage( "노드를 추가했습니다. 추가된 노드의 아이디는 " + r.id, function (data) { console.log(data); } ); } jsTreeBuild(); } ); }) .bind("remove.jstree", function (e, data) { data.rslt.obj.each(function () { $.ajax({ async: false, type: "POST", url: isDevelopingToRoute + "/api/arms/pdservice/removeNode.do", data: { c_id: this.id.replace("node_", "").replace("copy_", ""), }, success: function (r) { jNotify("Notification : Remove Node, Complete !"); if (typeof Chat != "undefined") { Chat.sendMessage( "노드를 삭제했습니다. 삭제된 노드의 아이디는 " + r.c_id, function (data) { console.log(data); } ); } jsTreeBuild(); }, }); }); }) .bind("rename.jstree", function (e, data) { $.post( isDevelopingToRoute + "/api/arms/pdservice/alterNode.do", { c_id: data.rslt.obj.attr("id").replace("node_", "").replace("copy_", ""), c_title: data.rslt.new_name, c_type: data.rslt.obj.attr("rel"), }, function (r) { if (!r.status) { $.jstree.rollback(data.rlbk); } jSuccess("Rename Node Complete"); if (typeof Chat != "undefined") { Chat.sendMessage( "노드를 변경했습니다. 변경된 노드의 아이디는 " + r.c_id, function (data) { console.log(data); } ); } jsTreeBuild(); } ); }) .bind("set_type.jstree", function (e, data) { $.post( isDevelopingToRoute + "/api/arms/pdservice/alterNodeType.do", { c_id: data.rslt.obj.attr("id").replace("node_", "").replace("copy_", ""), c_title: data.rslt.new_name, c_type: data.rslt.obj.attr("rel"), }, function (r) { jSuccess("Node Type Change"); if (typeof Chat != "undefined") { Chat.sendMessage( "노드를 변경했습니다. 변경된 노드의 아이디는 " + r.c_id, function (data) { console.log(data); } ); } jsTreeBuild(); } ); }) .bind("move_node.jstree", function (e, data) { data.rslt.o.each(function (i) { $.ajax({ async: false, type: "POST", url: isDevelopingToRoute + "/api/arms/pdservice/moveNode.do", data: { c_id: $(this).attr("id").replace("node_", "").replace("copy_", ""), ref: data.rslt.cr === -1 ? 1 : data.rslt.np.attr("id").replace("node_", "").replace("copy_", ""), c_position: data.rslt.cp + i, c_title: data.rslt.name, copy: data.rslt.cy ? 1 : 0, multiCounter: i, }, success: function (r) { if (r.status) { $.jstree.rollback(data.rlbk); } else { $(data.rslt.oc).attr("id", "node_" + r.id); if (data.rslt.cy && $(data.rslt.oc).children("UL").length) { data.inst.refresh(data.inst._get_parent(data.rslt.oc)); } } jNotify("Notification : Move Node Complete !"); if (typeof Chat != "undefined") { Chat.sendMessage( "노드가 이동되었습니다. 이동된 노드의 아이디는 " + r.c_id, function (data) { console.log(data); } ); } jsTreeBuild(); }, }); }); }) .bind("select_node.jstree", function (event, data) { // `data.rslt.obj` is the jquery extended node that was clicked if ($.isFunction(jsTreeClick)) { console.log(data.rslt.obj); jsTreeClick(data.rslt.obj.attr("id")); } }); $("#mmenu input, #mmenu button").click(function () { switch (this.id) { case "add_default": case "add_folder": $("#pdServiceTree").jstree("create", null, "last", { attr: { rel: this.id.toString().replace("add_", ""), }, }); break; case "search": $("#pdServiceTree").jstree("search", document.getElementById("text").value); break; case "text": break; default: $("#pdServiceTree").jstree(this.id); break; } }); } // --- select2 설정 --- // $(".js-data-example-ajax").select2({ ajax: { url: "https://api.github.com/search/repositories", dataType: "json", delay: 250, data: function (params) { return { q: params.term, // search term page: params.page, }; }, processResults: function (data, params) { // parse the results into the format expected by Select2 // since we are using custom formatting functions we do not need to // alter the remote JSON data, except to indicate that infinite // scrolling can be used params.page = params.page || 1; return { results: data.items, pagination: { more: params.page * 30 < data.total_count, }, }; }, cache: true, }, placeholder: "제품(서비스)의 Default 리뷰어를 등록해 주세요", minimumInputLength: 1, templateResult: formatRepo, templateSelection: formatRepoSelection, }); function formatRepo(repo) { if (repo.loading) { return repo.text; } var $container = $( "
" + "
" + "
" + "
" + "
" + "
" + "
" + "
" + "
" + "
" + "
" ); $container.find(".select2-result-repository__title").text(repo.full_name); $container .find(".select2-result-repository__description") .text(repo.description); $container .find(".select2-result-repository__forks") .append(repo.forks_count + " Forks"); $container .find(".select2-result-repository__stargazers") .append(repo.stargazers_count + " Stars"); $container .find(".select2-result-repository__watchers") .append(repo.watchers_count + " Watchers"); return $container; } function formatRepoSelection(repo) { return repo.full_name || repo.text; } // Code for the menu buttons