Initial commit
This commit is contained in:
commit
685d3eba55
3 changed files with 83 additions and 0 deletions
14
manifest.json
Executable file
14
manifest.json
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"manifest_version": 2,
|
||||||
|
"name": "Pivotal Improvements",
|
||||||
|
"version": "1.0.2",
|
||||||
|
|
||||||
|
"content_scripts":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"matches": ["*://*.pivotaltracker.com/n/projects/*"],
|
||||||
|
"js": ["project.js"],
|
||||||
|
"css": ["project.css"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
20
project.css
Executable file
20
project.css
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
.story.owned > .preview {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.story > .preview {
|
||||||
|
transition: background-color 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.story.highlighted.planned > .preview {
|
||||||
|
background-color: #dfdfdf;
|
||||||
|
}
|
||||||
|
|
||||||
|
.story.highlighted.started > .preview,
|
||||||
|
.story.highlighted.finished > .preview {
|
||||||
|
background-color: #e3e3c1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.story.highlighted.accepted > .preview {
|
||||||
|
background-color: #cadbbf;
|
||||||
|
}
|
49
project.js
Executable file
49
project.js
Executable file
|
@ -0,0 +1,49 @@
|
||||||
|
const root = document.querySelector('#root');
|
||||||
|
|
||||||
|
let fullName = '';
|
||||||
|
|
||||||
|
|
||||||
|
function updateFullName() {
|
||||||
|
const avatar = document.querySelector('[data-aid="Avatar__image"]');
|
||||||
|
if (avatar)
|
||||||
|
fullName = avatar.getAttribute('alt');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function setClassOnStoriesWithOwner(name, className) {
|
||||||
|
const owners = document.querySelectorAll('.owner');
|
||||||
|
for (const owner of owners) {
|
||||||
|
const story = owner.parentElement.parentElement.parentElement.parentElement;
|
||||||
|
|
||||||
|
if (owner.getAttribute('title') === name)
|
||||||
|
story.classList.add(className);
|
||||||
|
else
|
||||||
|
story.classList.remove(className);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function callback() {
|
||||||
|
if (!fullName) {
|
||||||
|
// Grab the full name from the avatar alt-text.
|
||||||
|
updateFullName();
|
||||||
|
}
|
||||||
|
|
||||||
|
setClassOnStoriesWithOwner(fullName, 'owned');
|
||||||
|
}
|
||||||
|
|
||||||
|
root.addEventListener('mouseover', event => {
|
||||||
|
if (event.target.className === 'owner') {
|
||||||
|
const name = event.target.getAttribute('title');
|
||||||
|
setClassOnStoriesWithOwner(name, 'highlighted');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
root.addEventListener('mouseout', event => {
|
||||||
|
if (event.target.className === 'owner')
|
||||||
|
setClassOnStoriesWithOwner('', 'highlighted');
|
||||||
|
});
|
||||||
|
|
||||||
|
const observer = new MutationObserver(callback);
|
||||||
|
const config = { childList: true, subtree: true };
|
||||||
|
observer.observe(root, config);
|
Loading…
Reference in a new issue