您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Display green cards for valid TACE
// ==UserScript== // @name PYS++ // @license MIT // @namespace http://tampermonkey.net/ // @version 1.8 // @description Display green cards for valid TACE // @author Matthieu Auger // @match https://app.pickyourskills.com/reporting/staffing_dashboard?view=user // @match https://app.pickyourskills.com/reporting/staffing_dashboard?view=user&tribe=lyon // @match https://app.pickyourskills.com/reporting/staffing_dashboard?view=user&tribe=kumo // @icon https://www.google.com/s2/favicons?domain=pickyourskills.com // @grant none // @require https://code.jquery.com/jquery-3.6.0.min.js // @require https://greasyfork.org/scripts/383527-wait-for-key-elements/code/Wait_for_key_elements.js?version=701631 // ==/UserScript== (function() { 'use strict'; var $ = window.jQuery; var currentWeekNumber = getCurrentWeekNumber(); var currentYear = new Date().getFullYear(); var displayExceedingTacesInOrange = false; var displayWeekStandard = false; var defaultTaces = { Dev: 100, Sales: 0, 'Growth Team': 0, Architecte: 90, 'Head of Tribe': 0, 'VP Tech': 50, 'CA / PO': 100, 'DP / PM / AM': 100, 'Externe': 0 } var tacesByTribe = { 'Theodo Lyon': { ...defaultTaces, 'Head of Tribe': 50, 'CA / PO': 50, 'DP / PM / AM': 50 }, 'Kumo': { ...defaultTaces, Dev: 90, Architecte: 80 } } var defaultWeekStandard = 9; var weekStandardByTribe = { 'Theodo Lyon': 9, 'Kumo': 3, } const urlParams = new URLSearchParams(window.location.search); if (urlParams.get('tribe') === 'kumo') { displayExceedingTacesInOrange = true; displayWeekStandard = true; } if (urlParams.get('tribe') === 'lyon') { displayWeekStandard = true; } function colorizeRowBasedOnStaffingAndTace(jNode) { var role = jNode.find('[label=Position]').text(); var tribe = jNode.find('[label=Tribe]').text(); jNode.find('div.cell.main_cell[width=85] > div > div').each(function(jNode) { var staffing = $(this).text(); if (staffing.endsWith('%')) { var staffingNumber = parseInt(staffing.slice(0, -1)); var taces = defaultTaces; if (tribe in tacesByTribe) { taces = tacesByTribe[tribe]; } if (staffingNumber === taces[role]) { displayGreen($(this)); } else if (staffingNumber > taces[role]) { if (displayExceedingTacesInOrange) { displayOrange($(this)); } else { displayGreen($(this)); } } else { displayRed($(this)); } } if (displayWeekStandard) { // we want to add a border x weeks after current and works even with new years, hence the modulo var weekStandard = defaultWeekStandard; if (tribe in weekStandardByTribe) { weekStandard = weekStandardByTribe[tribe]; } var weekNumberInStandard = currentWeekNumber + weekStandard; var yearNumberInStandard = currentYear; if (weekNumberInStandard > 52) { weekNumberInStandard = weekNumberInStandard % 52; yearNumberInStandard++ } var twoDigitsWeekStandard = ("0" + weekNumberInStandard).slice(-2); if ($(this).parent().data('cy') === 'date-' + yearNumberInStandard + '-W' + twoDigitsWeekStandard) { $(this).parent().css('border-right', '3px solid orange'); } } }); } function getCurrentWeekNumber() { var today = new Date(); var d = new Date(Date.UTC(today.getFullYear(), today.getMonth(), today.getDate())); var dayNum = d.getUTCDay() || 7; d.setUTCDate(d.getUTCDate() + 4 - dayNum); var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1)); return Math.ceil((((d - yearStart) / 86400000) + 1)/7) } function displayGreen(_this) { _this.css('color', 'rgb(112, 215, 98)'); _this.css('background-color', 'rgba(112, 215, 98, 0.1)'); } function displayOrange(_this) { _this.css('color', 'rgb(255, 165, 0)'); _this.css('background-color', 'rgba(255, 165, 0, 0.1)'); } function displayRed(_this) { _this.css('color', 'rgb(219, 40, 40)'); _this.css('background-color', 'rgba(219, 40, 40, 0.1)'); } waitForKeyElements("#individual_staffing_reporting_table_export .row", colorizeRowBasedOnStaffingAndTace); })();