1// Release 5.0 2// noinspection JSUnusedGlobalSymbols 3let link; 4let navbarShown = false; 5 6if (!Element.prototype.matches) { 7 Element.prototype.matches = 8 Element.prototype.msMatchesSelector || 9 Element.prototype.webkitMatchesSelector; 10} 11 12if (!Element.prototype.closest) { 13 Element.prototype.closest = function (s) { 14 var el = this; 15 16 do { 17 if (Element.prototype.matches.call(el, s)) return el; 18 el = el.parentElement || el.parentNode; 19 } while (el !== null && el.nodeType === 1); 20 return null; 21 }; 22} 23 24const timeout = (ms, message) => { 25 return new Promise((resolve) => { 26 setTimeout(() => { 27 resolve(); 28 //reject(new Error(message)); 29 }, ms); 30 }); 31}; 32 33 34const transitionEnd = (element) => { 35 return new Promise(resolve => { 36 resFunc = resolve; 37 element.addEventListener("transitionend", resFunc); 38 }); 39} 40window.blazorStrap = { 41 HideModal: async function (id, name, element, bodyAffected = true) { 42 return new Promise(async function (resolve) { 43 blazorStrap.RemoveDocumentEvent(id, name, "click"); 44 blazorStrap.RemoveDocumentEvent(id, name, "keyup"); 45 46 if (bodyAffected) { 47 await blazorStrap.RemoveBodyClass("modal-open"); 48 await blazorStrap.SetBodyStyle("overflow", ""); 49 await blazorStrap.SetBodyStyle("paddingRight", ""); 50 } 51 52 53 await blazorStrap.RemoveClass(element, "show"); 54 await blazorStrap.WaitForTransitionEnd(element, 300); 55 56 resolve(); 57 }); 58 }, 59 ShowOffcanvas: async function (objRef, id, name, element, bodyAffected = true, showBackdrop = true) { 60 return new Promise(async function (resolve) { 61 blazorStrap.AddDocumentEvent(objRef, id, name, "click"); 62 blazorStrap.RemoveDocumentEvent(objRef, id, name, "keyup"); 63 64 if (showBackdrop) { 65 if (bodyAffected) { 66 var scrollWidth = await blazorStrap.GetScrollBarWidth(); 67 var viewportHeight = await blazorStrap.GetWindowInnerHeight(); 68 var peakHeight = await blazorStrap.PeakHeight(element); 69 70 if (viewportHeight > peakHeight) { 71 await blazorStrap.SetBodyStyle("overflow", "hidden"); 72 if (scrollWidth != 0) 73 await blazorStrap.SetBodyStyle("paddingRight", scrollWidth + "px"); 74 } 75 } 76 } 77 //Clean up later 78 try { 79 objRef.invokeMethodAsync("ToggleBackdropAndModalChange"); 80 } catch { } 81 82 await blazorStrap.SetStyle(element, "visibility", "visible", 1); 83 //await blazorStrap.SetStyle(element, "display", "block", 50); 84 85 //await blazorStrap.AddClass(element, "show"); 86 //await blazorStrap.WaitForTransitionEnd(element, 300); 87 resolve(); 88 }); 89 }, 90 ShowModal: async function (objRef, id, name, element, bodyAffected = true) { 91 return new Promise(async function (resolve) { 92 blazorStrap.AddDocumentEvent(objRef, id, name, "click"); 93 blazorStrap.RemoveDocumentEvent(objRef, id, name, "keyup"); 94 95 //Clean up later 96 try { 97 objRef.invokeMethodAsync("ToggleBackdropAndModalChange"); 98 } catch { } 99 100 setTimeout(async function () { 101 if (bodyAffected) { 102 var scrollWidth = await blazorStrap.GetScrollBarWidth(); 103 var viewportHeight = await blazorStrap.GetWindowInnerHeight(); 104 var peakHeight = await blazorStrap.PeakHeight(element); 105 106 if (viewportHeight > peakHeight) { 107 await blazorStrap.SetBodyStyle("overflow", "hidden"); 108 if (scrollWidth != 0) 109 await blazorStrap.SetBodyStyle("paddingRight", scrollWidth + "px"); 110 } 111 } 112 113 114 await blazorStrap.SetStyle(element, "display", "block", 1); 115 await blazorStrap.AddClass(element, "show"); 116 await blazorStrap.WaitForTransitionEnd(element, 300); 117 resolve(); 118 }, 300); 119 }); 120 }, 121 HidePopover: async function (element, id) { 122 return new Promise(async function (resolve) { 123 await blazorStrap.RemoveClass(element, "show", 10); 124 await blazorStrap.SetStyle(element, "display", "none"); 125 await blazorStrap.RemovePopover(element, id); 126 // Waits 150 ms to allow any transition to end 127 setTimeout(async function () { 128 resolve(); 129 }, 150); 130 }); 131 }, 132 ShowPopover: async function (element, position, target, offset = "none") { 133 return new Promise(async function (resolve) { 134 await blazorStrap.SetStyle(element, "display", ""); 135 await blazorStrap.SetStyle(element, "visibility", "hidden", 1); 136 await blazorStrap.AddClass(element, "show", 1); 137 await blazorStrap.AddPopover(element, position, target, offset); 138 setTimeout(async function () { 139 await blazorStrap.UpdatePopoverArrow(element, position, false); 140 await blazorStrap.SetStyle(element, "visibility", "", 1); 141 // Waits 150 ms to allow any transition to end 142 setTimeout(async function () { 143 resolve(element.style.cssText); 144 }, 150); 145 }, 1); 146 147 }); 148 }, 149 WaitForTransitionEnd: function (element, timeoutLength) { 150 return Promise.race([timeout(timeoutLength), transitionEnd(element)]); 151 }, 152 CleanUpEvents: function () {
153 Object.keys(blazorStrap.EventHandlers).forEach(key => { 154 if (document.querySelector("[data-blazorstrap='" + key + "']") === null) { 155 Object.keys(blazorStrap.EventHandlers[key]).forEach(name => { 156 Object.keys(blazorStrap.EventHandlers[key][name]).forEach(type => { 157 try { 158 window.removeEventListener(type, blazorStrap.EventHandlers[key][name][type].Callback, false); 159 } catch { } 160 }); 161 }); 162 delete blazorStrap.EventHandlers[key]; 163 } 164 }); 165 }, 166 BlurAll: function () { 167 var tmp = document.createElement("input"); 168 tmp.position = "absolute"; 169 tmp.top = -500; 170 document.body.appendChild(tmp); 171 tmp.focus(); 172 document.body.removeChild(tmp); 173 }, 174 AddAttribute: async function (element, name, value) { 175 if (element === null || element === undefined) return; 176 return new Promise(function (resolve) { 177 element.setAttribute(name, value); 178 resolve(); 179 }); 180 }, 181 AddBodyClass: async function (className) { 182 return new Promise(function (resolve) { 183 document.body.classList.add(className); 184 resolve(); 185 }); 186 }, 187 AddClass: async function (element, className, delay = 0) { 188 if (element === null || element === undefined) return; 189 element.classList.add(className); 190 return new Promise(function (resolve) { 191 if (delay !== 0) setTimeout(() => resolve(), delay); else resolve(); 192 }); 193 }, 194 AddDocumentEvent: async function (objRef, id, name, type, ignoreChildren = false, filter = "") { 195 return new Promise(function (resolve) { 196 blazorStrap.AddEventInternal(objRef, document, id, name, type, ignoreChildren, filter); 197 resolve(); 198 }); 199 }, 200 AddEventInternal: function (objRef, element, id, name, type, ignoreChildren = false, filter = "") { 201 blazorStrap.CleanUpEvents(); 202 203 if (element === null) 204 return; 205 206 let expandedWidth = 0; 207 if (type === "resize" && element == document) { 208 let navbar = document.querySelector("[class*=navbar-expand]"); 209 // Gets the expanded size 210 if (navbar !== null) { 211 212 if (navbar.classList.contains("navbar-expand") || navbar.classList.contains("navbar-expand-ex")) expandedWidth = 576; 213 else if (navbar.classList.contains("navbar-expand-md")) expandedWidth = 768; 214 else if (navbar.classList.contains("navbar-expand-lg")) expandedWidth = 992; 215 else if (navbar.classList.contains("navbar-expand-xl")) expandedWidth = 1200; 216 else if (navbar.classList.contains("navbar-expand-xxl")) expandedWidth = 1400; 217 } 218 if (expandedWidth > window.innerWidth) 219 navbarShown = true; 220 } 221 if (blazorStrap.EventHandlers[id] === undefined) { 222 blazorStrap.EventHandlers[id] = {}; 223 } 224 225 if (blazorStrap.EventHandlers[id][name] === undefined) { 226 blazorStrap.EventHandlers[id][name] = {}; 227 } 228 229 blazorStrap.EventHandlers[id][name][type] = { 230 resizeFunc: function () { } 231 } 232 blazorStrap.EventHandlers[id][name][type] = { 233 Callback: async function (event) { 234 try { 235 let resizeFunc; 236 if (type === "resize" && element === document) { 237 clearTimeout(resizeFunc); 238 resizeFunc = setTimeout(function () { 239 if (window.innerWidth < expandedWidth) 240 navbarShown = false; 241 if (window.innerWidth > expandedWidth && navbarShown === false) { 242 navbarShown = true; 243 // noinspection JSUnresolvedVariable,JSUnresolvedFunction 244 try { 245 var test = objRef.invokeMethodAsync("InteropEventCallback", id, name, type, element.classList, blazorStrap.GetEvents(event)); 246 } catch { 247 // ObjectRef may be gone by time this fires 248 } 249 } 250 }, 100); 251 return; 252 } 253 if (type === "resize") { 254 clearTimeout(blazorStrap.EventHandlers[id][name][type][resizeFunc]); 255 blazorStrap.EventHandlers[id][name][type][resizeFunc] = setTimeout(function () { 256 objRef.invokeMethodAsync("InteropEventCallback", id, name, type, element.classList, blazorStrap.GetEvents(event)); 257 }, 250); 258 return; 259 } 260 if (type === "transitionend" && id !== event.target.getAttribute("data-blazorstrap")) return; 261 262 if (name === "bsdropdown") { 263 let parent = document.querySelector("[data-blazorstrap='" + id + "']"); 264 265 if (parent !== null) { 266 if (parent.contains(event.target)) { 267 if (event.target.closest(".dropdown-toggle") !== null) { 268 return; 269 } 270 } 271 } 272 } 273 if (ignoreChildren) { 274 let parent = document.querySelector("[data-blazorstrap='" + id + "']"); 275 276 if (parent !== null) { 277 if (parent.contains(event.target)) return; 278 } 279 } 280 if (filter === "") { 281 objRef.invokeMethodAsync("InteropEventCallback", id, name, type, element.classList, blazorStrap.GetEvents(event)); 282 } else if (element.getElementsByClassName(filter)) { 283 // noinspection JSUnresolvedVariable,JSUnresolvedFunction 284 objRef.invokeMethodAsync("InteropEventCallback", id, name, type, element.classList, blazorStrap.GetEvents(event)); 285 } 286 } catch 287 { 288 await blazorStrap.RemoveEventInternal(element, id, name, type); 289 } 290 } 291 }; 292 if (type === "resize") 293 window.addEventListener(type, blazorStrap.EventHandlers[id][name][type].Callback, false); 294 else 295 element.addEventListener(type, blazorStrap.EventHandlers[id][name][type].Callback, false); 296 }, 297 AddEvent: async function (objRef, id, name, type, isDocument = false, ignoreChildren = false, filter = "") { 298 return new Promise(function (resolve) { 299 blazorStrap.AddEventInternal(objRef, document.querySelector("[data-blazorstrap='" + id + "']"), id, name, type, ignoreChildren, filter); 300 resolve(); 301 }); 302 }, 303 AddPopover: async function (element, position, target, offset = "none") { 304 function ToPixels(value) { 305 if (value.indexOf("rem") !== -1) { 306 value = value.substring(0, value.indexOf("rem")); 307 return value * parseFloat(getComputedStyle(document.documentElement).fontSize); 308 } else if (value.indexOf("em") !== -1) { 309 value = value.substring(0, value.indexOf("em")); 310 return value * parseFloat(getComputedStyle(element).fontSize); 311 } 312 313 return value; 314 } 315 316 return new Promise(function (resolve) { 317 const id = element.getAttribute("data-blazorstrap"); 318 target = document.querySelector("[data-blazorstrap='" + target + "']"); 319 320 if (blazorStrap.EventHandlers[id] === undefined) { 321 blazorStrap.EventHandlers[id] = {}; 322 } 323 324 if (offset !== "none") { 325 offset = offset.split(","); 326 blazorStrap.EventHandlers[id]["Popover"] = Popper.createPopper(target, element, { 327 placement: position, 328 modifiers: [{ 329 name: 'offset', 330 options: { 331 offset: [parseInt(ToPixels(offset[0])), parseInt(ToPixels(offset[1]))] 332 } 333 }] 334 }); 335 } else { 336 blazorStrap.EventHandlers[id]["Popover"] = Popper.createPopper(target, element, { 337 placement: position 338 }); 339 } 340 341 resolve(true); 342 }); 343 }, 344 AnimateCarousel: async function (objref, id, showEl, hideEl, back) { 345 await blazorStrap.CleanupCarousel(showEl, hideEl); 346 347 let callback = function () { 348 objref.invokeMethodAsync("InteropEventCallback", id, "bscarouselbase", "transitionend"); 349 }; 350 351 return new Promise(function (resolve) { 352 if (back) { 353 showEl.classList.add("carousel-item-prev"); 354 setTimeout(async function () { 355 showEl.classList.add("carousel-item-end"); 356 hideEl.classList.add("carousel-item-end"); 357 hideEl.addEventListener("transitionend", callback, { 358 once: true 359 }); 360 resolve((await blazorStrap.TransitionDidNotStart(showEl))); 361 }, 10); 362 } else { 363 showEl.classList.add("carousel-item-next"); 364 setTimeout(async function () { 365 showEl.classList.add("carousel-item-start"); 366 hideEl.classList.add("carousel-item-start"); 367 hideEl.addEventListener("transitionend", callback, { 368 once: true 369 }); 370 resolve((await blazorStrap.TransitionDidNotStart(showEl))); 371 }, 10); 372 } 373 }); 374 }, 375 AnimateCarouselV4: async function (objref, id, showEl, hideEl, back) { 376 await blazorStrap.CleanupCarousel(showEl, hideEl); 377 378 let callback = function () { 379 objref.invokeMethodAsync("InteropEventCallback", id, "bscarouselbase", "transitionend"); 380 }; 381 382 return new Promise(function (resolve) { 383 if (back) { 384 showEl.classList.add("carousel-item-prev"); 385 setTimeout(async function () { 386 showEl.classList.add("carousel-item-right"); 387 hideEl.classList.add("carousel-item-right"); 388 hideEl.addEventListener("transitionend", callback, { 389 once: true 390 }); 391 resolve((await blazorStrap.TransitionDidNotStart(showEl))); 392 }, 10); 393 } else { 394 showEl.classList.add("carousel-item-next"); 395 setTimeout(async function () { 396 showEl.classList.add("carousel-item-left"); 397 hideEl.classList.add("carousel-item-left"); 398 hideEl.addEventListener("transitionend", callback, { 399 once: true 400 }); 401 resolve((await blazorStrap.TransitionDidNotStart(showEl))); 402 }, 10); 403 } 404 }); 405 }, 406 AnimateCollapse: async function (objRef, element, id, shown, name) { 407 if (shown) { 408 let cleanup = function () { 409 element.style["height"] = ""; 410 element.classList.remove("collapsing"); 411 element.classList.add("collapse"); 412 element.classList.add("show"); 413 objRef.invokeMethodAsync("InteropEventCallback", id, name, "transitionend", null, null); 414 }; 415 416 let height = await blazorStrap.PeakHeight(element); 417 418 element.classList.remove("collapse"); 419 element.classList.add("collapsing"); 420 element.addEventListener("transitionend", cleanup, { 421 once: true 422 }); 423 setTimeout(async function () { 424 element.style["height"] = height + "px"; 425 426 if (await blazorStrap.TransitionDidNotStart(element, 50)) { 427 cleanup(); 428 element.removeEventListener("transitionend", cleanup, { 429 once: true 430 }); 431 objRef.invokeMethodAsync("InteropEventCallback", id, name, "transitionend", null, null); 432 } 433 }, 10); 434 } else { 435 let cleanup = function () { 436 element.classList.remove("collapsing"); 437 element.classList.add("collapse"); 438 objRef.invokeMethodAsync("InteropEventCallback", id, name, "transitionend", null, null); 439 }; 440 441 let height = await blazorStrap.GetHeight(element); 442 element.style["height"] = height + "px"; 443 element.classList.remove("collapse"); 444 element.classList.remove("show"); 445 element.classList.add("collapsing"); 446 element.addEventListener("transitionend", cleanup, { 447 once: true 448 }); 449 setTimeout(async function () { 450 element.style["height"] = ""; 451 452 if (await blazorStrap.TransitionDidNotStart(element, 50)) { 453 cleanup(); 454 element.removeEventListener("transitionend", cleanup, { once: true });
455 objRef.invokeMethodAsync("InteropEventCallback", id, name, "transitionend", null, null); 456 } 457 }, 10); 458 } 459 }, 460 AnimateHorizontalCollapse: async function (objRef, element, id, shown, name) { 461 if (shown) { 462 let cleanup = function () { 463 element.style["width"] = ""; 464 element.classList.remove("collapsing"); 465 element.classList.add("collapse"); 466 element.classList.add("show"); 467 objRef.invokeMethodAsync("InteropEventCallback", id, name, "transitionend", null, null); 468 }; 469 let width = await blazorStrap.PeakWidth(element); 470 471 element.classList.remove("collapse"); 472 element.classList.add("collapsing"); 473 element.addEventListener("transitionend", cleanup, { 474 once: true 475 }); 476 setTimeout(async function () { 477 element.style["width"] = width + "px"; 478 479 if (await blazorStrap.TransitionDidNotStart(element, 50)) { 480 cleanup(); 481 element.removeEventListener("transitionend", cleanup, { 482 once: true 483 }); 484 objRef.invokeMethodAsync("InteropEventCallback", id, name, "transitionend", null, null); 485 } 486 }, 10); 487 } else { 488 let cleanup = function () { 489 element.classList.remove("collapsing"); 490 element.classList.add("collapse"); 491 objRef.invokeMethodAsync("InteropEventCallback", id, name, "transitionend", null, null); 492 }; 493 494 let width = await blazorStrap.GetWidth(element); 495 element.style["width"] = width + "px"; 496 element.classList.remove("collapse"); 497 element.classList.remove("show"); 498 element.classList.add("collapsing"); 499 element.addEventListener("transitionend", cleanup, { 500 once: true 501 }); 502 setTimeout(async function () { 503 element.style["width"] = ""; 504 505 if (await blazorStrap.TransitionDidNotStart(element, 50)) { 506 cleanup(); 507 element.removeEventListener("transitionend", cleanup, { once: true }); 508 objRef.invokeMethodAsync("InteropEventCallback", id, name, "transitionend", null, null); 509 } 510 }, 10); 511 } 512 }, 513 CleanupCarousel: async function (showEl, hideEl) {
514 //Cleans up any rogue calls 515 return new Promise(function (resolve) { 516 hideEl.classList.remove("carousel-item-end"); 517 hideEl.classList.remove("carousel-item-prev"); 518 hideEl.classList.remove("carousel-item-next"); 519 hideEl.classList.remove("carousel-item-start"); 520 showEl.classList.remove("carousel-item-end"); 521 showEl.classList.remove("carousel-item-prev"); 522 showEl.classList.remove("carousel-item-next"); 523 showEl.classList.remove("carousel-item-start"); 524 resolve(); 525 }); 526 }, 527 EventHandlers: [], 528 GetChildrenIds: function (target) { // Likely can be removed 529 const children = target.querySelectorAll("[data-blazorstrap]"); 530 let result = []; 531 532 for (i = 0; i < children; ++i) { 533 result.push(children[i].getAttribute("data-blazorstrap")); 534 } 535 return result; 536 }, 537 GetEvents: function (event) { // Likely can be removed 538 try { 539 return { 540 key: event.key, 541 clientWidth: document.documentElement.clientWidth, 542 parent: blazorStrap.GetParent(event.target.parentElement), 543 target: { 544 nodeName: event.target.nodeName, 545 classList: event.target.classList, 546 targetId: event.target.getAttribute("data-blazorstrap-target"), 547 childrenId: blazorStrap.GetChildrenIds(event.target), 548 dataId: event.target.getAttribute("data-blazorstrap") 549 } 550 }; 551 552 } catch { 553 return { 554 key: event.key, 555 clientWidth: document.documentElement.clientWidth, 556 } 557 } 558 }, 559 GetParent: function (parent, i = 0) { 560 //Limited to 4 deep 561 i = i + 1; 562 if (i > 4 || parent === undefined) return; 563 564 return { 565 parent: blazorStrap.GetParent(parent.parentElement, i), 566 target: { 567 nodeName: parent.nodeName, 568 classList: parent.classList, 569 targetId: parent.getAttribute("data-blazorstrap-target"), 570 childrenId: blazorStrap.GetChildrenIds(parent), 571 dataId: parent.getAttribute("data-blazorstrap") 572 } 573 } 574 }, 575 GetHeight: async function (element) { 576 if (element === null || element === undefined) return; 577 return new Promise(function (resolve) { 578 resolve(element.offsetHeight); 579 }); 580 }, 581 GetWidth: async function (element) { 582 if (element === null || element === undefined) return 0; 583 return new Promise(function (resolve) { 584 resolve(element.offsetWidth); 585 }); 586 }, 587 GetWindowInnerHeight: async function () { 588 return new Promise(function (resolve) { 589 resolve(window.innerHeight); 590 }); 591 }, 592 GetScrollBarWidth: async function () { 593 return new Promise(function (resolve) { 594 resolve(window.innerWidth - document.documentElement.clientWidth); 595 }); 596 }, 597 GetStyle: async function (element) { 598 if (element === null || element === undefined) return; 599 return element.style.cssText; 600 }, 601 PeakHeight: async function (element) { 602 if (element === null || element === undefined) return; 603 var oldStyle = element.style; 604 return new Promise(function (resolve) { 605 element.style.visibility = "hidden"; 606 element.style.width = (element.parentNode.offsetWidth - 4) + "px"; 607 element.style.position = "absolute"; 608 element.style.display = "block"; 609 setTimeout(function () { 610 var height = element.offsetHeight; 611 element.style = oldStyle; 612 resolve(height); 613 }, 10); 614 }); 615 }, 616 PeakWidth: async function (element) { 617 if (element === null || element === undefined) return; 618 var oldStyle = element.style; 619 return new Promise(function (resolve) { 620 element.style.visibility = "hidden"; 621 //element.style.height = (element.parentNode.offsetWidth - 4) + "px"; 622 element.style.position = "absolute"; 623 element.style.display = "block"; 624 setTimeout(function () { 625 var width = element.offsetWidth; 626 element.style = oldStyle; 627 resolve(width); 628 }, 10); 629 }); 630 }, 631 RemoveAttribute: async function (element, name) { //Likely can be removed 632 if (element === null || element === undefined) return; 633 return new Promise(function (resolve) { 634 element.removeAttribute(name); 635 resolve(); 636 }); 637 }, 638 RemoveBodyClass: async function (className) { 639 return new Promise(function (resolve) { 640 document.body.classList.remove(className); 641 resolve(); 642 }); 643 }, 644 RemoveClass: async function (element, className, delay = 0) { 645 if (element === null || element === undefined) return; 646 element.classList.remove(className); 647 return new Promise(function (resolve) { 648 if (delay !== 0) setTimeout(() => resolve(), delay); else resolve(); 649 }); 650 }, 651 RemoveDocumentEvent: async function (id, name, type) { 652 return new Promise(function (resolve) { 653 blazorStrap.RemoveEventInternal(document, id, name, type); 654 resolve(); 655 }); 656 }, 657 RemoveEvent: async function (id, name, type) { //Split Document out to its own function 658 return new Promise(function (resolve) { 659 blazorStrap.RemoveEventInternal(document.querySelector("[data-blazorstrap='" + id + "']"), id, name, type); 660 resolve(); 661 }); 662 }, 663 RemoveEventInternal: function (element, id, name, type) { 664 blazorStrap.CleanUpEvents(); 665 if (blazorStrap.EventHandlers[id] === undefined) return; 666 667 if (name !== "null" && type !== "null") { 668 if (blazorStrap.EventHandlers[id][name] === undefined) return; 669 if (blazorStrap.EventHandlers[id][name][type] === undefined) return; 670 671 if (blazorStrap.EventHandlers[id][name][type] !== undefined && blazorStrap.EventHandlers[id][name][type] !== null) { 672 if (element !== undefined && element !== null) { 673 if (type === "resize") 674 window.removeEventListener(type, blazorStrap.EventHandlers[id][name][type].Callback, false); 675 else 676 element.removeEventListener(type, blazorStrap.EventHandlers[id][name][type].Callback, false); 677 } 678 delete blazorStrap.EventHandlers[id][name][type]; 679 } 680 if (Object.keys(blazorStrap.EventHandlers[id][name]).length === 0) { 681 delete blazorStrap.EventHandlers[id][name]; 682 } 683 } 684 if (Object.keys(blazorStrap.EventHandlers[id]).length === 0) { 685 delete blazorStrap.EventHandlers[id]; 686 } 687 }, 688 RemovePopover: async function (element, id) { 689 return new Promise(function (resolve) { 690 if (blazorStrap.EventHandlers[id] === undefined) return resolve(); 691 692 if (blazorStrap.EventHandlers[id]["Popover"] !== undefined) { 693 blazorStrap.EventHandlers[id].Popover.destroy(); 694 delete blazorStrap.EventHandlers[id].Popover; 695 resolve(); 696 } 697 698 if (Object.keys(blazorStrap.EventHandlers[id]).length === 0) { 699 delete blazorStrap.EventHandlers[id]; 700 } 701 }); 702 }, 703 SetBodyStyle: async function (style, value) { 704 return new Promise(function (resolve) { 705 document.body.style[style] = value; 706 resolve(); 707 }); 708 }, 709 SetBootstrapCss: function (theme, version) { 710 if (link === undefined) { 711 let existing = document.querySelectorAll('link[href$="bootstrap.min.css"]')[0]; 712 713 if (existing === undefined) { 714 link = document.createElement('link'); 715 document.head.insertBefore(link, document.head.firstChild); 716 link.type = 'text/css'; 717 link.rel = 'stylesheet'; 718 } else link = existing; 719 } 720 721 if (theme === 'bootstrap') { 722 link.href = "https://cdn.jsdelivr.net/npm/bootstrap@" + version + "/dist/css/bootstrap.min.css"; 723 } else { 724 link.href = "https://cdn.jsdelivr.net/npm/bootswatch@" + version + "/dist/" + theme + "/bootstrap.min.css"; 725 } 726 727 return true; 728 }, 729 SetStyle: async function (element, style, value, delay = 0) { 730 if (element === null || element === undefined) return; 731 element.style[style] = value; 732 return new Promise(function (resolve) { 733 if (delay !== 0) setTimeout(() => resolve(), delay); else resolve(); 734 }); 735 }, 736 ToastTimer: function (element, time, timeRemaining, rendered) { 737 if (rendered === false) { 738 element.classList.add("showing"); 739 } 740 741 if (time === 0) { 742 setTimeout(function () { 743 element.classList.remove("showing"); 744 }, 100); 745 } 746 747 if (time !== 0) { 748 const dflex = element.querySelector(".d-flex"); 749 const wrapper = document.createElement("div"); 750 wrapper.className = "w-100 p-0 m-0 position-relative border-bottom-1 border-dark"; 751 wrapper.style.top = "-1px"; 752 const timeEl = document.createElement("div"); 753 wrapper.appendChild(timeEl); 754 element.insertBefore(wrapper, dflex); 755 timeEl.classList.add("bg-dark"); 756 timeEl.style.height = "4px"; 757 timeEl.style.opacity = ".4"; 758 759 if (timeRemaining === 0) { 760 timeEl.style.width = "0"; 761 timeEl.style["transition"] = "linear " + (time - timeRemaining) / 1000 + "s"; 762 timeEl.style["-webkit-transition"] = "linear " + (time - timeRemaining) / 1000 + "s"; 763 } else { 764 timeRemaining = time - timeRemaining; 765 timeEl.style.width = timeRemaining / time * 100 + "%"; 766 timeEl.style["transition"] = "linear" + (time - timeRemaining) / 1000 + "s"; 767 timeEl.style["-webkit-transition"] = "linear " + (time - timeRemaining) / 1000 + "s"; 768 } 769 770 setTimeout(function () { 771 element.classList.remove("showing"); 772 timeEl.style.width = "100%"; 773 }, 100); 774 } 775 }, 776 TransitionDidNotStart: async function (element, delay = 200) { 777 return new Promise(function (resolve) { 778 let handler = function () { 779 resolve(false); 780 clearTimeout(timeout); 781 }; 782 783 const timeout = setTimeout(function () { 784 resolve(true); 785 element.removeEventListener("transitionstart", handler, { 786 once: true 787 }); 788 }, delay); 789 element.addEventListener("transitionstart", handler, { 790 once: true 791 }); 792 }).then(data => data); 793 }, 794 UpdatePopover: async function (element) { 795 const id = element.getAttribute("data-blazorstrap"); 796 return new Promise(function (resolve) { 797 setTimeout(async function () { 798 await blazorStrap.EventHandlers[id].Popover.update(
798); 799 return resolve(element.style.cssText); 800 }, 10); 801 }); 802 }, 803 UpdatePopoverArrow: async function (element, position, tooltip) { 804 const id = element.getAttribute("data-blazorstrap"); 805 let arrow; 806 return new Promise(function (resolve) { 807 if (tooltip === false) arrow = element.querySelector('.popover-arrow'); else arrow = element.querySelector('.tooltip-arrow'); 808 if (arrow === undefined || arrow === null) { 809 arrow = element.querySelector('.arrow'); 810 } 811 position = position.replace("start", ""); 812 position = position.replace("end", ""); 813 814 switch (position) { 815 case "top": 816 arrow.style.transform = "translate(" + (element.offsetWidth / 2 - arrow.offsetWidth / 2) + "px, 0px)"; 817 if (!tooltip) blazorStrap.EventHandlers[id].Popover.setOptions({ 818 modifiers: [{ 819 name: 'offset', 820 options: { 821 offset: [0, arrow.offsetHeight] 822 } 823 }] 824 }); 825 break; 826 827 case "bottom": 828 arrow.style.transform = "translate(" + (element.offsetWidth / 2 - arrow.offsetWidth / 2) + "px, 0px)"; 829 if (!tooltip) blazorStrap.EventHandlers[id].Popover.setOptions({ 830 modifiers: [{ 831 name: 'offset', 832 options: { 833 offset: [0, arrow.offsetHeight] 834 } 835 }] 836 }); 837 break; 838 839 case "left": 840 arrow.style.transform = "translate(0px, " + (element.offsetHeight / 2 - arrow.offsetHeight / 2) + "px)"; 841 if (!tooltip) blazorStrap.EventHandlers[id].Popover.setOptions({ 842 modifiers: [{ 843 name: 'offset', 844 options: { 845 offset: [0, arrow.offsetWidth] 846 } 847 }] 848 }); 849 break; 850 851 case "right": 852 arrow.style.transform = "translate(0px, " + (element.offsetHeight / 2 - arrow.offsetHeight / 2) + "px)"; 853 if (!tooltip) blazorStrap.EventHandlers[id].Popover.setOptions({ 854 modifiers: [{ 855 name: 'offset', 856 options: { 857 offset: [0, arrow.offsetWidth] 858 } 859 }] 860 }); 861 break; 862 } 863 864 resolve(); 865 }); 866 } 867}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.