added subject download button, fixed all questions display on allquestions

This commit is contained in:
mrfry 2023-04-30 18:54:05 +02:00
parent 2e12f3275d
commit 055a732733
5 changed files with 161 additions and 48 deletions

View file

@ -98,7 +98,13 @@ function TopBar({
) )
} }
function SideBar({ sidebarOpen, closeSideBar, href, setDonateShowing }) { function SideBar({
sidebarOpen,
closeSideBar,
href,
setDonateShowing,
setReposShowing,
}) {
return sidebarOpen ? ( return sidebarOpen ? (
<> <>
<div id="sideBarLinks" className={styles.sidebarLinks}> <div id="sideBarLinks" className={styles.sidebarLinks}>
@ -120,6 +126,14 @@ function SideBar({ sidebarOpen, closeSideBar, href, setDonateShowing }) {
</Link> </Link>
) )
})} })}
<a
onClick={() => {
closeSideBar()
setReposShowing(true)
}}
>
Project Git linkek
</a>
<a <a
onClick={() => { onClick={() => {
closeSideBar() closeSideBar()
@ -133,6 +147,54 @@ function SideBar({ sidebarOpen, closeSideBar, href, setDonateShowing }) {
) : null ) : null
} }
function Repos() {
return (
<div>
<div className={styles.modalHead}>Project Git repository-k</div>
<div style={{ textAlign: 'justify', margin: '8px' }}>
<ul>
<li>
<a
rel="noreferrer"
target="_blank"
href="https://gitlab.com/MrFry/mrfrys-node-server"
>
Szerver
</a>
</li>
<li>
<a
rel="noreferrer"
target="_blank"
href="https://gitlab.com/MrFry/moodle-test-userscript"
>
Userscript
</a>
</li>
<li>
<a
rel="noreferrer"
target="_blank"
href="https://gitlab.com/MrFry/qmining-page"
>
Frontend
</a>
</li>
<li>
<a
rel="noreferrer"
target="_blank"
href="https://gitlab.com/MrFry/qmining-data-editor"
>
Data editor frontend
</a>
</li>
</ul>
</div>
</div>
)
}
function Donate() { function Donate() {
return ( return (
<div> <div>
@ -233,6 +295,7 @@ function MenuIcon({ setSidebarOpen, sidebarOpen }) {
export default function Layout({ children, router, globalData }) { export default function Layout({ children, router, globalData }) {
const [sidebarOpen, setSidebarOpen] = useState(true) const [sidebarOpen, setSidebarOpen] = useState(true)
const [donateShowing, setDonateShowing] = useState(false) const [donateShowing, setDonateShowing] = useState(false)
const [reposShowing, setReposShowing] = useState(false)
const userId = globalData.userId const userId = globalData.userId
const unreads = globalData.unreads const unreads = globalData.unreads
@ -279,8 +342,18 @@ export default function Layout({ children, router, globalData }) {
closeSideBar={closeSideBar} closeSideBar={closeSideBar}
href={href} href={href}
setDonateShowing={setDonateShowing} setDonateShowing={setDonateShowing}
setReposShowing={setReposShowing}
/> />
</div> </div>
{reposShowing ? (
<Modal
closeClick={() => {
setReposShowing(false)
}}
>
<Repos />
</Modal>
) : null}
{donateShowing ? ( {donateShowing ? (
<Modal <Modal
closeClick={() => { closeClick={() => {

View file

@ -211,8 +211,8 @@ export default function AllQuestions({ router, globalState, setGlobalState }) {
// FIXME: active item is all then no highlight // FIXME: active item is all then no highlight
const key = dbs.findIndex((x) => x.path === item.path) const key = dbs.findIndex((x) => x.path === item.path)
setData(null) setData(null)
setSelectedDb(key === 'all' ? 'all' : key) setSelectedDb(key === -1 ? 'all' : key)
if (key === 'all') { if (key === -1) {
router.replace( router.replace(
`${router.pathname}?question=${encodeURIComponent( `${router.pathname}?question=${encodeURIComponent(
searchTerm searchTerm
@ -267,7 +267,32 @@ export default function AllQuestions({ router, globalState, setGlobalState }) {
setActiveSubjName(subjName) setActiveSubjName(subjName)
}} }}
/> />
{currSubj && (
<>
{selectedDb !== 'all' ? (
<div className={'buttonContainer'}>
<a
onClick={() => {
window.open(
`${constants.apiUrl}allqr.txt?db=${dbs[selectedDb].name}&subj=${currSubj.Name}`,
'_blank'
)
}}
>
{'Tárgy kérdéseinek letöltése'}
<ExternalLinkIcon size={15} />
</a>
</div>
) : (
<div style={{ textAlign: 'center' }}>
<i>
Tárgy letöltéséhez válaszd ki a pontos DB-t az{' '}
{'"Összes kérdés"'} helyett!
</i>
</div>
)}
</>
)}
<div> <div>
<hr /> <hr />
<Subject subj={currSubj} /> <Subject subj={currSubj} />

View file

@ -12,6 +12,10 @@ function PasswordSection() {
<div className={'manualBody'}> <div className={'manualBody'}>
<ul> <ul>
<li>Minden felhasználónak más jelszava van.</li> <li>Minden felhasználónak más jelszava van.</li>
<li>
A jelszavak automatikusan és azonnal szinkronizálva vannak peerek
között. Egy jelszó minden peer-hez
</li>
<li>Elvileg elég csak egyszer beírnod, és többet nem kell, de </li> <li>Elvileg elég csak egyszer beírnod, és többet nem kell, de </li>
<li> <li>
Mentsd le biztos helyre a jelszót, hogy később is meglegyen! Mentsd le biztos helyre a jelszót, hogy később is meglegyen!
@ -77,14 +81,6 @@ function FAQSection() {
<br /> <br />
Több infó a <Link href="/faq?tab=risk">kockázatok résznél</Link>. Több infó a <Link href="/faq?tab=risk">kockázatok résznél</Link>.
</li> </li>
<li>
<b>Peer váltás után nem tudok bejelentkezni!</b>
Peer (vagy másnéven host) váltás után ha még nem kapcsolódtál a
megadott host-hoz engedélyezned kell a scriptnek hogy csatlakozzon
hozzá. Ez a felugró ablak nem minding azonnal jelenik meg, néha
előfordulhat hogy frissíteni kell az oldalt. Ha ezután sem működik
ellenőrizd hogy elérhető-e a host
</li>
<li> <li>
<b>Hogyan tudok a projektben segíteni?</b> <b>Hogyan tudok a projektben segíteni?</b>
Szinte mindig végtelen javítanivaló és tennivaló a projekttel Szinte mindig végtelen javítanivaló és tennivaló a projekttel
@ -110,10 +106,9 @@ function RiskSection() {
<li> <li>
<b>Adminnak küldött fájlok kezelése</b>A beküldött fájlokban <b>Adminnak küldött fájlok kezelése</b>A beküldött fájlokban
(adminnnak chat-en küldött, vagy kapcsolat oldalon küldött fájlok) (adminnnak chat-en küldött, vagy kapcsolat oldalon küldött fájlok)
szerepelhet személyes adat, pl.: név. Ha ilyen információval szerepelhet személyes adat, pl.: név. Ezekhez a fájlokhoz és
találkozok, akkor azt ki szoktam törölni. Ezekhez a fájlokhoz és információkhoz csak az admin fér hozzá. Ezek az információk nincsenek
információkhoz csak én férek hozzá, és sehova sincs kiadva. Ezek az sehol gyűjtve.
információk nincsenek sehol gyűjtve.
</li> </li>
<li> <li>
<b> <b>
@ -126,18 +121,17 @@ function RiskSection() {
teszi. teszi.
<p /> <p />
Bizonyíték? A script, weboldal és szerver teljesen nyílt forráskódú,{' '} Bizonyíték? A script, weboldal és szerver teljesen nyílt forráskódú,{' '}
TODO: ADD CONTRIBUTE TAB ezek repository-ja publikus, és akármikor felülvizsgálható. A script a
<Link href="/contribute#gitrepo"> te böngésződben fut, tampermonkey bővítmény menüjében megtekinthető
ezek repository-ja publikus milyen kód fut pontosan, és frissítéseknél megtekinthetőek a
</Link>{' '} változások.
(contribute oldal alja), és akármikor felülvizsgálható. A script a te <p />A projeckt git repókhoz vezető linkek megtalálhatók az
böngésződben fut, tampermonkey bővítmény menüjében megtekinthető oldalsávban
milyen kód fut pontosan.
</li> </li>
<li> <li>
<b>Bármikor észrevehetik hogy használod a scriptet</b> Vannak <b>Bármikor észrevehetik hogy használod a scriptet</b> Vannak
módszerek, hogy a weboldalon érzékeljék hogy fut-e userscript, de ez módszerek, hogy a weboldalon érzékeljék hogy fut-e userscript, de ez
ellen minden ismert módon védekezik a script. <p /> ellen védekezik a script. <p />
A script shadow-root hoz teszi hozzá az összes megjelenített A script shadow-root hoz teszi hozzá az összes megjelenített
elementet, így ezeket lehetetlen detektálni. A moodle semmiféleképpen elementet, így ezeket lehetetlen detektálni. A moodle semmiféleképpen
nem látja, hogy milyen más oldalak vannak megnyitva a böngésződben. nem látja, hogy milyen más oldalak vannak megnyitva a böngésződben.
@ -147,8 +141,8 @@ function RiskSection() {
át, hanem javascript eseménnyel, amit nem tud nyomon követni. át, hanem javascript eseménnyel, amit nem tud nyomon követni.
<p /> <p />
Aztán ki tudja ténylegesen hogy lehet, ezért{' '} Aztán ki tudja ténylegesen hogy lehet, ezért{' '}
<b>csak saját felelősségre használd a scriptet!</b> <i>csak saját felelősségre használd a scriptet!</i>
<p />A kérdésekre a válaszokat <p />A kérdésekre a válaszokat{' '}
<a <a
href={`${constants.siteUrl}dataeditor`} href={`${constants.siteUrl}dataeditor`}
target="_blank" target="_blank"
@ -157,7 +151,8 @@ function RiskSection() {
manuálisan is be lehet küldeni manuálisan is be lehet küldeni
</a> </a>
, és teszt kitöltés közben helyes válaszokat a weboldalon is meg lehet , és teszt kitöltés közben helyes válaszokat a weboldalon is meg lehet
keresni. keresni. Ez viszont azért lehet veszélyes, mert a moodle figyelheti
mikor veszíti el a fókuszt a weboldal.
</li> </li>
<li> <li>
<b>Bármikor leállhat a szerver</b> <b>Bármikor leállhat a szerver</b>
@ -177,8 +172,8 @@ function RiskSection() {
<b>Akármelyik válasz rossz lehet</b> <b>Akármelyik válasz rossz lehet</b>
Pl.: ha a script rosszul menti le, vagy rossz kérdésre ad választ. A Pl.: ha a script rosszul menti le, vagy rossz kérdésre ad választ. A
script minding a moodle szerint helyesnek vélt választ menti le, így script minding a moodle szerint helyesnek vélt választ menti le, így
előfordulhat hogy logikailag nem helyes a válasz, de a tanárok azt ritkán előfordulhat hogy logikailag nem helyes a válasz, de a tanárok
jelölték be helyesnek. azt jelölték be helyesnek.
</li> </li>
</ul> </ul>
</> </>
@ -303,6 +298,14 @@ function ScriptSection() {
áttetszőségét, vagy be tudod zárni jobb felül X-el, vagy egér középső áttetszőségét, vagy be tudod zárni jobb felül X-el, vagy egér középső
gombbal. gombbal.
</li> </li>
<li>
<b>Peer váltás után nem tudok bejelentkezni a scripten keresztül!</b>
Peer (vagy másnéven host) váltás után ha még nem kapcsolódtál a
megadott host-hoz engedélyezned kell a scriptnek hogy csatlakozzon
hozzá. Ez a felugró ablak nem minding azonnal jelenik meg, néha
előfordulhat hogy frissíteni kell az oldalt. Ha ezután sem működik
ellenőrizd hogy elérhető-e a host
</li>
<li> <li>
<b>Script felugró ablakon szereplő adatok és gombok értelmezése</b> <b>Script felugró ablakon szereplő adatok és gombok értelmezése</b>
<img <img
@ -448,13 +451,14 @@ function AddSite() {
function P2PSection() { function P2PSection() {
return ( return (
<> <>
<p>
A szerverben peer to peer (p2p) funkcionalitás is implementálva van, így A szerverben peer to peer (p2p) funkcionalitás is implementálva van, így
ha több szerver fut egyszerre, akkor azok meg tudják osztani egymás ha több szerver fut egyszerre, akkor azok meg tudják osztani egymás között
között a fontosabb adatokat, így az összes szerveren ugyanazok az adatok a fontosabb adatokat, így az összes szerveren ugyanazok az adatok érhetőek
érhetőek el. el.
</p> <p />
Szinkronizált adatok: Ha az egyik szerver kiesne, a script a megadott szerverek közül választ
egy újat.
<p />A következő adatok a szerverek között azonnal szinkronizálva vannak:
<ul> <ul>
<li> <li>
<i>Felhasználók</i>: egy jelszóval az összes oldalra be tudsz lépni <i>Felhasználók</i>: egy jelszóval az összes oldalra be tudsz lépni
@ -470,13 +474,26 @@ function P2PSection() {
<li>Fórum</li> <li>Fórum</li>
<li>Motd (motto of the day)</li> <li>Motd (motto of the day)</li>
</ul> </ul>
A szinkronizált adatok frissessége több mindenen múlik: a szerver adminja <h4>Peerek kezelése scriptnél:</h4>
szinkronizál-e rendesein, illetve a két szerver között működik-e a Ha nincs alapértelmezett peer, akkor ez az ablak fog megjelenni:
felhasználó szinkronizálás (van-e publick key megoszva a kettő között) <br />
<img src="img/scriptimg/script-5.jpg" alt="img" />
<br />
Itt a szerver domain-jét kell megadni a következő példa formátumban:
{" 'qmining.com'"}, {"'https://'"} és {"'/'"}-ek nélkül
<p /> <p />
Egy szerverhez beérkező új kérdések automatikusan tovább vannak küldve a <img src="img/scriptimg/script-1.jpg" alt="img" />
szervernél regisztrált peerekhez, így az új kérdések azonnal elérhetők <br />
mindenhol máshol. Ennél az ablaknál a legördülő menüben ki lehet választani egy másik peert,
vagy újat lehet hozzáadni. Ha olyan peer-hez próbál a script kapcsolódni,
amihez még előtte nem kapcsolódott, akkor engedélyezned kell a felugró
ablakban a tampermonkey-nak, hogy csatlakozhasson a domain-hez.
<br />
<img
style={{ width: '70%' }}
src="img/scriptimg/script-6.jpg"
alt="img"
/>
<p />A szervereknek 1-1 adminja van, akik belelátnak minden szerveren <p />A szervereknek 1-1 adminja van, akik belelátnak minden szerveren
tárolt adatba, a szervereken ők a <i>#1</i> számú felhasználók. Errő tárolt adatba, a szervereken ők a <i>#1</i> számú felhasználók. Errő
többet a <Link href="/faq?tab=risk">kockázatok résznél</Link> tudtok többet a <Link href="/faq?tab=risk">kockázatok résznél</Link> tudtok

View file

@ -149,12 +149,8 @@ export default function P2PInfo({ globalState, setGlobalState }) {
<Header title={'P2P infó'} /> <Header title={'P2P infó'} />
<div style={{ textAlign: 'center' }}> <div style={{ textAlign: 'center' }}>
A weboldal peer to peer (p2p) megoldást implementál, folyamatosan A weboldal peer to peer (p2p) megoldást implementál, folyamatosan
megosztja az új kérdéseket a lent megadott regisztrált szerverekkel, megosztja az új kérdéseket és felhasználókat a lent megadott
és hozzáadja a kapott új kérdéseket a helyi adatbázishoz. regisztrált szerverekkel
<p />
Ha az egyik szerver kiesne, a script a megadott szerverek közül
választ egy újat. A felhasználók is szinkronizálva vannak, így a
jelenlegi jelszavaddal bármelyik másik oldalra be tudsz lépni
<p />A szervert akár te is hostolhatod, érdeklődj a lentebb megadott <p />A szervert akár te is hostolhatod, érdeklődj a lentebb megadott
kontakton kontakton
</div> </div>

View file

@ -109,6 +109,8 @@ export default function PwRequest({ globalData, globalState, setGlobalState }) {
ha ugyan az a felhasználó több helyen is belépve marad. A ha ugyan az a felhasználó több helyen is belépve marad. A
jelszavakról bővebben a <Link href="/faq?tab=pw">GYIK</Link>{' '} jelszavakról bővebben a <Link href="/faq?tab=pw">GYIK</Link>{' '}
vonatkozó részében olvashatsz. vonatkozó részében olvashatsz.
<p />A jelszavak automatikusan és azonnal szinkronizálva vannak
peerek között. Egy jelszó minden peer-hez
</p> </p>
</div> </div>
<div className={styles.text}> <div className={styles.text}>