// ==UserScript==
// @name WME reviewEdits
// @namespace https://greasyfork.org/en/scripts/382070-wme-reviewedits
// @version 2019.04.27
// @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?version=229392
// ==/UserScript==
(function() {
'use strict';
var RE_Name = GM_info.script.name;
var RE_Version = GM_info.script.version;
var settings = {};
function bootstrap(tries) {
console.log('reviewEdits: 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);
}
}
function RE_log(message) {
if (typeof message === "string") {
console.log("Review Edits: " + message);
} else {
console.log("Review Edits: ", message);
}
}
function RE_init() {
// Check document elements are ready
var userInfo = document.getElementById("user-info");
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 = [{
//https://docs.google.com/forms/d/e/1FAIpQLSduBiLMhbg6nRpsEVCTcVbV4eWmHDXdIKGtuaOvzy6NZLbSgw/viewform?entry.1553765347=username&entry.1264424583=CLOSED&entry.1811077109=permalink&entry.792657790=Two-Way&entry.345142186=reason&entry.1102521735=2016-09-20+03:00&entry.2015424420=street+name&entry.1547375393=from+street&entry.1335391716=to+street&entry.1867193205=SC&entry.1714138473=county&entry.1803937317=source&entry.1648634142=notes
name: "SER Editor Review",
url: "https://docs.google.com/forms/d/e/1FAIpQLSepKZpDjeHySl95eArUn5iwTuOTUPvpz0ZvqaHg7LbvmBB1Lw/viewform",
fields: {
// description: "721250725",
// editClassification: "1347225342",
editDate: "233607996",
specificPermalink: "906461981",
reviewingEditor: "605955152",
sentToEditorPL: "76560122",
editorName: "1493012276"
}
}];
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
// document.getElementById('RE_locator').disabled = true;
// createURL();
function createURL(selection)
{
debugger;
//https://www.waze.com/editor/?env=usa&lon=-79.79248&lat=32.86150&layers=12709&zoom=5&mode=0&mapProblemFilter=1&mapUpdateRequestFilter=0&venueFilter=0&segments=504534141
//https://www.waze.com/editor/?env=usa&lon=-79.79248&lat=32.86150&layers=12709&zoom=5&mode=0&mapProblemFilter=1&mapUpdateRequestFilter=0&venueFilter=0&venues=183632201.1836387542.3102948
var permalink = "https://www.waze.com/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 type = "segments";
var zoom = W.map.zoom;
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;
var latOffset = lat + 0.003;
var lonOffset = lon - 0.003;
var 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();
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;
// function get4326CenterPoint()
// {
// let projI = new OL.Projection("EPSG:900913");
// let projE = new OL.Projection("EPSG:4326");
// let center_lonlat = (new OL.LonLat(W.map.center.lon, W.map.center.lat)).transform(projI,projE);
// let lat = Math.round(center_lonlat.lat * 1000000) / 1000000;
// let lon = Math.round(center_lonlat.lon * 1000000) / 1000000;
// // document.getElementById('WMEGLlatitude').innerHTML = lat;
// // document.getElementById('WMEGLlongitude').innerHTML = lon;
// return new OL.LonLat(lon, lat);
// }
// let latlon = get4326CenterPoint();
// if(W.selectionManager.getSelectedFeatures()[0] !== undefined) {
// var placeName='';
// var latOffset = latlon.lat + 0.003;
// var lonOffset = latlon.lon - 0.003;
// var zoomOffset = W.map.zoom + 2;
// if(W.selectionManager.getSelectedFeatures()[0].model.attributes.primaryStreetID === undefined) {
// correctURL = strStartURL + latlon.lon + '&lat=' + latlon.lat + '&zoom=' + W.map.zoom + '&venues=' + W.selectionManager.getSelectedFeatures()[0].model.attributes.id;
// placeName = W.selectionManager.getSelectedFeatures()[0].model.attributes.name;
// } else {
// correctURL = strStartURL + latlon.lon + '&lat=' + latlon.lat + '&zoom=' + W.map.zoom + '&segments=' + W.selectionManager.getSelectedFeatures()[0].model.attributes.id;
// }
// } else {
// alert('Please select a segment or venue first.');
// }
// console.log('correct URL is: ' + correctURL);
// return correctURL;
} // end of createURL function
function RE_getLastEditor(selection) {
var eID;
var editorNames = "";
var newEdName = "";
selection.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 = [];
debugger;
if (selection.length === 0 || selection[0].model.type !== "segment") {
RE_log("No segments selected.");
return;
}
Object.keys(formFields).forEach(function (key, index) {
debugger;
switch (key) {
// fields: {
// // description: "721250725",
// // editClassification: "1347225342",
// editDate: "233607996",
// specificPermalink: "906461981",
// reviewingEditor: "605955152",
// sentToEditorPL: "76560122",
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":
debugger;
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()
{
console.log('initiating WME ReviewEdits')
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);
}
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;
}
bootstrap();
})();