<!-- <script src="https://gsvlabs-confluence-files.s3-us-west-2.amazonaws.com/js/esg/addJudgeScript.js"> </script> -->
<script>
/*
ReadME:
This script can be added to any page to add in an "Add/Remove/View" judge entity. Made to be paired with the event page from confiform macro.
*/
// global variables for judge script
let judges_parent_container_selector = "#judgesetup-details-container";
let modal_parent_container_selector = "body";
let insert_tab = false;
let tab_container_selector = "";
let insert_stylesheets = ["https://gsvlabs-confluence-files.s3-us-west-2.amazonaws.com/stylesheets/ESG/addEventJudgeStyles.css"];
let arj_group_name = entryId + "-judges";
let event_page_url = window.location.origin + window.location.pathname + "#Watch"
// to do: add to confiform
let event_type_mapping = {
"CF": "City Finals",
"NF": "National Finals",
"CO": "Confederation Finals",
"GF": "Global Finals"
}
let event_type = "City Finals";
/* webhook dependencies */
let webhookAddExists = true;
let webhookAdd = "https://judging.esgx.global/rest/cb-automation/latest/hooks/8a157fe79319b1910d8997804ae78691705073bd";
let webhookRemoveExists = true;
let webhookRemove = "https://judging.esgx.global/rest/cb-automation/latest/hooks/04014b1a99e1ba40c6df9f7ff7c14b87515fe1c9";
let webhookJQL = jiraQuery;
/* MODAL FUNCTIONS */
const closeArjModal = (identifier) => {
// refresh form
refreshArjForm(identifier)
$(identifier).fadeOut();
}
// to do: disable button
const refreshArjForm = (identifier) => {
// reset response
$(identifier + " #arj-form-response-container").hide();
$("#arj-successful-img").hide();
$("#arj-form-response-text").text(" ");
$("#arj-form-response-text").hide();
$("#arj-form-response-btn").hide();
// reset form
$(identifier + " form")[0].reset();
// disable button
// show form
$(identifier + " form").show();
}
// to do: add fall back for entry id
const getForm = (form_type, user_display_name, username) => {
if(form_type === "add"){
return ` <h2 class="form-title fullSite" id="form-title-addjudgeglobalfinalists">Add New Judge</h2>
<form id="formaddeventjudge" class="add-user-form fullSite">
<input type="text" id="user_first_name" name="user_first_name" placeholder="First Name" required="" class="add-user-input fullSite">
<input type="text" id="user_last_name" name="user_last_name" placeholder="Last Name" required="" class="add-user-input fullSite">
<input type="text" id="user_email" name="email" placeholder="Email" required="" class="add-user-input fullSite">
<input type="hidden" name="groups" value="judge-users,${arj_group_name},event-judges" checked="" class="fullSite">
<input type="hidden" name="addUserType" value="judge" checked="" class="fullSite">
<input type="hidden" name="event_name" value="`+AJS.params.pageTitle+`" checked="" class="fullSite">
<input type="submit" id="form_submit_addjudgeglobalfinalists" name="Submit" class="pressbtn add-form-submit add-user-submit fullSite" value="Add Event Judge" disabled="disabled" >
</form>`
} else {
return `<h2 class="delete-text fullSite" id="remove-text-adminsremove">Are you sure you want to remove ${user_display_name}?</h2>
<div class="remove-button-container fullSite">
<button id="no-cancel-button-adminsremove" class="pressbtn modal-button fullSite" onclick="closeArjModal('#addremovejudge')" style="display: block;">No, Cancel</button>
<form id="user_form_deactivate_adminsremove" class="fullSite" style="display: block;">
<input class="hidden fullSite" value="${username}" type="text" id="remove_username_adminsremove" name="user_email" placeholder="Email" required="">
<input type="hidden" id="remove_groups_adminsremove" name="groups" class="fullSite" value="${arj_group_name}">
<input type="submit" class="pressbtn modal-button delete-submit-button fullSite" name="Submit" value="Yes, Delete">
</form>
</div>
`
}
}
const insertModal = () => {
let modal_html = `
<div id="addremovejudge" class="arj-modal-overlay" style="display: none;">
<div class="arj-modal-content">
<div class="arj-invitation">
<span class="arj-closeModalBtn" onclick="closeArjModal('#addremovejudge')">X</span>
<div id="modal-content-container"> </div>
<div id="modal-waiting-container" style="display:none;"><div class="loader fullSite" id="modal-loader" style="margin: 65px auto;"> </div></div>
<div id="arj-form-response-container" style="display:none" class="arj-form-response-container">
<img id="arj-successful-img" class="arj-successful-img" style="display: none;" src="https://passport-media.s3-us-west-1.amazonaws.com/ESG/judgingdashboard/successful_invite-ESG.png">
<p id="arj-form-response-text" style="display: none;" class="arj-form-response-text"> </p>
<button id="arj-form-response-btn" style="display: none;" class="arj-pressbtn arj-modal-button arj-form-response-button" onclick="refreshArjForm('#addremovejudge')">Refresh Form</button>
</div>
</div>
</div>
</div>`
return modal_html;
}
const openArjModal = (modal_type, user_display_name, username) => {
let modal_form = getForm(modal_type, user_display_name, username);
$("#modal-content-container").html(modal_form)
$("#formaddeventjudge").submit(function(e){ console.log("in jquery submit"); e.preventDefault(); handleAddForm(); })
$("#user_form_deactivate_adminsremove").submit(function(e){ console.log("in jquery submit remove"); e.preventDefault(); handleRemoveForm(); })
/* form validation */
$('#formaddeventjudge').on('click keyup' ,function() {
var empty = false;
$('#formaddeventjudge > input').each(function() {
if ($(this)[0].required && $(this).val() == '') {
empty = true;
}
});
if (empty) {
$('#form_submit_addjudgeglobalfinalists').attr('disabled', 'disabled');
} else {
$('#form_submit_addjudgeglobalfinalists').removeAttr('disabled');
}
});
/* end form validation */
$("#addremovejudge").show();
}
/* END MODAL FUNCTIONS */
/* CONTENT FUNCTIONS */
const insertARJHTML = () => {
let arj_skeleton = `
<div class="arj-container">
<h2>Event Judges</h2>
<div class="arj-button" onclick="openArjModal('add')">Add Judge</div>
<div id="arj-judges">
</div>
</div>
`;
return arj_skeleton;
}
const generateARJJudgeHTML = (judge) => {
let judge_html = "";
var button_html =
`<div class="fixed-button-container arj-fixed-button-container" onclick="openArjModal('remove', '`+judge.displayName+`', '`+judge.username+`')" data-remove_groups="${arj_group_name}" data-username="`+judge.username+`" data-displayname="`+judge.displayName+`">
<img src="https://passport-media.s3-us-west-1.amazonaws.com/ESG/judgingdashboard/trash-ESG.png"/>
</div>`;
judge_html +=
`<div class="judging-card-container arj-card">
<div class="image-container arj-card-image-container">
<a href="#">
<p class="judging-card-subtitle arj-card-subtitle">`+ judge.displayName +`</p></a>` + button_html + `
</div>
</div>`
return judge_html;
}
const getARJJudges = async () => {
res = "";
res = await jQuery.ajax({
url: "/rest/api/group/"+arj_group_name+"/member?",
type: "get",
dataType: 'json',
async: true
}).then(res => res);
res = res.results;
return res;
}
const insertARJJudges = async () => {
let arj_judges_html = '';
if(arj_group_name){
// get judges in entry ID group
let arj_judges_arr = await getARJJudges();
console.log(arj_judges_arr)
for(var i = 0; i < arj_judges_arr.length; i++){
arj_judges_html += generateARJJudgeHTML(arj_judges_arr[i]);
}
}
return arj_judges_html;
}
/* END CONTENT FUNCTIONS */
/* FORM SUBMIT FUNCTIONS */
const addJudge = async (judge_info) => {
// let judge_info_obj = {
// "fullname": "Fareeha Ahmed", "email" : "fareeha@gsvlabs.com", "event_name": "Delhi City Finals", "group" : ["judge-users"], "addUserType":"judge"
// }
console.log("add judge initiated", judge_info)
res = await jQuery.ajax({
url: "/rest/scriptrunner/latest/custom/addEventJudge",
headers: {
"X-Atlassian-Token": "nocheck",
"Content-type": "application/json",
},
type: "POST",
dataType: "json",
data: JSON.stringify(judge_info),
async: true
}).then(res => res);
return res;
}
const removeJudge = async (judge_info) => {
// let judge_info = {"username":"95far.eeha@gmail.com", "group" : ["b3d465e0-cc9b-4ee9-b83f-5aeb78493f3e-judges"]}
console.log("remove judge initiated", judge_info)
res = await jQuery.ajax({
url: "/rest/scriptrunner/latest/custom/removeEventJudge",
headers: {
"X-Atlassian-Token": "nocheck",
"Content-type": "application/json",
},
type: "POST",
dataType: "json",
data: JSON.stringify(judge_info),
async: true
}).then(res => res);
return res;
}
const triggerWebhook = async (url, webhookData) => {
// let url = "https://judging.esgx.global/rest/cb-automation/latest/hooks/8a157fe79319b1910d8997804ae78691705073bd"
// let webhookData = {"eventType" : "City Finals", "jiraQuery": jiraQuery, "email": "fareeha@gsvlabs.com", "fullname": "Fareeha Ahmed"} (for add)
console.log("webhook initiated", webhookData);
res = await jQuery.ajax({
url: "/rest/scriptrunner/latest/custom/pingJiraWebhook",
headers: {
"X-Atlassian-Token": "nocheck",
"Content-type": "application/json",
},
type: "POST",
dataType: "json",
data: JSON.stringify({url, webhookData}),
async: true
}).then(res => res);
console.log("webhook res", res);
return res;
}
const handleAddForm = async () => {
console.log("handle add form called")
// show loading indicator & hide form
$("#formaddeventjudge").hide();
$("#modal-waiting-container").show();
// format data
let formInputArr = $("#formaddeventjudge").serializeArray();
let formInputObj = {};
for(var i = 0; i < formInputArr.length; i++){
obj_name = formInputArr[i].name;
formInputObj[obj_name] = formInputArr[i].value;
}
formInputObj.fullname = formInputObj["user_first_name"] + " " + formInputObj["user_last_name"];
formInputObj.group = formInputObj["groups"].split(",");
formInputObj.event_page_url = event_page_url;
console.log("right before adding", formInputObj)
// run add
await addJudge(formInputObj).then(async res => {
console.log("returned", res)
// hide loading indicator
$("#modal-waiting-container").hide();
// set response
$("#arj-successful-img").show();
$("#arj-form-response-text").text("Judge has been added successfully.");
$("#arj-form-response-text").show();
$("#arj-form-response-container").show();
setTimeout(function(){
closeArjModal('#addremovejudge');
}, 1000);
let arj_judges_html = await insertARJJudges();
$("#arj-judges").html(arj_judges_html);
if(webhookAddExists){
// trigger webhook
formInputObj.eventType = event_type;
formInputObj.jiraQuery = webhookJQL;
triggerWebhook(webhookAdd, formInputObj);
}
// hide loading indicator, show message, close modal, refresh users
}).catch(err => {
console.log(err)
$("#modal-waiting-container").hide();
$("#arj-form-response-text").text("Oops, something went wrong.");
$("#arj-form-response-text").show();
$("#arj-form-response-container").show();
$("#arj-form-response-btn").show();
});
return false;
}
const handleRemoveForm = async () => {
console.log("handle remove form called")
// show loading indicator & hide form
$(".remove-button-container").hide();
$("#modal-waiting-container").show();
// format data
let formInputArr = $("#user_form_deactivate_adminsremove").serializeArray();
let formInputObj = {};
for(var i = 0; i < formInputArr.length; i++){
obj_name = formInputArr[i].name;
formInputObj[obj_name] = formInputArr[i].value;
}
formInputObj.username = formInputObj["user_email"]
formInputObj.group = formInputObj["groups"].split(",");
console.log("right before removing", formInputObj)
// run add
await removeJudge(formInputObj).then(async res => {
console.log("returned remove", res)
// hide loading indicator
$("#modal-waiting-container").hide();
// set response
$("#arj-successful-img").show();
$("#arj-form-response-text").text("Judge has been removed successfully.");
$("#arj-form-response-text").show();
$("#arj-form-response-container").show();
setTimeout(function(){
closeArjModal('#addremovejudge');
}, 1000);
let arj_judges_html = await insertARJJudges();
$("#arj-judges").html(arj_judges_html);
// hide loading indicator, show message, close modal, refresh users
if(webhookRemoveExists){
// trigger webhook
formInputObj.email = formInputObj.username;
formInputObj.eventType = event_type;
formInputObj.jiraQuery = `issuetype = "Scoring - Event Finals" AND issueFunction in subtasksOf('${webhookJQL}') AND "Judge Email" ~ "`+formInputObj.username+`"`;
triggerWebhook(webhookRemove, formInputObj);
}
}).catch(err => {
console.log(err)
$("#modal-waiting-container").hide();
$("#arj-form-response-text").text("Oops, something went wrong.");
$("#arj-form-response-text").show();
$("#arj-form-response-container").show();
setTimeout(function(){
closeArjModal('#addremovejudge');
}, 1000);
});
return false;
}
/* END FORM SUBMIT FUNCTIONS */
// insert stylesheets
$(window).load(() => {
let insert_html = ""
for(var i = 0; i < insert_stylesheets.length; i++){
let curr_stylesheet = insert_stylesheets[i]
insert_html += `<link type="text/css" rel="stylesheet" href="${curr_stylesheet}" />`
}
$("head").append(insert_html);
})
async function startJudgeScript(){
// create and insert modal which will hold the add and remove forms
let modal_html = insertModal();
let arj_html = insertARJHTML();
let arj_judges_html = await insertARJJudges();
$(judges_parent_container_selector).append(arj_html);
$("#arj-judges").html(arj_judges_html);
$(modal_parent_container_selector).append(modal_html);
}
document.addEventListener("load", startJudgeScript(), false);
// $(document).ready(function() {
// // create and insert modal which will hold the add and remove forms
// let modal_html = insertModal();
// let arj_html = insertARJHTML();
// let arj_judges_html = await insertARJJudges();
// $(judges_parent_container_selector).append(arj_html);
// $("#arj-judges").append(arj_judges_html);
// $(modal_parent_container_selector).append(modal_html);
// });
</script> |