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("sidebar_menu_product", "sidebar_menu_product_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 = $(
"