// ==UserScript==
// @name WME reviewEdits
// @namespace https://greasyfork.org/en/scripts/382070-wme-reviewedits
// @version 2019.05.14.01
// @description copies information from WME and adds to google sheet for record of reviewed edits.
// @author ramblinwreck_81
// @include https://www.waze.com/en-US/editor*
// @exclude https://www.waze.com/user/editor*
// @grant none
// @require https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
// ==/UserScript==
(function() {
'use strict';
var RE_Name = GM_info.script.name;
var RE_Version = GM_info.script.version;
var settings = {};
function RE_log(message) {
console.log(`Review Edits: ${message}`);
}
function bootstrap(tries) {
RE_log(`bootstrap`);
tries = tries || 1;
if (W && W.map &&
W.model && W.loginManager.user &&
$ ) {
RE_init();
// tabBuilder();
} else if (tries < 1000) {
setTimeout(function () {bootstrap(tries++);}, 200);
}
}
bootstrap();
function RE_init() {
// Check document elements are ready
var userInfo = document.getElementById("user-info");
var newEdName = "";
if (userInfo === null) {
window.setTimeout(RE_init, 500);
return;
}
var userTabs = document.getElementById("user-tabs");
if (userTabs === null) {
window.setTimeout(RE_init, 500);
return;
}
var navTab = userInfo.getElementsByTagName("ul");
if (navTab.length === 0) {
window.setTimeout(RE_init, 500);
return;
}
if (typeof navTab[0] === "undefined") {
window.setTimeout(RE_init, 500);
return;
}
var tabContent = userInfo.getElementsByTagName("div");
if (tabContent.length === 0) {
window.setTimeout(RE_init, 500);
return;
}
if (typeof tabContent[0] === "undefined") {
window.setTimeout(RE_init, 500);
return;
}
var editorURL = '';
RE_addUserTab();
RE_addFormBtn();
function RE_addFormBtn() {
RE_log(`adding form button`);
var selection = W.selectionManager.getSelectedFeatures();
var REDiv = document.createElement("div"),
REMnu = document.createElement("select"),
REBtn = document.createElement("button");
var formWindowName = "Review Edits result",
formWindowSpecs = "resizable=1,menubar=0,scrollbars=1,status=0,toolbar=0";
var editPanel,
selElem,
formLink;
REDiv.id = "reviewEditsDiv";
editPanel = document.getElementById("edit-panel");
selElem = editPanel.getElementsByClassName("selection");
if (selection.length === 0) { // || selection[0].model.type !== "segment") {
//formfiller_log("No segments selected.");
return;
}
if (document.getElementById("reviewEditsDiv")) {
//formfiller_log("Div already created");
return;
}
var forms = [{
name: "SER Editor Review",
// testing url: "https://docs.google.com/forms/d/e/1FAIpQLSepKZpDjeHySl95eArUn5iwTuOTUPvpz0ZvqaHg7LbvmBB1Lw/viewform",
url: "https://docs.google.com/forms/d/e/1FAIpQLSfc27FGWsN2RoX8WXYAYZ2xVIkJ1cI8u85ezV--AYsBCVuVKg/viewform",
fields: {
editDate: "150500272",
specificPermalink: "760385393",
reviewingEditor: "1935699410",
sentToEditorPL: "325109063",
editorName: "343499315"
}
}];
forms.forEach(function (key, i) {
REMnu.options.add(new Option(forms[i].name, i));
});
REBtn.innerHTML = "Go to Form";
REBtn.onclick = function () {
//alert(ffMnu.options[ffMnu.selectedIndex].value+": "+forms[ffMnu.options[ffMnu.selectedIndex].value].name);
RE_saveSettings();
formLink = RE_createFormLink(forms[REMnu.options[REMnu.selectedIndex].value]);
if (typeof formLink === "undefined") {
return;
}
if ($("#RE-open-in-tab").prop("checked")) {
window.open(formLink, "_blank");
} else {
window.open(formLink, formWindowName, formWindowSpecs);
}
};
REDiv.appendChild(REMnu);
REDiv.appendChild(REBtn);
selElem[0].appendChild(REDiv);
return;
} // end of RE_addFormBtn
function createURL(selection)
{
var permalink = "https://www.waze.com/en-US/editor?",
segIDs = [];
var latLon = W.map.center.clone().transform(W.map.projection.projCode, W.map.displayProjection.projCode);
var lat = latLon.lat,
lon = latLon.lon;
var env = W.location ? W.location.code : W.app.getAppRegionCode();
var zoom = W.map.zoom;
var latOffset;
var lonOffset;
var zoomOffset;
if (W.selectionManager.getSelectedFeatures()[0].model.type === "venue") { // code for selection is a place venue
latLon = selection[0].geometry.transform(W.map.projection.projCode, W.map.displayProjection.projCode);
lat = latLon.y;
lon = latLon.x;
// lon = selection[0].geometry.transform(W.map.displayProjection.projCode).x;
permalink += "env=" + env + "&lon=" + lon + "&lat=" + lat + "&zoom=" + zoom.toString() + "&venues=" + W.selectionManager.getSelectedFeatures()[0].model.attributes.id;
latOffset = lat + 0.003;
lonOffset = lon - 0.003;
zoomOffset = W.map.zoom - 2;
} else { // code for if selection is a segment(s)
var type = "segments";
var zoomToRoadType = W.Config.segments.zoomToRoadType;
var i;
//To get lat and long centered on segment
if (selection.length === 1) {
latLon = selection[0].model.getCenter().clone();
latLon.transform(W.map.projection.projCode, W.map.displayProjection.projCode);
lat = latLon.y;
lon = latLon.x;
latOffset = lat + 0.003;
lonOffset = lon - 0.003;
zoomOffset = W.map.zoom - 2;
}
for (i = 0; i < selection.length; i += 1) {
var segment = selection[i].model;
if (segment.type === "segment") {
segIDs.push(segment.attributes.id);
if (zoomToRoadType[zoom] !== -1 && zoomToRoadType[zoom].indexOf(segment.attributes.roadType) === -1) {
alert("This zoom level (" + zoom.toString() + ") cannot be used for this road type! Please increase your zoom:\n" +
"Streets: 4+\nOther drivable and Non-drivable: 3+\nHighways and PS: 2+");
formfiller_log("Zoom level not correct for segment: " + zoom.toString() + " " + segment.attributes.roadType.toString());
return;
}
}
}
permalink += "env=" + env + "&lon=" + lon + "&lat=" + lat + "&zoom=" + zoom.toString() + "&" + type + "=" + segIDs.join();
} // end of if(test)
var strStartURL = 'https://www.waze.com/en-US/editor?env=usa&lon=';
var correctURL;
var newURL;
editorURL = strStartURL + lonOffset + '&lat=' + latOffset + '&zoom=' + zoomOffset;
return permalink;
} // end of createURL function
function RE_getLastEditor(selection) {
var eID;
var editorNames = "";
if(selection[0].model.type === "venue") {
if(selection[0].model.attributes.residential) {
console.log('RPP');
var objId = selection[0].model.attributes.id;
var objUrl = "https://www.waze.com/Descartes/app/ElementHistory?objectType=venue&objectID=" + objId;
return $.ajax({
url:objUrl,
datatype: 'json',
success: function(data) {
RE_log(`Got the username`)
},
async: false
}).responseJSON.users.objects[0].userName;
} else { // it's a venue but not an RPP
editorNameConcat(selection);
return editorNames;
}
} else { // it's not a venue, it's a segment or segments
editorNameConcat(selection)
return editorNames;
}
function editorNameConcat(mapObject){
mapObject.forEach(function (selected) {
eID = selected.model.attributes.updatedBy;
if (typeof eID === "undefined") {
RE_log(`Unable to get updatedBy on ${selected.model.attributes.id}`);
eID = selected.model.attributes.createdBy;
}
newEdName = W.model.users.getObjectById(eID).userName;
if (editorNames.indexOf(newEdName) === -1) {
editorNames += ", " + newEdName;
}
});
editorNames = editorNames.substr(2);
return editorNames;
}
}
function RE_createFormLink(formSel) {
var selection = W.selectionManager.getSelectedFeatures();
var formValues = {};
var formFields = formSel.fields;
var formLink = formSel.url + "?entry.";
var formArgs = [];
if (selection.length === 0) { // || selection[0].model.type !== "segment") {
RE_log(`No segments selected.`);
return;
}
Object.keys(formFields).forEach(function (key, index) {
switch (key) {
case "reviewingEditor":
formValues[key] = W.loginManager.user.userName;
break;
case "specificPermalink":
formValues[key] = createURL(selection);
if (typeof formValues.specificPermalink === "undefined") {
RE_log(`No permalink generated`);
return;
}
break;
case "sentToEditorPL":
formValues[key] = editorURL;
break;
case "editDate":
var a = selection[0].model.attributes.updatedOn;
var b = new Date(a).toLocaleDateString();
formValues[key] = b;
break;
case "editorName":
formValues[key] = RE_getLastEditor(selection);
break;
default:
RE_log(`Nothing defined for ${key}`);
break;
}
//Add entry to form URL, if there's something to add
if (typeof formValues[key] !== "undefined" && formValues[key] !== "") {
formArgs[index] = formFields[key] + "=" + encodeURIComponent(formValues[key]);
}
});
formLink += formArgs.join("&entry.");
RE_log(`${formLink}`);
return formLink;
} // end of createFormLink
var reviewEditsObserver = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
// Mutation is a NodeList and doesn't support forEach like an array
for (var i = 0; i < mutation.addedNodes.length; i += 1) {
var addedNode = mutation.addedNodes[i];
// Only fire up if it's a node
if (addedNode.nodeType === Node.ELEMENT_NODE) {
var selectionDiv = addedNode.querySelector("div.selection");
if (selectionDiv) {
RE_addFormBtn();
}
}
}
});
});
reviewEditsObserver.observe(document.getElementById("edit-panel"), {
childList: true,
subtree: true
});
if (W.app.modeController) {
W.app.modeController.model.bind("change:mode", function (model, modeId) {
if (modeId === 0) {
RE_addUserTab();
}
});
}
// Unit switched (imperial/metric)
if (W.prefs) {
W.prefs.on("change:isImperial", RE_addUserTab);
}
if (!W.selectionManager.getSelectedFeatures) {
W.selectionManager.getSelectedFeatures = W.selectionManager.getSelectedItems;
}
RE_log(`Init done`);
return;
} //end of RE_init
function tabBuilder()
{
var $section = $("<div>");
$section.html([
'<div>',
'<h2>RE_Tab</h2>',
'<input type="checkbox" id="RE_Enabled" class="RE_SettingsCheckbox"><label for="RE_Enabled">Enable This Script</label>',
'<hr>',
'<hr>',
'<div>',
'</div>',
'</div>'
].join(' '));
} // end of tabBuilder function
function RE_addUserTab() {
RE_log(`adding tab`);
var userInfo = document.getElementById("user-info"),
userTabs = document.getElementById("user-tabs"),
navTabs = userTabs.getElementsByClassName("nav-tabs"),
tabContent = userInfo.getElementsByClassName("tab-content");
var RETab = document.createElement("li"),
REPanel = document.createElement("div"),
RENewTabBox = document.createElement("input"),
RENewTabLabel = document.createElement("label"),
RETabInfo = document.createElement("div");
RETab.innerHTML = '<a title="Review Edits" href="#sidepanel-reviewEdits" data-toggle="tab">Review Edits</a>';
REPanel.id = "sidepanel-reviewEdits";
REPanel.className = "tab-pane";
RE_log(`name: ${RE_Name}, Version: ${RE_Version}`);
RETabInfo.innerHTML = '<b>' + RE_Name + '</b> v' + RE_Version;
RENewTabBox.id = "RE-open-in-tab";
RENewTabBox.type = "checkbox";
RENewTabBox.name = "RE_open_tab";
RENewTabLabel.innerHTML = "Open form in new tab";
RENewTabLabel.for = "RE_open_tab";
REPanel.appendChild(RETabInfo);
REPanel.appendChild(RENewTabBox);
REPanel.appendChild(RENewTabLabel);
navTabs[0].appendChild(RETab);
tabContent[0].appendChild(REPanel);
RE_loadSettings();
}
function RE_loadSettings() {
var REOpenInTab = localStorage.getItem("RE-open-in-tab");
if (REOpenInTab === "1") {
$("#RE-open-in-tab").trigger("click");
}
return;
}
function RE_saveSettings() {
if ($("#RE-open-in-tab").prop("checked")) {
localStorage.setItem("RE-open-in-tab", "1");
} else {
localStorage.setItem("RE-open-in-tab", "0");
}
return;
}
})();