NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Funnel View // @namespace http://tampermonkey.net/ // @version 0.1 // @description try to take over the world! // @author You // @match https://amberstudent.freshsales.io/* // @grant GM_xmlhttpRequest // @license MIT // ==/UserScript== window.allData = []; const InternationalPhoneCodes = [ {value: "+44", name: "United Kingdom(+44)"}, {value: "+1", name: "United States(+1)"}, {value: "+91", name: "India(+91)"}, {value: "+65", name: "Singapore(+65)"}, {value: "+60", name: "Malaysia(+60)"}, {value: "+61", name: "Australia(+61)"}, {value: "+33", name: "France(+33)"}, {value: "+7840", name: "Abkhazia(+7 840)"}, {value: "+93", name: "Afghanistan(+93)"}, {value: "+355", name: "Albania(+355)"}, {value: "+213", name: "Algeria(+213)"}, {value: "+1684", name: "American Samoa(+1 684)"}, {value: "+376", name: "Andorra(+376)"}, {value: "+244", name: "Angola(+244)"}, {value: "+1264", name: "Anguilla(+1 264)"}, {value: "+1268", name: "Antigua and Barbuda(+1 268)"}, {value: "+54", name: "Argentina(+54)"}, {value: "+374", name: "Armenia(+374)"}, {value: "+297", name: "Aruba(+297)"}, {value: "+247", name: "Ascension(+247)"}, {value: "+61", name: "Australia(+61)"}, {value: "+672", name: "Australian External Territories(+672)"}, {value: "+43", name: "Austria(+43)"}, {value: "+994", name: "Azerbaijan(+994)"}, {value: "+1242", name: "Bahamas(+1 242)"}, {value: "+973", name: "Bahrain(+973)"}, {value: "+880", name: "Bangladesh(+880)"}, {value: "+1246", name: "Barbados(+1 246)"}, {value: "+1268", name: "Barbuda(+1 268)"}, {value: "+375", name: "Belarus(+375)"}, {value: "+32", name: "Belgium(+32)"}, {value: "+501", name: "Belize(+501)"}, {value: "+229", name: "Benin(+229)"}, {value: "+1441", name: "Bermuda(+1 441)"}, {value: "+975", name: "Bhutan(+975)"}, {value: "+591", name: "Bolivia(+591)"}, {value: "+387", name: "Bosnia and Herzegovina(+387)"}, {value: "+267", name: "Botswana(+267)"}, {value: "+55", name: "Brazil(+55)"}, {value: "+246", name: "British Indian Ocean Territory(+246)"}, {value: "+1284", name: "British Virgin Islands(+1 284)"}, {value: "+673", name: "Brunei(+673)"}, {value: "+359", name: "Bulgaria(+359)"}, {value: "+226", name: "Burkina Faso(+226)"}, {value: "+257", name: "Burundi(+257)"}, {value: "+855", name: "Cambodia(+855)"}, {value: "+237", name: "Cameroon(+237)"}, {value: "+1", name: "Canada(+1)"}, {value: "+238", name: "Cape Verde(+238)"}, {value: "+345", name: "Cayman Islands(+ 345)"}, {value: "+236", name: "Central African Republic(+236)"}, {value: "+235", name: "Chad(+235)"}, {value: "+56", name: "Chile(+56)"}, {value: "+86", name: "China(+86)"}, {value: "+61", name: "Christmas Island(+61)"}, {value: "+61", name: "Cocos-Keeling Islands(+61)"}, {value: "+57", name: "Colombia(+57)"}, {value: "+269", name: "Comoros(+269)"}, {value: "+242", name: "Congo(+242)"}, {value: "+243", name: "Congo, Dem. Rep. of (Zaire)(+243)"}, {value: "+682", name: "Cook Islands(+682)"}, {value: "+506", name: "Costa Rica(+506)"}, {value: "+385", name: "Croatia(+385)"}, {value: "+53", name: "Cuba(+53)"}, {value: "+599", name: "Curacao(+599)"}, {value: "+357", name: "Cyprus(+357)"}, {value: "+420", name: "Czech Republic(+420)"}, {value: "+45", name: "Denmark(+45)"}, {value: "+246", name: "Diego Garcia(+246)"}, {value: "+253", name: "Djibouti(+253)"}, {value: "+1767", name: "Dominica(+1 767)"}, {value: "+1809", name: "Dominican Republic(+1 809)"}, {value: "+670", name: "East Timor(+670)"}, {value: "+56", name: "Easter Island(+56)"}, {value: "+593", name: "Ecuador(+593)"}, {value: "+20", name: "Egypt(+20)"}, {value: "+503", name: "El Salvador(+503)"}, {value: "+240", name: "Equatorial Guinea(+240)"}, {value: "+291", name: "Eritrea(+291)"}, {value: "+372", name: "Estonia(+372)"}, {value: "+251", name: "Ethiopia(+251)"}, {value: "+500", name: "Falkland Islands(+500)"}, {value: "+298", name: "Faroe Islands(+298)"}, {value: "+679", name: "Fiji(+679)"}, {value: "+358", name: "Finland(+358)"}, {value: "+33", name: "France(+33)"}, {value: "+596", name: "French Antilles(+596)"}, {value: "+594", name: "French Guiana(+594)"}, {value: "+689", name: "French Polynesia(+689)"}, {value: "+241", name: "Gabon(+241)"}, {value: "+220", name: "Gambia(+220)"}, {value: "+995", name: "Georgia(+995)"}, {value: "+49", name: "Germany(+49)"}, {value: "+233", name: "Ghana(+233)"}, {value: "+350", name: "Gibraltar(+350)"}, {value: "+30", name: "Greece(+30)"}, {value: "+299", name: "Greenland(+299)"}, {value: "+1473", name: "Grenada(+1 473)"}, {value: "+590", name: "Guadeloupe(+590)"}, {value: "+1671", name: "Guam(+1 671)"}, {value: "+502", name: "Guatemala(+502)"}, {value: "+224", name: "Guinea(+224)"}, {value: "+245", name: "Guinea-Bissau(+245)"}, {value: "+595", name: "Guyana(+595)"}, {value: "+509", name: "Haiti(+509)"}, {value: "+504", name: "Honduras(+504)"}, {value: "+852", name: "Hong Kong SAR China(+852)"}, {value: "+36", name: "Hungary(+36)"}, {value: "+354", name: "Iceland(+354)"}, {value: "+91", name: "India(+91)"}, {value: "+62", name: "Indonesia(+62)"}, {value: "+98", name: "Iran(+98)"}, {value: "+964", name: "Iraq(+964)"}, {value: "+353", name: "Ireland(+353)"}, {value: "+972", name: "Israel(+972)"}, {value: "+39", name: "Italy(+39)"}, {value: "+225", name: "Ivory Coast(+225)"}, {value: "+1876", name: "Jamaica(+1 876)"}, {value: "+81", name: "Japan(+81)"}, {value: "+962", name: "Jordan(+962)"}, {value: "+77", name: "Kazakhstan(+7 7)"}, {value: "+254", name: "Kenya(+254)"}, {value: "+686", name: "Kiribati(+686)"}, {value: "+965", name: "Kuwait(+965)"}, {value: "+996", name: "Kyrgyzstan(+996)"}, {value: "+856", name: "Laos(+856)"}, {value: "+371", name: "Latvia(+371)"}, {value: "+961", name: "Lebanon(+961)"}, {value: "+266", name: "Lesotho(+266)"}, {value: "+231", name: "Liberia(+231)"}, {value: "+218", name: "Libya(+218)"}, {value: "+423", name: "Liechtenstein(+423)"}, {value: "+370", name: "Lithuania(+370)"}, {value: "+352", name: "Luxembourg(+352)"}, {value: "+853", name: "Macau SAR China(+853)"}, {value: "+389", name: "Macedonia(+389)"}, {value: "+261", name: "Madagascar(+261)"}, {value: "+265", name: "Malawi(+265)"}, {value: "+60", name: "Malaysia(+60)"}, {value: "+960", name: "Maldives(+960)"}, {value: "+223", name: "Mali(+223)"}, {value: "+356", name: "Malta(+356)"}, {value: "+692", name: "Marshall Islands(+692)"}, {value: "+596", name: "Martinique(+596)"}, {value: "+222", name: "Mauritania(+222)"}, {value: "+230", name: "Mauritius(+230)"}, {value: "+262", name: "Mayotte(+262)"}, {value: "+52", name: "Mexico(+52)"}, {value: "+691", name: "Micronesia(+691)"}, {value: "+1808", name: "Midway Island(+1 808)"}, {value: "+373", name: "Moldova(+373)"}, {value: "+377", name: "Monaco(+377)"}, {value: "+976", name: "Mongolia(+976)"}, {value: "+382", name: "Montenegro(+382)"}, {value: "+1664", name: "Montserrat(+1664)"}, {value: "+212", name: "Morocco(+212)"}, {value: "+95", name: "Myanmar(+95)"}, {value: "+264", name: "Namibia(+264)"}, {value: "+674", name: "Nauru(+674)"}, {value: "+977", name: "Nepal(+977)"}, {value: "+31", name: "Netherlands(+31)"}, {value: "+599", name: "Netherlands Antilles(+599)"}, {value: "+1869", name: "Nevis(+1 869)"}, {value: "+687", name: "New Caledonia(+687)"}, {value: "+64", name: "New Zealand(+64)"}, {value: "+505", name: "Nicaragua(+505)"}, {value: "+227", name: "Niger(+227)"}, {value: "+234", name: "Nigeria(+234)"}, {value: "+683", name: "Niue(+683)"}, {value: "+672", name: "Norfolk Island(+672)"}, {value: "+850", name: "North Korea(+850)"}, {value: "+1670", name: "Northern Mariana Islands(+1 670)"}, {value: "+47", name: "Norway(+47)"}, {value: "+968", name: "Oman(+968)"}, {value: "+92", name: "Pakistan(+92)"}, {value: "+680", name: "Palau(+680)"}, {value: "+970", name: "Palestinian Territory(+970)"}, {value: "+507", name: "Panama(+507)"}, {value: "+675", name: "Papua New Guinea(+675)"}, {value: "+595", name: "Paraguay(+595)"}, {value: "+51", name: "Peru(+51)"}, {value: "+63", name: "Philippines(+63)"}, {value: "+48", name: "Poland(+48)"}, {value: "+351", name: "Portugal(+351)"}, {value: "+1787", name: "Puerto Rico(+1 787)"}, {value: "+974", name: "Qatar(+974)"}, {value: "+262", name: "Reunion(+262)"}, {value: "+40", name: "Romania(+40)"}, {value: "+7", name: "Russia(+7)"}, {value: "+250", name: "Rwanda(+250)"}, {value: "+685", name: "Samoa(+685)"}, {value: "+378", name: "San Marino(+378)"}, {value: "+966", name: "Saudi Arabia(+966)"}, {value: "+221", name: "Senegal(+221)"}, {value: "+381", name: "Serbia(+381)"}, {value: "+248", name: "Seychelles(+248)"}, {value: "+232", name: "Sierra Leone(+232)"}, {value: "+65", name: "Singapore(+65)"}, {value: "+421", name: "Slovakia(+421)"}, {value: "+386", name: "Slovenia(+386)"}, {value: "+677", name: "Solomon Islands(+677)"}, {value: "+27", name: "South Africa(+27)"}, {value: "+500", name: "South Georgia and the South Sandwich Islands(+500)"}, {value: "+82", name: "South Korea(+82)"}, {value: "+34", name: "Spain(+34)"}, {value: "+94", name: "Sri Lanka(+94)"}, {value: "+249", name: "Sudan(+249)"}, {value: "+597", name: "Suriname(+597)"}, {value: "+268", name: "Swaziland(+268)"}, {value: "+46", name: "Sweden(+46)"}, {value: "+41", name: "Switzerland(+41)"}, {value: "+963", name: "Syria(+963)"}, {value: "+886", name: "Taiwan(+886)"}, {value: "+992", name: "Tajikistan(+992)"}, {value: "+255", name: "Tanzania(+255)"}, {value: "+66", name: "Thailand(+66)"}, {value: "+670", name: "Timor Leste(+670)"}, {value: "+228", name: "Togo(+228)"}, {value: "+690", name: "Tokelau(+690)"}, {value: "+676", name: "Tonga(+676)"}, {value: "+1868", name: "Trinidad and Tobago(+1 868)"}, {value: "+216", name: "Tunisia(+216)"}, {value: "+90", name: "Turkey(+90)"}, {value: "+993", name: "Turkmenistan(+993)"}, {value: "+1649", name: "Turks and Caicos Islands(+1 649)"}, {value: "+688", name: "Tuvalu(+688)"}, {value: "+1340", name: "U.S. Virgin Islands(+1 340)"}, {value: "+256", name: "Uganda(+256)"}, {value: "+380", name: "Ukraine(+380)"}, {value: "+971", name: "United Arab Emirates(+971)"}, {value: "+44", name: "United Kingdom(+44)"}, {value: "+1", name: "United States(+1)"}, {value: "+598", name: "Uruguay(+598)"}, {value: "+998", name: "Uzbekistan(+998)"}, {value: "+678", name: "Vanuatu(+678)"}, {value: "+58", name: "Venezuela(+58)"}, {value: "+84", name: "Vietnam(+84)"}, {value: "+1808", name: "Wake Island(+1 808)"}, {value: "+681", name: "Wallis and Futuna(+681)"}, {value: "+967", name: "Yemen(+967)"}, {value: "+260", name: "Zambia(+260)"}, {value: "+255", name: "Zanzibar(+255)"}, {value: "+263", name: "Zimbabwe(+263)"} ]; const styleString = `<style> .values-container{ } .values-container.big .item { padding: 5px 10px; color: #9012FE; border: 1px solid #9012FE; font-size: 10px; border-radius: 40px; display: inline-block; margin: 10px; } .values-container.small { padding: 10px 0; } .values-container.small .item{ padding: 2px 2px; color: black; border-right: 1px solid #F05677; font-size: 10px; display: inline-block; font-weight: bold; } .values-container.small .process { color: #F05677; } .tags-container{ } .tags-container .options{ z-index: 10; background-color: white; padding: 10px; color: #9012FE; cursor: pointer; } .tags-container .trigger { background-color: black; width: 30px; height: 30px; border: 30px; cursor: pointer; } .tags-container .tag{ display: none; border: 1px solid #888; padding: 4px 8px; border-radius: 40px; } .tags-container .tag:hover{ background-color: #f0f0f0; } .dark-tag{ color: red; border: 1px solid red; display: inline-block; padding: 4px; font-weight: bold; float: right; } .tags-container .tag-1{ color: green; } .tags-container .tag-2{ color: red; } .tags-container .tag.show { display: inline-block; } .tags-container:hover .tag{ display: inline-block; } .email-link-button-container .button{ padding: 10px 20px; color: white; position: fixed; z-index: 100000; top: 10px; right: 350px; background-color: black; cursor: pointer; } .whatsapp-link-button-container .button { padding: 10px 20px; color: white; position: fixed; z-index: 100000; top: 10px; right: 480px; background-color: #11af22; cursor: pointer; } .add-tag-container{ position: relative; z-index: 1; } .add-tag-container .add{ color: white; background-color: green; width: 40px; height: 40px; display: inline-block; line-height: 40px; text-align: center; border-radius: 100%; font-size: 25px; cursor: pointer; } .add-tag-container .tags-option{ display: none; flex-direction: column; position: absolute; top: 50px; } .add-tag-container.show-options .tags-option{ display: flex; } .add-tag-container .tag-option{ background-color: white; padding: 10px; border: 1px solid lightgray; cursor: pointer; max-width: 200px; } .add-tag-container .tag-option:hover{ background-color: blue; color: white; } .show-tag-container{ display: inline-block; background-color: #9012FE; color: white; border-radius: 20px; } .show-tag-delete{ background-color: #f05577; padding: 10px; cursor: pointer; font-size: 12px; } .show-tag-text { padding: 9px; display: inline-block } .outer-tags-container { display: inline-block; width: 120px; margin-top: 10px; } .show-tags { display: inline-block; } .funnel-tag { display: inline-block; padding: 0 4px; border:1px solid #9012FE; color: #9012FE; font-weight: bold; border-radius: 2px; } .timeZone-container{ line-height: 40px; } .timeZone { margin: 10px; padding: 8px; background-color: #EFF7FF; border-radius: 8px; border: 1px solid #415E9B; } .timeZone-name{' color: black; font-weight: bold; margin-right: 10px; } .timeZone-time{ color: purple; font-weight: bold; } .time-tag{ color: blue; font-weight: bold; font-size: 12px; padding: 4px 4px 4px 10px; } .green-tag{ padding: 10px; display: inline-block; background-color: green; color: white; font-size: 20px; font-weight: bold; } .country-name{ color: #a94b5f; font-weight: bold; font-size: 12px; padding: 4px 4px 4px 10px; } </style>`; const getHTMLForTag = ()=>{ return (` <div class="tags-container"> <span class="trigger"> Gola</span> <span class="current"></span> <div class="options"> <div class="tag tag-1" data-id="1">Important</div> <div class="tag tag-2" data-id="2"> Junk</div> </div> <div> `); }; const getAllDetails = (deal)=>{ let d = new Date(deal.created_at); const string = d.toString(); const array = string.split(" "); const time = array[4].split(":"); let newTime = ""; const hour = parseInt(time[0]); let prefix = ""; let hourToDisplay = hour; if(hour < 12 ){ prefix = "A.M" } else if(hour == 12){ prefix = "Noon" } else if (hour > 12){ hourToDisplay = hour - 12; prefix = "P.M" } const fullTime = array[0]+ "-" + array[2] +"," + array[1] + "--" + hourToDisplay + ":" + time[1] + " " + prefix; const obj = { weekDay: array[0], monthName: array[1], day: array[2], time: fullTime }; let countriesMatched = deal.user_details.phone; const phone = deal.user_details.phone; if(phone && phone.length > 10){ const firstDigit = "+" +phone.slice(0,1); const twoDigits = "+" + phone.slice(0,2); const threetDigits = "+" + phone.slice(0,3); for(let i = 0; i < InternationalPhoneCodes.length; ++i ){ const node = InternationalPhoneCodes[i]; if(node.value ==firstDigit || node.value ==twoDigits || node.value ==threetDigits ){ countriesMatched += " | " +node.name; break; } } } return { utm_campaign: deal.data.source.utm_campaign || "", utm_source: deal.data.source.utm_source || "", source: deal.data.source, message: deal.data.message, budget_full: deal.data.budget_full, move_in_date: deal.data.move_in_date, configuration: deal.data.configuration, lease_duration: deal.data.lease_duration, no_of_students: deal.data.no_of_students, location: deal.location_name, email: deal.user_details.email, phone: deal.user_details.phone, id: deal.connect_details_freshsales_id, tags: deal.tags, process_details: deal.process_details, time: fullTime, country: countriesMatched, }; }; const getHTMLForDealPage = (details, className)=>{ let tagHtml = ""; if(!details.tags){ details.tags = []; } else { details.tags.forEach((tag)=>{ tagHtml +=`<span class="funnel-tag">${tag}</span>`;}); } let processString = ""; const pd = details.process_details; const issues = pd.issues; if(pd && typeof pd.call_count != "undefined" && typeof pd.note_count != "undefined" && typeof pd.email_count != "undefined"){ processString = "call-" +pd.call_count + " | notes-" + pd.note_count + " | email-" + pd.email_count + " "; } if(issues && issues.length > 0 ){ const array = issues.map((issue)=>{ return issue.message;}); let issueHtml = ""; array.forEach((issue)=>{ const row = `<div class="dark-tag tag">${issue}</div>`; issueHtml += row; }); processString += issueHtml; } return (` <div class="values-container ${className}"> <div class="country-name">${details.country}</div> <div class="time-tag">${details.time}</div> <div class="funnel-tags-container">${tagHtml}</div> <div class="item"><span>${details.move_in_date || ""}</span></div> <div class="item"><span>${details.budget_full || ""}</span></div> <div class="item"><span>${details.lease_duration || ""}</span></div> <div class="item"><span>${details.no_of_students || ""} students</span></div> <div class="item"><span>${details.utm_campaign + " | "} students</span></div> <div class="item"><span>${details.utm_source + " | "} students</span></div> <div class="item process"><span>${processString}</span></div> </div> `); }; const insertHTMLInCards = (deals)=>{ const dealsIds = deals.map((deal)=>{ return "" + deal.connect_details_freshsales_id;}); $('.funl-card-wrap .js-deal-pipeline').each((index, card)=>{ const $card = $(card); const cardId = $card.attr('data-value'); if(dealsIds.indexOf(cardId) > -1 ){ const deal = deals.filter((deal)=>{ return deal.connect_details_freshsales_id == cardId;})[0]; const details = getAllDetails(deal); if(details){ $card.find('.funl-card').append(getHTMLForDealPage(details,"small")); $card.addClass('data-fetched'); } } }); }; const getHTMLForEmailLink = (details)=>{ let href= `https://mail.google.com/mail/u/0/?view=cm&fs=1&to=${details.user_details.email}&su=Accommodation+near+your+university+|+Amberstudent&tf=1`; // let href= `mailto:${details.user_details.email}`; return (` <div class="email-link-button-container"> <a href="${href}" target="_blank" class="button"> open Vocus</a> <div> `); }; const getHTMLForWhatsapp = (details)=>{ let href= `https://api.whatsapp.com/send?phone=${details.user_details.phone}`; return (` <div class="whatsapp-link-button-container"> <a href="${href}" target="_blank" class="button"> Text on Whatsapp</a> <div> `); }; const getAllCardIds = ()=>{ let ids = []; $('.funl-card-wrap .js-deal-pipeline').each((index, card)=>{ const $card = $(card); const cardId = $card.attr('data-value'); ids.push(cardId); }); return ids.slice(0,50); }; const makeAPICall = (ids, callback)=>{ const idString = ids.join(","); const jqxhr = $.ajax( "https://base.amberstudent.com/leads?api_key=4f2032f4059f0a24196578ff035ad102cb80c27a&only=data,tags,created_at,id,user_details,process_details&methods=process_details,connect_details_freshsales_id,location_name&connect_details_freshsales_ids=" + idString ) .done(function(res) { console.log(res.data.result); window.allData = window.allData.concat(res.data.result); if(callback){ callback(res.data.result); } else { insertHTMLInCards(res.data.result); } }) .fail(function(err) { console.log(err); }); }; const updateTags = (id, tags, callback)=>{ $.ajax({ url: "https://base.amberstudent.com/leads/" + id, type: 'PUT', success:function(res) { console.log(res); callback(); }, fail:function(err){ console.log(err); }, contentType: 'application/json', data: JSON.stringify({ "api_key": "4f2032f4059f0a24196578ff035ad102cb80c27a", "lead": { "tags": tags, "send_event": false, } }), }); }; const bindEventForVocus = (details)=>{ $('.ember-application').on('click','.email-link-button-container .button',(e)=>{ e.preventDefault(); e.stopPropagation(); let subject = $('.email-compose-group > input[name=subject]').val(); if(!subject || subject.length < 5 ) { subject = "Accommodation near your university | Amberstudent"; } subject = subject.trim().split(" ").join("+"); /*let body=$($('iframe')[0]).contents().find('body[contenteditable=true]').html(); if(!body || body.length < 2){ body=""; } debugger; body = body.split(" ").join("+");*/ const newHref= `https://mail.google.com/mail/u/0/?view=cm&fs=1&to=${details.user_details.email}&su=${subject}&tf=1`; $('.email-link-button-container button').attr('href',newHref); const win = window.open(newHref, '_blank'); win.focus(); }); }; const appendHTMLInDealView = (details)=>{ // Add vocus $('.card-stage-details').append(getHTMLForEmailLink(details)); $('.card-stage-details').append(getHTMLForWhatsapp(details)); // bindEventForVocus(details); const tagHTML = ` <div class="outer-tags-container"> <div class="add-tag-container"> <span class="add"> + </span> <div class="tags-option"> <div class="tag-option">Vocus removed</div> <div class="tag-option">Ready to book</div> <div class="tag-option">High priority</div> <div class="tag-option">Payment remaining</div> <div class="tag-option">Keep watch</div> <div class="tag-option">Parents Involved</div> <div class="tag-option">A+ lead</div> <div class="tag-option">Very demanding</div> <div class="tag-option">Passing time</div> <div class="tag-option">Half details</div> <div class="tag-option">Unimportant-Not responding</div> <div class="tag-option">Didn't pick up call</div> <div class="tag-option">Opportunity | 2019</div> <div class="tag-option">Opportunity | 2018</div> <div class="tag-option">Number not present</div> <div class="tag-option">Short term</div> <div class="tag-option">Chat on whatsapp</div> <div class="tag-option">Viewing Scheduled</div> </div> </div> </div> `; let showTagsHTML = '<div class="show-tags">'; if(!details.tags){ details.tags = [];} details.tags.forEach((tag, index)=>{ const showTagHTML = ` <div class="show-tag-container"> <span class="show-tag-text"> ${tag}</span> <span data-tag="${tag}" class="show-tag-delete"> X</span> </div> `; showTagsHTML = showTagsHTML + showTagHTML; }); showTagsHTML += '</div>'; let issues= ""; let issueHtml = ""; let utmHtml = `<div class="green-tag">${details.data.source.utm_campaign || " "}${ " | " + details.data.source.utm_source}</div>`; let message_combined_html = ""; const message_combined = $(`div[data-test-detail-field=Message\\ Combined]`).text().trim().split("___________"); if(message_combined && message_combined.length > 0){ message_combined_html = `<div class="message-combined">`; message_combined.forEach((message)=>{ message_combined_html += `<span class="item-pill"> ${message}</span>`; }); message_combined_html += "</div>"; } if(details.process_details && details.process_details.issues){ issues = details.process_details.issues; if(issues && issues.length > 0 ){ const array = issues.map((issue)=>{ return issue.message;}); array.forEach((issue)=>{ const row = `<div class="dark-tag tag">${issue}</div>`; issueHtml += row; }); } } $('.card-stage-details').append(tagHTML); $('.card-stage-details').append(showTagsHTML); $('.card-stage-details').append(issueHtml); $('.card-stage-details').append(utmHtml); $('.add-tag-container .add').on("click",()=>{ const $node = $(".add-tag-container"); if($node.hasClass('show-options')){ $node.removeClass("show-options"); } else { $node.addClass("show-options"); } }); $(".outer-tags-container").on("click",".tag-option",(e)=>{ var id = details.id; var tagText = $(e.target).text(); let tags = details.tags; if(details.tags.indexOf(tagText) == -1 ){ tags.push(tagText); } else { tags = details.tags.filter((tag)=>{ return tag != tagText;}); } console.log(tagText); updateTags(id,tags,()=>{ $(".add-tag-container").removeClass("show-options"); $(".show-tags").append( `<div class="show-tag-container"> <span class="show-tag-text"> ${tagText}</span> <span data-tag="${tagText}" class="show-tag-delete"> X</span> </div>` ); }); }); $('.show-tags').on('click', '.show-tag-delete', (e)=>{ const id = details.id; var tagText = $(e.target).attr('data-tag'); let tags = details.tags; if(details.tags.indexOf(tagText) > -1 ){ tags = details.tags.filter((tag)=>{ return tag != tagText;}); } console.log(tagText); updateTags(id,tags,()=>{ let $element = null; $('.show-tag-container').each((index, value)=>{ const text = $(value).find('.show-tag-text').text(); if(text.trim() == tagText.trim()){ $element = $(value); } }); if($element){$element.remove();}; }); }); $('.card-stage-details').append(message_combined_html); }; const getDeatilsOfDeal = (callback)=>{ const url = window.location.href; const idSplittedArray = url.split("/"); const id = idSplittedArray[idSplittedArray.length - 1]; const jqxhr = $.ajax( "https://base.amberstudent.com/leads?api_key=4f2032f4059f0a24196578ff035ad102cb80c27a&only=data,tags,id,created_at,user_details,process_details&methods=connect_details_freshsales_id,location_name&connect_details_freshsales_ids=" + id ) .done(function(res) { console.log(res.data.result); callback(res.data.result[0]); }) .fail(function(err) { console.log(err); }); }; const addEventForButtonClick = ()=>{ $('.ember-application').on('click','.funl-card-wrap button',(e)=>{ const $node = $(e.target).closest('.funl-card-wrap'); const id = setInterval(()=>{ let freshSalesdataFetched = false; const oldCards = $node.find('.js-deal-pipeline').filter((index,card)=>{ if($(card).hasClass('data-fetched')){ return true; } else { return false; } }); freshSalesdataFetched = oldCards.length > 0? false: true; if(freshSalesdataFetched){ clearInterval(id); let ids = []; $node.find('.js-deal-pipeline').each((index, card)=>{ const $card = $(card); const cardId = $card.attr('data-value'); ids.push(cardId); }); const oldIds = window.allData.map((deal)=>{ return "" + deal.connect_details_freshsales_id;}); let idsToSend = ids.filter((id)=>{ if(oldIds.indexOf(id) > -1){ return false; } else { return true; } }); makeAPICall(idsToSend, (data)=>{ $node.find('.js-deal-pipeline').each((index, card)=>{ const $card = $(card); const cardId = $card.attr('data-value'); const deal = window.allData.filter((deal)=>{ return deal.connect_details_freshsales_id == cardId;})[0]; const details = getAllDetails(deal); if(details){ if(!$card.hasClass('data-fetched')){ $card.find('.funl-card').append(getHTMLForDealPage(details,"small")); $card.addClass('data-fetched'); } } }); }); } },1000); }); }; const checkForHTMLLoad = (view)=>{ let time = 1000; /*if(view == "funnelView"){ time = 5000; }*/ const id = setInterval(()=>{ if($(".ember-application").html().length > 0){ clearInterval(id); if(view == "dealView" ){ const details = getDeatilsOfDeal(appendHTMLInDealView); } if(view == "funnelView" ){ const ids = getAllCardIds(); makeAPICall(ids); addEventForButtonClick(); } } console.log("waiting for html load ...."); },time); //hide new button $('.navbar-personal-item button').hide(); // hide delete option $('.btn.btn-default.dropdown-toggle').hide(); }; //https://stackoverflow.com/questions/18259301/how-to-run-a-function-when-any-xmlhttprequest-is-complete const runBeforePageLoad = ()=>{ let xhrRequests = 0; let oldXHRCount = 0; let timeId; var oldOpen = XMLHttpRequest.prototype.open; function onStateChange(event) { xhrRequests++; timeId = setInterval(()=>{ if(xhrRequests > oldXHRCount){ oldXHRCount = xhrRequests; } if(xhrRequests > 0 && (xhrRequests <= oldXHRCount)){ console.log("Fire Last"); clearInterval(timeId); startInsertingHTML(); console.log(xhrRequests); oldXHRCount = 0; xhrRequests = 0; } },3000); } XMLHttpRequest.prototype.open = function() { oldOpen.apply(this, arguments); // when an XHR object is opened, add a listener for its readystatechange events this.addEventListener("load", onStateChange); }; }; let previousUrl = ""; const startInsertingHTML = ()=>{ const url = window.location.href; if(url == previousUrl){ return; } previousUrl = url; if(url.indexOf("view") == -1 ){ $('head').append(styleString); checkForHTMLLoad("dealView"); } else if(url.indexOf("deals/view") > -1 && url.indexOf("funnel") > -1){ $('head').append(styleString); checkForHTMLLoad("funnelView"); } }; $(document).ready(()=>{ runBeforePageLoad(); });