PageSourceSearch

https://xgm.guru/public/mjs/79df25d1/components/resource/moderation.js

js xgm.guru collected 2026-09-24 10:33:45 UTC 3,427 bytes, 97 lines download raw bytes

1import {globalProgress, L} from '../../ui/utils.js'
2import {firemsg} from '../../ui/firemsg.js'
3import {Modal} from '../../ui/modal.js'
4
5/** @type {HTMLFormElement} form */
6const form = document.getElementById('moderation-helper-form')
7/** @type {HTMLTextAreaElement} */
8const textarea = form.querySelector('.moderation-helper-text')
9/** @type {HTMLSelectElement} */
10const select = form.querySelector('.moderation-helper-select')
11/** @type {HTMLInputElement} */
12const id = form.querySelector('.moderation-id')
13/** @type {HTMLInputElement} */
14const projectId = form.querySelector('.moderation-project-id')
15/** @type {HTMLButtonElement} */
16const sendButton = form.querySelector('.btn-primary')
17
18let resource = null
19
20let list = {}
21
22// add text to textarea
23select.addEventListener('change', e => {
24    const textToAdd = list[select.value] || null
25    if(!textToAdd) {
26        throw new Error('Cannot find list element: '+select.value)
27    }
28    textarea.value = textarea.value + '\r\n' + textToAdd.trim() + '\r\n'
29})
30
31// send comment
32form.addEventListener('submit', async e => {
33    if(!resource) return
34    e.preventDefault()
35    globalProgress(true)
36    sendButton.disabled = true
37    const formData = new FormData(form);
38    formData.set('pageid', resource.dataset.id)
39    formData.set('id', resource.dataset.projectId)
40    formData.set('do', 'post')
41    formData.set('nomerge', '1')
42    formData.set('comment-type', '190')
43    const response = await fetch("/comment/do", {
44      method: "POST",
45      body: formData,
46    })
47    globalProgress(false)
48    sendButton.disabled = false
49    Modal.close(() => { 
50        textarea.value = '' 
51        document.location.reload()
52    })
53})
54
55document.body.addEventListener('ui.modal-open', e => {
56    if (e.detail.name !== 'moderation-helper-form') return
57    textarea.value = L(
58        'Приветствую! Ресурс был снят с публикации и требует доработки по следующим причинам:\r\n', 
59        'Greetings! The resource has been removed from publication and requires correction for the following reasons:\r\n'
60    )
61    resource = e.target.closest('.as-resource, .as-resource-form')
62
63    Modal.open(async () => {
64        globalProgress(true)
65        sendButton.disabled = true
66        await fetch('/resource/moderation/helper-list', {
67            method: 'GET'
68        })
69            .then((response) => {
70                response.json().then(data => { 
71                    if(data.list) {
72                        select.innerHTML = '<option value=""> </option>'
73                        list = data.list
74                        for(let title in data.list) {
75                            let o = document.createElement('option')
76                            o.innerHTML = title
77                            o.value = title
78                            select.insertAdjacentElement('beforeend', o)
79                        }
80                    }
81                })
82            })
83            .catch(r => {
84                textarea.value = r.statusText || 'Error '+r.status
85            })
86            .finally(() => {
87                globalProgress(false)
88                sendButton.disabled = false
89            })
90        textarea.focus()
91        return form
92    }, () => { 
93        textarea.value = '' 
94    })
95})
96
97export default {}

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.