您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds buttons to select technicians by area and dates up to 7 days from the latest selected date in the calendar in Pestpac
- // ==UserScript==
- // @name Pestpac - Easy Quick Scheduler Buttons
- // @version 5.2.2
- // @description Adds buttons to select technicians by area and dates up to 7 days from the latest selected date in the calendar in Pestpac
- // @match https://app.pestpac.com/appointment/*
- // @author Jamie Cruz
- // @grant none
- // @license MIT
- // @namespace https://greasyfork.org/users/1433767
- // ==/UserScript==
- (function() {
- 'use strict';
- /**
- * Creates and inserts the button container for technician selection.
- * This container is styled as a scrollable two-column grid.
- * It is placed next to the "Refresh Search" button for accessibility.
- * @returns {HTMLElement} The created container element.
- */
- function createButtonContainer() {
- var container = document.createElement("div");
- container.id = "techbuttons";
- container.classList.add("slim-scrollbar", "pr-tiny"); // Applies styling for custom scrollbar
- container.style.display = "grid";
- container.style.gridTemplateColumns = "auto auto"; // Two columns with flexible sizing
- container.style.gap = "5px"; // Space between buttons
- container.style.overflowY = "auto"; // Enables vertical scrolling
- container.style.maxHeight = "125px"; // Limits height for a compact view
- container.style.border = "1px solid #ccc"; // Adds a border for clarity
- container.style.padding = "10px";
- container.style.marginBottom = "10px";
- container.style.width = "fit-content"; // Prevents unnecessary horizontal scrolling
- var refreshSearchButton = document.getElementById("butRefreshSearch");
- if (refreshSearchButton) {
- refreshSearchButton.parentNode.insertBefore(container, refreshSearchButton.nextSibling);
- } else {
- console.error("Element with ID 'butRefreshSearch' not found."); // Logs an error if the expected element is missing
- }
- return container;
- }
- /**
- * Adds a technician selection button to the container.
- * Clicking the button selects specific rows based on given range IDs.
- * @param {string} buttonText - Label for the button.
- * @param {string} color - Background color for the button.
- * @param {Array} rowRanges - Array of start and end row IDs to select.
- * @param {HTMLElement} container - The container to add the button to.
- * @param {string} position - Positioning data for organizational purposes.
- */
- function addTechButton(buttonText, color, rowRanges, container, position) {
- var button = document.createElement("button");
- button.innerHTML = buttonText;
- button.style.width = "90px"; // Uniform button size
- button.style.height = "28px";
- button.style.fontSize = "12px"; // Smaller text for clarity
- button.style.backgroundColor = color;
- button.style.color = "white";
- button.style.border = "none";
- button.style.borderRadius = "5px";
- button.style.cursor = "pointer";
- button.style.textAlign = "center";
- button.setAttribute("data-position", position); // Stores position metadata
- var positionParts = position.split(":");
- button.style.gridRow = positionParts[0]; // Assigns the row number
- button.style.gridColumn = positionParts[1]; // Assigns the column number
- container.appendChild(button);
- button.addEventListener("click", function() {
- // Deselects all previously selected rows
- document.querySelectorAll("tr.SelectedRow").forEach(row => {
- row.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));
- row.classList.remove("SelectedRow");
- });
- // Selects new rows based on predefined ID ranges
- for (let range of rowRanges) {
- for (let i = range.start; i <= range.end; i++) {
- let row = document.querySelector("table.insetTable #MultiTechRow" + i);
- if (row) {
- row.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));
- row.classList.add("SelectedRow");
- } else {
- console.error("Row with ID 'MultiTechRow" + i + "' not found.");
- }
- }
- }
- });
- }
- /**
- * Adds a button to automatically select the next 7 calendar dates after the last selected date.
- * Useful for scheduling appointments efficiently.
- */
- function addSelectButton() {
- var button = document.createElement("button");
- button.innerHTML = "+7";
- button.style.width = "60px"; // Compact button
- button.style.height = "28px";
- button.style.fontSize = "12px";
- button.style.backgroundColor = "#1565C0";
- button.style.color = "white";
- button.style.border = "none";
- button.style.borderRadius = "5px";
- button.style.cursor = "pointer";
- var updateCalendarButton = document.getElementById("butUpdateCalendarDate");
- if (updateCalendarButton) {
- updateCalendarButton.parentNode.insertBefore(button, updateCalendarButton.nextSibling);
- } else {
- console.error("Element with ID 'butUpdateCalendarDate' not found.");
- }
- button.addEventListener("click", function() {
- var selectedDates = document.querySelectorAll(".selectedcalendarlink");
- if (selectedDates.length === 0) {
- alert("No date selected.");
- return;
- }
- var latestSelectedDate = selectedDates[selectedDates.length - 1];
- var latestDateText = latestSelectedDate.textContent.trim();
- var latestDate = new Date(latestDateText);
- var calendarDates = document.querySelectorAll("table.insetTable .calendarlink, table.insetTable .selectedcalendarlink");
- var count = 0;
- var latestFound = false;
- for (var i = 0; i < calendarDates.length; i++) {
- var dateText = calendarDates[i].textContent.trim();
- if (latestFound && count < 7) {
- calendarDates[i].dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));
- count++;
- }
- if (dateText === latestDateText) {
- latestFound = true;
- }
- }
- });
- }
- /**
- * Initializes the script by creating the button container and adding technician selection buttons.
- * Also adds the "+7" button for date selection.
- */
- window.onload = function() {
- var container = createButtonContainer();
- addTechButton("VA techs", "#262F6A", [{ start: 3, end: 10 }], container, "1:1");
- addTechButton("VA ACT", "#0057E9", [{ start: 3, end: 4 }, { start: 6, end: 7 }], container, "2:1");
- addTechButton("VA TM", "#262F6A", [{ start: 4, end: 4 }, { start: 6, end: 6 }], container, "3:1");
- addTechButton("Tide", "#52C5D8", [{ start: 24, end: 26 }], container, "4:1");
- addTechButton("MD techs", "#EF4255", [{ start: 11, end: 23 }], container, "1:2");
- addTechButton("MD TM", "#EF4255", [{ start: 11, end: 14 }, { start: 17, end: 17 }], container, "3:2");
- addTechButton("MD ACT", "#F5A623", [{ start: 11, end: 18 }, { start: 21, end: 21 }], container, "2:2");
- addSelectButton("+7", "#1565C0");
- };
- })();