fix: admin: country flags not visible on Windows
Massimo Melina committed
Dec 27, 2023 at 23:58 UTC
646b2e47930adc74f258c5e32030a3833444df64
261 files changed
+54
-31
README.md
+3
-1
@@ -220,4 +220,6 @@ There are several ways to contribute
220
221
- [License](https://github.com/rejetto/hfs/blob/master/LICENSE.txt)
222
223
-- [To-do list](todo.md)
\ No newline at end of file
223
+- [To-do list](todo.md)
224
+
225
+- Flag images are public-domain, downloaded from https://flagpedia.net
\ No newline at end of file
admin/public/flags/ad.png
Binary files /dev/null and b/admin/public/flags/ad.png differ
admin/public/flags/ae.png
Binary files /dev/null and b/admin/public/flags/ae.png differ
admin/public/flags/af.png
Binary files /dev/null and b/admin/public/flags/af.png differ
admin/public/flags/ag.png
Binary files /dev/null and b/admin/public/flags/ag.png differ
admin/public/flags/ai.png
Binary files /dev/null and b/admin/public/flags/ai.png differ
admin/public/flags/al.png
Binary files /dev/null and b/admin/public/flags/al.png differ
admin/public/flags/am.png
Binary files /dev/null and b/admin/public/flags/am.png differ
admin/public/flags/ao.png
Binary files /dev/null and b/admin/public/flags/ao.png differ
admin/public/flags/aq.png
Binary files /dev/null and b/admin/public/flags/aq.png differ
admin/public/flags/ar.png
Binary files /dev/null and b/admin/public/flags/ar.png differ
admin/public/flags/as.png
Binary files /dev/null and b/admin/public/flags/as.png differ
admin/public/flags/at.png
Binary files /dev/null and b/admin/public/flags/at.png differ
admin/public/flags/au.png
Binary files /dev/null and b/admin/public/flags/au.png differ
admin/public/flags/aw.png
Binary files /dev/null and b/admin/public/flags/aw.png differ
admin/public/flags/ax.png
Binary files /dev/null and b/admin/public/flags/ax.png differ
admin/public/flags/az.png
Binary files /dev/null and b/admin/public/flags/az.png differ
admin/public/flags/ba.png
Binary files /dev/null and b/admin/public/flags/ba.png differ
admin/public/flags/bb.png
Binary files /dev/null and b/admin/public/flags/bb.png differ
admin/public/flags/bd.png
Binary files /dev/null and b/admin/public/flags/bd.png differ
admin/public/flags/be.png
Binary files /dev/null and b/admin/public/flags/be.png differ
admin/public/flags/bf.png
Binary files /dev/null and b/admin/public/flags/bf.png differ
admin/public/flags/bg.png
Binary files /dev/null and b/admin/public/flags/bg.png differ
admin/public/flags/bh.png
Binary files /dev/null and b/admin/public/flags/bh.png differ
admin/public/flags/bi.png
Binary files /dev/null and b/admin/public/flags/bi.png differ
admin/public/flags/bj.png
Binary files /dev/null and b/admin/public/flags/bj.png differ
admin/public/flags/bl.png
Binary files /dev/null and b/admin/public/flags/bl.png differ
admin/public/flags/bm.png
Binary files /dev/null and b/admin/public/flags/bm.png differ
admin/public/flags/bn.png
Binary files /dev/null and b/admin/public/flags/bn.png differ
admin/public/flags/bo.png
Binary files /dev/null and b/admin/public/flags/bo.png differ
admin/public/flags/bq.png
Binary files /dev/null and b/admin/public/flags/bq.png differ
admin/public/flags/br.png
Binary files /dev/null and b/admin/public/flags/br.png differ
admin/public/flags/bs.png
Binary files /dev/null and b/admin/public/flags/bs.png differ
admin/public/flags/bt.png
Binary files /dev/null and b/admin/public/flags/bt.png differ
admin/public/flags/bv.png
Binary files /dev/null and b/admin/public/flags/bv.png differ
admin/public/flags/bw.png
Binary files /dev/null and b/admin/public/flags/bw.png differ
admin/public/flags/by.png
Binary files /dev/null and b/admin/public/flags/by.png differ
admin/public/flags/bz.png
Binary files /dev/null and b/admin/public/flags/bz.png differ
admin/public/flags/ca.png
Binary files /dev/null and b/admin/public/flags/ca.png differ
admin/public/flags/cc.png
Binary files /dev/null and b/admin/public/flags/cc.png differ
admin/public/flags/cd.png
Binary files /dev/null and b/admin/public/flags/cd.png differ
admin/public/flags/cf.png
Binary files /dev/null and b/admin/public/flags/cf.png differ
admin/public/flags/cg.png
Binary files /dev/null and b/admin/public/flags/cg.png differ
admin/public/flags/ch.png
Binary files /dev/null and b/admin/public/flags/ch.png differ
admin/public/flags/ci.png
Binary files /dev/null and b/admin/public/flags/ci.png differ
admin/public/flags/ck.png
Binary files /dev/null and b/admin/public/flags/ck.png differ
admin/public/flags/cl.png
Binary files /dev/null and b/admin/public/flags/cl.png differ
admin/public/flags/cm.png
Binary files /dev/null and b/admin/public/flags/cm.png differ
admin/public/flags/cn.png
Binary files /dev/null and b/admin/public/flags/cn.png differ
admin/public/flags/co.png
Binary files /dev/null and b/admin/public/flags/co.png differ
admin/public/flags/cr.png
Binary files /dev/null and b/admin/public/flags/cr.png differ
admin/public/flags/cu.png
Binary files /dev/null and b/admin/public/flags/cu.png differ
admin/public/flags/cv.png
Binary files /dev/null and b/admin/public/flags/cv.png differ
admin/public/flags/cw.png
Binary files /dev/null and b/admin/public/flags/cw.png differ
admin/public/flags/cx.png
Binary files /dev/null and b/admin/public/flags/cx.png differ
admin/public/flags/cy.png
Binary files /dev/null and b/admin/public/flags/cy.png differ
admin/public/flags/cz.png
Binary files /dev/null and b/admin/public/flags/cz.png differ
admin/public/flags/de.png
Binary files /dev/null and b/admin/public/flags/de.png differ
admin/public/flags/dj.png
Binary files /dev/null and b/admin/public/flags/dj.png differ
admin/public/flags/dk.png
Binary files /dev/null and b/admin/public/flags/dk.png differ
admin/public/flags/dm.png
Binary files /dev/null and b/admin/public/flags/dm.png differ
admin/public/flags/do.png
Binary files /dev/null and b/admin/public/flags/do.png differ
admin/public/flags/dz.png
Binary files /dev/null and b/admin/public/flags/dz.png differ
admin/public/flags/ec.png
Binary files /dev/null and b/admin/public/flags/ec.png differ
admin/public/flags/ee.png
Binary files /dev/null and b/admin/public/flags/ee.png differ
admin/public/flags/eg.png
Binary files /dev/null and b/admin/public/flags/eg.png differ
admin/public/flags/eh.png
Binary files /dev/null and b/admin/public/flags/eh.png differ
admin/public/flags/er.png
Binary files /dev/null and b/admin/public/flags/er.png differ
admin/public/flags/es.png
Binary files /dev/null and b/admin/public/flags/es.png differ
admin/public/flags/et.png
Binary files /dev/null and b/admin/public/flags/et.png differ
admin/public/flags/fi.png
Binary files /dev/null and b/admin/public/flags/fi.png differ
admin/public/flags/fj.png
Binary files /dev/null and b/admin/public/flags/fj.png differ
admin/public/flags/fk.png
Binary files /dev/null and b/admin/public/flags/fk.png differ
admin/public/flags/fm.png
Binary files /dev/null and b/admin/public/flags/fm.png differ
admin/public/flags/fo.png
Binary files /dev/null and b/admin/public/flags/fo.png differ
admin/public/flags/fr.png
Binary files /dev/null and b/admin/public/flags/fr.png differ
admin/public/flags/ga.png
Binary files /dev/null and b/admin/public/flags/ga.png differ
admin/public/flags/gb-eng.png
Binary files /dev/null and b/admin/public/flags/gb-eng.png differ
admin/public/flags/gb-nir.png
Binary files /dev/null and b/admin/public/flags/gb-nir.png differ
admin/public/flags/gb-sct.png
Binary files /dev/null and b/admin/public/flags/gb-sct.png differ
admin/public/flags/gb-wls.png
Binary files /dev/null and b/admin/public/flags/gb-wls.png differ
admin/public/flags/gb.png
Binary files /dev/null and b/admin/public/flags/gb.png differ
admin/public/flags/gd.png
Binary files /dev/null and b/admin/public/flags/gd.png differ
admin/public/flags/ge.png
Binary files /dev/null and b/admin/public/flags/ge.png differ
admin/public/flags/gf.png
Binary files /dev/null and b/admin/public/flags/gf.png differ
admin/public/flags/gg.png
Binary files /dev/null and b/admin/public/flags/gg.png differ
admin/public/flags/gh.png
Binary files /dev/null and b/admin/public/flags/gh.png differ
admin/public/flags/gi.png
Binary files /dev/null and b/admin/public/flags/gi.png differ
admin/public/flags/gl.png
Binary files /dev/null and b/admin/public/flags/gl.png differ
admin/public/flags/gm.png
Binary files /dev/null and b/admin/public/flags/gm.png differ
admin/public/flags/gn.png
Binary files /dev/null and b/admin/public/flags/gn.png differ
admin/public/flags/gp.png
Binary files /dev/null and b/admin/public/flags/gp.png differ
admin/public/flags/gq.png
Binary files /dev/null and b/admin/public/flags/gq.png differ
admin/public/flags/gr.png
Binary files /dev/null and b/admin/public/flags/gr.png differ
admin/public/flags/gs.png
Binary files /dev/null and b/admin/public/flags/gs.png differ
admin/public/flags/gt.png
Binary files /dev/null and b/admin/public/flags/gt.png differ
admin/public/flags/gu.png
Binary files /dev/null and b/admin/public/flags/gu.png differ
admin/public/flags/gw.png
Binary files /dev/null and b/admin/public/flags/gw.png differ
admin/public/flags/gy.png
Binary files /dev/null and b/admin/public/flags/gy.png differ
admin/public/flags/hk.png
Binary files /dev/null and b/admin/public/flags/hk.png differ
admin/public/flags/hm.png
Binary files /dev/null and b/admin/public/flags/hm.png differ
admin/public/flags/hn.png
Binary files /dev/null and b/admin/public/flags/hn.png differ
admin/public/flags/hr.png
Binary files /dev/null and b/admin/public/flags/hr.png differ
admin/public/flags/ht.png
Binary files /dev/null and b/admin/public/flags/ht.png differ
admin/public/flags/hu.png
Binary files /dev/null and b/admin/public/flags/hu.png differ
admin/public/flags/id.png
Binary files /dev/null and b/admin/public/flags/id.png differ
admin/public/flags/ie.png
Binary files /dev/null and b/admin/public/flags/ie.png differ
admin/public/flags/il.png
Binary files /dev/null and b/admin/public/flags/il.png differ
admin/public/flags/im.png
Binary files /dev/null and b/admin/public/flags/im.png differ
admin/public/flags/in.png
Binary files /dev/null and b/admin/public/flags/in.png differ
admin/public/flags/io.png
Binary files /dev/null and b/admin/public/flags/io.png differ
admin/public/flags/iq.png
Binary files /dev/null and b/admin/public/flags/iq.png differ
admin/public/flags/ir.png
Binary files /dev/null and b/admin/public/flags/ir.png differ
admin/public/flags/is.png
Binary files /dev/null and b/admin/public/flags/is.png differ
admin/public/flags/it.png
Binary files /dev/null and b/admin/public/flags/it.png differ
admin/public/flags/je.png
Binary files /dev/null and b/admin/public/flags/je.png differ
admin/public/flags/jm.png
Binary files /dev/null and b/admin/public/flags/jm.png differ
admin/public/flags/jo.png
Binary files /dev/null and b/admin/public/flags/jo.png differ
admin/public/flags/jp.png
Binary files /dev/null and b/admin/public/flags/jp.png differ
admin/public/flags/ke.png
Binary files /dev/null and b/admin/public/flags/ke.png differ
admin/public/flags/kg.png
Binary files /dev/null and b/admin/public/flags/kg.png differ
admin/public/flags/kh.png
Binary files /dev/null and b/admin/public/flags/kh.png differ
admin/public/flags/ki.png
Binary files /dev/null and b/admin/public/flags/ki.png differ
admin/public/flags/km.png
Binary files /dev/null and b/admin/public/flags/km.png differ
admin/public/flags/kn.png
Binary files /dev/null and b/admin/public/flags/kn.png differ
admin/public/flags/kp.png
Binary files /dev/null and b/admin/public/flags/kp.png differ
admin/public/flags/kr.png
Binary files /dev/null and b/admin/public/flags/kr.png differ
admin/public/flags/kw.png
Binary files /dev/null and b/admin/public/flags/kw.png differ
admin/public/flags/ky.png
Binary files /dev/null and b/admin/public/flags/ky.png differ
admin/public/flags/kz.png
Binary files /dev/null and b/admin/public/flags/kz.png differ
admin/public/flags/la.png
Binary files /dev/null and b/admin/public/flags/la.png differ
admin/public/flags/lb.png
Binary files /dev/null and b/admin/public/flags/lb.png differ
admin/public/flags/lc.png
Binary files /dev/null and b/admin/public/flags/lc.png differ
admin/public/flags/li.png
Binary files /dev/null and b/admin/public/flags/li.png differ
admin/public/flags/lk.png
Binary files /dev/null and b/admin/public/flags/lk.png differ
admin/public/flags/lr.png
Binary files /dev/null and b/admin/public/flags/lr.png differ
admin/public/flags/ls.png
Binary files /dev/null and b/admin/public/flags/ls.png differ
admin/public/flags/lt.png
Binary files /dev/null and b/admin/public/flags/lt.png differ
admin/public/flags/lu.png
Binary files /dev/null and b/admin/public/flags/lu.png differ
admin/public/flags/lv.png
Binary files /dev/null and b/admin/public/flags/lv.png differ
admin/public/flags/ly.png
Binary files /dev/null and b/admin/public/flags/ly.png differ
admin/public/flags/ma.png
Binary files /dev/null and b/admin/public/flags/ma.png differ
admin/public/flags/mc.png
Binary files /dev/null and b/admin/public/flags/mc.png differ
admin/public/flags/md.png
Binary files /dev/null and b/admin/public/flags/md.png differ
admin/public/flags/me.png
Binary files /dev/null and b/admin/public/flags/me.png differ
admin/public/flags/mf.png
Binary files /dev/null and b/admin/public/flags/mf.png differ
admin/public/flags/mg.png
Binary files /dev/null and b/admin/public/flags/mg.png differ
admin/public/flags/mh.png
Binary files /dev/null and b/admin/public/flags/mh.png differ
admin/public/flags/mk.png
Binary files /dev/null and b/admin/public/flags/mk.png differ
admin/public/flags/ml.png
Binary files /dev/null and b/admin/public/flags/ml.png differ
admin/public/flags/mm.png
Binary files /dev/null and b/admin/public/flags/mm.png differ
admin/public/flags/mn.png
Binary files /dev/null and b/admin/public/flags/mn.png differ
admin/public/flags/mo.png
Binary files /dev/null and b/admin/public/flags/mo.png differ
admin/public/flags/mp.png
Binary files /dev/null and b/admin/public/flags/mp.png differ
admin/public/flags/mq.png
Binary files /dev/null and b/admin/public/flags/mq.png differ
admin/public/flags/mr.png
Binary files /dev/null and b/admin/public/flags/mr.png differ
admin/public/flags/ms.png
Binary files /dev/null and b/admin/public/flags/ms.png differ
admin/public/flags/mt.png
Binary files /dev/null and b/admin/public/flags/mt.png differ
admin/public/flags/mu.png
Binary files /dev/null and b/admin/public/flags/mu.png differ
admin/public/flags/mv.png
Binary files /dev/null and b/admin/public/flags/mv.png differ
admin/public/flags/mw.png
Binary files /dev/null and b/admin/public/flags/mw.png differ
admin/public/flags/mx.png
Binary files /dev/null and b/admin/public/flags/mx.png differ
admin/public/flags/my.png
Binary files /dev/null and b/admin/public/flags/my.png differ
admin/public/flags/mz.png
Binary files /dev/null and b/admin/public/flags/mz.png differ
admin/public/flags/na.png
Binary files /dev/null and b/admin/public/flags/na.png differ
admin/public/flags/nc.png
Binary files /dev/null and b/admin/public/flags/nc.png differ
admin/public/flags/ne.png
Binary files /dev/null and b/admin/public/flags/ne.png differ
admin/public/flags/nf.png
Binary files /dev/null and b/admin/public/flags/nf.png differ
admin/public/flags/ng.png
Binary files /dev/null and b/admin/public/flags/ng.png differ
admin/public/flags/ni.png
Binary files /dev/null and b/admin/public/flags/ni.png differ
admin/public/flags/nl.png
Binary files /dev/null and b/admin/public/flags/nl.png differ
admin/public/flags/no.png
Binary files /dev/null and b/admin/public/flags/no.png differ
admin/public/flags/np.png
Binary files /dev/null and b/admin/public/flags/np.png differ
admin/public/flags/nr.png
Binary files /dev/null and b/admin/public/flags/nr.png differ
admin/public/flags/nu.png
Binary files /dev/null and b/admin/public/flags/nu.png differ
admin/public/flags/nz.png
Binary files /dev/null and b/admin/public/flags/nz.png differ
admin/public/flags/om.png
Binary files /dev/null and b/admin/public/flags/om.png differ
admin/public/flags/pa.png
Binary files /dev/null and b/admin/public/flags/pa.png differ
admin/public/flags/pe.png
Binary files /dev/null and b/admin/public/flags/pe.png differ
admin/public/flags/pf.png
Binary files /dev/null and b/admin/public/flags/pf.png differ
admin/public/flags/pg.png
Binary files /dev/null and b/admin/public/flags/pg.png differ
admin/public/flags/ph.png
Binary files /dev/null and b/admin/public/flags/ph.png differ
admin/public/flags/pk.png
Binary files /dev/null and b/admin/public/flags/pk.png differ
admin/public/flags/pl.png
Binary files /dev/null and b/admin/public/flags/pl.png differ
admin/public/flags/pm.png
Binary files /dev/null and b/admin/public/flags/pm.png differ
admin/public/flags/pn.png
Binary files /dev/null and b/admin/public/flags/pn.png differ
admin/public/flags/pr.png
Binary files /dev/null and b/admin/public/flags/pr.png differ
admin/public/flags/ps.png
Binary files /dev/null and b/admin/public/flags/ps.png differ
admin/public/flags/pt.png
Binary files /dev/null and b/admin/public/flags/pt.png differ
admin/public/flags/pw.png
Binary files /dev/null and b/admin/public/flags/pw.png differ
admin/public/flags/py.png
Binary files /dev/null and b/admin/public/flags/py.png differ
admin/public/flags/qa.png
Binary files /dev/null and b/admin/public/flags/qa.png differ
admin/public/flags/re.png
Binary files /dev/null and b/admin/public/flags/re.png differ
admin/public/flags/ro.png
Binary files /dev/null and b/admin/public/flags/ro.png differ
admin/public/flags/rs.png
Binary files /dev/null and b/admin/public/flags/rs.png differ
admin/public/flags/ru.png
Binary files /dev/null and b/admin/public/flags/ru.png differ
admin/public/flags/rw.png
Binary files /dev/null and b/admin/public/flags/rw.png differ
admin/public/flags/sa.png
Binary files /dev/null and b/admin/public/flags/sa.png differ
admin/public/flags/sb.png
Binary files /dev/null and b/admin/public/flags/sb.png differ
admin/public/flags/sc.png
Binary files /dev/null and b/admin/public/flags/sc.png differ
admin/public/flags/sd.png
Binary files /dev/null and b/admin/public/flags/sd.png differ
admin/public/flags/se.png
Binary files /dev/null and b/admin/public/flags/se.png differ
admin/public/flags/sg.png
Binary files /dev/null and b/admin/public/flags/sg.png differ
admin/public/flags/sh.png
Binary files /dev/null and b/admin/public/flags/sh.png differ
admin/public/flags/si.png
Binary files /dev/null and b/admin/public/flags/si.png differ
admin/public/flags/sj.png
Binary files /dev/null and b/admin/public/flags/sj.png differ
admin/public/flags/sk.png
Binary files /dev/null and b/admin/public/flags/sk.png differ
admin/public/flags/sl.png
Binary files /dev/null and b/admin/public/flags/sl.png differ
admin/public/flags/sm.png
Binary files /dev/null and b/admin/public/flags/sm.png differ
admin/public/flags/sn.png
Binary files /dev/null and b/admin/public/flags/sn.png differ
admin/public/flags/so.png
Binary files /dev/null and b/admin/public/flags/so.png differ
admin/public/flags/sr.png
Binary files /dev/null and b/admin/public/flags/sr.png differ
admin/public/flags/ss.png
Binary files /dev/null and b/admin/public/flags/ss.png differ
admin/public/flags/st.png
Binary files /dev/null and b/admin/public/flags/st.png differ
admin/public/flags/sv.png
Binary files /dev/null and b/admin/public/flags/sv.png differ
admin/public/flags/sx.png
Binary files /dev/null and b/admin/public/flags/sx.png differ
admin/public/flags/sy.png
Binary files /dev/null and b/admin/public/flags/sy.png differ
admin/public/flags/sz.png
Binary files /dev/null and b/admin/public/flags/sz.png differ
admin/public/flags/tc.png
Binary files /dev/null and b/admin/public/flags/tc.png differ
admin/public/flags/td.png
Binary files /dev/null and b/admin/public/flags/td.png differ
admin/public/flags/tf.png
Binary files /dev/null and b/admin/public/flags/tf.png differ
admin/public/flags/tg.png
Binary files /dev/null and b/admin/public/flags/tg.png differ
admin/public/flags/th.png
Binary files /dev/null and b/admin/public/flags/th.png differ
admin/public/flags/tj.png
Binary files /dev/null and b/admin/public/flags/tj.png differ
admin/public/flags/tk.png
Binary files /dev/null and b/admin/public/flags/tk.png differ
admin/public/flags/tl.png
Binary files /dev/null and b/admin/public/flags/tl.png differ
admin/public/flags/tm.png
Binary files /dev/null and b/admin/public/flags/tm.png differ
admin/public/flags/tn.png
Binary files /dev/null and b/admin/public/flags/tn.png differ
admin/public/flags/to.png
Binary files /dev/null and b/admin/public/flags/to.png differ
admin/public/flags/tr.png
Binary files /dev/null and b/admin/public/flags/tr.png differ
admin/public/flags/tt.png
Binary files /dev/null and b/admin/public/flags/tt.png differ
admin/public/flags/tv.png
Binary files /dev/null and b/admin/public/flags/tv.png differ
admin/public/flags/tw.png
Binary files /dev/null and b/admin/public/flags/tw.png differ
admin/public/flags/tz.png
Binary files /dev/null and b/admin/public/flags/tz.png differ
admin/public/flags/ua.png
Binary files /dev/null and b/admin/public/flags/ua.png differ
admin/public/flags/ug.png
Binary files /dev/null and b/admin/public/flags/ug.png differ
admin/public/flags/um.png
Binary files /dev/null and b/admin/public/flags/um.png differ
admin/public/flags/us.png
Binary files /dev/null and b/admin/public/flags/us.png differ
admin/public/flags/uy.png
Binary files /dev/null and b/admin/public/flags/uy.png differ
admin/public/flags/uz.png
Binary files /dev/null and b/admin/public/flags/uz.png differ
admin/public/flags/va.png
Binary files /dev/null and b/admin/public/flags/va.png differ
admin/public/flags/vc.png
Binary files /dev/null and b/admin/public/flags/vc.png differ
admin/public/flags/ve.png
Binary files /dev/null and b/admin/public/flags/ve.png differ
admin/public/flags/vg.png
Binary files /dev/null and b/admin/public/flags/vg.png differ
admin/public/flags/vi.png
Binary files /dev/null and b/admin/public/flags/vi.png differ
admin/public/flags/vn.png
Binary files /dev/null and b/admin/public/flags/vn.png differ
admin/public/flags/vu.png
Binary files /dev/null and b/admin/public/flags/vu.png differ
admin/public/flags/wf.png
Binary files /dev/null and b/admin/public/flags/wf.png differ
admin/public/flags/ws.png
Binary files /dev/null and b/admin/public/flags/ws.png differ
admin/public/flags/xk.png
Binary files /dev/null and b/admin/public/flags/xk.png differ
admin/public/flags/ye.png
Binary files /dev/null and b/admin/public/flags/ye.png differ
admin/public/flags/yt.png
Binary files /dev/null and b/admin/public/flags/yt.png differ
admin/public/flags/za.png
Binary files /dev/null and b/admin/public/flags/za.png differ
admin/public/flags/zm.png
Binary files /dev/null and b/admin/public/flags/zm.png differ
admin/public/flags/zw.png
Binary files /dev/null and b/admin/public/flags/zw.png differ
admin/src/InternetPage.ts
+3
-2
@@ -5,7 +5,7 @@ import { CardMembership, HomeWorkTwoTone, Lock, Public, PublicTwoTone, RouterTwo
5
import { apiCall, useApiEx } from './api'
6
import { closeDialog, DAY, formatTimestamp, wait, wantArray, with_, PORT_DISABLED, isIP, CFG,
7
useRequestRender } from './misc'
8
-import { Flex, LinkBtn, Btn } from './mui'
8
+import { Flex, LinkBtn, Btn, Country } from './mui'
9
import { alertDialog, confirmDialog, promptDialog, toast, waitDialog } from './dialog'
10
import { BoolField, Form, MultiSelectField, NumberField, SelectField } from '@hfs/mui-grid-form'
11
import md from './md'
@@ -53,7 +53,7 @@ export default function InternetPage() {
53
function geoBox() {
54
const countryOptions = useMemo(() => _.sortBy(COUNTRIES, 'name').map(x => ({
55
value: x.code,
56
- label: `${x.flag} ${x.name}`
56
+ label: x.name,
57
})), [COUNTRIES])
58
return h(TitleCard, { title: "Geo IP", icon: Public },
59
h(ConfigForm<{
@@ -78,6 +78,7 @@ export default function InternetPage() {
78
label: `Selected countries (${values[CFG.geo_list]?.length || 0})`,
79
placeholder: "none",
80
options: countryOptions,
81
+ renderOption: (v: any) => h(Country, { code: v.value, long: true }),
82
clearable: true,
83
},
84
values[CFG.geo_allow] != null && {
admin/src/LogsPage.ts
+1
-2
@@ -6,12 +6,11 @@ import { API_URL, useApiList } from './api'
6
import { DataTable } from './DataTable'
7
import { Dict, formatBytes, HTTP_UNAUTHORIZED, NBSP, prefix, shortenAgent, splitAt, tryJson, typedKeys } from '@hfs/shared'
8
import { logLabels } from './OptionsPage'
9
-import { Flex, useBreakpoint, usePauseButton, useToggleButton } from './mui';
9
+import { Flex, useBreakpoint, usePauseButton, useToggleButton, Country } from './mui';
10
import { GridColDef } from '@mui/x-data-grid'
11
import _ from 'lodash'
12
import { SmartToy } from '@mui/icons-material'
13
import md from './md'
14
-import { Country } from './MonitorPage'
14
15
export default function LogsPage() {
16
const [tab, setTab] = useState(0)
admin/src/MonitorPage.ts
+3
-17
@@ -1,17 +1,16 @@
1
// This file is part of HFS - Copyright 2021-2023, Massimo Melina <a@rejetto.com> - License https://www.gnu.org/licenses/gpl-3.0.txt
2
3
import _ from "lodash"
4
-import { createElement as h, useMemo, Fragment, useState, ReactNode } from "react"
4
+import { createElement as h, useMemo, Fragment, useState } from "react"
5
import { apiCall, useApiEvents, useApiEx, useApiList } from "./api"
6
import { LinkOff, Lock, Block, FolderZip, Upload, Download } from '@mui/icons-material'
7
import { Box, Chip, ChipProps, Tooltip } from '@mui/material'
8
import { DataTable } from './DataTable'
9
-import { formatBytes, ipForUrl, manipulateConfig, useBatch, CFG, formatSpeed } from "./misc"
10
-import { IconBtn, IconProgress, iconTooltip, usePauseButton, useBreakpoint } from './mui'
9
+import { formatBytes, ipForUrl, manipulateConfig, CFG, formatSpeed } from "./misc"
10
+import { IconBtn, IconProgress, iconTooltip, usePauseButton, useBreakpoint, Country } from './mui'
11
import { Field, SelectField } from '@hfs/mui-grid-form'
12
import { StandardCSSProperties } from '@mui/system/styleFunctionSx/StandardCssProperties'
13
import { toast } from "./dialog"
14
-import { ALL as COUNTRIES } from './countries'
14
import { agentIcons } from './LogsPage'
15
16
export default function MonitorPage() {
@@ -83,19 +82,6 @@ function MoreInfo() {
82
83
}
84
86
-export function Country({ code, ip, def }: { code: string, ip?: string, def?: ReactNode }) {
87
- const { data } = useBatch(code === undefined && ip && ip2countryBatch, ip, { delay: 100 }) // query if necessary
88
- code ||= data || ''
89
- const country = code && _.find(COUNTRIES, { code })
90
- return country ? h(Tooltip, { title: country.name, children: h('span', {}, country.flag, ' ', code ) })
91
- : h(Fragment, {}, def)
92
-}
93
-
94
-async function ip2countryBatch(ips: string[]) {
95
- const res = await apiCall('ip_country', { ips })
96
- return res.codes as string[]
97
-}
98
-
85
function Connections() {
86
const { list, error, props } = useApiList('get_connections')
87
const config = useApiEx('get_config', { only: [CFG.geo_enable] })
admin/src/index.css
+9
@@ -17,6 +17,15 @@ code {
17
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
18
monospace;
19
}
20
+img.flag {
21
+ width: 1.5em;
22
+ height: 1em;
23
+ vertical-align: text-top;
24
+ margin-top: 1px;
25
+}
26
+.icon-w-text {
27
+ margin-right: .5em;
28
+}
29
30
.MuiSvgIcon-root {
31
vertical-align: bottom;
admin/src/mui.ts
+24
-3
@@ -6,12 +6,15 @@ import { SxProps } from '@mui/system'
6
import { createElement as h, FC, forwardRef, Fragment, ReactNode, useCallback, useState } from 'react'
7
import { Box, BoxProps, Breakpoint, ButtonProps, CircularProgress, IconButton, IconButtonProps, Link, LinkProps,
8
Tooltip, TooltipProps, useMediaQuery } from '@mui/material'
9
-import { formatPerc, WIKI_URL } from '../../src/cross'
10
-import { dontBotherWithKeys, useStateMounted } from '@hfs/shared'
9
+import { formatPerc, prefix, WIKI_URL } from '../../src/cross'
10
+import { dontBotherWithKeys, useBatch, useStateMounted } from '@hfs/shared'
11
import { Promisable } from '@hfs/mui-grid-form'
12
import { alertDialog, confirmDialog, toast } from './dialog'
13
import { LoadingButton, LoadingButtonProps } from '@mui/lab'
14
import { Link as RouterLink } from 'react-router-dom'
15
+import _ from 'lodash'
16
+import { ALL as COUNTRIES } from './countries'
17
+import { apiCall } from '@hfs/shared/api'
18
19
export function spinner() {
20
return h(CircularProgress)
@@ -220,4 +223,22 @@ export function useToggleButton(iconBtn: (state:boolean) => Omit<IconBtnProps, '
223
onClick: toggle,
224
})
225
return [state, el] as const
223
-}
\ No newline at end of file
226
+}
227
+
228
+export function Country({ code, ip, def, long, short }: { code: string, ip?: string, def?: ReactNode, long?: boolean, short?: boolean }) {
229
+ const { data } = useBatch(code === undefined && ip && ip2countryBatch, ip, { delay: 100 }) // query if necessary
230
+ code ||= data || ''
231
+ const country = code && _.find(COUNTRIES, { code })
232
+ return !country ? h(Fragment, {}, def) : h(Tooltip, {
233
+ title: long ? undefined : country.name,
234
+ children: h('span', {},
235
+ h('img', { className: 'flag icon-w-text', src: `flags/${code.toLowerCase()}.png`, alt: country.name }),
236
+ long ? country.name + prefix(' (', short && code, ')') : code
237
+ )
238
+ })
239
+}
240
+
241
+async function ip2countryBatch(ips: string[]) {
242
+ const res = await apiCall('ip_country', { ips })
243
+ return res.codes as string[]
244
+}
mui-grid-form/SelectField.ts
+11
-6
@@ -2,14 +2,16 @@
2
3
import { createElement as h, Fragment, ReactNode, useMemo } from 'react'
4
import { FieldProps } from '.'
5
-import { Autocomplete, FormControl, FormControlLabel, FormLabel, IconButton, InputAdornment, MenuItem, Radio,
6
- RadioGroup, StandardTextFieldProps, TextField, Tooltip } from '@mui/material'
5
+import {
6
+ Autocomplete, Chip, FormControl, FormControlLabel, FormLabel, IconButton, InputAdornment, MenuItem, Radio,
7
+ RadioGroup, StandardTextFieldProps, TextField, Tooltip
8
+} from '@mui/material'
9
import { SxProps } from '@mui/system'
10
import { Clear } from '@mui/icons-material'
11
10
-type SelectOptions<T> = { [label:string]:T } | SelectOption<T>[]
12
+type SelectOptions<T> = { [label:string]: T } | SelectOption<T>[]
13
type SelectOption<T> = SelectPair<T> | (T extends string | number ? T : never)
12
-interface SelectPair<T> { label: string, value:T }
14
+interface SelectPair<T> { label: string, value: T }
15
16
export function SelectField<T>(props: FieldProps<T> & CommonSelectProps<T>) {
17
const { value, onChange, setApi, options, sx, ...rest } = props
@@ -27,7 +29,7 @@ export function SelectField<T>(props: FieldProps<T> & CommonSelectProps<T>) {
29
})
30
}
31
30
-export function MultiSelectField<T>(props: FieldProps<T[]> & CommonSelectProps<T>) {
32
+export function MultiSelectField<T>({ renderOption, ...props }: FieldProps<T[]> & CommonSelectProps<T> & { renderOption?: (option: SelectPair<T>) => ReactNode }) {
33
const { value, onChange, setApi, options, sx, clearable, clearValue, placeholder, autocompleteProps, ...rest } = props
34
const { select, InputProps, ...common } = commonSelectProps({ clearValue: [], ...props, clearable: false })
35
const normalizedOptions = useMemo(() => normalizeOptions(options), [options])
@@ -41,7 +43,7 @@ export function MultiSelectField<T>(props: FieldProps<T[]> & CommonSelectProps<T
43
onChange: (event, sel) => onChange(sel.map(x => x.value) as T[], { was: value, event }),
44
isOptionEqualToValue: (option, val) => option.value === val.value,
45
getOptionLabel: x => x.label,
44
- renderOption: (props, x) => h('span', props, x.label),
46
+ renderOption: (props, x) => h('span', props, renderOption?.(x) ?? x.label),
47
...common,
48
...autocompleteProps,
49
value: valueAsOptions,
@@ -52,6 +54,9 @@ export function MultiSelectField<T>(props: FieldProps<T[]> & CommonSelectProps<T
54
sx: { ...rest.sx, '& div[role=button]': { whiteSpace: 'unset' } },
55
...params,
56
}),
57
+ renderTags: (tagValue, getTagProps) =>
58
+ tagValue.map((option, index) =>
59
+ h(Chip, { label: renderOption?.(option) ?? option.label, ...getTagProps({ index }) })),
60
sx: {
61
'.MuiAutocomplete-tag': { height: 24 }, // too tall, otherwise
62
'.MuiAutocomplete-inputRoot': { pt: '21px' }, // some extra margin from label