coupdoeil 1.0.0.pre.alpha.1 → 1.0.0.pre.alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/app/assets/javascripts/coupdoeil.js +253 -242
- data/app/assets/javascripts/coupdoeil.min.js +1 -1
- data/app/assets/javascripts/coupdoeil.min.js.map +1 -1
- data/app/javascript/coupdoeil/elements/coupdoeil_element.js +1 -1
- data/app/javascript/coupdoeil/events/onclick.js +1 -2
- data/app/javascript/coupdoeil/events/onmouseover.js +8 -5
- data/app/javascript/coupdoeil/events.js +3 -1
- data/app/javascript/coupdoeil/hovercard/actions.js +0 -60
- data/app/javascript/coupdoeil/hovercard/cache.js +5 -1
- data/app/javascript/coupdoeil/hovercard/closing.js +55 -8
- data/app/javascript/coupdoeil/hovercard/controller.js +0 -2
- data/app/javascript/coupdoeil/hovercard/current.js +13 -0
- data/app/javascript/coupdoeil/hovercard/opening.js +78 -73
- data/app/javascript/coupdoeil/hovercard/optionsParser.js +3 -2
- data/app/javascript/coupdoeil/hovercard/positioning.js +6 -5
- data/app/javascript/coupdoeil/hovercard/state_check.js +2 -1
- data/lib/coupdoeil/engine.rb +9 -1
- data/lib/coupdoeil/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 692dde641a7454618ccdfced914f4a42fcba0259e69147598b0c95bc51c8fae0
|
4
|
+
data.tar.gz: 5c384435d015f13eaa720d1710c7f789dae8c3b8619cf9202abfe3284c554cc1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84570a2fbca462e2c611b9c0064bc8864097e2bdbea4828ba09c85978d00a7bdb49fe73ef2ccf2efe9ea722c6a952507e3784c7d0faa0a052b3dddd2156e0121
|
7
|
+
data.tar.gz: fa9bddb68087382174d222bf4160973655d95433d7d222396204c08a98b9bead48bf3dfb64b6984e5ba614726d49e22493a64b5ab5c5b584fdbe170e1e544be9
|
data/CHANGELOG.md
CHANGED
@@ -5,8 +5,6 @@ class HovercardController {
|
|
5
5
|
this.children = new Set;
|
6
6
|
this.parent = null;
|
7
7
|
this.closingRequest = null;
|
8
|
-
this.openingDelay = null;
|
9
|
-
this.fetchDelay = null;
|
10
8
|
}
|
11
9
|
get isOpen() {
|
12
10
|
return !!this.coupdoeilElement.dataset.hovercardOpen;
|
@@ -57,7 +55,7 @@ const ANIMATIONS = [ false, "slide-in", "fade-in", "slide-out", "custom" ];
|
|
57
55
|
|
58
56
|
const PLACEMENTS = [ "auto", "top", "top-start", "top-end", "right", "right-start", "right-end", "bottom", "bottom-start", "bottom-end", "left", "left-start", "left-end" ];
|
59
57
|
|
60
|
-
const LOADINGS = [ "
|
58
|
+
const LOADINGS = [ "async", "preload", "lazy" ];
|
61
59
|
|
62
60
|
function parseCSSSize(value) {
|
63
61
|
if (typeof value === "number") {
|
@@ -103,7 +101,7 @@ function getCache(optionsInt) {
|
|
103
101
|
}
|
104
102
|
|
105
103
|
function getLoading(optionsInt) {
|
106
|
-
return LOADINGS[optionsInt & 3
|
104
|
+
return LOADINGS[optionsInt >> 1 & 3];
|
107
105
|
}
|
108
106
|
|
109
107
|
function getTrigger$1(optionsInt) {
|
@@ -187,180 +185,10 @@ function setHovercardContentHTML(controller, value) {
|
|
187
185
|
hovercardContentHTMLMap.set(cacheMapKey(controller), value);
|
188
186
|
}
|
189
187
|
|
190
|
-
async function enter(element, transitionName = null) {
|
191
|
-
element.classList.remove("hidden");
|
192
|
-
await transition("enter", element, transitionName);
|
193
|
-
}
|
194
|
-
|
195
|
-
async function leave(element, transitionName = null) {
|
196
|
-
await transition("leave", element, transitionName);
|
197
|
-
element.classList.add("hidden");
|
198
|
-
}
|
199
|
-
|
200
|
-
async function transition(direction, element, animation) {
|
201
|
-
const dataset = element.dataset;
|
202
|
-
const animationClass = animation ? `${animation}-${direction}` : direction;
|
203
|
-
let transition = `transition${direction.charAt(0).toUpperCase() + direction.slice(1)}`;
|
204
|
-
const genesis = dataset[transition] ? dataset[transition].split(" ") : [ animationClass ];
|
205
|
-
const start = dataset[`${transition}Start`] ? dataset[`${transition}Start`].split(" ") : [ `${animationClass}-start` ];
|
206
|
-
const end = dataset[`${transition}End`] ? dataset[`${transition}End`].split(" ") : [ `${animationClass}-end` ];
|
207
|
-
addClasses(element, genesis);
|
208
|
-
addClasses(element, start);
|
209
|
-
await nextFrame();
|
210
|
-
removeClasses(element, start);
|
211
|
-
addClasses(element, end);
|
212
|
-
await afterTransition(element);
|
213
|
-
removeClasses(element, end);
|
214
|
-
removeClasses(element, genesis);
|
215
|
-
}
|
216
|
-
|
217
|
-
function addClasses(element, classes) {
|
218
|
-
element.classList.add(...classes);
|
219
|
-
}
|
220
|
-
|
221
|
-
function removeClasses(element, classes) {
|
222
|
-
element.classList.remove(...classes);
|
223
|
-
}
|
224
|
-
|
225
|
-
function nextFrame() {
|
226
|
-
return new Promise((resolve => {
|
227
|
-
requestAnimationFrame((() => {
|
228
|
-
requestAnimationFrame(resolve);
|
229
|
-
}));
|
230
|
-
}));
|
231
|
-
}
|
232
|
-
|
233
|
-
function afterTransition(element) {
|
234
|
-
return new Promise((resolve => {
|
235
|
-
const computedDuration = getComputedStyle(element).transitionDuration.split(",")[0];
|
236
|
-
const duration = Number(computedDuration.replace("s", "")) * 1e3;
|
237
|
-
setTimeout((() => {
|
238
|
-
resolve();
|
239
|
-
}), duration);
|
240
|
-
}));
|
241
|
-
}
|
242
|
-
|
243
|
-
function detachFromParent(controller) {
|
244
|
-
if (controller.parent) {
|
245
|
-
controller.parent.children.delete(controller);
|
246
|
-
controller.parent = null;
|
247
|
-
}
|
248
|
-
}
|
249
|
-
|
250
|
-
function cancelCloseRequest(controller) {
|
251
|
-
clearTimeout(controller.closingRequest);
|
252
|
-
controller.closingRequest = null;
|
253
|
-
}
|
254
|
-
|
255
|
-
function closeNow(controller, allowAnimation = true) {
|
256
|
-
if (controller.closing || controller.isClosed) return;
|
257
|
-
controller.closing = true;
|
258
|
-
cancelOpenCloseActions(controller);
|
259
|
-
controller.children.forEach((childController => {
|
260
|
-
closeNow(childController);
|
261
|
-
}));
|
262
|
-
detachFromParent(controller);
|
263
|
-
if (allowAnimation && controller.card.dataset.animation) {
|
264
|
-
closeWithAnimation(controller);
|
265
|
-
} else {
|
266
|
-
closeWithoutAnimation(controller);
|
267
|
-
}
|
268
|
-
}
|
269
|
-
|
270
|
-
async function closeWithAnimation(controller) {
|
271
|
-
await leave(controller.card, "hovercard");
|
272
|
-
closeWithoutAnimation(controller);
|
273
|
-
}
|
274
|
-
|
275
|
-
function closeWithoutAnimation(controller) {
|
276
|
-
controller.card.remove();
|
277
|
-
controller.card = null;
|
278
|
-
delete controller.closing;
|
279
|
-
delete controller.coupdoeilElement.dataset.hovercardOpen;
|
280
|
-
}
|
281
|
-
|
282
|
-
function clear(controller) {
|
283
|
-
closeNow(controller, false);
|
284
|
-
}
|
285
|
-
|
286
|
-
function closeLater(controller) {
|
287
|
-
cancelOpenCloseActions(controller);
|
288
|
-
controller.closingRequest = setTimeout((() => {
|
289
|
-
closeNow(controller);
|
290
|
-
}), defaultConfig.closingDelay);
|
291
|
-
}
|
292
|
-
|
293
|
-
function closeChildrenNow(controller) {
|
294
|
-
controller.children.forEach((childController => {
|
295
|
-
closeNow(childController);
|
296
|
-
}));
|
297
|
-
}
|
298
|
-
|
299
|
-
function closeOnHoverChildrenLater(controller) {
|
300
|
-
controller.children.forEach((childController => {
|
301
|
-
if (triggeredOnHover(childController)) {
|
302
|
-
closeLater(childController);
|
303
|
-
}
|
304
|
-
}));
|
305
|
-
}
|
306
|
-
|
307
|
-
const CURRENT_HOVERCARDS_BY_ID = new Map;
|
308
|
-
|
309
|
-
window.hovercads = CURRENT_HOVERCARDS_BY_ID;
|
310
|
-
|
311
188
|
function clearHovercardContentCache() {
|
312
189
|
hovercardContentHTMLMap.clear();
|
313
190
|
}
|
314
191
|
|
315
|
-
function currentHovercardsById() {
|
316
|
-
return CURRENT_HOVERCARDS_BY_ID;
|
317
|
-
}
|
318
|
-
|
319
|
-
function addToCurrents(coupdoeilElement) {
|
320
|
-
CURRENT_HOVERCARDS_BY_ID.set(coupdoeilElement.uniqueId, coupdoeilElement);
|
321
|
-
}
|
322
|
-
|
323
|
-
function closeAllNow() {
|
324
|
-
for (const coupdoeilElement of CURRENT_HOVERCARDS_BY_ID.values()) {
|
325
|
-
closeNow(coupdoeilElement.hovercardController);
|
326
|
-
removeFromCurrents(coupdoeilElement);
|
327
|
-
}
|
328
|
-
}
|
329
|
-
|
330
|
-
function clearAll() {
|
331
|
-
for (const coupdoeilElement of CURRENT_HOVERCARDS_BY_ID.values()) {
|
332
|
-
clear(coupdoeilElement.hovercardController);
|
333
|
-
removeFromCurrents(coupdoeilElement);
|
334
|
-
}
|
335
|
-
}
|
336
|
-
|
337
|
-
function closeTriggeredOnHoverNow() {
|
338
|
-
for (const coupdoeilElement of CURRENT_HOVERCARDS_BY_ID.values()) {
|
339
|
-
if (triggeredOnHover(coupdoeilElement.hovercardController)) {
|
340
|
-
closeNow(coupdoeilElement.hovercardController);
|
341
|
-
removeFromCurrents(coupdoeilElement);
|
342
|
-
}
|
343
|
-
}
|
344
|
-
}
|
345
|
-
|
346
|
-
function closeTriggeredOnHoverLater() {
|
347
|
-
for (const coupdoeilElement of CURRENT_HOVERCARDS_BY_ID.values()) {
|
348
|
-
if (triggeredOnHover(coupdoeilElement.hovercardController)) {
|
349
|
-
closeLater(coupdoeilElement.hovercardController);
|
350
|
-
removeFromCurrents(coupdoeilElement);
|
351
|
-
}
|
352
|
-
}
|
353
|
-
}
|
354
|
-
|
355
|
-
function removeFromCurrents(coupdoeilElement) {
|
356
|
-
CURRENT_HOVERCARDS_BY_ID.delete(coupdoeilElement.uniqueId);
|
357
|
-
}
|
358
|
-
|
359
|
-
function cancelOpenCloseActions(controller) {
|
360
|
-
cancelOpening(controller);
|
361
|
-
cancelCloseRequest(controller);
|
362
|
-
}
|
363
|
-
|
364
192
|
const sides = [ "top", "right", "bottom", "left" ];
|
365
193
|
|
366
194
|
const alignments = [ "start", "end" ];
|
@@ -1935,10 +1763,191 @@ const computePosition = (reference, floating, options) => {
|
|
1935
1763
|
});
|
1936
1764
|
};
|
1937
1765
|
|
1938
|
-
async function
|
1766
|
+
async function enter(element, transitionName = null) {
|
1767
|
+
element.classList.remove("hidden");
|
1768
|
+
await transition("enter", element, transitionName);
|
1769
|
+
}
|
1770
|
+
|
1771
|
+
async function leave(element, transitionName = null) {
|
1772
|
+
await transition("leave", element, transitionName);
|
1773
|
+
element.classList.add("hidden");
|
1774
|
+
}
|
1775
|
+
|
1776
|
+
async function transition(direction, element, animation) {
|
1777
|
+
const dataset = element.dataset;
|
1778
|
+
const animationClass = animation ? `${animation}-${direction}` : direction;
|
1779
|
+
let transition = `transition${direction.charAt(0).toUpperCase() + direction.slice(1)}`;
|
1780
|
+
const genesis = dataset[transition] ? dataset[transition].split(" ") : [ animationClass ];
|
1781
|
+
const start = dataset[`${transition}Start`] ? dataset[`${transition}Start`].split(" ") : [ `${animationClass}-start` ];
|
1782
|
+
const end = dataset[`${transition}End`] ? dataset[`${transition}End`].split(" ") : [ `${animationClass}-end` ];
|
1783
|
+
addClasses(element, genesis);
|
1784
|
+
addClasses(element, start);
|
1785
|
+
await nextFrame();
|
1786
|
+
removeClasses(element, start);
|
1787
|
+
addClasses(element, end);
|
1788
|
+
await afterTransition(element);
|
1789
|
+
removeClasses(element, end);
|
1790
|
+
removeClasses(element, genesis);
|
1791
|
+
}
|
1792
|
+
|
1793
|
+
function addClasses(element, classes) {
|
1794
|
+
element.classList.add(...classes);
|
1795
|
+
}
|
1796
|
+
|
1797
|
+
function removeClasses(element, classes) {
|
1798
|
+
element.classList.remove(...classes);
|
1799
|
+
}
|
1800
|
+
|
1801
|
+
function nextFrame() {
|
1802
|
+
return new Promise((resolve => {
|
1803
|
+
requestAnimationFrame((() => {
|
1804
|
+
requestAnimationFrame(resolve);
|
1805
|
+
}));
|
1806
|
+
}));
|
1807
|
+
}
|
1808
|
+
|
1809
|
+
function afterTransition(element) {
|
1810
|
+
return new Promise((resolve => {
|
1811
|
+
const computedDuration = getComputedStyle(element).transitionDuration.split(",")[0];
|
1812
|
+
const duration = Number(computedDuration.replace("s", "")) * 1e3;
|
1813
|
+
setTimeout((() => {
|
1814
|
+
resolve();
|
1815
|
+
}), duration);
|
1816
|
+
}));
|
1817
|
+
}
|
1818
|
+
|
1819
|
+
const CURRENT_HOVERCARDS_BY_ID = new Map;
|
1820
|
+
|
1821
|
+
function currentHovercardsById() {
|
1822
|
+
return CURRENT_HOVERCARDS_BY_ID;
|
1823
|
+
}
|
1824
|
+
|
1825
|
+
function addToCurrents(coupdoeilElement) {
|
1826
|
+
CURRENT_HOVERCARDS_BY_ID.set(coupdoeilElement.uniqueId, coupdoeilElement);
|
1827
|
+
}
|
1828
|
+
|
1829
|
+
function removeFromCurrents(coupdoeilElement) {
|
1830
|
+
CURRENT_HOVERCARDS_BY_ID.delete(coupdoeilElement.uniqueId);
|
1831
|
+
}
|
1832
|
+
|
1833
|
+
function detachFromParent(controller) {
|
1834
|
+
if (controller.parent) {
|
1835
|
+
controller.parent.children.delete(controller);
|
1836
|
+
controller.parent = null;
|
1837
|
+
}
|
1838
|
+
}
|
1839
|
+
|
1840
|
+
function cancelOpenCloseActions(controller) {
|
1841
|
+
cancelOpening(controller);
|
1842
|
+
cancelCloseRequest(controller);
|
1843
|
+
}
|
1844
|
+
|
1845
|
+
function cancelOpening(controller) {
|
1846
|
+
console.log("deleting openingHovercard: ", controller.coupdoeilElement.uniqueId);
|
1847
|
+
delete controller.coupdoeilElement.openingHovercard;
|
1848
|
+
}
|
1849
|
+
|
1850
|
+
function cancelCloseRequest(controller) {
|
1851
|
+
clearTimeout(controller.closingRequest);
|
1852
|
+
controller.closingRequest = null;
|
1853
|
+
addToCurrents(controller.coupdoeilElement);
|
1854
|
+
}
|
1855
|
+
|
1856
|
+
function closeNow(controller, allowAnimation = true) {
|
1857
|
+
console.log("closing: ", controller.coupdoeilElement.uniqueId);
|
1858
|
+
console.log({
|
1859
|
+
closing: controller.closing,
|
1860
|
+
isClosed: controller.isClosed && !controller.coupdoeilElement.openingHovercard
|
1861
|
+
});
|
1862
|
+
if (controller.closing || controller.isClosed && !controller.coupdoeilElement.openingHovercard) return;
|
1863
|
+
controller.closing = true;
|
1864
|
+
cancelOpenCloseActions(controller);
|
1865
|
+
controller.children.forEach((childController => {
|
1866
|
+
closeNow(childController);
|
1867
|
+
}));
|
1868
|
+
detachFromParent(controller);
|
1869
|
+
if (allowAnimation && controller.card && controller.card.dataset.animation) {
|
1870
|
+
closeWithAnimation(controller);
|
1871
|
+
} else {
|
1872
|
+
closeWithoutAnimation(controller);
|
1873
|
+
}
|
1874
|
+
}
|
1875
|
+
|
1876
|
+
async function closeWithAnimation(controller) {
|
1877
|
+
await leave(controller.card, "hovercard");
|
1878
|
+
closeWithoutAnimation(controller);
|
1879
|
+
}
|
1880
|
+
|
1881
|
+
function closeWithoutAnimation(controller) {
|
1882
|
+
if (controller.card) {
|
1883
|
+
controller.card.remove();
|
1884
|
+
controller.card = null;
|
1885
|
+
}
|
1886
|
+
delete controller.closing;
|
1887
|
+
delete controller.coupdoeilElement.dataset.hovercardOpen;
|
1888
|
+
}
|
1889
|
+
|
1890
|
+
function clear(controller) {
|
1891
|
+
closeNow(controller, false);
|
1892
|
+
}
|
1893
|
+
|
1894
|
+
function closeLater(controller) {
|
1895
|
+
cancelOpenCloseActions(controller);
|
1896
|
+
controller.closingRequest = setTimeout((() => {
|
1897
|
+
closeNow(controller);
|
1898
|
+
}), defaultConfig.closingDelay);
|
1899
|
+
}
|
1900
|
+
|
1901
|
+
function closeChildrenNow(controller) {
|
1902
|
+
controller.children.forEach((childController => {
|
1903
|
+
closeNow(childController);
|
1904
|
+
}));
|
1905
|
+
}
|
1906
|
+
|
1907
|
+
function closeOnHoverChildrenLater(controller) {
|
1908
|
+
controller.children.forEach((childController => {
|
1909
|
+
if (triggeredOnHover(childController)) {
|
1910
|
+
closeLater(childController);
|
1911
|
+
}
|
1912
|
+
}));
|
1913
|
+
}
|
1914
|
+
|
1915
|
+
function closeAllNow() {
|
1916
|
+
for (const coupdoeilElement of CURRENT_HOVERCARDS_BY_ID.values()) {
|
1917
|
+
closeNow(coupdoeilElement.hovercardController);
|
1918
|
+
removeFromCurrents(coupdoeilElement);
|
1919
|
+
}
|
1920
|
+
}
|
1921
|
+
|
1922
|
+
function clearAll() {
|
1923
|
+
for (const coupdoeilElement of CURRENT_HOVERCARDS_BY_ID.values()) {
|
1924
|
+
clearHovercard(coupdoeilElement.hovercardController);
|
1925
|
+
removeFromCurrents(coupdoeilElement);
|
1926
|
+
}
|
1927
|
+
}
|
1928
|
+
|
1929
|
+
function closeTriggeredOnHoverNow() {
|
1930
|
+
for (const coupdoeilElement of CURRENT_HOVERCARDS_BY_ID.values()) {
|
1931
|
+
if (triggeredOnHover(coupdoeilElement.hovercardController)) {
|
1932
|
+
closeNow(coupdoeilElement.hovercardController);
|
1933
|
+
removeFromCurrents(coupdoeilElement);
|
1934
|
+
}
|
1935
|
+
}
|
1936
|
+
}
|
1937
|
+
|
1938
|
+
function closeTriggeredOnHoverLater() {
|
1939
|
+
for (const coupdoeilElement of CURRENT_HOVERCARDS_BY_ID.values()) {
|
1940
|
+
if (triggeredOnHover(coupdoeilElement.hovercardController)) {
|
1941
|
+
closeLater(coupdoeilElement.hovercardController);
|
1942
|
+
removeFromCurrents(coupdoeilElement);
|
1943
|
+
}
|
1944
|
+
}
|
1945
|
+
}
|
1946
|
+
|
1947
|
+
async function positionHovercard(target, card, options) {
|
1939
1948
|
let {placement: placements, offset: offsetValue} = options;
|
1940
1949
|
const placement = placements[0];
|
1941
|
-
const arrowElement =
|
1950
|
+
const arrowElement = card.querySelector("[data-hovercard-arrow]");
|
1942
1951
|
const middleware = [ AutoPositioningWithFallbacks(placements) ];
|
1943
1952
|
if (arrowElement) {
|
1944
1953
|
const arrowSize = arrowElement.clientWidth;
|
@@ -1948,7 +1957,7 @@ async function positionHovercard(controller, options) {
|
|
1948
1957
|
}));
|
1949
1958
|
}
|
1950
1959
|
middleware.push(offset(offsetValue));
|
1951
|
-
const computedPosition = await computePosition(
|
1960
|
+
const computedPosition = await computePosition(target, card, {
|
1952
1961
|
placement: placement,
|
1953
1962
|
middleware: middleware
|
1954
1963
|
});
|
@@ -1956,8 +1965,8 @@ async function positionHovercard(controller, options) {
|
|
1956
1965
|
if (arrowElement) {
|
1957
1966
|
positionArrow(arrowElement, computedPosition);
|
1958
1967
|
}
|
1959
|
-
|
1960
|
-
Object.assign(
|
1968
|
+
card.dataset.placement = actualPlacement;
|
1969
|
+
Object.assign(card.style, {
|
1961
1970
|
left: `${x}px`,
|
1962
1971
|
top: `${y}px`
|
1963
1972
|
});
|
@@ -2009,49 +2018,64 @@ function positionArrow(arrowElement, computedData) {
|
|
2009
2018
|
});
|
2010
2019
|
}
|
2011
2020
|
|
2012
|
-
function
|
2013
|
-
|
2014
|
-
|
2015
|
-
|
2016
|
-
|
2017
|
-
|
2021
|
+
function fetchHovercardContent(controller) {
|
2022
|
+
const type = getType(controller);
|
2023
|
+
const params = getParams(controller);
|
2024
|
+
const authenticityToken = document.querySelector("meta[name=csrf-token]").content;
|
2025
|
+
let url = `/coupdoeil/hovercard`;
|
2026
|
+
const opts = {
|
2027
|
+
method: "POST",
|
2028
|
+
headers: {
|
2029
|
+
"Content-Type": "application/json"
|
2030
|
+
},
|
2031
|
+
body: JSON.stringify({
|
2032
|
+
params: params,
|
2033
|
+
action_name: type,
|
2034
|
+
authenticity_token: authenticityToken
|
2035
|
+
})
|
2036
|
+
};
|
2037
|
+
return fetch(url, opts).then((response => {
|
2038
|
+
if (response.status >= 400) {
|
2039
|
+
throw "error while fetching hovercard content";
|
2040
|
+
}
|
2041
|
+
return response.text();
|
2042
|
+
}));
|
2043
|
+
}
|
2044
|
+
|
2045
|
+
async function loadHovercardContentHTML(controller, options, delayOptions) {
|
2046
|
+
return new Promise((resolve => {
|
2047
|
+
setTimeout((async () => {
|
2048
|
+
if (!controller.coupdoeilElement.openingHovercard) return;
|
2049
|
+
if (options.cache === false || options.cache && !getHovercardContentHTML(controller)) {
|
2050
|
+
let html;
|
2051
|
+
if (options.loading === "preload") {
|
2052
|
+
html = preloadedContentElement(controller).innerHTML;
|
2053
|
+
} else {
|
2054
|
+
html = await fetchHovercardContent(controller);
|
2055
|
+
}
|
2056
|
+
setHovercardContentHTML(controller, html);
|
2057
|
+
}
|
2058
|
+
resolve();
|
2059
|
+
}), delayOptions.fetch);
|
2060
|
+
}));
|
2018
2061
|
}
|
2019
2062
|
|
2020
2063
|
async function openHovercard(controller, {parent: parent}) {
|
2064
|
+
console.log("opening: ", controller.coupdoeilElement.uniqueId);
|
2021
2065
|
if (controller.isOpen) {
|
2022
|
-
cancelCloseRequest(controller);
|
2023
|
-
return addToCurrents(controller.coupdoeilElement);
|
2066
|
+
return cancelCloseRequest(controller);
|
2024
2067
|
}
|
2025
2068
|
if (parent) {
|
2026
2069
|
controller.parent = parent;
|
2027
2070
|
parent.children.add(controller);
|
2028
2071
|
}
|
2029
|
-
const
|
2072
|
+
const delays = getDelayOptionsForController(controller);
|
2030
2073
|
const options = extractOptionsFromElement(controller.coupdoeilElement);
|
2031
|
-
const
|
2032
|
-
|
2033
|
-
|
2034
|
-
setTimeout(resolve, delayOptions.reOpening);
|
2035
|
-
} else {
|
2036
|
-
setTimeout(resolve, delayOptions.actualOpening);
|
2037
|
-
}
|
2038
|
-
}));
|
2039
|
-
if (!getHovercardContentHTML(controller) || !cache) {
|
2040
|
-
controller.fetchDelay = new Promise((resolve => {
|
2041
|
-
setTimeout(resolve, delayOptions.fetch);
|
2042
|
-
}));
|
2043
|
-
await controller.fetchDelay;
|
2044
|
-
if (!controller.fetchDelay) {
|
2045
|
-
return;
|
2046
|
-
}
|
2047
|
-
controller.fetchDelay = null;
|
2048
|
-
const html = preloadedContentElement(controller)?.innerHTML || await fetchHovercardContent(controller);
|
2049
|
-
setHovercardContentHTML(controller, html);
|
2050
|
-
}
|
2051
|
-
await controller.openingDelay;
|
2074
|
+
const openingDelay = new Promise((resolve => setTimeout(resolve, delays.opening)));
|
2075
|
+
const fetchDelay = loadHovercardContentHTML(controller, options, delays);
|
2076
|
+
await Promise.all([ fetchDelay, openingDelay ]);
|
2052
2077
|
const parentIsClosedOrClosing = controller.parent && (controller.parent.isClosed || controller.parent.closingRequest);
|
2053
|
-
if (controller.
|
2054
|
-
controller.openingDelay = null;
|
2078
|
+
if (controller.coupdoeilElement.openingHovercard && !parentIsClosedOrClosing) {
|
2055
2079
|
await display(controller, options);
|
2056
2080
|
}
|
2057
2081
|
}
|
@@ -2065,13 +2089,22 @@ async function display(controller, options) {
|
|
2065
2089
|
controller.card.dataset.animation = options.animation;
|
2066
2090
|
}
|
2067
2091
|
requestAnimationFrame((async () => {
|
2092
|
+
if (!controller.coupdoeilElement.openingHovercard) {
|
2093
|
+
return clear(controller);
|
2094
|
+
}
|
2068
2095
|
controller.card.style.opacity = "0";
|
2069
2096
|
controller.card.classList.remove("hidden");
|
2070
2097
|
requestAnimationFrame((async () => {
|
2071
|
-
|
2098
|
+
if (!controller.coupdoeilElement.openingHovercard) {
|
2099
|
+
return clear(controller);
|
2100
|
+
}
|
2101
|
+
await positionHovercard(controller.coupdoeilElement, controller.card, options);
|
2072
2102
|
controller.card.classList.add("hidden");
|
2073
2103
|
controller.card.style.removeProperty("opacity");
|
2074
2104
|
requestAnimationFrame((async () => {
|
2105
|
+
if (!controller.coupdoeilElement.openingHovercard) {
|
2106
|
+
return clear(controller);
|
2107
|
+
}
|
2075
2108
|
addToCurrents(controller.coupdoeilElement);
|
2076
2109
|
delete controller.coupdoeilElement.openingHovercard;
|
2077
2110
|
controller.coupdoeilElement.dataset.hovercardOpen = true;
|
@@ -2084,42 +2117,20 @@ async function display(controller, options) {
|
|
2084
2117
|
function getDelayOptionsForController(controller) {
|
2085
2118
|
if (triggeredOnClick(controller)) {
|
2086
2119
|
return {
|
2087
|
-
|
2088
|
-
|
2089
|
-
fetch: 0
|
2120
|
+
fetch: 0,
|
2121
|
+
opening: 0
|
2090
2122
|
};
|
2091
2123
|
}
|
2124
|
+
let fetchDelay;
|
2125
|
+
{
|
2126
|
+
fetchDelay = defaultConfig.openingDelay / 2;
|
2127
|
+
}
|
2092
2128
|
return {
|
2093
|
-
fetch:
|
2094
|
-
|
2095
|
-
actualOpening: defaultConfig.openingDelay - defaultConfig.fetchDelay
|
2129
|
+
fetch: fetchDelay,
|
2130
|
+
opening: defaultConfig.openingDelay
|
2096
2131
|
};
|
2097
2132
|
}
|
2098
2133
|
|
2099
|
-
function fetchHovercardContent(controller) {
|
2100
|
-
const type = getType(controller);
|
2101
|
-
const params = getParams(controller);
|
2102
|
-
const authenticityToken = document.querySelector("meta[name=csrf-token]").content;
|
2103
|
-
let url = `/coupdoeil/hovercard`;
|
2104
|
-
const opts = {
|
2105
|
-
method: "POST",
|
2106
|
-
headers: {
|
2107
|
-
"Content-Type": "application/json"
|
2108
|
-
},
|
2109
|
-
body: JSON.stringify({
|
2110
|
-
params: params,
|
2111
|
-
action_name: type,
|
2112
|
-
authenticity_token: authenticityToken
|
2113
|
-
})
|
2114
|
-
};
|
2115
|
-
return fetch(url, opts).then((response => {
|
2116
|
-
if (response.status >= 400) {
|
2117
|
-
throw "error while fetching hovercard content";
|
2118
|
-
}
|
2119
|
-
return response.text();
|
2120
|
-
}));
|
2121
|
-
}
|
2122
|
-
|
2123
2134
|
function buildHovercardElement(controller, options) {
|
2124
2135
|
const el = document.createElement("div");
|
2125
2136
|
el.setAttribute("role", "dialog");
|