File size: 1,994 Bytes
465d267 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <!--
Matomo - free/libre analytics platform
@link https://matomo.org
@license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
-->
<script lang="ts">
import { defineComponent } from 'vue';
import { AjaxHelper } from 'CoreHome';
interface UpdatePluginsCount {
observer: MutationObserver | null,
pending: boolean,
}
export default defineComponent({
props: {
selector: {
type: String,
required: true,
},
observerSelector: {
type: String,
default: '#secondNavBar',
},
},
data(): UpdatePluginsCount {
return {
observer: null,
pending: false,
};
},
methods: {
async fetchAndUpdate(el: Element) {
await AjaxHelper.fetch<{ value: number }>({
module: 'API',
method: 'CorePluginsAdmin.getNumberOfPluginUpdates',
}).then((response) => {
const count = response.value || 0;
if (count) {
const originalText = el.textContent?.trim() ?? '';
el.textContent = `${originalText} (${count})`;
}
}).catch((error) => {
console.error('Failed to fetch number of plugin updates:', error.message || error);
});
},
maybeUpdate() {
const el = document.querySelector(this.selector);
if (!el) return;
if (this.observer) {
this.observer.disconnect();
this.observer = null;
}
if (this.pending) return;
this.pending = true;
this.fetchAndUpdate(el).finally(() => {
this.pending = false;
});
},
},
mounted() {
const root = document.querySelector(this.observerSelector);
if (!root) {
return;
}
this.maybeUpdate();
this.observer = new MutationObserver(() => this.maybeUpdate());
this.observer.observe(root, { childList: true, subtree: true });
},
beforeUnmount() {
if (this.observer) {
this.observer.disconnect();
this.observer = null;
}
},
render() {
return null;
},
});
</script>
|