Rodeo Plus
Rodeo Plus
// @namespace com.amazon.shocklp
// @version 1.10.18.1
// @match https://rodeo-iad.amazon.com/*
// @downloadURL https://axzile.corp.amazon.com/-/carthamus/download_script/rodeo-plus.user.js
// @updateURL https://axzile.corp.amazon.com/-/carthamus/download_script/rodeo-plus.user.js
// @icon https://rodeo-iad.amazon.com//resources/images/rodeo-favicon.gif
// @grant GM_setClipboard
// @grant GM_addStyle
// @grant GM_info
// @run-at document-end
// @grant GM_xmlhttpRequest
// @require https://code.jquery.com/jquery-3.3.1.js
// @require https://raw.githubusercontent.com/pamelafox/lscache/master/lscache.js
// @require https://axzile.corp.amazon.com/-/carthamus/download_script/read-cookie.user.js
// ==/UserScript==
/* global $, readCookie */
/* eslint-disable no-multi-spaces */
// media
if (urlmatch){
FC = urlmatch[2];
var region2 = {
'dub':'eu',
'iad':'na',
'nrt':'jp'
}[region];
var region3 = {
'dub':'eu',
'iad':'na',
'nrt':'ap'
}[region];
emplID = readCookie('fcmenu-employeeId'),
remoteAddr = readCookie('fcmenu-remoteAddr');
(function(){
accoladeContainer.append(accoladeImg)
//accoladeContainer.append(accoladeOverlay)
//accoladeOverlay.append(accoladeText)
accoladeContainer.classList.add('fcpn-head-item')
accoladeContainer.classList.add('accolade-container')
accoladeImg.classList.add('accolade-image')
accoladeOverlay.classList.add('accolade-overlay')
accoladeText.classList.add('accolade-text')
accoladeImg.src = 'https://m.media-amazon.com/images/G/01/Accolades/favicon-
32x32._CB422871708_.png'
searchContainer.children[0].append(accoladeContainer)
accoladeContainer.addEventListener('click', function(){
window.open('https://accolades.corp.amazon.com/send/?user=shocklp', '_blank')
})
})()
console.log(`
-----------------------------
);
//These are the titles that show next to the checkboxes under options
var optionsDefault = {
};
/*for(i=0;i<Object.keys(optionsDefault).length;i++){
console.log(Object.keys(optionsDefault)[i])
}*/
optionHeader.addEventListener('click', collapseOptions );
rpOptionSet.classList.add('option-set');
plusMinus.innerText = "-";
plusMinus.href = '#';
plusMinus.classList.add('plus','minus')
optionHeader.append(plusMinus);
optionsMenu.prepend(rpOptionSet);
optionsMenu.prepend(optionHeader);
//-------------------------------------------------------------------------------
for(var i=0;i<Object.keys(optionsDefault).length;i++){
rpOptionCheckBox.type = 'checkbox';
rpOptionCheckBox.id = Object.keys(optionsDefault)[i];
rpOptionLabel.setAttribute('for', Object.keys(optionsDefault)[i]);
rpOptionLabel.innerText = optionsDefault[Object.keys(optionsDefault)[i]].title
rpOptionSet.append(rpOptionDiv)
rpOptionDiv.append(rpOptionCheckBox, rpOptionLabel)
}
/*make [Rodeo Plus Options] collapsible*/
function collapseOptions(){
if(this.className == 'option-header'){
this.nextSibling.style.display = 'none'
this.classList.add('option-header-collapsed')
this.children[0].innerText = '+'
}else if(this.classList.contains('option-header-collapsed')){
this.nextSibling.style.display = 'block'
this.classList.remove('option-header-collapsed')
this.children[0].innerText = '-'
/*activate/deactivate add-ons*/
function toggleOption(){
if(this.checked){
options[key].on = true //change the value of 'on' within the key of the correctly
clicked checkbox
}else{
options[key].on = false //change the value of 'on' within the key of the correctly
clicked checkbox
localStorage.setItem('options', JSON.stringify(options)) //apply the changed value back to
localStoarage
/*
*/
(window.checkForStorage = function(){
})
Object.keys(JSON.parse(localStorage.options)).forEach(function(key){
if(optionsDefault[key] == undefined){
delete del[key] //delete the key that is in storage but not in defaults (removing an unused
setting)
})
}else{
if(urlmatch[3] != null){
runRodeoPlusOptions()
})()
function runRodeoPlusOptions(){
Object.keys(JSON.parse(localStorage.options)).forEach(function(key){
//console.log(JSON.parse(localStorage.options)[key].on)
if(JSON.parse(localStorage.options)[key].on){
document.getElementById(key).checked = true;
}else{
console.log(`${JSON.parse(localStorage.options)[key].title}: %cOFF`, "color:#fff; background-
color:red; border-radius:10px; padding: 0 5px; border: 1px solid #fff; float:right;")
document.getElementById(key).checked = false;
})
// Allow user to scan ship label QR codes in search bar and return sp00
$("#shipment-search").change( function(){
$("#shipment-search").val(output);
})
document.querySelectorAll('table a[href*=".hitch.aft"][href*="/shipment/"]')
.forEach((a) => {
hitchImg = document.createElement('img')
hitchImg.src =
'https://drive.corp.amazon.com/view/GRR1%20TamperMonkey/media/hitch.png'
hitchLink.append(hitchImg)
hitchImg.classList.add('linkIcon')
hitchImg.title = "Hitch"
hitchLink.classList.add('eagleLink')
hitchLink.href = `https://${region2}.hitch.aft.amazon.dev/warehouse/${FC}/shipment/$
{shipmentId}`
hitchLink.target = '_blank'
a.append(hitchLink)
eagleImg = document.createElement('img')
eagleImg.src = 'https://eagleeye-na.amazon.com/img/eagle-eye-favicon.png'
eagleImg.title = "Eagle-Eye"
eagleLink.append(eagleImg)
eagleImg.classList.add('linkIcon')
eagleLink.classList.add('eagleLink')
eagleLink.href = `https://eagleeye-${region2}.amazon.com/search?type=Shipment&value=$
{shipmentId}`
eagleLink.target = '_blank'
a.append(eagleLink)
GM_xmlhttpRequest({
method: 'GET',
url: `https://hero.${region2}.picking.aft.a2z.com/api/fcs/${FC}/entities/type/
CUSTOMER_SHIPMENT/id/${shipmentId}/events`,
headers: {
'Accept':'application/json, text/javascript',
'Content-Type':'application/json; charset=UTF-8'
},
onload: function(response) {
var js = JSON.parse(response.responseText);
if (js.EventList[i].eventType == 'CREATE_PACKAGE'){
EventD1 = js.EventList[i].eventDetailsKey;
EventD2 = js.EventList[i].requestId;
break;
GM_xmlhttpRequest({
method: 'GET',
headers: {
'Accept':'application/json, text/javascript',
'Content-Type':'application/json; charset=UTF-8'
},
onload: function(response) {
var js = JSON.parse(response.responseText);
// updateBoxRec(shipmentId, boxrec[1]);
}
}
});
});
});
document.querySelectorAll('table a[href*="&asin="]')
.forEach((a) => {
a.href = `http://fcresearch-${region2}.aka.amazon.com/${FC}/results?s=${ASIN}`;
});
document.querySelectorAll('table a[href*="&container="]')
.forEach((a) => {
a.href = `http://fcresearch-${region2}.aka.amazon.com/${FC}/results?s=${location}`;
});
//console.log(allTh);
var shipTh = Array.from(allTh).find(th => th.innerText === 'Shipment ID' || th.innerText ===
'Transfer Request ID');
var scanTh = Array.from(allTh).find(th => th.innerText === 'Scannable ID');
var dateTh = Array.from(allTh).find(th => th.innerText === 'Expected Ship Date' || th.innerText
=== 'Need To Ship By Date');
//console.log(pickBatchTh);
// Get the index of that element with respect to its siblings (+1 because nodes are base 1 not base 0
like arrays)
};
};
};
};
};
};
//console.log(pickBatchColumn);
var total = 0
for(var j=0;j<quantityColumn.length;j++){
total += quant
};
};
quantityTh.innerText += ` (${total})`;
};
for(j=0;j<workPoolColumn.length;j++){
if(workPoolColumn[j].innerText == 'PickingNotYetPickedHardCapped' ||
workPoolColumn[j].innerText == 'PickingNotYetPickedNonPickable'){
workPoolColumn[j].parentNode.classList.add('hardCapped');
};
for(j=0;j<shipOptionColumn.length;j++){
if(shipOptionColumn[j].innerText == 'sss-us'||
shipOptionColumn[j].innerText == 'std-us-military'){
shipColumn[j].parentNode.classList.add('coldPrickly')
var coldPricklyImg = document.createElement('img')
coldPricklyImg.src =
"https://drive.corp.amazon.com/view/GRR1%20TamperMonkey/media/cold.png"
coldPricklyImg.classList.add('linkIcon')
shipColumn[j].appendChild(coldPricklyImg)
for(j=0;j<shipColumn.length;j++){
shipColumn[j].innerHTML+=("<div class='relative'><img
src='https://drive.corp.amazon.com/view/GRR1%20TamperMonkey/media/copy.png' width='20px'
class='CopyBtn'><span class='tooltip tooltip--pos'>Copy Ship ID</span></div>");
//shipColumn[j].innerHTML+=("<span class='CopyBtn'>📋</span>");
};
};
for(j=0;j<scanColumn.length;j++){
if(scanColumn[j].innerText==''){
}else{
scanColumn[j].innerHTML+=("<div class='relative'><img
src='https://drive.corp.amazon.com/view/GRR1%20TamperMonkey/media/copy.png' width='20px'
class='CopyBtn'><span class='tooltip tooltip--pos'>Copy Scannable ID</span></div>");
//scanColumn[j].innerHTML+=("<span class='CopyBtn'>📋</span>");
}
};
};
for(j=0;j<asinColumn.length;j++){
if(asinColumn[j].innerText==''){
}else{
asinColumn[j].innerHTML+=("<div class='relative'><img
src='https://drive.corp.amazon.com/view/GRR1%20TamperMonkey/media/copy.png' width='20px'
class='CopyBtn'><span class='tooltip tooltip--pos'>Copy ASIN</span><img src='https://drive-
render.corp.amazon.com/view/shocklp@/media/print.png' width='20px' class='printBtn'></div>");
//asinColumn[j].innerHTML+=("<span class='CopyBtn'>📋</span>");
};
};
//console.log(link)
range.selectNode(link);
selection.removeAllRanges();
selection.addRange(range);
//navigator.clipboard.write(selection)
selection.removeAllRanges()
//-- Get text of adjacent <div> and strip leading/trailing whitespace:
$(".justCopied").removeClass ("justCopied")
targetDiv.parent().parent().addClass("justCopied")
} );
$(".justCopied").removeClass ("justCopied")
})
GM_xmlhttpRequest({
url:"https://fc-art.corp.amazon.com/checkprinter",
method:"POST",
data:`printerip=${remoteAddr}&localprint=true`,
headers:{
Host: "fc-art.corp.amazon.com",
Referer: "https://fc-art.corp.amazon.com/",
"Content-Type": "application/x-www-form-urlencoded",
Origin: "https://fc-art.corp.amazon.com",
Connection: "keep-alive",
"Upgrade-Insecure-Requests": 1,
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-User": "?1",
},
onload:function(){
GM_xmlhttpRequest({
method: "POST",
url: "https://fc-art.corp.amazon.com/process?",
data: params,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
})
})
//console.log(`${url}${params}`);
if(JSON.parse(localStorage.options).PADModifier.on == true){
waaa.appendChild(ptNode)
waaa.appendChild(padTime);
waaa.appendChild(minsNode);
padTime.classList.add("padtime");
padTime.maxLength=3;
if (!localStorage.padTime){
localStorage.padTime = 0;
padTime.value = localStorage.padTime; //whatever is in storage will load into the text field
};
var ExSD=[]; /*stores the ExSD so that pad time can be manipulated many times
and it will still be calculated based off the actual ExSD and not
ExSD[i] = new Date (dateColumn[i].innerText) //get time from column and use to calculate pad
times
if(padTime.value==""){
if(JSON.parse(localStorage.options).CPTHighlighter.on == true){
CPTHighlighter()
});
function newExsd(){
dateColumn[i].innerText = `${tempDate.getFullYear()}-${tempDate.getMonth()+1}-$
{tempDate.getDate()} ${(tempDate.getHours()<10?'0':'')}${tempDate.getHours()}:$
{(tempDate.getMinutes()<10?'0':'')}${tempDate.getMinutes()}`;
if(JSON.parse(localStorage.options).CPTHighlighter.on == true){
CPTHighlighter()
for(var k=0;k<conditionColumn.length;k++){
conditionColumn[k].classList.remove('relative'); //remove .relative class from conditions cell so
the numbers stay centered
};
};
function CPTHighlighter(){
//console.log(`padtime: ${PAD}`)
dateColumn[i].classList.remove("redcpt","yellowcpt","greencpt");
if(timeLeft <= 0) {
dateColumn[i].classList.add("redcpt");
dateColumn[i].classList.add("yellowcpt");
dateColumn[i].classList.add("greencpt");
}else{
};
};
};
};
/* CONDITIONS TOOLTIP */
function addConditions(){
var conditions=[]
conditions[0] ="Cancelled"
conditions[6] ="Shipped"
conditions[7] ="Scanned"
conditions[8] ="Manifesting"
conditions[12] ="Giftwrapped"
conditions[32] ="Manifesting"
conditions[99] =""
conditions[102]="Pending Payment-Reverse"
conditions[104]="Pending Crossdock"
conditions[603]=""
conditions[666]=""
conditions[704]="Pack in Progress"
conditions[707]="Shipment Packed"
conditions[2667]="FCPickingRollbackService"
conditions[3010]=""
conditions[3603]=""
conditions[4666]="Unknown Shipment"
conditions[4667]="Undership"
conditions[4668]="Overship"
if(currentCond == 11||
currentCond == 12||
currentCond == 27){
conditionColumn[k].parentNode.classList.add('inProblemSolve');
}else{null};
};
};
function scanIdChecker(){
scanColumn[l].parentNode.classList.add('isTote')
scanColumn[l].parentNode.classList.add('hotpick');
}else if (currentScan.match(/ts(ps)?([A-Za-z]+)?(\d+)?(SLAM|CW)?_?([A-Z])?_?\d+_?(\d+)?/) !
== null){
scanColumn[l].parentNode.classList.add("inProblemSolve")
scanColumn[l].parentNode.classList.add("inProblemSolve")
scanColumn[l].parentNode.classList.add('isSp00')
GM_xmlhttpRequest({
method: "GET",
url: url,
onload: function(response) {
podLink.innerText = podID
podLink.href = "https://vantage.amazon.com/app/pod-portal/pod-details?
region=us-east-1&customer=AMZN&podId=" + podID
podLink.target = "_blank"
arrmImg.src =
'https://drive.corp.amazon.com/view/GRR1%20TamperMonkey/media/arm.png'
arrmLink.append(arrmImg)
arrmImg.classList.add('linkIcon')
arrmLink.href = `https://arrm-portal-${region3}-${region}.$
{region}.proxy.amazon.com/storage/snapshot?customer=AMZN&warehouse=${FC}&zone=$
{floor}&searchSelector=pod&searchInput=${podID}`
arrmLink.target = '_blank'
message.classList.add('podInfo')
message.innerText = `${floor} : `
message.append(podLink)
message.append(arrmLink)
newDiv.append(message)
binCell.parentNode.append(newDiv)
})
podImg = document.createElement('img')
podImg.src =
'https://drive.corp.amazon.com/view/GRR1%20TamperMonkey/media/pod_console_icon.png'
podLink.append(podImg)
podImg.classList.add('linkIcon')
podLink.href = `https://pod-console.corp.amazon.com/pods/AMZN/${FC}/none/none/$
{bin}` //slice so that we get just the pod location and not the extra stuff in the cell like 'copy scannable
ID'
podLink.target = '_blank'
scanColumn[l].append(podLink)
podLink.addEventListener("click",function(){
this.parentNode.parentNode.classList.add('visitedPod')
})
scanColumn[l].parentElement.classList.add('badScan')
scanColumn[l].classList.add('condition')
}else{
scanColumn[l].parentElement.classList.add('badScan')
scanColumn[l].classList.add('condition')
//scannableColumn[l].firstElementChild.classList.add('badScan');
}
addClipboard()
addConditions()
scanIdChecker()
/*Screen Barcode*/
var bar_cover=document.createElement("div")
bar_cover.classList.add("barcodes_cover")
bar_panel.classList.add("barcodes_panel")
bar_panel.appendChild(bar_label)
bar_panel.appendChild(bar_img)
bar_cover.appendChild(bar_panel)
function altClickShowBar(event) {
if ( ! event.altKey ) return
let barType="128"
if (barcodeText.length > 16) {
barType="qr"
showBarcodePage(barType,barcodeText);
// thanks to barcodeapi.org
function showBarcodePage(barcodeType,barcodeString) {
bar_label.innerText=barcodeString
bar_img.src = `https://barcodeapi.org/api/${barcodeType}/${barcodeString}?text=none`
bar_cover.style.display="grid"
//document.head.appendChild(barcodeShowStyle);
document.body.append(bar_cover)
GM_addStyle ( `
.fcpn-sprite{
background-image: url("https://drive.corp.amazon.com/view/GRR1%20TamperMonkey/media/
rodeoPlus.png") !important;
#fcpn-header {
position:sticky;
top: 0;
z-index: 1000;
}
#fcpn-site-input{
color:#e47911 !important;
.result-table thead {
position: sticky;
top: 35px;
z-index: 60;
.highlight-header.tablesorter-header{
background-color:#fff !important;
#disabledScript {
left: 350px;
position: absolute;
padding: 0 10px;
border-radius: 10px;
z-index:1001;
@keyframes notify {
0% {background-color: yellow;}
100%{background-color: yellow;}
#enabledScript{
left:350px;
position: absolute;
padding: 0 10px;
border-radius: 10px;
@keyframes notify2 {
0% {background-color: lightgreen;}
100%{background-color: lightgreen;}
.tooltip{
z-index:1001;
visibility: hidden;
opacity:0;
position:absolute;
background-color: #555;
color: #fff;
text-align: center;
border-radius: 6px;
padding: 5px;
text-indent: initial;
border-color: #fff;
user-select:none;
.tooltip--pos{
bottom: 130%;
left:50%;
transform:translate(-50%,0);
}
.conditiontip {
bottom: 90%;
right: 50%;
margin-right: 12px;
.CopyBtn:hover + .tooltip,
.quickLink:hover + .tooltip,
opacity:1;
visibility: visible;
user-select:none;
.CopyBtn,
.printBtn{
opacity:0;
cursor: pointer;
text-indent:0;
user-select:none;
.CopyBtn:hover,
.printBtn:hover{
opacity:1;
cursor:pointer;
.tooltip--pos::after {
content: "";
position: absolute;
top: 100%;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
.linkIcon {
height: 1rem;
user-select: none;
.podInfo {
color: #ff5733;
.quickLink {
opacity:0;
cursor: pointer;
text-indent:0;
.quickLink:hover {
opacity:1;
cursor:pointer;
.visitedPod {
background-color:#30D5C8;
.justCopied {
background-color:#FEDA15;
}
@keyframes copy {
.justCopied a {
color:#0113DA;
@keyframes changeBlack {
.badScan {
@keyframes blink {
.badScan a {
@keyframes whiteText {
.fl-right {
float:right;
.moreThan1 {
animation: blink1 800ms ease-in infinite;
@keyframes blink1 {
color:#fff;
.hardCapped {
background-color:#ff443366;
.coldPrickly {
background-color:#dcf3ff;
.filterable.check .filter-link,
.non-filterable.check .filter-link {
.filterable .euler-link,
.non-filterable .euler-link {
.filterable .aps-link,
.non-filterable .aps-link {
.filterable .hero-link,
.non-filterable .hero-link {
.filterable.check,
.non-filterable.check {
.relative .filter-link {
#disabledScript {
cursor:pointer;
.relative {
display: flex;
justify-content: space-between;
.condition {
position:relative;
#fcpn-update {
width: 24px;
height: 24px;
display: block;
white-space: normal;
background-image:
url('https://drive-render.corp.amazon.com/view/shocklp@/media/update.png');
background-size: contain;
cursor:pointer;
}
#fcpn-update:hover > .fcpn-tooltip{
display:block;
.redcpt{
background-color:#ff1a00;
.yellowcpt{
background-color: #ff3;
.greencpt{
background-color: #26cc00;
.padtime{
text-align: center;
width: 36px;
border-radius: 20%;
.inProblemSolve{
box-shadow: -5px 0px 0px rgb(191, 128, 255) inset,-5px 2px 0px rgb(191, 128, 255) inset,-5px -2px
0px rgb(191, 128, 255) inset;
.isTote{
box-shadow: -5px 0px 0px rgb(255, 233, 0) inset,-5px 2px 0px rgb(255, 233, 0) inset,-5px -2px 0px
rgb(255, 233, 0) inset;
.isSp00{
box-shadow: -5px 0px 0px rgb(0, 200, 255) inset,-5px 2px 0px rgb(0, 200, 255) inset,-5px -2px 0px
rgb(0, 200, 255) inset;
/*background-color: rgba(255, 255, 255, 0.1)*/
color: #fff;
.hotpick{
background-color:#93ff93;
::selection {
color: #f90;
background: #146eb4;
.checkBox{
.run {
background-color: #f90;
.run:hover{
background-color:#f00;
.run:after{
content: "";
display: block;
width: 2px;
height: 7px;
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.run:hover:after{
content: "";
display: block;
color:white;
border:transparent;
transform: rotate(0deg);
.noRun{
background-color:#fff;
.noRun:hover{
background-color: #0f0;
.noRun:after{
content: "";
display: block;
width: 2px;
height: 7px;
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
.noRun:hover:after{
content: "";
display: block;
color:white;
border:transparent;
transform: rotate(0deg);
.checkBox:hover{
/*background-color: gray;*/
cursor:pointer;
.checkBox:active{
background-color: white;
.deleteCache{
color: #f00;
cursor: pointer;
.eagleLink{
text-indent:0;
user-select: none;
.barcodes_cover {
display: none;
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: #f3f3f3cc;
z-index: 160;
align-items: center;
justify-items: center;
}
.barcodes_cover>.barcodes_panel {
display: grid;
width: 35%;
height: 42%;
background-color: #fff;
border-radius: 5px;
min-width: 35rem;
min-height: 17rem;
align-items: center;
justify-items: center;
.barcodes_cover>.barcodes_panel>img {
display: block;
.barcodes_cover>.barcodes_panel>p {
display: block;
margin-top:1rem;
color:#444;
.accolade-container {
background-color: transparent;
width: 32px;
height: 32px;
cursor: pointer;
.accolade-container:hover{
width: 50%;
background-color: transparent;
right: 232px;
.accolade-overlay{
position: absolute;
bottom: 0;
right: 0;
left: 32px;
background-color: #007486;
overflow: hidden;
width: 0;
height: 100%;
.accolade-container:hover .accolade-overlay{
min-width:220%;
.accolade-text{
color: white;
font-size: auto;
position: absolute;
top: 50%;
left: 50%;
white-space: nowrap;
` );
// })