Skip to content

Commit 5aacd27

Browse files
schedule.js: Optimize duplicate code and add JSDoc
1 parent c772fcb commit 5aacd27

1 file changed

Lines changed: 48 additions & 34 deletions

File tree

public/js/schedule.js

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
this.on('mouseleave', '#notifications-schedule .entry', this.onEntryLeave, this);
2121
}
2222

23+
/**
24+
* Make the sidebar sortable and add drag&drop support.
25+
*
26+
* @param event The event object.
27+
*/
2328
onRendered(event)
2429
{
2530
if (event.target !== event.currentTarget) {
@@ -46,6 +51,11 @@
4651
});
4752
}
4853

54+
/**
55+
* Handle drop event on the sidebar.
56+
*
57+
* @param event The event object.
58+
*/
4959
onDrop(event)
5060
{
5161
event = event.originalEvent;
@@ -74,32 +84,19 @@
7484
form.requestSubmit();
7585
}
7686

87+
/**
88+
* Handle hover (`mouseenter`) event on schedule entries.
89+
*
90+
* @param event The mouse event object.
91+
*/
7792
onEntryHover(event)
7893
{
79-
const entry = event.currentTarget;
80-
const overlay = entry.parentElement;
81-
const grid = overlay.previousSibling;
82-
const sideBar = grid.previousSibling;
94+
const [relatedEntries, tooltip] = event.data.self.identifyRelatedEntries(event);
8395

84-
let relatedElements;
85-
if ('rotationPosition' in entry.dataset) {
86-
relatedElements = Array.from(
87-
grid.querySelectorAll('[data-y-position="' + entry.dataset.rotationPosition + '"]')
88-
);
89-
90-
relatedElements.push(sideBar.childNodes[Number(entry.dataset.rotationPosition)]);
91-
} else {
92-
relatedElements = overlay.querySelectorAll(
93-
'[data-rotation-position="' + entry.dataset.entryPosition + '"]'
94-
);
95-
}
96-
97-
relatedElements.forEach((relatedElement) => {
98-
relatedElement.classList.add('highlighted');
99-
});
96+
relatedEntries.forEach(element => element.classList.add('highlighted'));
10097

101-
const tooltip = entry.querySelector('.rotation-info');
10298
if (tooltip) {
99+
const grid = event.currentTarget.parentElement.previousSibling;
103100
requestAnimationFrame(() => {
104101
const tooltipRect = tooltip.getBoundingClientRect();
105102
const gridRect = grid.getBoundingClientRect();
@@ -114,34 +111,51 @@
114111
}
115112
}
116113

114+
/**
115+
* Handle hover (`mouseleave`) event on schedule entries.
116+
*
117+
* @param event The mouse event object.
118+
*/
117119
onEntryLeave(event)
118120
{
121+
const [relatedEntries, tooltip] = event.data.self.identifyRelatedEntries(event);
122+
123+
relatedEntries.forEach(element => element.classList.remove('highlighted'));
124+
125+
if (tooltip) {
126+
tooltip.classList.remove('is-left', 'is-bottom');
127+
}
128+
}
129+
130+
/**
131+
* Identify hover-related entries.
132+
*
133+
* @param event The mouse event object.
134+
* @returns {[HTMLElement[], HTMLElement|null]}
135+
*/
136+
identifyRelatedEntries(event) {
119137
const entry = event.currentTarget;
120138
const overlay = entry.parentElement;
121139
const grid = overlay.previousSibling;
122140
const sideBar = grid.previousSibling;
123141

124-
let relatedElements;
142+
let relatedEntries;
125143
if ('rotationPosition' in entry.dataset) {
126-
relatedElements = Array.from(
144+
relatedEntries = Array.from(
127145
grid.querySelectorAll('[data-y-position="' + entry.dataset.rotationPosition + '"]')
128146
);
129147

130-
relatedElements.push(sideBar.childNodes[Number(entry.dataset.rotationPosition)]);
148+
relatedEntries.push(sideBar.childNodes[Number(entry.dataset.rotationPosition)]);
131149
} else {
132-
relatedElements = overlay.querySelectorAll(
133-
'[data-rotation-position="' + entry.dataset.entryPosition + '"]'
150+
relatedEntries = Array.from(
151+
overlay.querySelectorAll('[data-rotation-position="' + entry.dataset.entryPosition + '"]')
134152
);
135153
}
136154

137-
relatedElements.forEach((relatedElement) => {
138-
relatedElement.classList.remove('highlighted');
139-
});
140-
141-
const tooltip = entry.querySelector('.rotation-info');
142-
if (tooltip) {
143-
tooltip.classList.remove('is-left', 'is-bottom');
144-
}
155+
return [
156+
relatedEntries,
157+
entry.querySelector('.rotation-info')
158+
];
145159
}
146160
}
147161

0 commit comments

Comments
 (0)