您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add custom functionality to OpenAir website
- // ==UserScript==
- // @name Koombea OpenAir: functions
- // @name:es Koombea OpenAir: functions
- // @description Add custom functionality to OpenAir website
- // @description:es Agrega funcionalidad personalizada al sitio web de OpenAir
- // @namespace koombea_air
- // @version 0.5.0
- // @author rhonaldomaster
- // @compatible chrome
- // @compatible edge
- // @compatible firefox
- // @compatible opera
- // @compatible safari
- // @copyright GNU/GPL v3
- // @grant GM_addStyle
- // @homepage https://github.com/rhonaldomaster/openair-k-colors
- // @icon https://www.google.com/s2/favicons?sz=64&domain=openair.com
- // @license GPL-3.0-or-later
- // @match *://koombea-inc.app.netsuitesuiteprojectspro.com*
- // ==/UserScript==
- /**
- * Converts booking % to h/d
- */
- function convertBookingPercentToHD() {
- const bookings = document.querySelectorAll('.GMGanttFixedIn, .GMGanttLeftIn, .GMGanttRightIn, .GMGanttBaseIn');
- bookings.forEach((booking) => {
- // Validates that the booking wasn't already converted and that it contains the % value
- const bookingHTML = booking.innerHTML;
- if (
- bookingHTML.split('h/d')[0] == bookingHTML &&
- bookingHTML != '' &&
- bookingHTML.match(/([0-9]*\.?[0-9]+)\s%/) != null
- ) {
- const hours_per_day = Math.round(((bookingHTML.match(/([0-9]*\.?[0-9]+)\s%/)[1] * 8) / 100 + Number.EPSILON) * 100) / 100;
- if (bookingHTML.match(/([0-9]*\.?[0-9]+)\s%/)[0] == booking.textContent) {
- // For allocation percentage bubbles at the top
- booking.innerHTML = hours_per_day + 'h/d';
- } else {
- // For bookings
- booking.innerHTML = hours_per_day + 'h/d ' + bookingHTML;
- }
- }
- });
- }
- /**
- * Displays alert if the opened timesheet is in the future
- */
- function checkForFutureTimesheets() {
- const timesheetStart = new Date(document.querySelector('.header-text-record-title').innerHTML.split(' to ')[0]); //Gets timesheet's dates based on title
- const today = new Date();
- if(timesheetStart - today > 0) {
- document.querySelector('.header-text-record-title').innerHTML += '<span class="timesheet-alert"><b class="svg"></b> This timesheet is for a future period!</span>';
- }
- }
- /**
- * UI add-on for bookings form to calculate hours per day
- */
- function calculateHoursPerDay() {
- const iframe = document.querySelector('iframe[name="Edit booking"]');
- const isNewBooking = window.location.href.indexOf("/booking.pl") > -1 && window.location.href.indexOf("action=new") > -1;
- var doc;
- if(iframe != null) {
- doc = iframe.contentDocument;
- } else if(isNewBooking) {
- doc = document;
- }
- if(doc != undefined) {
- const bookByTable = doc.querySelector('#row_section_4 .formLabeledPair > tbody');
- const warningContainer = doc.querySelector('.book-by__warning-text');
- if(warningContainer == null) {
- bookByTable.innerHTML += '<tr><td colspan="4">Hours per day calculator:</td><td class="book-by__hours-per-day"><input type="text" class="book-by__hours-per-day" value="0" size="12" maxlength="12"></td></tr><tr class="book-by__warning-text"><td colspan="5"><strong>Make sure to select "Percentage of time"</strong></td></tr>';
- }
- const perDayInput = doc.querySelector('input.book-by__hours-per-day');
- const percentageInput = doc.querySelector('#row_section_4 input[name="percentage"]');
- if(perDayInput.value != percentageInput.value * 8 / 100 && doc.activeElement != perDayInput && doc.activeElement != percentageInput) perDayInput.value = percentageInput.value * 8 / 100;
- percentageInput.addEventListener('input', () => {
- perDayInput.value = percentageInput.value * 8 / 100;
- });
- perDayInput.addEventListener('input', () => {
- percentageInput.value = perDayInput.value * 100 / 8;
- });
- }
- }
- /**
- * Checks the current page location
- */
- function pageLocation(page) {
- const location = window.location.href;
- switch (page) {
- case "timesheet":
- return (location.indexOf("/timesheet.pl") > -1 && location.indexOf("timesheet_id=") > -1);
- break;
- case "planner":
- return (location.indexOf("/booking.pl") > -1 && location.indexOf("_booking_layout=planner") > -1);
- break;
- case "booking-edit":
- return (location.indexOf("/booking.pl") > -1 && (location.indexOf("_booking_layout=planner") > -1 || location.indexOf("action=new") > -1));
- break;
- }
- }
- window.addEventListener('load', () => {
- if(pageLocation("timesheet")) checkForFutureTimesheets();
- if(pageLocation("planner")) setInterval(convertBookingPercentToHD, 1000);
- if(pageLocation("booking-edit")) setInterval(calculateHoursPerDay, 1000);
- });