mirror of
https://github.com/ae-utbm/sith.git
synced 2024-11-15 02:33:22 +00:00
Add link-once and script-once web components
This commit is contained in:
parent
c50f0a2ac5
commit
0a0092e189
33
core/static/webpack/core/components/include-index.ts
Normal file
33
core/static/webpack/core/components/include-index.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import { inheritHtmlElement, registerComponent } from "#core:utils/web-components";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Web component used to import css files only once
|
||||||
|
* If called multiple times or the file was already imported, it does nothing
|
||||||
|
**/
|
||||||
|
@registerComponent("link-once")
|
||||||
|
export class LinkOnce extends inheritHtmlElement("link") {
|
||||||
|
connectedCallback() {
|
||||||
|
super.connectedCallback(false);
|
||||||
|
// We get href from node.attributes instead of node.href to avoid getting the domain part
|
||||||
|
const href = this.node.attributes.getNamedItem("href").nodeValue;
|
||||||
|
if (document.querySelectorAll(`link[href='${href}']`).length === 0) {
|
||||||
|
this.appendChild(this.node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Web component used to import javascript files only once
|
||||||
|
* If called multiple times or the file was already imported, it does nothing
|
||||||
|
**/
|
||||||
|
@registerComponent("script-once")
|
||||||
|
export class ScriptOnce extends inheritHtmlElement("script") {
|
||||||
|
connectedCallback() {
|
||||||
|
super.connectedCallback(false);
|
||||||
|
// We get src from node.attributes instead of node.src to avoid getting the domain part
|
||||||
|
const src = this.node.attributes.getNamedItem("src").nodeValue;
|
||||||
|
if (document.querySelectorAll(`script[src='${src}']`).length === 0) {
|
||||||
|
this.appendChild(this.node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -185,8 +185,8 @@ const loadEasyMde = (textarea: HTMLTextAreaElement) => {
|
|||||||
|
|
||||||
@registerComponent("markdown-input")
|
@registerComponent("markdown-input")
|
||||||
class MarkdownInput extends inheritHtmlElement("textarea") {
|
class MarkdownInput extends inheritHtmlElement("textarea") {
|
||||||
constructor() {
|
connectedCallback() {
|
||||||
super();
|
super.connectedCallback();
|
||||||
window.addEventListener("DOMContentLoaded", () => loadEasyMde(this.node));
|
loadEasyMde(this.node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,8 +30,7 @@ export function inheritHtmlElement<K extends keyof HTMLElementTagNameMap>(tagNam
|
|||||||
return class Inherited extends HTMLElement {
|
return class Inherited extends HTMLElement {
|
||||||
protected node: HTMLElementTagNameMap[K];
|
protected node: HTMLElementTagNameMap[K];
|
||||||
|
|
||||||
constructor() {
|
connectedCallback(autoAddNode?: boolean) {
|
||||||
super();
|
|
||||||
this.node = document.createElement(tagName);
|
this.node = document.createElement(tagName);
|
||||||
const attributes: Attr[] = []; // We need to make a copy to delete while iterating
|
const attributes: Attr[] = []; // We need to make a copy to delete while iterating
|
||||||
for (const attr of this.attributes) {
|
for (const attr of this.attributes) {
|
||||||
@ -44,7 +43,10 @@ export function inheritHtmlElement<K extends keyof HTMLElementTagNameMap>(tagNam
|
|||||||
this.removeAttributeNode(attr);
|
this.removeAttributeNode(attr);
|
||||||
this.node.setAttributeNode(attr);
|
this.node.setAttributeNode(attr);
|
||||||
}
|
}
|
||||||
|
// Atuomatically add node to DOM if autoAddNode is true or unspecified
|
||||||
|
if (autoAddNode === undefined || autoAddNode) {
|
||||||
this.appendChild(this.node);
|
this.appendChild(this.node);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
<link rel="preload" as="style" href="{{ static('webpack/fontawesome-index.css') }}" onload="this.onload=null;this.rel='stylesheet'">
|
<link rel="preload" as="style" href="{{ static('webpack/fontawesome-index.css') }}" onload="this.onload=null;this.rel='stylesheet'">
|
||||||
<noscript><link rel="stylesheet" href="{{ static('webpack/fontawesome-index.css') }}"></noscript>
|
<noscript><link rel="stylesheet" href="{{ static('webpack/fontawesome-index.css') }}"></noscript>
|
||||||
|
|
||||||
|
<script src={{ static("webpack/core/components/include-index.ts") }}></script>
|
||||||
<script src="{{ static('webpack/alpine-index.js') }}" defer></script>
|
<script src="{{ static('webpack/alpine-index.js') }}" defer></script>
|
||||||
<!-- Jquery declared here to be accessible in every django widgets -->
|
<!-- Jquery declared here to be accessible in every django widgets -->
|
||||||
<script src="{{ static('webpack/jquery-index.js') }}"></script>
|
<script src="{{ static('webpack/jquery-index.js') }}"></script>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div>
|
<div>
|
||||||
|
<script-once src="{{ statics.js }}" defer></script-once>
|
||||||
|
<link-once rel="stylesheet" type="text/css" href="{{ statics.css }}" defer></link-once>
|
||||||
|
|
||||||
<markdown-input name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}>{% if widget.value %}{{ widget.value }}{% endif %}</markdown-input>
|
<markdown-input name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}>{% if widget.value %}{{ widget.value }}{% endif %}</markdown-input>
|
||||||
|
|
||||||
{# The easymde script can be included twice, it's safe in the code #}
|
</div>
|
||||||
<script src="{{ statics.js }}" defer> </script>
|
|
||||||
<link rel="stylesheet" type="text/css" href="{{ statics.css }}" defer>
|
|
||||||
</div>
|
|
||||||
|
Loading…
Reference in New Issue
Block a user