https://de.wikipedia.org/w/index.php?action=history&feed=atom&title=Benutzer%3ALadsgroup%2Fdashboard.js Benutzer:Ladsgroup/dashboard.js - Versionsgeschichte 2025-05-04T20:45:10Z Versionsgeschichte dieser Seite in Wikipedia MediaWiki 1.44.0-wmf.27 https://de.wikipedia.org/w/index.php?title=Benutzer:Ladsgroup/dashboard.js&diff=238096758&oldid=prev Ladsgroup: AZ: Die Seite wurde neu angelegt: // License: GPL-v3 or later // Keep in sync with https://gitlab.wikimedia.org/ladsgroup/dashboard-gadget/-/blob/main/main.js function dashboardGadget() { function msg( key ){ const i18n = { 'en': { 'dashboard': 'Dashboard', 'dashboard-message': 'Go to the dashboard', 'loading': 'Loading...', 'diff': 'Diff',… 2023-10-12T19:13:38Z <p><a href="/wiki/Hilfe:Zusammenfassung_und_Quellen#Auto-Zusammenfassung" title="Hilfe:Zusammenfassung und Quellen">AZ</a>: Die Seite wurde neu angelegt: // License: GPL-v3 or later // Keep in sync with https://gitlab.wikimedia.org/ladsgroup/dashboard-gadget/-/blob/main/main.js function dashboardGadget() { function msg( key ){ const i18n = { &#039;en&#039;: { &#039;dashboard&#039;: &#039;Dashboard&#039;, &#039;dashboard-message&#039;: &#039;Go to the dashboard&#039;, &#039;loading&#039;: &#039;Loading...&#039;, &#039;diff&#039;: &#039;Diff&#039;,…</p> <p><b>Neue Seite</b></p><div>// License: GPL-v3 or later<br /> // Keep in sync with https://gitlab.wikimedia.org/ladsgroup/dashboard-gadget/-/blob/main/main.js<br /> <br /> function dashboardGadget() {<br /> function msg( key ){<br /> const i18n = {<br /> &#039;en&#039;: {<br /> &#039;dashboard&#039;: &#039;Dashboard&#039;,<br /> &#039;dashboard-message&#039;: &#039;Go to the dashboard&#039;,<br /> &#039;loading&#039;: &#039;Loading...&#039;,<br /> &#039;diff&#039;: &#039;Diff&#039;,<br /> &#039;refresh&#039;: &#039;Refresh&#039;,<br /> &#039;configuration&#039;: &#039;Configuration&#039;,<br /> &#039;pending-since&#039;: &#039;Pending since&#039;,<br /> &#039;default-config&#039;: &#039;User:Ladsgroup/defaultDashboardConfig.json&#039;<br /> },<br /> &#039;fa&#039;: {<br /> &#039;dashboard&#039;: &#039;پیشخوان&#039;,<br /> &#039;dashboard-message&#039;: &#039;رفتن به صفحهٔ پیشخوان عمومی&#039;,<br /> &#039;loading&#039;: &#039;در حال بارگذاری...&#039;,<br /> &#039;diff&#039;: &#039;تفاوت&#039;,<br /> &#039;refresh&#039;: &#039;بروزرسانی&#039;,<br /> &#039;configuration&#039;: &#039;تنظیمات&#039;,<br /> &#039;pending-since&#039;: &#039;در حال انتظار از&#039;,<br /> &#039;default-config&#039;: &#039;مدیاویکی:Gadget-dashboard/defaultConfig.json&#039;<br /> },<br /> &#039;de&#039;: {<br /> &#039;dashboard&#039;: &#039;Dashboard&#039;,<br /> &#039;dashboard-message&#039;: &#039;Go to the dashboard&#039;,<br /> &#039;loading&#039;: &#039;Laden...&#039;,<br /> &#039;diff&#039;: &#039;Unterschied&#039;,<br /> &#039;refresh&#039;: &#039;Neuladen&#039;,<br /> &#039;configuration&#039;: &#039;Einstellungen&#039;,<br /> &#039;pending-since&#039;: &#039;Ungesichtet seit&#039;,<br /> &#039;default-config&#039;: &#039;User:Ladsgroup/defaultConfig.json&#039;<br /> }<br /> };<br /> return i18n[ mw.config.get( &#039;wgUserLanguage&#039; ).split(&#039;-&#039;)[0] ][ key ] || i18n.en[ key ];<br /> }<br /> <br /> // inject the link<br /> if ($(&#039;.vector-user-links&#039;).length) {<br /> // new vector<br /> let dashboardLinkDiv = $(&#039;&lt;div&gt;&lt;/div&gt;&#039;);<br /> dashboardLinkDiv.css(&#039;margin&#039;, &#039;5px&#039;);<br /> let link = $(&#039;&lt;a&gt;&lt;/a&gt;&#039;);<br /> link.attr(&#039;href&#039;, &#039;/wiki/Special:BlankPage/Dashboard&#039;);<br /> link.text(msg(&#039;dashboard&#039;))<br /> dashboardLinkDiv.append(link);<br /> dashboardLinkDiv.append(&#039; - &#039;);<br /> $(&#039;.vector-user-links&#039;).prepend(dashboardLinkDiv);<br /> } else {<br /> // old vector<br /> mw.util.addPortletLink(&#039;p-personal&#039;, &#039;/wiki/Special:BlankPage/Dashboard&#039;, msg(&#039;dashboard&#039;), &#039;p-dashboard&#039;, msg(&#039;dashboard-message&#039;), null, &#039;#pt-userpage&#039;);<br /> }<br /> <br /> if (<br /> mw.config.get( &#039;wgCanonicalNamespace&#039; ) != &#039;Special&#039; ||<br /> mw.config.get( &#039;wgCanonicalSpecialPageName&#039; ) != &#039;Blankpage&#039; ||<br /> mw.config.get( &#039;wgPageName&#039; ).search( &#039;/Dashboard&#039; ) == -1<br /> ) {<br /> return;<br /> }<br /> document.documentElement.classList.remove(&#039;vector-feature-limited-width-clientpref-1&#039;);<br /> document.documentElement.classList.add(&#039;vector-feature-limited-width-clientpref-0&#039;);<br /> document.documentElement.classList.remove(&#039;vector-feature-page-tools-pinned-enabled&#039;);<br /> document.documentElement.classList.add(&#039;vector-feature-page-tools-pinned-disabled&#039;);<br /> $(&#039;.vector-page-toolbar&#039;).remove();<br /> window.dispatchEvent( new Event( &#039;resize&#039; ) );<br /> $(&#039;.mw-first-heading&#039;).text(msg(&#039;dashboard&#039;));<br /> document.title = msg(&#039;dashboard&#039;);<br /> $(&#039;.mw-body-content&#039;).text(msg(&#039;loading&#039;));<br /> <br /> async function loadConfig( title ) {<br /> let response = await fetch(&quot;/wiki/&quot; + encodeURIComponent(title) + &#039;?action=raw&#039;);<br /> return response.text();<br /> }<br /> <br /> async function contentForPageType( box ) {<br /> let response = await fetch(&quot;/api/rest_v1/page/html/&quot; + encodeURIComponent(box.pageTitle));<br /> return response.text();<br /> }<br /> <br /> async function contentForRC( box ) {<br /> let response = await fetch(box.url);<br /> let data = await response.json();<br /> data = data.query.recentchanges;<br /> let content = $(&#039;&lt;ul&gt;&lt;/ul&gt;&#039;);<br /> for ( i in data ) {<br /> let diff = $(&#039;&lt;a&gt;&lt;/a&gt;&#039;);<br /> diff.attr(&#039;href&#039;, &#039;/wiki/Special:Diff/&#039; + Number(data[i].revid));<br /> diff.text(msg(&#039;diff&#039;));<br /> <br /> let liObj = $(&#039;&lt;li&gt;&lt;/li&gt;&#039;);<br /> liObj.append(&#039;(&#039;);<br /> liObj.append(diff);<br /> liObj.append(&#039;) - &#039;);<br /> liObj.append(getPageLink(data[i].title));<br /> liObj.append(&#039; &#039;);<br /> liObj.append(getUser(data[i].user));<br /> liObj.append( &#039; (&#039; + data[i].parsedcomment + &#039;)&#039; );<br /> <br /> content.append(liObj);<br /> }<br /> return content;<br /> }<br /> <br /> async function contentForWatchlist( box ) {<br /> let response = await fetch(box.url);<br /> let data = await response.json();<br /> data = data.query.watchlist;<br /> let content = $(&#039;&lt;ul&gt;&lt;/ul&gt;&#039;);<br /> for ( i in data ) {<br /> let diff = $(&#039;&lt;a&gt;&lt;/a&gt;&#039;);<br /> diff.attr(&#039;href&#039;, &#039;/wiki/Special:Diff/&#039; + Number(data[i].revid));<br /> diff.text(msg(&#039;diff&#039;));<br /> <br /> let liObj = $(&#039;&lt;li&gt;&lt;/li&gt;&#039;);<br /> liObj.append(&#039;(&#039;);<br /> liObj.append(diff);<br /> liObj.append(&#039;) - &#039;);<br /> liObj.append(getPageLink(data[i].title));<br /> liObj.append(&#039; &#039;);<br /> liObj.append(getUser(data[i].user));<br /> liObj.append( &#039; (&#039; + data[i].parsedcomment + &#039;)&#039; );<br /> <br /> content.append(liObj);<br /> }<br /> <br /> return content;<br /> }<br /> <br /> async function contentForPending( box ) {<br /> let response = await fetch(box.url);<br /> let data = await response.json();<br /> data = data.query.oldreviewedpages;<br /> if ( !data ) {<br /> return &#039;Nothing to review!&#039;;<br /> }<br /> let content = $(&#039;&lt;ul&gt;&lt;/ul&gt;&#039;);<br /> for ( i in data ) {<br /> let diff = $(&#039;&lt;a&gt;&lt;/a&gt;&#039;);<br /> diff.attr(&#039;href&#039;, &#039;/wiki/Special:Diff/&#039; + Number(data[i].revid));<br /> diff.text(msg(&#039;diff&#039;));<br /> <br /> let liObj = $(&#039;&lt;li&gt;&lt;/li&gt;&#039;);<br /> liObj.append(&#039;(&#039;);<br /> liObj.append(diff);<br /> liObj.append(&#039;) - &#039;);<br /> liObj.append(getPageLink(data[i].title));<br /> liObj.append( &#039; (&#039; + msg(&#039;pending-since&#039;) + &#039;: &#039; + data[i].pending_since + &#039;)&#039; );<br /> <br /> content.append(liObj);<br /> }<br /> <br /> return content;<br /> }<br /> <br /> async function contentForCategory( box ) {<br /> let api = new mw.Api();<br /> if (box.norandom) {<br /> limit = 10;<br /> } else {<br /> limit = 100;<br /> }<br /> let data = await api.get( {<br /> action: &#039;query&#039;,<br /> list: &#039;categorymembers&#039;,<br /> cmprop: &#039;title&#039;,<br /> cmlimit: limit,<br /> cmtitle: box.categoryTitle<br /> } );<br /> data = getMultipleRandom(data.query.categorymembers, 10);<br /> let content = $(&#039;&lt;ul&gt;&lt;/ul&gt;&#039;);<br /> for ( i in data ) {<br /> let liObj = $(&#039;&lt;li&gt;&lt;/li&gt;&#039;);<br /> liObj.append(getPageLink(data[i].title));<br /> content.append(liObj);<br /> }<br /> return content;<br /> }<br /> <br /> async function contentForLinks( box ) {<br /> let content = $(&#039;&lt;ul&gt;&lt;/ul&gt;&#039;);<br /> for ( i in box.links ) {<br /> let link = box.links[i];<br /> if ( link.page ) {<br /> let liObj = $(&#039;&lt;li&gt;&lt;/li&gt;&#039;);<br /> liObj.append(getPageLink(link.page));<br /> content.append(liObj);<br /> } else if ( link.url ) {<br /> let link = $(&#039;&lt;a&gt;&#039;);<br /> link.attr(&#039;href&#039;, encodeURIComponent(link.url));<br /> link.text(link.text);<br /> let liObj = $(&#039;&lt;li&gt;&lt;/li&gt;&#039;);<br /> liObj.append(link);<br /> content.append(liObj);<br /> }<br /> }<br /> <br /> return content;<br /> }<br /> <br /> async function contnetForStats() {<br /> let api = new mw.Api();<br /> let data = await api.get( {<br /> action: &#039;query&#039;,<br /> meta: &#039;siteinfo&#039;,<br /> siprop: &#039;statistics&#039;,<br /> } );<br /> let content = &#039;&lt;ul&gt;&#039;;<br /> content += &#039;&lt;li&gt;تعداد مقالات: &#039; + mw.language.convertNumber(data.query.statistics.articles) + &#039;&lt;/li&gt;&#039;;<br /> content += &#039;&lt;li&gt;تعداد صفحات: &#039; + mw.language.convertNumber(data.query.statistics.pages) + &#039;&lt;/li&gt;&#039;;<br /> content += &#039;&lt;li&gt;تعداد ویرایش‌ها: &#039; + mw.language.convertNumber(data.query.statistics.edits) + &#039;&lt;/li&gt;&#039;;<br /> content += &#039;&lt;li&gt;تعداد تصاویر: &#039; + mw.language.convertNumber(data.query.statistics.images) + &#039;&lt;/li&gt;&#039;;<br /> content += &#039;&lt;li&gt;تعداد کاربران فعال: &#039; + mw.language.convertNumber(data.query.statistics.activeusers) + &#039;&lt;/li&gt;&#039;;<br /> return content + &#039;&lt;/ul&gt;&#039;;<br /> }<br /> <br /> async function contnetForCx() {<br /> let api = new mw.Api();<br /> let data = await api.get( {<br /> action: &#039;query&#039;,<br /> assert: &#039;user&#039;,<br /> list: &#039;contenttranslationsuggestions&#039;,<br /> from: &#039;en&#039;,<br /> to: &#039;fa&#039;,<br /> limit: 10,<br /> seed: Math.floor(Math.random() * 100)<br /> } );<br /> data = data.query.contenttranslationsuggestions.lists;<br /> let content = $(&#039;&lt;ul&gt;&lt;/ul&gt;&#039;);<br /> for ( i in data ) {<br /> for (j in data[i].suggestions) {<br /> let link = $(&#039;&lt;a&gt;&#039;);<br /> link.attr(&#039;href&#039;, &#039;https://en.wikipedia.org/wiki/&#039; + encodeURIComponent(data[i].suggestions[j].title));<br /> link.text(data[i].suggestions[j].title);<br /> <br /> let liObj = $(&#039;&lt;li&gt;&lt;/li&gt;&#039;);<br /> liObj.append(link);<br /> content.append(liObj);<br /> }<br /> }<br /> let divObj = $(&#039;&lt;div direction=&quot;ltr&quot;&gt;&lt;/div&gt;&#039;);<br /> divObj.append(content);<br /> return divObj;<br /> }<br /> <br /> const handlers = {<br /> &#039;page&#039;: contentForPageType,<br /> &#039;rc&#039;: contentForRC,<br /> &#039;watchlist&#039;: contentForWatchlist,<br /> &#039;category&#039;: contentForCategory,<br /> &#039;pending&#039;: contentForPending,<br /> &#039;links&#039;: contentForLinks,<br /> &#039;stats&#039;: contnetForStats,<br /> &#039;cx&#039;: contnetForCx,<br /> };<br /> <br /> function getUser(username) {<br /> let link = $(&#039;&lt;a&gt;&#039;);<br /> link.attr(&#039;href&#039;, &#039;/wiki/User:&#039; + encodeURIComponent(username));<br /> link.text(username);<br /> return link;<br /> }<br /> <br /> function getPageLink( title ) {<br /> let link = $(&#039;&lt;a&gt;&#039;);<br /> link.attr(&#039;href&#039;, &#039;/wiki/&#039; + encodeURIComponent(title));<br /> link.text(title);<br /> return link;<br /> }<br /> <br /> function getMultipleRandom(arr, num) {<br /> const shuffled = [...arr].sort(() =&gt; 0.5 - Math.random());<br /> <br /> return shuffled.slice(0, num);<br /> }<br /> <br /> function loadBoxes() {<br /> $(&#039;.mw-body-content&#039;).text(msg(&#039;loading&#039;));<br /> let tabs = $(&#039;&lt;div class=&quot;cdx-tabs&quot;&gt;&lt;/div&gt;&#039;);<br /> let tabsHeader = $(&#039;&lt;div class=&quot;cdx-tabs__header&quot;&gt;&lt;div class=&quot;cdx-tabs__list&quot;&gt;&lt;/div&gt;&lt;/div&gt;&#039;);<br /> let tabsContent = $( &#039;&lt;div class=&quot;cdx-tabs__content&quot;&gt;&lt;/div&gt;&#039;);<br /> for ( let tabIndex in window.dashboardConfig.tabs ) {<br /> let tabConfig = window.dashboardConfig.tabs[tabIndex]; <br /> let headerElement = $(&#039;&lt;span class=&quot;cdx-tabs__list__item&quot;&gt;&lt;/span&gt;&#039;);<br /> headerElement.text( tabConfig.title );<br /> headerElement.on( &#039;click&#039;, () =&gt; { <br /> window.dashboardActiveTab = tabIndex;<br /> loadBoxes();<br /> });<br /> if ( tabIndex == ( window.dashboardActiveTab || 0 ) ) {<br /> headerElement.attr(&#039;aria-selected&#039;, true);<br /> }<br /> tabsHeader.append(headerElement);<br /> <br /> let tabContent = $( &#039;&lt;div class=&quot;cdx-tab&quot;&gt;&lt;/div&gt;&#039;);<br /> tabContent.attr( &#039;id&#039;, &#039;tab-content-&#039; + tabIndex );<br /> tabContent.css(&#039;display&#039;, &#039;flex&#039;);<br /> tabContent.css(&#039;flex-wrap&#039;, &#039;wrap&#039;);<br /> tabContent.css(&#039;align-items&#039;, &#039;flex-start&#039;);<br /> for (let i in tabConfig.boxes) {<br /> i = Number(i);<br /> let box = tabConfig.boxes[i];<br /> let element = $(&#039;&lt;span class=&quot;cdx-card__text&quot;&gt;&lt;/span&gt;&#039;);<br /> let titleElement = $(&#039;&lt;span class=&quot;cdx-card__text__title&quot;&gt;&lt;/span&gt;&#039;);<br /> titleElement.text(box.title);<br /> element.append(titleElement);<br /> let contentElement = $(&#039;&lt;span&gt;&lt;/span&gt;&#039;);<br /> contentElement.attr(&#039;class&#039;, &#039;cdx-card__text__supporting-text&#039;);<br /> contentElement.attr(&#039;id&#039;, &#039;dashboard-box-&#039; + i);<br /> contentElement.append(&#039;&lt;span class=&quot;cdx-css-icon--clock&quot;&gt;&lt;/span&gt;&#039;);<br /> contentElement.append(msg(&#039;loading&#039;));<br /> contentElement.css(&#039;width&#039;, box.width || &#039;300px&#039; );<br /> contentElement.css(&#039;height&#039;, box.height || &#039;300px&#039; );<br /> contentElement.css(&#039;overflow&#039;, &#039;scroll&#039; );<br /> element.append(contentElement);<br /> let wrapper = $( &#039;&lt;span class=&quot;cdx-card&quot;&gt;&lt;/span&gt;&#039; );<br /> wrapper.append(element);<br /> wrapper.css(&#039;padding&#039;, &#039;15px&#039; );<br /> wrapper.css(&#039;margin&#039;, &#039;15px&#039; );<br /> const activeTab = window.dashboardActiveTab || 0;<br /> if ( tabIndex == activeTab ) {<br /> wrapper.css(&#039;display&#039;, &#039;inline-flex&#039;);<br /> tabsContent.append(wrapper);<br /> if ( handlers[box.type] ) {<br /> handlerPromise = handlers[box.type](box);<br /> } else {<br /> handlerPromise = new Promise(() =&gt; { return &#039;No handler has been found&#039; } );<br /> }<br /> handlerPromise.then( ( content ) =&gt; { $( &#039;#dashboard-box-&#039; + i).html( content )});<br /> } else {<br /> wrapper.css(&#039;display&#039;, &#039;none&#039;);<br /> }<br /> }<br /> }<br /> tabs.append(tabsHeader);<br /> let direction = &#039;left&#039;;<br /> if (document.dir == &#039;rtl&#039;) {<br /> direction = &#039;right&#039;;<br /> }<br /> <br /> let refreshButton = $(&#039;&lt;button class=&quot;cdx-button cdx-button--action-progressive&quot;&gt;&lt;/button&gt;&#039;);<br /> refreshButton.append(&#039;&lt;span class=&quot;cdx-button__icon cdx-css-icon--reload&quot;&gt;&lt;/span&gt;&#039;);<br /> refreshButton.text(msg(&#039;refresh&#039;));<br /> refreshButton.css( &#039;align-self&#039;, &#039;flex-end&#039; );<br /> refreshButton.css( &#039;margin-bottom&#039;, &#039;5px&#039; );<br /> refreshButton.css( &#039;margin-&#039; + direction, &#039;5px&#039; );<br /> refreshButton.on(&#039;click&#039;, loadBoxes );<br /> <br /> let configButton = $(&#039;&lt;button class=&quot;cdx-button cdx-button--action-progressive&quot;&gt;&lt;/button&gt;&#039;);<br /> configButton.append(&#039;&lt;span class=&quot;cdx-button__icon cdx-css-icon--reload&quot;&gt;&lt;/span&gt;&#039;);<br /> configButton.text(msg(&#039;configuration&#039;));<br /> <br /> let configLink = $(&#039;&lt;a&gt;&lt;/a&gt;&#039;);<br /> configLink.attr(&#039;href&#039;, &#039;/wiki/ &#039; + encodeURIComponent( window.dashboardConfigLocation ));<br /> configLink.attr(&#039;target&#039;, &#039;_blank&#039;);<br /> configLink.append(configButton);<br /> configLink.css( &#039;margin-bottom&#039;, &#039;5px&#039; );<br /> configLink.css( &#039;margin-&#039; + direction, &#039;auto&#039;); <br /> tabsHeader.append( configLink );<br /> tabsHeader.append( refreshButton );<br /> tabs.append(tabsContent);<br /> $(&#039;.mw-body-content&#039;).html(tabs);<br /> }<br /> let configPromise = null;<br /> if ( mw.util.getParamValue( &#039;dashboardConfig&#039; ) ) {<br /> configPromise = loadConfig( mw.util.getParamValue( &#039;dashboardConfig&#039; ) );<br /> window.dashboardConfigLocation = mw.util.getParamValue( &#039;dashboardConfig&#039; );<br /> } else {<br /> configPromise = loadConfig(&#039;User:&#039; + mw.config.get(&#039;wgUserName&#039;) + &#039;/dashboardConfig.json&#039; )<br /> .then( function (res) {<br /> try {<br /> JSON.parse(res);<br /> window.dashboardConfigLocation = &#039;User:&#039; + mw.config.get(&#039;wgUserName&#039;) + &#039;/dashboardConfig.json&#039;;<br /> return res;<br /> } catch (erorr) {<br /> window.dashboardConfigLocation = msg(&#039;default-config&#039;);<br /> return loadConfig(msg(&#039;default-config&#039;));<br /> }<br /> } );<br /> }<br /> configPromise.then( function (res) {<br /> let config = JSON.parse(res);<br /> window.dashboardConfig = config;<br /> mw.loader.using(&#039;codex-styles&#039;).then( loadBoxes() );<br /> });<br /> };<br /> <br /> (function ($, mw) {<br /> dashboardGadget();<br /> }(jQuery, mediaWiki));</div> Ladsgroup