Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

JIRA Service Desk - Project Queue - Trigger ASYNC Refresh

Nicolas DUPRE August 29, 2018

Hi Community,

 

Sorry for the double post. Due to many edition on JS  code block to get the right syntax highlight, my previous post has been considered as SPAM and no longer visible.


I'm looking for very specific need. I'm developping a userscript to send notification througth dedicated API (https://developer.mozilla.org/fr/docs/Web/API/notification).


My script works but if I'm not on the page, on the browser (Google Chrome), the refresh of the current queues is stopped.

I create new issue and then I tried to replay xhr queries but nothing is refresh.

2018-08-28 20_03_02-DevTools - preprod-support.viseo.com_projects_AJTI01_queues_custom_2018.png


I tried to send event "refreshIssuePage" and some others customed events, but nothing happens.

 

var evt = new Event('refreshIssuePage');
document.dispatchEvent(evt);

2018-08-28 20_03_57-DevTools - preprod-support.viseo.com_projects_AJTI01_queues_custom_2018.png

 

Is someone know how to refresh the current queue of selected prohect when JIRA runs in background ?

 

Each time I come back on page, the "poll" request is sent :

2018-08-28 20_07_16-DevTools - preprod-support.viseo.com_projects_AJTI01_queues_custom_2018.png

 

I didn't found Web Worker/SSE which could manage refreh of current queue .

Maybe there is a flag which tells the page have not the focus and stops the refresh (in DOM element 'window' (probably window.AJS) or 'document' ?

 

All help is welcome.

 

Best regards,

Nicolas DUPRE.

 

JIRANotifier.png

 

Javascript Code (Wrong syntax highlighting - Sorry)

// ==UserScript==
// @name VISEO Jira Service Desk Notifier
// @namespace *
// @version 0.2.0-JIRAv7.5.3
// @description Notify on new request for Viseo JIRA Support.
// @author Nicolas DUPRE
// @match https://<your-jira-server-domain>/*
// @grant none
// ==/UserScript==
//https://tampermonkey.net/documentation.php

/**
* Settings vars
*/
// Project/queues to watch
// def: <projectKey>: [<queuId>, [...<queuId>]]
let projects = {
VJIR01A: [208],
NOVA01T: [1372]
};
// Son de la notification de 1 à 3
let sound = 2;


/**
* Variable global du programme
*/
// Sons
let sounds = ['arpeggio', 'microbounce', 'munchausen'];
// Modèle URL pour surveiller la queue et emmettre les notifications
let URLPattern = 'https://<your-jira-server-domain>/projects/%p/queues/custom/%q';
// Modèle URL pour jumper directement sur l'issue
let IssueURLPattern = 'https://<your-jira-server-domain>/browse/%i';
// Modèle de message pour la notification
let messagePattern = 'Issue %i has been created : %m';
// URLs chargées : si absent, alors indexer l'existant pour ne pas notifier la queue complète
let URLLoaded = [];
// Liste des issues indexés pour ne pas renotifier
let IssueLoaded = [];
// Dernière URL lors de la surveillance - Permet de gérer un temps d'attente de chargement pour indexer si besoin
let lastURLLocation = null;


/**
* Fonctions
*/
// Fonction de surveillance
function watch(){
// Initialisation
// Indicateur pour ne pas procéder à la surveillance
let skip = false;
// Temps d'attente défini a 1000ms par défaut
let timeout = 1000;



// gestion des changements d'URL pour laisser des temps d'attente de chargement.
if (document.location.href !== lastURLLocation) {
skip = true;
timeout = 5000;
lastURLLocation = document.location.href;
}

// Analyse si nous passé
if (!skip){
// Demander l'autorisation d'envoyer des notifications.
// Uniquement à partir d'ici pour être sur que tout est chargé
new NotifyMe().request();

for(let project in projects){
projects[project].map(function(queue){
let URL = URLPattern;
URL = URL.replace('%p', project);
URL = URL.replace('%q', queue);

let notify = (URLLoaded.lastIndexOf(URL) === -1) ? false : true;

// Si l'URL généré par la config correspond à l'URL actuelle, on watch
if (URL === document.location.href) {
var issues = document.querySelectorAll('.sd-issue-table tbody .issuerow').forEach(function(issue){
let issueKey = issue.getAttribute('data-issuekey');
let issueSum = issue.querySelector('.summary p a').textContent;
//let issueTypeIcon = issueKey.querySelector('.issuetype a img').getAttribute('src');
let issueTypeIcon = '/s/-zcv8tr/75008/63c38cbf4c2f8f9251dd0d383c77b8bb/_/favicon.ico';
let message = messagePattern;

let target = IssueURLPattern.replace('%i', issueKey);

message = message.replace('%i', issueKey);
message = message.replace('%m', issueSum);

if (IssueLoaded.lastIndexOf(issueKey) === -1){
IssueLoaded.push(issueKey);

if (notify) {
document.NotifyMePlayer.play();
let notifier = new NotifyMe();
notifier.title('Viseo JIRA Service Desk');
notifier.message('message');
notifier.target(target);
notifier.options({
icon: issueTypeIcon
});
notifier.send();
}
}
});
}

// Ajouter à l'index des URL indexés.
if(URLLoaded.lastIndexOf(URL) === -1) URLLoaded.push(URL);
});
}
}

setTimeout(watch, timeout);
}


/**
* Exécution
*/
// Chargement de la lib "NotifyMe"
var NotifyMeScript = document.createElement('script');
NotifyMeScript.src='https://rawgit.com/neooblaster/NotifyMe/master/src/NotifyMe.min.js';
document.head.appendChild(NotifyMeScript);

// Création d'un player audio
var notificationPlayer = document.createElement('audio');
notificationPlayer.src='http://library.neoblaster.fr/JavaScript.Classes/NotifyMe_V.1.0/'+sounds[sound-1]+'.mp3';
notificationPlayer.setAttribute('id', 'notificationPlayer');
notificationPlayer.setAttribute('style', 'display: none;');
document.NotifyMePlayer = notificationPlayer;

// Execution de la surveillance après 4s d'attente pour laisser le temps à la queue de s'afficher
watch();

 

0 answers

Suggest an answer

Log in or Sign up to answer