diff --git a/Server/app/resources/basic/BasicController.jl b/Server/app/resources/basic/BasicController.jl
index 308d47f..8b42e34 100644
--- a/Server/app/resources/basic/BasicController.jl
+++ b/Server/app/resources/basic/BasicController.jl
@@ -10,12 +10,6 @@ dict_layouts = Dict(
:landing => generate_layout_html("main",controller,"landing",css=["landing"],libraries=["Leaflet"]),
:manifesto => generate_layout_html("main",controller,"manifesto"),
:join_us => generate_layout_html("main",controller,"join_us",libraries=["Leaflet"]),
- :groups => generate_layout_html("main",controller,"groups",libraries=["Leaflet"]),
- :groups_add => generate_layout_html("main",controller,"groups_add",libraries=["Leaflet"]),
- :cooperatives => generate_layout_html("main",controller,"cooperatives",libraries=["Leaflet"]),
- :communes => generate_layout_html("main",controller,"communes",libraries=["Leaflet"]),
- :parties => generate_layout_html("main",controller,"parties",libraries=["Leaflet"]),
- :partners => generate_layout_html("main",controller,"partners",libraries=["Leaflet"]),
:compass => generate_layout_html("main",controller,"compass"),
)
@@ -54,61 +48,6 @@ const join_us_info = Dict(
),
)
-const groups_info = Dict(
- "en" => Dict(
- :title => "LibSoc - Groups",
- :description => ""
- ),
- "ru" => Dict(
- :title => "LibSoc - Группы",
- :description => ""
- )
-)
-
-const cooperatives_info = Dict(
- "en" => Dict(
- :title => "LibSoc - Cooperatives",
- :description => ""
- ),
- "ru" => Dict(
- :title => "LibSoc - Кооперативы",
- :description => ""
- )
-)
-
-const communes_info = Dict(
- "en" => Dict(
- :title => "LibSoc - Communes",
- :description => ""
- ),
- "ru" => Dict(
- :title => "LibSoc - Коммуны",
- :description => ""
- )
-)
-
-const partners_info = Dict(
- "en" => Dict(
- :title => "LibSoc - Partners",
- :description => ""
- ),
- "ru" => Dict(
- :title => "LibSoc - Партнеры",
- :description => ""
- )
-)
-
-const parties_info = Dict(
- "en" => Dict(
- :title => "LibSoc - Parties",
- :description => ""
- ),
- "ru" => Dict(
- :title => "LibSoc - Партии",
- :description => ""
- )
-)
-
const compass_info = Dict(
"en" => Dict(
:title => "LibSoc - Political Compass",
@@ -147,62 +86,6 @@ function manifesto()
)
end
-function join_us()
- locale = get_locale()
- html(:basic,:join_us, layout = dict_layouts[:join_us], context = @__MODULE__,
- title = join_us_info[locale][:title],
- description = join_us_info[locale][:description]
- )
-end
-
-function groups()
- locale = get_locale()
- html(:basic,:groups, layout = dict_layouts[:groups], context = @__MODULE__,
- title = groups_info[locale][:title],
- description = groups_info[locale][:description]
- )
-end
-
-function groups_add()
- locale = get_locale()
- html(:basic,:groups_add, layout = dict_layouts[:groups_add], context = @__MODULE__,
- title = groups_info[locale][:title],
- description = groups_info[locale][:description]
- )
-end
-
-function cooperatives()
- locale = get_locale()
- html(:basic,:cooperatives, layout = dict_layouts[:cooperatives], context = @__MODULE__,
- title = cooperatives_info[locale][:title],
- description = cooperatives_info[locale][:description]
- )
-end
-
-function communes()
- locale = get_locale()
- html(:basic,:communes, layout = dict_layouts[:communes], context = @__MODULE__,
- title = communes_info[locale][:title],
- description = communes_info[locale][:description]
- )
-end
-
-function partners()
- locale = get_locale()
- html(:basic,:partners, layout = dict_layouts[:partners], context = @__MODULE__,
- title = partners_info[locale][:title],
- description = partners_info[locale][:description]
- )
-end
-
-function parties()
- locale = get_locale()
- html(:basic,:parties, layout = dict_layouts[:parties], context = @__MODULE__,
- title = parties_info[locale][:title],
- description = parties_info[locale][:description]
- )
-end
-
function political_compass()
locale = get_locale()
html(:basic,:compass, layout = dict_layouts[:compass], context = @__MODULE__,
@@ -211,9 +94,12 @@ function political_compass()
)
end
-function groups_add_post()
- data = jsonpayload()
- insert_into_table("groups_requests",data)
+function join_us()
+ locale = get_locale()
+ html(:basic,:join_us, layout = dict_layouts[:join_us], context = @__MODULE__,
+ title = join_us_info[locale][:title],
+ description = join_us_info[locale][:description]
+ )
end
end
diff --git a/Server/app/resources/communes/CommunesController.jl b/Server/app/resources/communes/CommunesController.jl
new file mode 100644
index 0000000..613ffc6
--- /dev/null
+++ b/Server/app/resources/communes/CommunesController.jl
@@ -0,0 +1,59 @@
+module CommunesController
+
+using Genie, Genie.Renderer, Genie.Renderer.Html, Genie.Requests
+using JSON3
+using SearchLight
+using Server.DatabaseSupport, Server.TemplateEditor
+
+controller = "communes"
+dict_layouts = Dict(
+ :communes => generate_layout_html("main",controller,"communes",libraries=["Leaflet"]),
+ :communes_add => generate_layout_html("main",controller,"communes_add",libraries=["Leaflet"]),
+)
+
+#---Page info-----------------------------------------------------
+
+const communes_info = Dict(
+ "en" => Dict(
+ :title => "LibSoc - Communes",
+ :description => ""
+ ),
+ "ru" => Dict(
+ :title => "LibSoc - Коммуны",
+ :description => ""
+ )
+)
+
+function get_locale()
+ data = payload()
+ if :locale in keys(data)
+ return data[:locale]
+ else
+ return "en"
+ end
+end
+
+#---Functions---------------------------------------------------------
+
+function communes()
+ locale = get_locale()
+ html(:communes,:communes, layout = dict_layouts[:communes], context = @__MODULE__,
+ title = communes_info[locale][:title],
+ description = communes_info[locale][:description]
+ )
+end
+
+function communes_add()
+ locale = get_locale()
+ html(:communes,:communes_add, layout = dict_layouts[:communes_add], context = @__MODULE__,
+ title = communes_info[locale][:title],
+ description = communes_info[locale][:description]
+ )
+end
+
+function communes_add_post()
+ data = jsonpayload()
+ insert_into_table("communes_requests",data)
+end
+
+end
diff --git a/Server/app/resources/basic/views/communes.jl.html b/Server/app/resources/communes/views/communes.jl.html
similarity index 100%
rename from Server/app/resources/basic/views/communes.jl.html
rename to Server/app/resources/communes/views/communes.jl.html
diff --git a/Server/app/resources/communes/views/communes_add.jl.html b/Server/app/resources/communes/views/communes_add.jl.html
new file mode 100644
index 0000000..0b597ef
--- /dev/null
+++ b/Server/app/resources/communes/views/communes_add.jl.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Server/app/resources/cooperatives/CooperativesController.jl b/Server/app/resources/cooperatives/CooperativesController.jl
new file mode 100644
index 0000000..8c08482
--- /dev/null
+++ b/Server/app/resources/cooperatives/CooperativesController.jl
@@ -0,0 +1,60 @@
+module CooperativesController
+
+using Genie, Genie.Renderer, Genie.Renderer.Html, Genie.Requests
+using JSON3
+using SearchLight
+using Server.DatabaseSupport, Server.TemplateEditor
+
+controller = "cooperatives"
+dict_layouts = Dict(
+ :cooperatives => generate_layout_html("main",controller,"cooperatives",libraries=["Leaflet"]),
+ :cooperatives_add => generate_layout_html("main",controller,"cooperatives_add",libraries=["Leaflet"]),
+)
+
+#---Page info-----------------------------------------------------
+
+const cooperatives_info = Dict(
+ "en" => Dict(
+ :title => "LibSoc - Cooperatives",
+ :description => ""
+ ),
+ "ru" => Dict(
+ :title => "LibSoc - Кооперативы",
+ :description => ""
+ )
+)
+
+function get_locale()
+ data = payload()
+ if :locale in keys(data)
+ return data[:locale]
+ else
+ return "en"
+ end
+end
+
+#---Functions---------------------------------------------------------
+
+
+function cooperatives_add()
+ locale = get_locale()
+ html(:cooperatives,:cooperatives_add, layout = dict_layouts[:cooperatives_add], context = @__MODULE__,
+ title = cooperatives_info[locale][:title],
+ description = cooperatives_info[locale][:description]
+ )
+end
+
+function cooperatives()
+ locale = get_locale()
+ html(:cooperatives,:cooperatives, layout = dict_layouts[:cooperatives], context = @__MODULE__,
+ title = cooperatives_info[locale][:title],
+ description = cooperatives_info[locale][:description]
+ )
+end
+
+function cooperatives_add_post()
+ data = jsonpayload()
+ insert_into_table("cooperatives_requests",data)
+end
+
+end
diff --git a/Server/app/resources/basic/views/cooperatives.jl.html b/Server/app/resources/cooperatives/views/cooperatives.jl.html
similarity index 100%
rename from Server/app/resources/basic/views/cooperatives.jl.html
rename to Server/app/resources/cooperatives/views/cooperatives.jl.html
diff --git a/Server/app/resources/cooperatives/views/cooperatives_add.jl.html b/Server/app/resources/cooperatives/views/cooperatives_add.jl.html
new file mode 100644
index 0000000..713e1bb
--- /dev/null
+++ b/Server/app/resources/cooperatives/views/cooperatives_add.jl.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Server/app/resources/groups/GroupsController.jl b/Server/app/resources/groups/GroupsController.jl
new file mode 100644
index 0000000..c924959
--- /dev/null
+++ b/Server/app/resources/groups/GroupsController.jl
@@ -0,0 +1,59 @@
+module GroupsController
+
+using Genie, Genie.Renderer, Genie.Renderer.Html, Genie.Requests
+using JSON3
+using SearchLight
+using Server.DatabaseSupport, Server.TemplateEditor
+
+controller = "groups"
+dict_layouts = Dict(
+ :groups => generate_layout_html("main",controller,"groups",libraries=["Leaflet"]),
+ :groups_add => generate_layout_html("main",controller,"groups_add",libraries=["Leaflet"]),
+)
+
+#---Page info-----------------------------------------------------
+
+const groups_info = Dict(
+ "en" => Dict(
+ :title => "LibSoc - Groups",
+ :description => ""
+ ),
+ "ru" => Dict(
+ :title => "LibSoc - Группы",
+ :description => ""
+ )
+)
+
+function get_locale()
+ data = payload()
+ if :locale in keys(data)
+ return data[:locale]
+ else
+ return "en"
+ end
+end
+
+#---Functions---------------------------------------------------------
+
+function groups()
+ locale = get_locale()
+ html(:groups,:groups, layout = dict_layouts[:groups], context = @__MODULE__,
+ title = groups_info[locale][:title],
+ description = groups_info[locale][:description]
+ )
+end
+
+function groups_add()
+ locale = get_locale()
+ html(:groups,:groups_add, layout = dict_layouts[:groups_add], context = @__MODULE__,
+ title = groups_info[locale][:title],
+ description = groups_info[locale][:description]
+ )
+end
+
+function groups_add_post()
+ data = jsonpayload()
+ insert_into_table("groups_requests",data)
+end
+
+end
diff --git a/Server/app/resources/basic/views/groups.jl.html b/Server/app/resources/groups/views/groups.jl.html
similarity index 100%
rename from Server/app/resources/basic/views/groups.jl.html
rename to Server/app/resources/groups/views/groups.jl.html
diff --git a/Server/app/resources/basic/views/groups_add.jl.html b/Server/app/resources/groups/views/groups_add.jl.html
similarity index 100%
rename from Server/app/resources/basic/views/groups_add.jl.html
rename to Server/app/resources/groups/views/groups_add.jl.html
diff --git a/Server/app/resources/parties/PartiesController.jl b/Server/app/resources/parties/PartiesController.jl
new file mode 100644
index 0000000..15a0099
--- /dev/null
+++ b/Server/app/resources/parties/PartiesController.jl
@@ -0,0 +1,60 @@
+module PartiesController
+
+using Genie, Genie.Renderer, Genie.Renderer.Html, Genie.Requests
+using JSON3
+using SearchLight
+using Server.DatabaseSupport, Server.TemplateEditor
+
+controller = "parties"
+dict_layouts = Dict(
+ :parties_add => generate_layout_html("main",controller,"parties_add",libraries=["Leaflet"]),
+ :parties => generate_layout_html("main",controller,"parties",libraries=["Leaflet"]),
+)
+
+#---Page info-----------------------------------------------------
+
+const parties_info = Dict(
+ "en" => Dict(
+ :title => "LibSoc - Parties",
+ :description => ""
+ ),
+ "ru" => Dict(
+ :title => "LibSoc - Партии",
+ :description => ""
+ )
+)
+
+function get_locale()
+ data = payload()
+ if :locale in keys(data)
+ return data[:locale]
+ else
+ return "en"
+ end
+end
+
+#---Functions---------------------------------------------------------
+
+
+function parties()
+ locale = get_locale()
+ html(:parties,:parties, layout = dict_layouts[:parties], context = @__MODULE__,
+ title = parties_info[locale][:title],
+ description = parties_info[locale][:description]
+ )
+end
+
+function parties_add()
+ locale = get_locale()
+ html(:parties,:parties_add, layout = dict_layouts[:parties_add], context = @__MODULE__,
+ title = parties_info[locale][:title],
+ description = parties_info[locale][:description]
+ )
+end
+
+function parties_add_post()
+ data = jsonpayload()
+ insert_into_table("parties_requests",data)
+end
+
+end
diff --git a/Server/app/resources/basic/views/parties.jl.html b/Server/app/resources/parties/views/parties.jl.html
similarity index 100%
rename from Server/app/resources/basic/views/parties.jl.html
rename to Server/app/resources/parties/views/parties.jl.html
diff --git a/Server/app/resources/parties/views/parties_add.jl.html b/Server/app/resources/parties/views/parties_add.jl.html
new file mode 100644
index 0000000..9b859ff
--- /dev/null
+++ b/Server/app/resources/parties/views/parties_add.jl.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Server/app/resources/partners/PartnersController.jl b/Server/app/resources/partners/PartnersController.jl
new file mode 100644
index 0000000..a553c62
--- /dev/null
+++ b/Server/app/resources/partners/PartnersController.jl
@@ -0,0 +1,59 @@
+module PartnersController
+
+using Genie, Genie.Renderer, Genie.Renderer.Html, Genie.Requests
+using JSON3
+using SearchLight
+using Server.DatabaseSupport, Server.TemplateEditor
+
+controller = "partners"
+dict_layouts = Dict(
+ :partners => generate_layout_html("main",controller,"partners",libraries=["Leaflet"]),
+ :partners_add => generate_layout_html("main",controller,"partners_add",libraries=["Leaflet"]),
+)
+
+#---Page info-----------------------------------------------------
+
+const partners_info = Dict(
+ "en" => Dict(
+ :title => "LibSoc - Partners",
+ :description => ""
+ ),
+ "ru" => Dict(
+ :title => "LibSoc - Партнеры",
+ :description => ""
+ )
+)
+
+
+function get_locale()
+ data = payload()
+ if :locale in keys(data)
+ return data[:locale]
+ else
+ return "en"
+ end
+end
+
+#---Functions---------------------------------------------------------
+
+function partners()
+ locale = get_locale()
+ html(:partners,:partners, layout = dict_layouts[:partners], context = @__MODULE__,
+ title = partners_info[locale][:title],
+ description = partners_info[locale][:description]
+ )
+end
+function partners_add()
+ locale = get_locale()
+ html(:partners,:partners_add, layout = dict_layouts[:partners_add], context = @__MODULE__,
+ title = partners_info[locale][:title],
+ description = partners_info[locale][:description]
+ )
+end
+
+function partners_add_post()
+ data = jsonpayload()
+ insert_into_table("partners_requests",data)
+end
+
+end
diff --git a/Server/app/resources/basic/views/partners.jl.html b/Server/app/resources/partners/views/partners.jl.html
similarity index 100%
rename from Server/app/resources/basic/views/partners.jl.html
rename to Server/app/resources/partners/views/partners.jl.html
diff --git a/Server/app/resources/partners/views/partners_add.jl.html b/Server/app/resources/partners/views/partners_add.jl.html
new file mode 100644
index 0000000..783dec5
--- /dev/null
+++ b/Server/app/resources/partners/views/partners_add.jl.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Server/app/svelte/public/js/communes.js b/Server/app/svelte/public/js/communes.js
deleted file mode 100644
index 871abde..0000000
--- a/Server/app/svelte/public/js/communes.js
+++ /dev/null
@@ -1,99 +0,0 @@
-
-export let communes = [
- {
- location: [["Canada","Montreal"],[45.55541047232767, -73.42859611607271]],
- status: "forming",
- members: 2,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Denmark"],[55.915625218626275, 9.673445220831253]],
- status: "forming",
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Estonia","Kohtla-Jarve"],[59.409521829709504, 27.288415912535914]],
- status: "forming",
- members: 2,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Latvia"],[56.934159375258055, 25.269099001330265]],
- status: "forming",
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Switzerland"],[46.97045202584917, 8.05130091516525]],
- status: "forming",
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- }
-]
-
-export let communesByCountry = {}
-for (let c of communes) {
- let country = c.location[0][0]
- if (country in communesByCountry) {
- communesByCountry[country].push(c)
- }
- else {
- communesByCountry[country] = [c]
- }
-}
-
-export let communesMarkersLayer = L.layerGroup()
-
-export function translate(content, x) {
- let out = content[x]
- if (out==undefined) {
- return x
- }
- else {
- return out
- }
-}
-
-export function addMarkersCommunes(map,content,locale) {
- for (let g of communes) {
- let coordinates
- let text = ""+content["Commune"]+" "
- for (let field in g) {
- let fieldText = content[field] + ": "
- if (field=="contact") {
- text += fieldText + "" + content[g.contact[1]]+ " "
- }
- else if (field=="location") {
- let location = g[field][0]
- let locationString
- if (locale=="en") {
- locationString = location.map(x => x).join(", ")
- }
- else {
- locationString = location.map(x => translate(content, x)).join(", ")
- }
-
- text += fieldText + locationString + " "
- coordinates = g[field][1]
- }
- else if (field=="status") {
- text += fieldText + content[g[field]] + " "
- }
- else {
- text += fieldText + g[field] + " "
- }
- }
- var markerIcon = new L.Icon({
- iconUrl: 'https://www.libsoc.org/img/common/markers/marker-red.png',
- shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
- iconSize: [25, 41],
- iconAnchor: [12, 41],
- popupAnchor: [1, -34],
- shadowSize: [41, 41]
- });
- let marker = L.marker(coordinates, {icon: markerIcon})
- marker.addTo(communesMarkersLayer).bindPopup(text)
- }
- communesMarkersLayer.addTo(map)
-}
\ No newline at end of file
diff --git a/Server/app/svelte/public/js/coops.js b/Server/app/svelte/public/js/coops.js
deleted file mode 100644
index 8338fcc..0000000
--- a/Server/app/svelte/public/js/coops.js
+++ /dev/null
@@ -1,79 +0,0 @@
-export let coops = [
- {
- logo: "chiron_logo",
- name: "Chiron Health",
- location: [["Estonia","Kohtla-Järve"],[59.41038769769602, 27.287802936242034]],
- market: "wellnessAndHealth",
- workers: 2,
- status: "inDevelopment",
- website: ["https://www.chrn.health/", "chrn.health"],
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"],
- description: "descriptionChironHealth"
- },
- {
- logo: "kuusk_logo",
- name: "Kuusk",
- location: [["Estonia","Kohtla-Järve"],[59.399947051803004, 27.277159931677055]],
- market: "herbalTeas",
- workers: 1,
- status: "inDevelopment",
- website: ["-","-"],
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"],
- description: "kuuskDescription"
- }
-]
-
-export let coopsByCountry = {}
-for (let g of coops) {
- let country = g.location[0][0]
- if (country in coopsByCountry) {
- coopsByCountry[country].push(g)
- }
- else {
- coopsByCountry[country] = [g]
- }
-}
-
-export let coopsMarkersLayer = L.layerGroup()
-
-export function addMarkersCoops(map,content,locale) {
- for (let g of coops) {
- let coordinates
- let text = ""+content["Cooperative"]+" "
- for (let field in g) {
- let fieldText
- if (field!="logo") {
- fieldText = content[field] + ": "
- }
- if (field=="logo") {
- text += " " + " "
- }
- else if (field=="contact") {
- text += fieldText + "" + content[g.contact[1]] + " " + " "
- }
- else if (field=="website") {
- text += fieldText + "" + g.website[1] + " " + " "
- }
- else if (field=="location") {
- let location = g[field][0]
- let locationString
- if (locale=="en") {
- locationString = location.map(x => x).join(", ")
- }
- else {
- locationString = location.map(x => content[x]).join(", ")
- }
- text += fieldText + locationString + " "
- coordinates = g[field][1]
- }
- else if (field=="market" || field=="status" || field=="description") {
- text += fieldText + content[g[field]] + " "
- }
- else {
- text += fieldText + g[field] + " "
- }
- }
- L.marker(coordinates).addTo(coopsMarkersLayer).bindPopup(text)
- }
- coopsMarkersLayer.addTo(map)
-}
\ No newline at end of file
diff --git a/Server/app/svelte/public/js/groups.js b/Server/app/svelte/public/js/groups.js
deleted file mode 100644
index 1319310..0000000
--- a/Server/app/svelte/public/js/groups.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
-export let groups = [
- {
- location: [["Bulgaria","Varna"],[43.21582161671174, 27.89896092161012]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Canada","Halifax"],[44.65166135030067, -63.59289968306866]],
- members: 2,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Canada","Toronto"], [43.6960589794647, -79.37396957644577]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Denmark","Copenhagen"],[55.6840661150132, 12.557133959514688]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Denmark","Kolding"], [55.49261908652738, 9.470268969851743]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Estonia","Kohtla-Järve"], [59.40629447076191, 27.280605339416322]],
- members: 3,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Estonia","Tallinn"], [59.39180354687856, 24.72304565687877]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Germany","Wiesbaden"], [50.07459620869791, 8.234984059337897]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Greece","Athens"], [37.94877252621736, 23.677622972996158]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Ireland"], [53.280192832733576, -7.688103518964818]],
- members: 6,
- contact: ["https://discord.gg/4BUau4AZre","DiscordInviteLink"]
- },
- {
- location: [["Latvia","Riga"], [56.94748425529816, 24.003027136431925]],
- members: 2,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["USA","Florida"], [26.945024427155868, -81.22162645059898]],
- members: 2,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["USA","Colorado","Louisville"], [39.965026323855334, -105.15948886693151]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["USA","Georgia"], [33.91813982808364, -84.38058579763135]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["USA","Ohio"], [40.18243610076637, -83.07800532738788]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Thailand","Chiang Mai"], [18.788343253574393, 98.99423221087719]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- },
- {
- location: [["Switzerland","Cham"], [47.18298143153399, 8.460076421717238]],
- members: 1,
- contact: ["https://discord.gg/Qk8KUk787z","DiscordInviteLink"]
- }
-]
-*/
-
-export let groupsMarkersLayer = L.layerGroup()
-let groupsMarkersLayerOut = L.layerGroup()
-let groupsMarkersLayerIn = L.layerGroup()
-
-let contactGeneral =["https://discord.gg/4BUau4AZre","DiscordInviteLink"]
-
-export function translate(content, x) {
- let out = content[x]
- if (out==undefined) {
- return x
- }
- else {
- return out
- }
-}
-
-function addMarkersToLayer(g,layer,content,locale) {
- let coordinates
- let text = ""+content["Group"]+" "
- for (let field of ["location","members","contact"]) {
-
- let fieldText = content[field] + ": "
- if (field=="contact") {
- text += fieldText + "" + g.contact + " "
- }
- else if (field=="location") {
- let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
- let locationString
- if (locale=="en") {
- locationString = location.map(x => x).join(", ")
- }
- else {
- locationString = location.map(x => translate(content, x)).join(", ")
- }
- text += fieldText + locationString + " "
- coordinates = [g.latitude,g.longitude]
- }
- else {
- text += fieldText + g[field] + " "
- }
- }
- var markerIcon = new L.Icon({
- iconUrl: 'https://www.libsoc.org/img/common/markers/marker-green.png',
- shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
- iconSize: [25, 41],
- iconAnchor: [12, 41],
- popupAnchor: [1, -34],
- shadowSize: [41, 41]
- })
- //console.log(text)
- let marker = L.marker(coordinates, {icon: markerIcon})
- marker.addTo(layer).bindPopup(text)
-}
-
-export function addMarkersGroups(groups,groupsByCountry,map,content,locale) {
- for (let g of groups) {
- addMarkersToLayer(g,groupsMarkersLayerIn,content,locale)
- }
- for (let gs of Object.values(groupsByCountry)) {
- if (gs.length==1) {
- let g = {...gs[0]}
- g.country = [g.country]
- addMarkersToLayer(g,groupsMarkersLayerOut,content,locale)
- }
- else {
- let locationName = gs[0].country
- let locationCoordinates = [0,0]
- let members = 0
- let contact = gs[0].contact
- for (let g of gs) {
- locationCoordinates[0] += g.latitude
- locationCoordinates[1] += g.longitude
- members += g.members
- if (g.contact[0]!=gs[0].contact[0]) {
- contact = contactGeneral
- }
- }
- locationCoordinates[0] = locationCoordinates[0]/gs.length
- locationCoordinates[1] = locationCoordinates[1]/gs.length
- let gNew = {
- country: locationName,
- latitude: locationCoordinates[0],
- longitude: locationCoordinates[1],
- members: members,
- contact: contact
- }
- addMarkersToLayer(gNew,groupsMarkersLayerOut,content,locale)
- }
- }
-
- groupsMarkersLayerOut.addTo(groupsMarkersLayer)
- groupsMarkersLayer.addTo(map)
- map.on("zoomend", () => onZoomEnd(map))
-}
-
-function onZoomEnd(map) {
- let zoomLevel = map.getZoom()
- if (zoomLevel==3) {
- groupsMarkersLayer.removeLayer(groupsMarkersLayerIn)
- groupsMarkersLayerOut.addTo(groupsMarkersLayer)
- }
- else if (zoomLevel==4) {
- groupsMarkersLayer.removeLayer(groupsMarkersLayerOut)
- groupsMarkersLayerIn.addTo(groupsMarkersLayer)
- }
-}
-
-
diff --git a/Server/app/svelte/public/js/libraries/mapTools.js b/Server/app/svelte/public/js/libraries/mapTools.js
new file mode 100644
index 0000000..1f9cfb4
--- /dev/null
+++ b/Server/app/svelte/public/js/libraries/mapTools.js
@@ -0,0 +1,90 @@
+let contactGeneral =["https://discord.gg/4BUau4AZre","DiscordInviteLink"]
+
+export function translate(content, x) {
+ let out = content[x]
+ if (out==undefined) {
+ return x
+ }
+ else {
+ return out
+ }
+}
+
+function addMarkersToLayer(g,layer,content,locale,addPinContent,markerColor) {
+ let {text,coordinates} = addPinContent(g,content,locale)
+ var markerIcon = new L.Icon({
+ iconUrl: 'https://www.libsoc.org/img/common/markers/marker-' + markerColor + '.png',
+ shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+ shadowSize: [41, 41]
+ })
+ let marker = L.marker(coordinates, {icon: markerIcon})
+ marker.addTo(layer).bindPopup(text)
+}
+
+export function addMarkersEntries(entries,entriesByCountry,map,content,locale,addPinContent,markerColor) {
+ let entriesMarkersLayer = L.layerGroup()
+ let entriesMarkersLayerOut = L.layerGroup()
+ let entriesMarkersLayerIn = L.layerGroup()
+ for (let g of entries) {
+ if (g.country!="Online" && g.country!="Worldwide") {
+ addMarkersToLayer(g,entriesMarkersLayerIn,content,locale,addPinContent,markerColor)
+ }
+ }
+ for (let gs of Object.values(entriesByCountry)) {
+ if (gs.length==1) {
+ let g = {...gs[0]}
+ g.country = [g.country]
+ if (g.country!="Online" && g.country!="Worldwide") {
+ addMarkersToLayer(g,entriesMarkersLayerOut,content,locale,addPinContent,markerColor)
+ }
+ }
+ else {
+ if (gs[0].country!="Online" && gs[0].country!="Worldwide") {
+ let locationName = gs[0].country
+ let locationCoordinates = [0,0]
+ let members = 0
+ let contact = gs[0].contact
+ for (let g of gs) {
+ locationCoordinates[0] += g.latitude
+ locationCoordinates[1] += g.longitude
+ members += g.members
+ if (g.contact[0]!=gs[0].contact[0]) {
+ contact = contactGeneral
+ }
+ }
+ locationCoordinates[0] = locationCoordinates[0]/gs.length
+ locationCoordinates[1] = locationCoordinates[1]/gs.length
+ let gNew = {
+ country: locationName,
+ latitude: locationCoordinates[0],
+ longitude: locationCoordinates[1],
+ members: members,
+ contact: contact
+ }
+ addMarkersToLayer(gNew,entriesMarkersLayerOut,content,locale,addPinContent,markerColor)
+ }
+ }
+ }
+
+ entriesMarkersLayerOut.addTo(entriesMarkersLayer)
+ entriesMarkersLayer.addTo(map)
+ map.on("zoomend", () => onZoomEnd(map,entriesMarkersLayer,entriesMarkersLayerOut,entriesMarkersLayerIn))
+ return entriesMarkersLayer
+}
+
+function onZoomEnd(map,entriesMarkersLayer,entriesMarkersLayerOut,entriesMarkersLayerIn) {
+ let zoomLevel = map.getZoom()
+ if (zoomLevel==3) {
+ entriesMarkersLayer.removeLayer(entriesMarkersLayerIn)
+ entriesMarkersLayerOut.addTo(entriesMarkersLayer)
+ }
+ else if (zoomLevel==4) {
+ entriesMarkersLayer.removeLayer(entriesMarkersLayerOut)
+ entriesMarkersLayerIn.addTo(entriesMarkersLayer)
+ }
+}
+
+
diff --git a/Server/app/svelte/public/js/mapFuncs.js b/Server/app/svelte/public/js/mapFuncs.js
new file mode 100644
index 0000000..f37d0d7
--- /dev/null
+++ b/Server/app/svelte/public/js/mapFuncs.js
@@ -0,0 +1,178 @@
+import { translate } from "/js/libraries/mapTools.js"
+
+export function addGroupPinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Group"]+" "
+ for (let field of ["location","members","contact"]) {
+ let fieldText = content[field] + ": "
+ if (field=="contact") {
+ text += fieldText + "" + g.contact + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
+
+export function addCommunePinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Commune"]+" "
+ for (let field of ["location","status","members","contact"]) {
+ let fieldText = content[field] + ": "
+ if (field=="contact") {
+ text += fieldText + "" + g.contact + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else if (field=="status") {
+ text += fieldText + content[g[field]] + " "
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
+
+export function addCoopPinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Cooperative"]+" "
+ for (let field of ["logo","name","location","workers","status","website","contact","description"]) {
+ let fieldText
+ if (field!="logo") {
+ fieldText = content[field] + ": "
+ }
+ if (field=="logo") {
+ text += " " + " "
+ }
+ else if (field=="contact") {
+ text += fieldText + "" + g.contact + " " + " "
+ }
+ else if (field=="website") {
+ text += fieldText + "" + g.website + " " + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else if (field=="market" || field=="status" || field=="description") {
+ text += fieldText + g[field] + " "
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
+
+export function addPartyPinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Cooperative"]+" "
+ for (let field of ["logo","name","location","website","contact","description"]) {
+ let fieldText
+ if (field!="logo") {
+ fieldText = content[field] + ": "
+ }
+ if (field=="logo") {
+ text += " " + " "
+ }
+ else if (field=="link") {
+ text += fieldText + "" + g.link + " " + " "
+ }
+ else if (field=="website") {
+ text += fieldText + "" + g.website + " " + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else if (field=="description") {
+ text += fieldText + content[g[field]] + " "
+ }
+ else if (field=="contact") {
+ text += fieldText + "" + g.contact + " " + " "
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
+
+export function addPartnersPinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Partner"]+" "
+ for (let field of ["logo","name","location","website","contact","description"]) {
+ let fieldText
+ if (field!="logo") {
+ fieldText = content[field] + ": "
+ }
+ if (field=="logo") {
+ text += " " + " "
+ }
+ else if (field=="contact") {
+ text += fieldText + "" + g.contact + " " + " "
+ }
+ else if (field=="website") {
+ text += fieldText + "" + g.website + " " + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else if (field=="description") {
+ text += fieldText + g[field] + " "
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
\ No newline at end of file
diff --git a/Server/app/svelte/public/js/parties.js b/Server/app/svelte/public/js/parties.js
deleted file mode 100644
index 5921eb9..0000000
--- a/Server/app/svelte/public/js/parties.js
+++ /dev/null
@@ -1,74 +0,0 @@
-export let parties = [
- {
- logo: "roots",
- name: "Roots",
- location: ["Ireland",[52.98479517270413, -7.649233227534782]],
- //members: 6,
- link: "https://discord.gg/pSTMacJZsK",
- description: "descriptionRoots"
- }
-]
-
-export let partiesByCountry = {}
-for (let g of parties) {
- let country = g.location[0]
- if (country in partiesByCountry) {
- partiesByCountry[country].push(g)
- }
- else {
- partiesByCountry[country] = [g]
- }
-}
-
-export let partiesMarkersLayer = L.layerGroup()
-
-export function addMarkersParties(map,content,locale) {
- for (let g of parties) {
- let coordinates
- let text = ""+content["Party"]+" "
- for (let field in g) {
- let fieldText
- if (field!="logo") {
- fieldText = content[field] + ": "
- }
- if (field=="logo") {
- text += " " + " "
- }
- else if (field=="link") {
- text += fieldText + "" + g.link + " " + " "
- }
- else if (field=="website") {
- text += fieldText + "" + g.website + " " + " "
- }
- else if (field=="location") {
- let location = g[field][0]
- let locationString
- if (locale=="en") {
- locationString = location
- }
- else {
- locationString = content[location]
- }
- text += fieldText + locationString + " "
- coordinates = g[field][1]
- }
- else if (field=="description") {
- text += fieldText + content[g[field]] + " "
- }
- else {
- text += fieldText + g[field] + " "
- }
- }
- var markerIcon = new L.Icon({
- iconUrl: 'https://www.libsoc.org/img/common/markers/marker-gold.png',
- shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
- iconSize: [25, 41],
- iconAnchor: [12, 41],
- popupAnchor: [1, -34],
- shadowSize: [41, 41]
- });
- let marker = L.marker(coordinates, {icon: markerIcon})
- marker.addTo(partiesMarkersLayer).bindPopup(text)
- }
- partiesMarkersLayer.addTo(map)
-}
\ No newline at end of file
diff --git a/Server/app/svelte/public/js/partners.js b/Server/app/svelte/public/js/partners.js
deleted file mode 100644
index 05fd226..0000000
--- a/Server/app/svelte/public/js/partners.js
+++ /dev/null
@@ -1,21 +0,0 @@
-export let partners = [
- {
- name: "Gaia's Fall",
- type: "typeGaiasFall",
- location: [["Online"],[0,0]],
- link: "https://discord.libsoc.org/invite/",
- description: "descriptionGaiasFall",
- logo: "gaias_fall"
- }
-]
-
-export let partnersByCountry = {}
-for (let g of partners) {
- let country = g.location[0][0]
- if (country in partnersByCountry) {
- partnersByCountry[country].push(g)
- }
- else {
- partnersByCountry[country] = [g]
- }
-}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/en/communes-component.json b/Server/app/svelte/public/locales/en/communes-component.json
index e9c522f..99f0d64 100644
--- a/Server/app/svelte/public/locales/en/communes-component.json
+++ b/Server/app/svelte/public/locales/en/communes-component.json
@@ -10,5 +10,6 @@
"forming": "forming",
"WhatsAppInviteLink": "WhatsApp invite link",
"DiscordInviteLink": "Discord invite link",
- "Commune": "Commune"
+ "Commune": "Commune",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/en/cooperatives-component.json b/Server/app/svelte/public/locales/en/cooperatives-component.json
index b246fd4..06ce0d2 100644
--- a/Server/app/svelte/public/locales/en/cooperatives-component.json
+++ b/Server/app/svelte/public/locales/en/cooperatives-component.json
@@ -18,6 +18,7 @@
"descriptionChironHealth": "Chiron Health is a health platform providing courses and services on the topics of nutrition, exercise, sleep and mental wellbeing.",
"herbalTeas": "herbal teas",
"kuuskDescription": "Kuusk is an online store that sells herbal teas from exclusively local wild plants, as well as an online gathering course.",
- "Cooperative": "Cooperative"
+ "Cooperative": "Cooperative",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/en/countries.json b/Server/app/svelte/public/locales/en/countries.json
index 8919b1b..0e0dcd2 100644
--- a/Server/app/svelte/public/locales/en/countries.json
+++ b/Server/app/svelte/public/locales/en/countries.json
@@ -1,3 +1,3 @@
{
- "map-prompt": "Want to appear on our map? Contact us!"
+
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/en/groups-component.json b/Server/app/svelte/public/locales/en/groups-component.json
index 18e5fb4..9a4eaf7 100644
--- a/Server/app/svelte/public/locales/en/groups-component.json
+++ b/Server/app/svelte/public/locales/en/groups-component.json
@@ -8,5 +8,6 @@
"contact": "Contact",
"DiscordInviteLink": "Discord invite link",
"WhatsAppInviteLink": "WhatsApp invite link",
- "Group": "Group"
+ "Group": "Group",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/en/parties-component.json b/Server/app/svelte/public/locales/en/parties-component.json
index 317e43c..4fa7607 100644
--- a/Server/app/svelte/public/locales/en/parties-component.json
+++ b/Server/app/svelte/public/locales/en/parties-component.json
@@ -5,8 +5,10 @@
"name": "Name",
"location": "Location",
"members": "Members",
- "link": "Link",
+ "website": "Website",
+ "contact": "Contact",
"description": "Description",
"descriptionRoots": "We are a left libertarian organization based in Ireland. We have a focus on rebuilding the country's infrastructure, sense of governance, housing, agricultural industries and youth affairs.",
- "Party": "Party"
+ "Party": "Party",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/en/partners-component.json b/Server/app/svelte/public/locales/en/partners-component.json
index f677ace..37421c6 100644
--- a/Server/app/svelte/public/locales/en/partners-component.json
+++ b/Server/app/svelte/public/locales/en/partners-component.json
@@ -5,10 +5,11 @@
"subheading2": "Online",
"name": "Name",
"location": "Location",
- "type": "Type",
- "link": "Link",
+ "website": "Website",
+ "contact": "Contact",
"description": "Description",
"typeGaiasFall": "a place for discussions",
- "descriptionGaiasFall": "Gaia's Fall is a server that promotes Solarpunk ideals, environmentalism, anarchism, and anti-capitalism. We encourage civil debates, discussions of theories and possibilities, and the creation of communities focused on shaping a better world."
+ "descriptionGaiasFall": "Gaia's Fall is a server that promotes Solarpunk ideals, environmentalism, anarchism, and anti-capitalism. We encourage civil debates, discussions of theories and possibilities, and the creation of communities focused on shaping a better world.",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/ru/communes-component.json b/Server/app/svelte/public/locales/ru/communes-component.json
index d8e3064..b8bf573 100644
--- a/Server/app/svelte/public/locales/ru/communes-component.json
+++ b/Server/app/svelte/public/locales/ru/communes-component.json
@@ -9,5 +9,6 @@
"forming": "формируется",
"WhatsAppInviteLink": "WhatsApp ссылка",
"DiscordInviteLink": "Discord ссылка",
- "Commune": "Коммуна"
+ "Commune": "Коммуна",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/ru/cooperatives-component.json b/Server/app/svelte/public/locales/ru/cooperatives-component.json
index c04de71..c824886 100644
--- a/Server/app/svelte/public/locales/ru/cooperatives-component.json
+++ b/Server/app/svelte/public/locales/ru/cooperatives-component.json
@@ -18,5 +18,6 @@
"descriptionChironHealth": "Chiron Health — это платформа о здоровье, предлагающая курсы и услуги по вопросам питания, физических упражнений, сна и психического благополучия",
"herbalTeas": "травяные чаи",
"kuuskDescription": "Kuusk — интернет-магазин, в котором продаются травяные чаи исключительно из местных дикорастущих растений, а также онлайн-курс по собирательству.",
- "Cooperative": "Кооператив"
+ "Cooperative": "Кооператив",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/ru/countries.json b/Server/app/svelte/public/locales/ru/countries.json
index 56dd33d..0e0dcd2 100644
--- a/Server/app/svelte/public/locales/ru/countries.json
+++ b/Server/app/svelte/public/locales/ru/countries.json
@@ -1,30 +1,3 @@
{
- "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!",
- "Online": "Онлайн",
- "Denmark": "Дания",
- "Estonia": "Эстония",
- "Greece": "Греция",
- "Latvia": "Латвия",
- "Canada": "Канада",
- "Ireland": "Ирландия",
- "Germany": "Германия",
- "USA": "CША",
- "Bulgaria": "Болгария",
- "Thailand": "Тайланд",
- "Colorado": "Колорадо",
- "Georgia": "Джорджия",
- "Ohio": "Огайо",
- "Copenhagen": "Копенгаген",
- "Kolding": "Колдинг",
- "Kohtla-Järve": "Кохтла-Ярве",
- "Athens": "Афины",
- "Riga": "Рига",
- "Halifax": "Галифакс",
- "Montreal": "Монреаль",
- "Wiesbaden": "Висбаден",
- "Florida": "Флорида",
- "Tallinn": "Таллинн",
- "Varna": "Варна",
- "Louisville": "Луисвилл",
- "Toronto": "Торонто"
+
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/ru/groups-component.json b/Server/app/svelte/public/locales/ru/groups-component.json
index 4d0d9ff..b81838a 100644
--- a/Server/app/svelte/public/locales/ru/groups-component.json
+++ b/Server/app/svelte/public/locales/ru/groups-component.json
@@ -7,5 +7,6 @@
"contact": "Контакт",
"DiscordInviteLink": "Discord ссылка",
"WhatsAppInviteLink": "WhatsApp ссылка",
- "Group": "Группа"
+ "Group": "Группа",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/ru/join-us-component.json b/Server/app/svelte/public/locales/ru/join-us-component.json
index 8ec1522..5b4df5d 100644
--- a/Server/app/svelte/public/locales/ru/join-us-component.json
+++ b/Server/app/svelte/public/locales/ru/join-us-component.json
@@ -30,5 +30,6 @@
"market": "Рынок",
"workers": "Работники",
"description": "Описание",
- "website": "Вебсайт"
+ "website": "Вебсайт",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/ru/landing-component.json b/Server/app/svelte/public/locales/ru/landing-component.json
index e134c65..5eb789b 100644
--- a/Server/app/svelte/public/locales/ru/landing-component.json
+++ b/Server/app/svelte/public/locales/ru/landing-component.json
@@ -11,5 +11,6 @@
"findUs": "Найди нас",
"whatNow": "Что теперь?",
"joinUs": "Присоединяйся",
- "talkWithUs": "Напиши нам"
+ "talkWithUs": "Напиши нам",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/ru/parties-component.json b/Server/app/svelte/public/locales/ru/parties-component.json
index 9a3d3fd..768b953 100644
--- a/Server/app/svelte/public/locales/ru/parties-component.json
+++ b/Server/app/svelte/public/locales/ru/parties-component.json
@@ -5,9 +5,11 @@
"name": "Имя",
"location": "Локация",
"members": "Участники",
- "link": "Ссылка",
+ "website": "Вебсайт",
+ "contact": "Контакт",
"description": "Описание",
"ireland": "Ирландия",
"descriptionRoots": "Мы — левая либертарная организация, базирующаяся в Ирландии. Мы уделяем особое внимание восстановлению инфраструктуры страны, самоуправлению, жилищному строительству, сельскохозяйственной промышленности и делам молодежи.",
- "Party": "Партия"
+ "Party": "Партия",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/public/locales/ru/partners-component.json b/Server/app/svelte/public/locales/ru/partners-component.json
index 3ebd453..4d5a616 100644
--- a/Server/app/svelte/public/locales/ru/partners-component.json
+++ b/Server/app/svelte/public/locales/ru/partners-component.json
@@ -6,8 +6,10 @@
"name": "Название",
"location": "Локация",
"type": "Тип",
- "link": "Ссылка",
+ "website": "Вебсайт",
+ "contact": "Контакт",
"description": "Описание",
"typeGaiasFall": "место для общения",
- "descriptionGaiasFall": "Gaia's Fall — это сервер, который продвигает идеалы соларпанка, защиту окружающей среды, анархизм и антикапитализм. Мы поощряем гражданские дебаты, обсуждение теорий и возможностей, а также создание сообществ, сосредоточенных на формировании лучшего мира."
+ "descriptionGaiasFall": "Gaia's Fall — это сервер, который продвигает идеалы соларпанка, защиту окружающей среды, анархизм и антикапитализм. Мы поощряем гражданские дебаты, обсуждение теорий и возможностей, а также создание сообществ, сосредоточенных на формировании лучшего мира.",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/app/svelte/rollup.config.js b/Server/app/svelte/rollup.config.js
index bade40b..d9f00c2 100644
--- a/Server/app/svelte/rollup.config.js
+++ b/Server/app/svelte/rollup.config.js
@@ -10,7 +10,6 @@ import watch from "rollup-plugin-watch";
const production = !process.env.ROLLUP_WATCH;
-
function serve() {
let server;
diff --git a/Server/app/svelte/src/communes-add-component.svelte b/Server/app/svelte/src/communes-add-component.svelte
new file mode 100644
index 0000000..3f23fa7
--- /dev/null
+++ b/Server/app/svelte/src/communes-add-component.svelte
@@ -0,0 +1,415 @@
+
+
+
+
+{#key $loaded}
+ {#if $loaded==3}
+
+
+
+
Add a Commune
+
+
If there are no communes near you who you can join and you want to start your own then do the following:
+
+ Click on the map to show us where you are located;
+ Add a way to contact you or leave blank for a pin to point to our discord;
+ Press "Submit" to add yourself to our map;
+ Verify yourself by having a chat with us at our Discord server to show on the map;
+
+
+
+
+
Submit
+
+
mapCallback(createMap,$content,locale)}>
+
+
+ {/if}
+{/key}
+
+
\ No newline at end of file
diff --git a/Server/app/svelte/src/communes-component.svelte b/Server/app/svelte/src/communes-component.svelte
index e710735..ea18f32 100644
--- a/Server/app/svelte/src/communes-component.svelte
+++ b/Server/app/svelte/src/communes-component.svelte
@@ -3,31 +3,56 @@
{#key $loaded}
- {#if $loaded==2}
+ {#if $loaded==3}
+
{$content.communes}
-
+
{$content.p1}
{$content.subheading1}
-
mapCallbackCommunes(createMap,$content,locale)}>
+
mapCallback(createMap,$content,locale)}>
{$content["map-prompt"]}
- {#each Object.entries(communesByCountry) as [name,communes]}
+ {#each Object.entries(entriesByCountry) as [name,entries]}
{getCountry(name)}
- {#each communes as commune}
+ {#each entries as entry}
+
-
{$content.location}: {getAddress(commune)}
-
{$content.status}: {$content[commune.status]}
-
{$content.members}: {commune.members}
-
{$content.contact}: {$content[commune.contact[1]]}
+
{$content.location}: {getAddress(entry)}
+
{$content.status}: {$content[entry.status]}
+
{$content.members}: {entry.members}
+
{$content.contact}: {entry.contact}
{/each}
@@ -75,7 +102,7 @@
margin-bottom: 2rem;
}
- #commune-img {
+ #communes-img {
position: absolute;
width: 11.5rem;
left: 50%;
diff --git a/Server/app/svelte/src/components/map-component.svelte b/Server/app/svelte/src/components/map-component.svelte
index aecc12b..f6b6d4d 100644
--- a/Server/app/svelte/src/components/map-component.svelte
+++ b/Server/app/svelte/src/components/map-component.svelte
@@ -50,6 +50,8 @@
width: var(--width,100%);
margin-top: var(--margin-top,0);
margin-bottom: var(--margin-bottom,0);
+ position: relative;
+ z-index: 0;
}
\ No newline at end of file
diff --git a/Server/app/svelte/src/components/select-component.svelte b/Server/app/svelte/src/components/select-component.svelte
index 0951e93..5f4a42a 100644
--- a/Server/app/svelte/src/components/select-component.svelte
+++ b/Server/app/svelte/src/components/select-component.svelte
@@ -194,6 +194,7 @@
.select span {
position: relative;
padding-top: 0.5rem;
+ padding-left: 0.3rem;
white-space: nowrap;
}
diff --git a/Server/app/svelte/src/cooperatives-add-component.svelte b/Server/app/svelte/src/cooperatives-add-component.svelte
new file mode 100644
index 0000000..1465083
--- /dev/null
+++ b/Server/app/svelte/src/cooperatives-add-component.svelte
@@ -0,0 +1,413 @@
+
+
+
+
+{#key $loaded}
+ {#if $loaded==3}
+
+
+
+
Add a Group
+
+
If there are no groups in your town with whom you can organize then do the following:
+
+ Click on the map to show us where you are located;
+ Add a way to contact you or leave blank for a pin to point to our discord;
+ Press "Submit" to add yourself to our map;
+ Verify yourself by having a chat with us at our Discord server to show on the map;
+
+
+
+
Submit
+
+
mapCallback(createMap,$content,locale)}>
+
+
+ {/if}
+{/key}
+
+
\ No newline at end of file
diff --git a/Server/app/svelte/src/cooperatives-component.svelte b/Server/app/svelte/src/cooperatives-component.svelte
index 1e255d5..6ba90df 100644
--- a/Server/app/svelte/src/cooperatives-component.svelte
+++ b/Server/app/svelte/src/cooperatives-component.svelte
@@ -4,8 +4,9 @@
// Import statements
import { onMount } from 'svelte'
import { writable } from 'svelte/store';
- import { coopsByCountry, addMarkersCoops } from '/js/coops.js'
- import { loadLocaleContent } from "/js/libraries/serverTools.js"
+ import { loadLocaleContent, getData} from "/js/libraries/serverTools.js"
+ import { addMarkersEntries, translate } from "/js/libraries/mapTools.js"
+ import { addCoopPinContent } from "/js/mapFuncs.js"
// Import components
import "/js/components/map-component.js"
@@ -13,21 +14,45 @@
// Main code
let loaded = writable(0)
let content = writable({})
+ let entries
+ let entriesByCountry
- let locale = loadLocaleContent(content,"countries",loaded)
- loadLocaleContent(content,"cooperatives-component",loaded)
+ let locale = loadLocaleContent(content,"cooperatives-component",loaded)
+ loadLocaleContent(content,"countries",loaded)
- function mapCallbackCoops(createMap,content) {
+ let callback = (response) => {
+ entries = JSON.parse(response)
+ entriesByCountry = {}
+ for (let g of entries) {
+ let country = g.country
+ if (g.contact==null) {
+ g.contact = "https://discord.gg/Qk8KUk787z"
+ }
+ if (country in entriesByCountry) {
+ entriesByCountry[country].push(g)
+ }
+ else {
+ entriesByCountry[country] = [g]
+ }
+ }
+ loaded.update((val) => {
+ return val + 1
+ })
+ }
+ getData("/assets/cooperatives.json",callback)
+
+ function mapCallback(createMap,content,locale) {
let map = createMap([22, 0],2)
- addMarkersCoops(map,content,locale)
+ addMarkersEntries(entries,entriesByCountry,map,content,locale,addCoopPinContent,"blue")
}
- function getCountry(name) {
- return locale=="en" ? name : $content[name]
+ function getCountry(x) {
+ return locale=="en" ? x : translate($content,x)
}
- function getAddress(group) {
- return group.location[0].map(x => locale=="en" ? x : $content[x]).join(", ")
+ function getAddress(g) {
+ let location = [g.country,g.state,g.town].filter(x => x!=null)
+ return location.map(x => locale=="en" ? x : translate($content,x)).join(", ")
}
onMount(() => {
@@ -36,37 +61,38 @@
{#key $loaded}
- {#if $loaded==2}
+ {#if $loaded==3}
{$content.cooperatives}
{$content.p1}
{$content.subheading1}
-
mapCallbackCoops(createMap,$content,locale)}>
+
mapCallback(createMap,$content,locale)}>
{$content["map-prompt"]}
- {#each Object.entries(coopsByCountry) as [name,coops]}
+ {#each Object.entries(entriesByCountry) as [name,entries]}
{getCountry(name)}
- {#each coops as coop}
+ {#each entries as entry}
+ {console.log(entry)}
-
{$content.name}: {coop.name}
-
{$content.location}: {getAddress(coop)}
-
{$content.market}: {$content[coop.market]}
-
{$content.workers}: {coop.workers}
-
{$content.status}: {$content[coop.status]}
-
{$content.website}: {coop.website[1]}
-
{$content.contact}: {$content[coop.contact[1]]}
+
{$content.name}: {entry.name}
+
{$content.location}: {getAddress(entry)}
+
{$content.market}: {entry.market}
+
{$content.workers}: {entry.workers}
+
{$content.status}: {entry.status}
+
{$content.website}: {entry.website}
+
{$content.contact}: {entry.contact}
-
-
+
+
-
{$content.description}: {$content[coop.description]}
+
{$content.description}: {entry.description}
{/each}
diff --git a/Server/app/svelte/src/groups-add-component.svelte b/Server/app/svelte/src/groups-add-component.svelte
index bd53d3f..9a6c2fc 100644
--- a/Server/app/svelte/src/groups-add-component.svelte
+++ b/Server/app/svelte/src/groups-add-component.svelte
@@ -4,8 +4,8 @@
// Import statements
import { onMount } from 'svelte'
import { writable } from 'svelte/store';
- import { addMarkersGroups, translate } from '/js/groups.js'
import { loadLocaleContent, getData, sendData } from "/js/libraries/serverTools.js"
+ import { addMarkersEntries, translate } from "/js/libraries/mapTools.js"
// Import components
import "/js/components/map-component.js"
@@ -13,22 +13,22 @@
// Main code
let loaded = writable(0)
let content = writable({})
- let groups
- let groupsByCountry
+ let entries
+ let entriesByCountry
let callback = (response) => {
- groups = JSON.parse(response)
- groupsByCountry = {}
- for (let g of groups) {
+ entries = JSON.parse(response)
+ entriesByCountry = {}
+ for (let g of entries) {
let country = g.country
if (g.contact==null) {
g.contact = "https://discord.gg/Qk8KUk787z"
}
- if (country in groupsByCountry) {
- groupsByCountry[country].push(g)
+ if (country in entriesByCountry) {
+ entriesByCountry[country].push(g)
}
else {
- groupsByCountry[country] = [g]
+ entriesByCountry[country] = [g]
}
}
loaded.update((val) => {
@@ -126,9 +126,37 @@
getData(url,callback)
}
- function mapCallbackGroups(createMap,content,locale) {
+ function addGroupPinContent(g,content,locale) {
+ let coordinates
+ let text = "
"+content["Group"]+" "
+ for (let field of ["location","members","contact"]) {
+ let fieldText = content[field] + ": "
+ if (field=="contact") {
+ text += fieldText + "
" + g.contact + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + "
"
+ coordinates = [g.latitude,g.longitude]
+ }
+ else {
+ text += fieldText + g[field] + "
"
+ }
+ }
+ return {text,coordinates}
+ }
+
+
+ function mapCallback(createMap,content,locale) {
let map = createMap([22, 0],2)
- addMarkersGroups(groups,groupsByCountry,map,content,locale)
+ addMarkersEntries(entries,entriesByCountry,map,content,locale,addGroupPinContent,"green")
userPin.addTo(map)
map.on('click', function(event) {
@@ -220,7 +248,7 @@
Submit
-
mapCallbackGroups(createMap,$content,locale)}>
+
mapCallback(createMap,$content,locale)}>
{/if}
diff --git a/Server/app/svelte/src/groups-component.svelte b/Server/app/svelte/src/groups-component.svelte
index c12847c..3f4b017 100644
--- a/Server/app/svelte/src/groups-component.svelte
+++ b/Server/app/svelte/src/groups-component.svelte
@@ -4,8 +4,9 @@
// Import statements
import { onMount } from 'svelte'
import { writable } from 'svelte/store';
- import { addMarkersGroups, translate } from '/js/groups.js'
- import { loadLocaleContent, getData, sendData } from "/js/libraries/serverTools.js"
+ import { loadLocaleContent, getData} from "/js/libraries/serverTools.js"
+ import { addMarkersEntries, translate } from "/js/libraries/mapTools.js"
+ import { addGroupPinContent } from "/js/mapFuncs.js"
// Import components
import "/js/components/map-component.js"
@@ -13,25 +14,25 @@
// Main code
let loaded = writable(0)
let content = writable({})
- let groups
- let groupsByCountry
+ let entries
+ let entriesByCountry
let locale = loadLocaleContent(content,"groups-component",loaded)
loadLocaleContent(content,"countries",loaded)
let callback = (response) => {
- groups = JSON.parse(response)
- groupsByCountry = {}
- for (let g of groups) {
+ entries = JSON.parse(response)
+ entriesByCountry = {}
+ for (let g of entries) {
let country = g.country
if (g.contact==null) {
g.contact = "https://discord.gg/Qk8KUk787z"
}
- if (country in groupsByCountry) {
- groupsByCountry[country].push(g)
+ if (country in entriesByCountry) {
+ entriesByCountry[country].push(g)
}
else {
- groupsByCountry[country] = [g]
+ entriesByCountry[country] = [g]
}
}
loaded.update((val) => {
@@ -40,9 +41,9 @@
}
getData("/assets/groups.json",callback)
- function mapCallbackGroups(createMap,content,locale) {
+ function mapCallback(createMap,content,locale) {
let map = createMap([22, 0],2)
- addMarkersGroups(groups,groupsByCountry,map,content,locale)
+ addMarkersEntries(entries,entriesByCountry,map,content,locale,addGroupPinContent,"green")
}
function getCountry(x) {
@@ -68,16 +69,16 @@
{$content.p1}
{$content.subheading1}
-
mapCallbackGroups(createMap,$content,locale)}>
+
mapCallback(createMap,$content,locale)}>
{$content["map-prompt"]}
- {#each Object.entries(groupsByCountry) as [name,groups]}
+ {#each Object.entries(entriesByCountry) as [name,entries]}
{getCountry(name)}
- {#each groups as group}
+ {#each entries as entry}
-
{$content.location}: {getAddress(group)}
-
{$content.members}: {group.members}
-
{$content.contact}: {group.contact}
+
{$content.location}: {getAddress(entry)}
+
{$content.members}: {entry.members}
+
{$content.contact}: {entry.contact}
{/each}
diff --git a/Server/app/svelte/src/join-us-component.svelte b/Server/app/svelte/src/join-us-component.svelte
index 72975c2..def67e8 100644
--- a/Server/app/svelte/src/join-us-component.svelte
+++ b/Server/app/svelte/src/join-us-component.svelte
@@ -4,11 +4,9 @@
// Import statements
import { onMount } from 'svelte'
import { writable } from 'svelte/store';
- import { addMarkersGroups, groupsMarkersLayer } from '/js/groups.js'
- import { addMarkersCoops, coopsMarkersLayer } from '/js/coops.js'
- import { addMarkersCommunes, communesMarkersLayer } from '/js/communes.js'
- import { addMarkersParties, partiesMarkersLayer } from '/js/parties.js'
import { loadLocaleContent, getData } from "/js/libraries/serverTools.js"
+ import { addMarkersEntries, translate } from "/js/libraries/mapTools.js"
+ import { addGroupPinContent, addCommunePinContent, addCoopPinContent, addPartyPinContent } from "/js/mapFuncs.js"
// Import components
import "/js/components/map-component.js"
@@ -16,8 +14,8 @@
// Main code
let loaded = writable(0)
let content = writable({})
- let groups
- let groupsByCountry
+ let entries = {}
+ let entriesByCountry ={}
loadLocaleContent(content,"groups-component",loaded)
loadLocaleContent(content,"communes-component",loaded)
@@ -27,40 +25,42 @@
let locale = loadLocaleContent(content,"join-us-component",loaded)
- let callback = (response) => {
- groups = JSON.parse(response)
- groupsByCountry = {}
- for (let g of groups) {
+ let callback = (response,name) => {
+ entries[name] = JSON.parse(response)
+ entriesByCountry[name] = {}
+ for (let g of entries[name]) {
let country = g.country
if (g.contact==null) {
g.contact = "https://discord.gg/Qk8KUk787z"
}
- if (country in groupsByCountry) {
- groupsByCountry[country].push(g)
+ if (country in entriesByCountry[name]) {
+ entriesByCountry[name][country].push(g)
}
else {
- groupsByCountry[country] = [g]
+ entriesByCountry[name][country] = [g]
}
}
loaded.update((val) => {
return val + 1
})
}
- getData("/assets/groups.json",callback)
+ getData("/assets/groups.json",(response) => callback(response,"groups"))
+ getData("/assets/communes.json",(response) => callback(response,"communes"))
+ getData("/assets/cooperatives.json",(response) => callback(response,"cooperatives"))
+ getData("/assets/parties.json",(response) => callback(response,"parties"))
function mapCallback(createMap,content,locale) {
let map = createMap([22, 0],2)
- addMarkersGroups(groups,groupsByCountry,map,content,locale)
- addMarkersCommunes(map,content,locale)
- addMarkersCoops(map,content,locale)
- addMarkersParties(map,content,locale)
+ let groupsMarkersLayer = addMarkersEntries(entries["groups"],entriesByCountry["groups"],map,content,locale,addGroupPinContent,"green")
+ let communesMarkersLayer = addMarkersEntries(entries["communes"],entriesByCountry["communes"],map,content,locale,addCommunePinContent,"red")
+ let coopsMarkersLayer = addMarkersEntries(entries["cooperatives"],entriesByCountry["cooperatives"],map,content,locale,addCoopPinContent,"blue")
+ let partiesMarkersLayer = addMarkersEntries(entries["parties"],entriesByCountry["parties"],map,content,locale,addPartyPinContent,"gold")
- let overlayMaps = {
- "Groups": groupsMarkersLayer,
- "Communes": communesMarkersLayer,
- "Coops": coopsMarkersLayer,
- "Parties": partiesMarkersLayer,
- }
+ let overlayMaps = {}
+ overlayMaps[content.groups] = groupsMarkersLayer
+ overlayMaps[content.communes] = communesMarkersLayer
+ overlayMaps[content.cooperatives] = coopsMarkersLayer
+ overlayMaps[content.parties] = partiesMarkersLayer
L.control.layers(null, overlayMaps).addTo(map)
}
@@ -70,7 +70,7 @@
{#key $loaded}
- {#if $loaded==7}
+ {#if $loaded==10}
{$content.heading}
@@ -101,7 +101,7 @@
{$content.nearYou}
{$content.noneNear} {$content.WhatsAppGroup} {$content.or} {$content.DiscordServer} {$content.helpStart}
-
mapCallback(createMap,$content,locale)}>
+
mapCallback(createMap,$content,locale)} colors={["#23AC20","#CA2437","#217BC9","#FFD326"]}>
{/if}
diff --git a/Server/app/svelte/src/landing-component.svelte b/Server/app/svelte/src/landing-component.svelte
index 4f0b855..d224f93 100644
--- a/Server/app/svelte/src/landing-component.svelte
+++ b/Server/app/svelte/src/landing-component.svelte
@@ -4,11 +4,9 @@
// Import statements
import { onMount } from 'svelte'
import { writable } from 'svelte/store';
- import { addMarkersGroups, groupsMarkersLayer, translate } from '/js/groups.js'
- import { addMarkersCoops, coopsMarkersLayer } from '/js/coops.js'
- import { addMarkersCommunes, communesMarkersLayer } from '/js/communes.js'
- import { addMarkersParties, partiesMarkersLayer } from '/js/parties.js'
import { loadLocaleContent, getData } from "/js/libraries/serverTools.js"
+ import { addMarkersEntries, translate } from "/js/libraries/mapTools.js"
+ import { addGroupPinContent, addCommunePinContent, addCoopPinContent, addPartyPinContent } from "/js/mapFuncs.js"
// Import components
import "/js/components/map-component.js"
@@ -18,8 +16,8 @@
let gridWidth
let loaded = writable(0)
let content = writable({})
- let groups
- let groupsByCountry
+ let entries = {}
+ let entriesByCountry ={}
function changeWidth(locale) {
if (locale=="ru") {
@@ -30,26 +28,29 @@
}
}
- let callback = (response) => {
- groups = JSON.parse(response)
- groupsByCountry = {}
- for (let g of groups) {
+ let callback = (response,name) => {
+ entries[name] = JSON.parse(response)
+ entriesByCountry[name] = {}
+ for (let g of entries[name]) {
let country = g.country
if (g.contact==null) {
g.contact = "https://discord.gg/Qk8KUk787z"
}
- if (country in groupsByCountry) {
- groupsByCountry[country].push(g)
+ if (country in entriesByCountry[name]) {
+ entriesByCountry[name][country].push(g)
}
else {
- groupsByCountry[country] = [g]
+ entriesByCountry[name][country] = [g]
}
}
loaded.update((val) => {
return val + 1
})
}
- getData("/assets/groups.json",callback)
+ getData("/assets/groups.json",(response) => callback(response,"groups"))
+ getData("/assets/communes.json",(response) => callback(response,"communes"))
+ getData("/assets/cooperatives.json",(response) => callback(response,"cooperatives"))
+ getData("/assets/parties.json",(response) => callback(response,"parties"))
loadLocaleContent(content,"groups-component",loaded)
loadLocaleContent(content,"communes-component",loaded)
@@ -61,10 +62,10 @@
function mapCallback(createMap,content,locale) {
let map = createMap([22, 0],2)
- addMarkersGroups(groups,groupsByCountry,map,content,locale)
- addMarkersCommunes(map,content,locale)
- addMarkersCoops(map,content,locale)
- addMarkersParties(map,content,locale)
+ let groupsMarkersLayer = addMarkersEntries(entries["groups"],entriesByCountry["groups"],map,content,locale,addGroupPinContent,"green")
+ let communesMarkersLayer = addMarkersEntries(entries["communes"],entriesByCountry["communes"],map,content,locale,addCommunePinContent,"red")
+ let coopsMarkersLayer = addMarkersEntries(entries["cooperatives"],entriesByCountry["cooperatives"],map,content,locale,addCoopPinContent,"blue")
+ let partiesMarkersLayer = addMarkersEntries(entries["parties"],entriesByCountry["parties"],map,content,locale,addPartyPinContent,"gold")
let overlayMaps = {}
overlayMaps[content.groups] = groupsMarkersLayer
@@ -81,7 +82,7 @@
{#key $loaded}
- {#if $loaded==7}
+ {#if $loaded==10}
@@ -97,9 +98,9 @@
{$content.groupsText}
+
+
Add a Party
+
+
If there are no parties in your country which you can join then do the following:
+
+ Click on the map to show us where you are located;
+ Add a way to contact you or leave blank for a pin to point to our discord;
+ Press "Submit" to add yourself to our map;
+ Verify yourself by having a chat with us at our Discord server to show on the map;
+
+
+
+
Submit
+
+
mapCallback(createMap,$content,locale)}>
+
+
+ {/if}
+{/key}
+
+
\ No newline at end of file
diff --git a/Server/app/svelte/src/parties-component.svelte b/Server/app/svelte/src/parties-component.svelte
index d091526..205b93b 100644
--- a/Server/app/svelte/src/parties-component.svelte
+++ b/Server/app/svelte/src/parties-component.svelte
@@ -4,8 +4,9 @@
// Import statements
import { onMount } from 'svelte'
import { writable } from 'svelte/store';
- import { partiesByCountry, addMarkersParties } from '/js/parties.js'
- import { loadLocaleContent } from "/js/libraries/serverTools.js"
+ import { loadLocaleContent, getData} from "/js/libraries/serverTools.js"
+ import { addMarkersEntries, translate } from "/js/libraries/mapTools.js"
+ import { addPartyPinContent } from "/js/mapFuncs.js"
// Import components
import "/js/components/map-component.js"
@@ -13,21 +14,45 @@
// Main code
let loaded = writable(0)
let content = writable({})
+ let entries
+ let entriesByCountry
- loadLocaleContent(content,"countries",loaded)
let locale = loadLocaleContent(content,"parties-component",loaded)
+ loadLocaleContent(content,"countries",loaded)
- function mapCallbackParties(createMap,content,locale) {
+ let callback = (response) => {
+ entries = JSON.parse(response)
+ entriesByCountry = {}
+ for (let g of entries) {
+ let country = g.country
+ if (g.contact==null) {
+ g.contact = "https://discord.gg/Qk8KUk787z"
+ }
+ if (country in entriesByCountry) {
+ entriesByCountry[country].push(g)
+ }
+ else {
+ entriesByCountry[country] = [g]
+ }
+ }
+ loaded.update((val) => {
+ return val + 1
+ })
+ }
+ getData("/assets/parties.json",callback)
+
+ function mapCallback(createMap,content,locale) {
let map = createMap([22, 0],2)
- addMarkersParties(map,content,locale)
+ addMarkersEntries(entries,entriesByCountry,map,content,locale,addPartyPinContent,"gold")
}
- function getCountry(name) {
- return locale=="en" ? name : $content[name]
+ function getCountry(x) {
+ return locale=="en" ? x : translate($content,x)
}
- function getAddress(group) {
- return locale=="en" ? group.location : $content[group.location]
+ function getAddress(g) {
+ let location = [g.country,g.state,g.town].filter(x => x!=null)
+ return location.map(x => locale=="en" ? x : translate($content,x)).join(", ")
}
onMount(() => {
@@ -36,7 +61,7 @@
{#key $loaded}
- {#if $loaded==2}
+ {#if $loaded==3}
@@ -44,26 +69,27 @@
{$content.p1}
{$content.subheading1}
-
mapCallbackParties(createMap,$content,locale)}>
+
mapCallback(createMap,$content,locale)}>
{$content["map-prompt"]}
- {#each Object.entries(partiesByCountry) as [name,parties]}
+ {#each Object.entries(entriesByCountry) as [name,entries]}
{getCountry(name)}
- {#each parties as party}
+ {#each entries as entry}
-
-
+
+
-
{$content.name}: {party.name}
-
{$content.location}: {getAddress(party)}
-
{$content.link}: {party.link}
+
{$content.name}: {entry.name}
+
{$content.location}: {getAddress(entry)}
+
{$content.website}: {entry.website}
+
{$content.contact}: {entry.contact}
-
{$content.description}: {$content[party.description]}
+
{$content.description}: {$content[entry.description]}
{/each}
@@ -134,7 +160,7 @@
.party-logo {
position: relative;
right: 0;
- max-height: 5.5rem;
+ max-height: 6.5rem;
max-width: 100%;
border-radius: 1rem;
}
diff --git a/Server/app/svelte/src/partners-add-component.svelte b/Server/app/svelte/src/partners-add-component.svelte
new file mode 100644
index 0000000..2088024
--- /dev/null
+++ b/Server/app/svelte/src/partners-add-component.svelte
@@ -0,0 +1,195 @@
+
+
+
+
+{#key $loaded}
+ {#if $loaded==3}
+
+
+
+
{$content.groups}
+
+
{$content.p1}
+
{$content.subheading1}
+
mapCallback(createMap,$content,locale)}>
+
{$content["map-prompt"]}
+ {#each Object.entries(entriesByCountry) as [name,entries]}
+
{getCountry(name)}
+
+ {#each entries as entry}
+
+
{$content.location}: {getAddress(entry)}
+
{$content.members}: {entry.members}
+
{$content.contact}: {entry.contact}
+
+ {/each}
+
+ {/each}
+
+
+ {/if}
+{/key}
+
+
\ No newline at end of file
diff --git a/Server/app/svelte/src/partners-component.svelte b/Server/app/svelte/src/partners-component.svelte
index 01483a9..bbabb86 100644
--- a/Server/app/svelte/src/partners-component.svelte
+++ b/Server/app/svelte/src/partners-component.svelte
@@ -4,25 +4,55 @@
// Import statements
import { onMount } from 'svelte'
import { writable } from 'svelte/store';
- import { loadLocaleContent } from "/js/libraries/serverTools.js"
- import { partnersByCountry } from '/js/partners.js'
-
+ import { loadLocaleContent, getData} from "/js/libraries/serverTools.js"
+ import { addMarkersEntries, translate } from "/js/libraries/mapTools.js"
+ import { addPartnersPinContent } from "/js/mapFuncs.js"
+
// Import components
import "/js/components/map-component.js"
// Main code
let loaded = writable(0)
let content = writable({})
+ let entries
+ let entriesByCountry
- loadLocaleContent(content,"countries",loaded)
let locale = loadLocaleContent(content,"partners-component",loaded)
+ loadLocaleContent(content,"countries",loaded)
- function getCountry(name) {
- return locale=="en" ? name : $content[name]
+ let callback = (response) => {
+ entries = JSON.parse(response)
+ entriesByCountry = {}
+ for (let g of entries) {
+ let country = g.country
+ if (g.contact==null) {
+ g.contact = "https://discord.gg/Qk8KUk787z"
+ }
+ if (country in entriesByCountry) {
+ entriesByCountry[country].push(g)
+ }
+ else {
+ entriesByCountry[country] = [g]
+ }
+ }
+ loaded.update((val) => {
+ return val + 1
+ })
+ }
+ getData("/assets/partners.json",callback)
+
+ function mapCallback(createMap,content,locale) {
+ let map = createMap([22, 0],2)
+ addMarkersEntries(entries,entriesByCountry,map,content,locale,addPartnersPinContent,"blue")
}
- function getAddress(group) {
- return group.location[0].map(x => locale=="en" ? x : $content[x]).join(", ")
+ function getCountry(x) {
+ return locale=="en" ? x : translate($content,x)
+ }
+
+ function getAddress(g) {
+ let location = [g.country,g.state,g.town].filter(x => x!=null)
+ return location.map(x => locale=="en" ? x : translate($content,x)).join(", ")
}
onMount(() => {
@@ -31,7 +61,7 @@
{#key $loaded}
- {#if $loaded==2}
+ {#if $loaded==3}
@@ -39,25 +69,27 @@
{$content.p1}
{$content.subheading1}
- {#each Object.entries(partnersByCountry) as [name,partners]}
+
mapCallback(createMap,$content,locale)}>
+
{$content["map-prompt"]}
+ {#each Object.entries(entriesByCountry) as [name,entries]}
{getCountry(name)}
- {#each partners as partner}
+ {#each entries as entry}
-
-
+
+
-
{$content.name}: {partner.name}
-
{$content.type}: {$content[partner.type]}
-
{$content.location}: {getAddress(partner)}
-
{$content.link}: {partner.link}
+
{$content.name}: {entry.name}
+
{$content.location}: {getAddress(entry)}
+
{$content.website}: {entry.website}
+
{$content.contact}: {entry.contact}
-
{$content.description}: {$content[partner.description]}
+
{$content.description}: {entry.description}
{/each}
@@ -133,7 +165,7 @@
#map {
--height: 30rem;
--width: 100%;
- --margin-bottom: 3rem;
+ --margin-bottom: 0.5rem;
}
#text-container {
@@ -148,7 +180,7 @@
}
h3 {
- margin-bottom: 2rem;
+ margin-bottom: 1rem;
}
#container {
diff --git a/Server/lib_ext/compile_database.jl b/Server/lib_ext/compile_database.jl
index 5e85e61..fd0951b 100644
--- a/Server/lib_ext/compile_database.jl
+++ b/Server/lib_ext/compile_database.jl
@@ -18,14 +18,14 @@ function table_to_json(name,df)
end
end
-function compile_groups()
- df = select_from_table(["groups" => ["*"]])
- table_to_json("groups",df)
+function compile(name)
+ df = select_from_table([name => ["*"]])
+ table_to_json(name,df)
end
-function move_requests()
- df_requests = select_from_table(["groups_requests" => ["*"]], where_data=["verified" => true, "added" => false])
- df = select_from_table(["groups" => ["*"]])
+function move_requests(name)
+ df_requests = select_from_table(["$(name)_requests" => ["*"]], where_data=["verified" => true, "added" => false])
+ df = select_from_table([name => ["*"]])
latitudes = df.latitude
longitudes = df.longitude
for df_row in eachrow(df_requests)
@@ -35,11 +35,11 @@ function move_requests()
row_found = df[ind_id_given,Not(:id)]
dict = Dict(zip(names(row_found),values(row_found)))
dict["members"] += 1
- update_table("groups",dict, where_data=["id" => id])
+ update_table(name,dict, where_data=["id" => id])
else
id = df_row.id
dict_update = Dict("added" => true)
- update_table("groups_requests",dict_update, where_data=["id" => id])
+ update_table("$(name)_requests",dict_update, where_data=["id" => id])
df_row_to_add = df_row[Not(:id_given)]
df_row_to_add = df_row_to_add[Not(:verified)]
@@ -47,11 +47,20 @@ function move_requests()
df_row_to_add = df_row_to_add[Not(:id)]
dict = Dict(zip(names(df_row_to_add),values(df_row_to_add)))
dict["members"] = 1
- insert_into_table("groups",dict)
+ insert_into_table(name,dict)
end
end
end
-move_requests()
-compile_groups()
+move_requests("groups")
+compile("groups")
+
+move_requests("communes")
+compile("communes")
+
+compile("cooperatives")
+
+compile("parties")
+
+compile("partners")
\ No newline at end of file
diff --git a/Server/public/assets/communes.json b/Server/public/assets/communes.json
new file mode 100644
index 0000000..4487f2b
--- /dev/null
+++ b/Server/public/assets/communes.json
@@ -0,0 +1 @@
+[{"town":"Saalfeld/Saale","contact":null,"latitude":50.61764000625769,"status":"forming","longitude":11.25,"id":1,"members":1,"country":"Germany","state":"Thuringia"}]
\ No newline at end of file
diff --git a/Server/public/assets/cooperatives.json b/Server/public/assets/cooperatives.json
new file mode 100644
index 0000000..2b4c380
--- /dev/null
+++ b/Server/public/assets/cooperatives.json
@@ -0,0 +1 @@
+[{"market":"wellness and health","state":null,"town":"Kohtla-Järve","name":"Chiron Health","status":"in development","id":1,"description":"Chiron Health is a health platform providing courses and services on the topics of nutrition, exercise, sleep and mental wellbeing.","country":"Estonia","workers":2,"contact":"https://discord.gg/Qk8KUk787z","latitude":59.41038769769602,"longitude":27.287802936242034,"logo":"1690553207","website":"https://www.chrn.health"}]
\ No newline at end of file
diff --git a/Server/public/assets/parties.json b/Server/public/assets/parties.json
new file mode 100644
index 0000000..2e9c284
--- /dev/null
+++ b/Server/public/assets/parties.json
@@ -0,0 +1 @@
+[{"latitude":52.98479517270413,"name":"Roots","longitude":-7.649233227534782,"id":1,"logo":"1690554940","website":" ","members":null,"description":"descriptionRoots","country":"Ireland","contact":"https://discord.gg/pSTMacJZsK"}]
\ No newline at end of file
diff --git a/Server/public/assets/partners.json b/Server/public/assets/partners.json
new file mode 100644
index 0000000..50f52c9
--- /dev/null
+++ b/Server/public/assets/partners.json
@@ -0,0 +1 @@
+[{"state":null,"town":null,"name":"Gaia's Fall","id":1,"description":"Gaia's Fall is a server that promotes Solarpunk ideals, environmentalism, anarchism, and anti-capitalism. We encourage civil debates, discussions of theories and possibilities, and the creation of communities focused on shaping a better world.","country":"Online","contact":"https://discord.gg/xAPZmyr8B6","latitude":null,"longitude":null,"logo":"1690554942","website":" "}]
\ No newline at end of file
diff --git a/Server/public/img/common/commune.svg b/Server/public/img/common/communes.svg
similarity index 100%
rename from Server/public/img/common/commune.svg
rename to Server/public/img/common/communes.svg
diff --git a/Server/public/img/coops/chiron_logo.png b/Server/public/img/coops/1690553207.png
similarity index 100%
rename from Server/public/img/coops/chiron_logo.png
rename to Server/public/img/coops/1690553207.png
diff --git a/Server/public/img/coops/chiron_logo.webp b/Server/public/img/coops/1690553207.webp
similarity index 100%
rename from Server/public/img/coops/chiron_logo.webp
rename to Server/public/img/coops/1690553207.webp
diff --git a/Server/public/img/coops/kuusk_logo.png b/Server/public/img/coops/1690553208.png
similarity index 100%
rename from Server/public/img/coops/kuusk_logo.png
rename to Server/public/img/coops/1690553208.png
diff --git a/Server/public/img/coops/kuusk_logo.webp b/Server/public/img/coops/1690553208.webp
similarity index 100%
rename from Server/public/img/coops/kuusk_logo.webp
rename to Server/public/img/coops/1690553208.webp
diff --git a/Server/public/img/parties/roots.png b/Server/public/img/parties/1690554940.png
similarity index 100%
rename from Server/public/img/parties/roots.png
rename to Server/public/img/parties/1690554940.png
diff --git a/Server/public/img/parties/roots.webp b/Server/public/img/parties/1690554940.webp
similarity index 100%
rename from Server/public/img/parties/roots.webp
rename to Server/public/img/parties/1690554940.webp
diff --git a/Server/public/img/partners/gaias_fall.jpg b/Server/public/img/partners/1690554942.jpg
similarity index 100%
rename from Server/public/img/partners/gaias_fall.jpg
rename to Server/public/img/partners/1690554942.jpg
diff --git a/Server/public/img/partners/gaias_fall.webp b/Server/public/img/partners/1690554942.webp
similarity index 100%
rename from Server/public/img/partners/gaias_fall.webp
rename to Server/public/img/partners/1690554942.webp
diff --git a/Server/public/js/components/communes-add-component.js b/Server/public/js/components/communes-add-component.js
new file mode 100644
index 0000000..a11d2bd
--- /dev/null
+++ b/Server/public/js/components/communes-add-component.js
@@ -0,0 +1 @@
+import{S as t,i as e,a as n,b as o,s as i,e as r,n as a,d as s,c as l,o as m,f as c,g as u,h as p,j as d,k as f,l as g,m as h,p as b,r as w}from"./index-8c09578c.js";import{w as y}from"./index-77787e10.js";import{getData as v,loadLocaleContent as x,sendData as k}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as j,translate as S}from"../../../../../../../../../js/libraries/mapTools.js";import"../../../../../../../../../js/components/map-component.js";import"../../../../../../../../../js/components/select-component.js";function z(t){let e,n,i,r,a,l,m,c,y,v,x,k,j,L,S,z,C,T,N,O,H,M,A,$,E,J,U,q,D,I,R,G,K,P,Q,V,Y,_,B,F,W,X,Z;return{c(){e=u("div"),n=u("div"),i=u("h1"),i.textContent="Add a Commune",r=p(),a=u("img"),m=p(),c=u("p"),c.textContent="If there are no communes near you who you can join and you want to start your own then do the following:",y=p(),v=u("ol"),v.innerHTML="
Click on the map to show us where you are located; \n
Add a way to contact you or leave blank for a pin to point to our discord; \n
Press "Submit" to add yourself to our map; \n
Verify yourself by having a chat with us at our Discord server to show on the map; ",x=p(),k=u("div"),j=u("label"),j.textContent="Location:",L=p(),S=u("div"),z=u("input"),C=p(),T=u("div"),N=p(),O=u("div"),H=u("label"),H.textContent="Contact:",M=p(),A=u("div"),$=u("input"),E=p(),J=u("div"),U=p(),q=u("div"),D=u("label"),D.textContent="Status:",I=p(),R=u("div"),G=u("select-component"),K=p(),P=u("div"),Q=p(),V=u("button"),V.textContent="Submit",Y=p(),_=u("p"),B=p(),F=u("map-component"),d(a,"id","communes-img"),f(a.src,l="/img/common/communes.svg")||d(a,"src","/img/common/communes.svg"),d(a,"alt","communes"),d(c,"class","description"),d(j,"for","address-input"),d(z,"id","address-input"),d(z,"type","text"),z.readOnly=!0,d(T,"class","ghost-input"),d(S,"class","input-wrapper"),d(k,"id","address-input-wrapper"),d(k,"class","input-label-wrapper"),d(H,"for","contact-input"),d($,"id","contact-input"),d($,"type","text"),d(J,"class","ghost-input"),d(A,"class","input-wrapper"),d(O,"class","input-label-wrapper"),d(D,"for","contact-input"),g(G,"id","status-input"),g(G,"options",["forming","growing","not growing"]),d(P,"class","ghost-input"),d(R,"class","input-wrapper"),d(q,"id","status-input-wrapper"),d(q,"class","input-label-wrapper"),d(V,"id","submit-button"),d(_,"id","confirmation-msg"),g(F,"id","map"),g(F,"callback",W=t[17]),d(n,"id","text-container"),d(e,"id","container")},m(s,l){o(s,e,l),h(e,n),h(n,i),h(n,r),h(n,a),h(n,m),h(n,c),h(n,y),h(n,v),h(n,x),h(n,k),h(k,j),h(k,L),h(k,S),h(S,z),t[11](z),h(S,C),h(S,T),h(n,N),h(n,O),h(O,H),h(O,M),h(O,A),h(A,$),t[13]($),h(A,E),h(A,J),h(n,U),h(n,q),h(q,D),h(q,I),h(q,R),h(R,G),t[15](G),h(R,K),h(R,P),h(n,Q),h(n,V),h(n,Y),h(n,_),t[16](_),h(n,B),h(n,F),X||(Z=[b(z,"input",t[12]),b($,"input",t[14]),b(V,"click",t[10])],X=!0)},p(t,e){32&e&&W!==(W=t[17])&&g(F,"callback",W)},d(n){n&&s(e),t[11](null),t[13](null),t[15](null),t[16](null),X=!1,w(Z)}}}function C(t){let e,n=3==t[4]&&z(t);return{c(){n&&n.c(),e=r()},m(t,i){n&&n.m(t,i),o(t,e,i)},p(t,o){3==t[4]?n?n.p(t,o):(n=z(t),n.c(),n.m(e.parentNode,e)):n&&(n.d(1),n=null)},d(t){n&&n.d(t),t&&s(e)}}}function T(t){let e,n=t[4],l=C(t);return{c(){l.c(),e=r(),this.c=a},m(t,n){l.m(t,n),o(t,e,n)},p(t,[o]){16&o&&i(n,n=t[4])?(l.d(1),l=C(t),l.c(),l.m(e.parentNode,e)):l.p(t,o)},i:a,o:a,d(t){t&&s(e),l.d(t)}}}function N(t){t.nextElementSibling.innerHTML=t.value}function O(t,e,n){let o,i,r=y(0);l(t,r,(t=>n(4,o=t)));let a,s,u=y({});l(t,u,(t=>n(5,i=t)));let p,d,f,g,h;v("/assets/communes.json",(t=>{a=JSON.parse(t),s={};for(let t of a){let e=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),e in s?s[e].push(t):s[e]=[t]}r.update((t=>t+1))}));let b=0,w=0,z=function(t,e){let n=new L.Icon({iconUrl:"/img/common/markers/marker-black.png",shadowUrl:"https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]});return L.marker([t,e],{icon:n})}(0,0);z.setOpacity(0);let C=x(u,"communes-component",r);function T(t,e,n){let o,i="
"+e.Group+" ";for(let r of["location","members","contact"]){let a=e[r]+": ";if("contact"==r)i+=a+"
"+t.contact+" ";else if("location"==r){let r,s=[t.country,t.state,t.town].filter((t=>null!=t&&null!=t));r="en"==n?s.map((t=>t)).join(", "):s.map((t=>S(e,t))).join(", "),i+=a+r+"
",o=[t.latitude,t.longitude]}else i+=a+t[r]+"
"}return{text:i,coordinates:o}}function O(t,e,o){let i=t([22,0],2);j(a,s,i,e,o,T,"green"),z.addTo(i),i.on("click",(function(t){let e=t.latlng.lat,o=t.latlng.lng;b=e,w=o,function(t,e,n){let o=L.latLng(e,n);t.setLatLng(o)}(z,e,o),z.setOpacity(1),v(`https://nominatim.openstreetmap.org/reverse?lat=${e}&lon=${o}&format=jsonv2`,(t=>{let e=(t=JSON.parse(t)).address,o=e.city||e.town||e.village||e.hamlet,i=e.state,r=e.country;null!=i?r+=", "+i:i="",null!=o?r+=", "+o:o="",n(1,d.value=r,d),N(d)})),function(t,e){v(`https://nominatim.openstreetmap.org/reverse?lat=${t}&lon=${e}&format=jsonv2&accept-language=en`,(t=>{let e=(t=JSON.parse(t)).address,n=e.city||e.town||e.village||e.hamlet,o=e.state,i=e.country;null!=o||(o=""),null!=n||(n=""),h=[i,o,n]}))}(e,o)}))}function H(t){!1!==t?(n(0,p.innerHTML="You have been added to our database! Now go to our Discord to verify yourself.",p),n(0,p.style.color="green",p)):(n(0,p.innerHTML="Something went wrong.",p),n(0,p.style.color="red",p))}x(u,"countries",r),m((()=>{}));return[p,d,f,g,o,i,r,u,C,O,function(){if(null!=h){let t={country:h[0],state:h[1],town:h[2],latitude:b,longitude:w,contact:f.value,status:g.value};""==t.state&&(t.state=null),""==t.town&&(t.town=null),""==t.contact&&(t.contact=null),k("/"+C+"/communes-add-post/",t,H)}},function(t){c[t?"unshift":"push"]((()=>{d=t,n(1,d)}))},()=>N(d),function(t){c[t?"unshift":"push"]((()=>{f=t,n(2,f)}))},()=>N(f),function(t){c[t?"unshift":"push"]((()=>{g=t,n(3,g)}))},function(t){c[t?"unshift":"push"]((()=>{p=t,n(0,p)}))},t=>O(t,i,C)]}class H extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},O,T,i,{},null),t&&t.target&&o(t.target,this,t.anchor)}}customElements.define("communes-add-component",H);export{H as default};
diff --git a/Server/public/js/components/communes-component.js b/Server/public/js/components/communes-component.js
index 4751c4f..3196831 100644
--- a/Server/public/js/components/communes-component.js
+++ b/Server/public/js/components/communes-component.js
@@ -1 +1 @@
-import{S as t,i as n,a as o,b as e,s as m,e as r,n as a,d as c,c as i,o as s,f as l,t as p,g as u,h as g,j as d,k as h,l as f,m as b,p as j}from"./index-4348483d.js";import{w as x}from"./index-71440b21.js";import{addMarkersCommunes as v,communesByCountry as w}from"../../../../../../../../../js/communes.js";import{loadLocaleContent as y}from"../../../../../../../../../js/libraries/serverTools.js";import"../../../../../../../../../js/components/map-component.js";function k(t,n,o){const e=t.slice();return e[9]=n[o][0],e[10]=n[o][1],e}function z(t,n,o){const e=t.slice();return e[13]=n[o],e}function D(t){let n,o,m,r,a,i,s,x,v,y,z,D,E,O,R,T,A,C,H,L,M=t[0].communes+"",S=t[0].p1+"",_=t[0].subheading1+"",q=t[0]["map-prompt"]+"",B=Object.entries(w),F=[];for(let n=0;n
o(1,m=t)));let a=x({});i(t,a,(t=>o(0,e=t))),y(a,"countries",r);let c=y(a,"communes-component",r);function l(t,n,o){let e=t([22,0],2);v(e,n,o)}s((()=>{}));return[e,m,r,a,c,l,function(t){return"en"==c?t:e[t]},function(t){return t.location[0].map((t=>"en"==c?t:e[t])).join(", ")},t=>l(t,e,c)]}class A extends t{constructor(t){super(),this.shadowRoot.innerHTML="",n(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},T,R,m,{},null),t&&t.target&&e(t.target,this,t.anchor)}}customElements.define("communes-component",A);export{A as default};
+import{S as t,i as n,a as o,b as e,s as r,e as m,n as s,d as a,c,o as i,g as l,t as p,h as u,j as d,k as g,l as f,m as h,q as b,u as j}from"./index-8c09578c.js";import{w as x}from"./index-77787e10.js";import{loadLocaleContent as y,getData as v}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as w,translate as k}from"../../../../../../../../../js/libraries/mapTools.js";import{addCommunePinContent as z}from"../../../../../../../../../js/mapFuncs.js";import"../../../../../../../../../js/components/map-component.js";function N(t,n,o){const e=t.slice();return e[12]=n[o][0],e[3]=n[o][1],e}function O(t,n,o){const e=t.slice();return e[15]=n[o],e}function T(t){let n,o,r,m,s,c,i,x,y,v,w,k,z,O,T,D,R,S,q,A,C=t[1].communes+"",F=t[1].p1+"",H=t[1].subheading1+"",J=t[1]["map-prompt"]+"",K=Object.entries(t[0]),L=[];for(let n=0;no(2,r=t)));let s,a,l=x({});c(t,l,(t=>o(1,e=t)));let p=y(l,"communes-component",m);y(l,"countries",m);function u(t,n,o){let e=t([22,0],2);w(s,a,e,n,o,z,"red")}v("/assets/communes.json",(t=>{o(3,s=JSON.parse(t)),o(0,a={});for(let t of s){let n=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),n in a?a[n].push(t):o(0,a[n]=[t],a)}m.update((t=>t+1))})),i((()=>{}));return[a,e,r,s,m,l,p,u,function(t){return"en"==p?t:k(e,t)},function(t){return[t.country,t.state,t.town].filter((t=>null!=t)).map((t=>"en"==p?t:k(e,t))).join(", ")},t=>u(t,e,p)]}class A extends t{constructor(t){super(),this.shadowRoot.innerHTML="",n(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},q,S,r,{},null),t&&t.target&&e(t.target,this,t.anchor)}}customElements.define("communes-component",A);export{A as default};
diff --git a/Server/public/js/components/compass-component.js b/Server/public/js/components/compass-component.js
index 1e38a3d..29f4b42 100644
--- a/Server/public/js/components/compass-component.js
+++ b/Server/public/js/components/compass-component.js
@@ -1 +1 @@
-import{S as t,i as n,a as e,b as i,s as o,e as r,n as s,d as a,c as l,o as m,f as c,t as u,g as p,h as d,j as g,l as h,m as f,q as b,p as v,r as q}from"./index-4348483d.js";import{w as x}from"./index-71440b21.js";import{loadLocaleContent as _}from"../../../../../../../../../js/libraries/serverTools.js";import{shuffleArray as z}from"../../../../../../../../../js/libraries/miscTools.js";function w(t,n,e){const i=t.slice();return i[19]=n[e],i[21]=e,i}function y(t){let n,e,r,s,l,m,b,v,q=t[5].heading+"",x=t[0],_=S(t);return{c(){n=c("div"),e=c("div"),r=c("h1"),s=u(q),l=p(),m=c("img"),v=p(),_.c(),d(m,"id","compass-img"),g(m.src,b="/img/common/compass.svg")||d(m,"src","/img/common/compass.svg"),d(m,"alt","compass"),d(e,"id","text-container"),d(n,"id","container")},m(t,o){i(t,n,o),h(n,e),h(e,r),h(r,s),h(e,l),h(e,m),h(e,v),_.m(e,null)},p(t,n){32&n&&q!==(q=t[5].heading+"")&&f(s,q),1&n&&o(x,x=t[0])?(_.d(1),_=S(t),_.c(),_.m(e,null)):_.p(t,n)},d(t){t&&a(n),_.d(t)}}}function k(t){let n,e,o,r,s,l,m,g,v,q,x,_,z,w,y,k,j,C,S,B,M,N,T,D;return{c(){n=c("p"),n.textContent="You are compatible with ...",e=p(),o=c("ul"),r=c("li"),s=u("capitalism by "),l=c("span"),m=u(t[2]),g=u("%"),v=p(),q=c("li"),x=u("vanguardism by "),_=c("span"),z=u(t[3]),w=u("%"),y=p(),k=c("li"),j=u("libertarian socialism by "),C=c("span"),S=u(t[4]),B=u("%"),M=p(),N=c("button"),N.textContent="back",d(o,"class","results-list"),d(N,"class","quiz-buttons")},m(a,c){i(a,n,c),i(a,e,c),i(a,o,c),h(o,r),h(r,s),h(r,l),h(l,m),h(r,g),h(o,v),h(o,q),h(q,x),h(q,_),h(_,z),h(q,w),h(o,y),h(o,k),h(k,j),h(k,C),h(C,S),h(k,B),i(a,M,c),i(a,N,c),T||(D=b(N,"click",t[16]),T=!0)},p(t,n){4&n&&f(m,t[2]),8&n&&f(z,t[3]),16&n&&f(S,t[4])},d(t){t&&a(n),t&&a(e),t&&a(o),t&&a(M),t&&a(N),T=!1,D()}}}function j(t){let n,e,o,r,s,l,m,g,x,_=t[5].qs[t[0]].q+"",z=t[5].qs[t[0]].as,y=[];for(let n=0;ne(6,o=t)));let s=x({});l(t,s,(t=>e(5,i=t))),_(s,"countries",r),_(s,"compass-component",r,(function(t){for(let n of t.qs)z(n.as)}));let a=0,c=[],u="",p="",d="";function g(t){null!=c[t]&&at.includes("C"))).filter(Boolean).length/c.length).toString()),e(3,p=Math.round(100*c.map((t=>t.includes("V"))).filter(Boolean).length/c.length).toString()),e(4,d=Math.round(100*c.map((t=>t.includes("LS"))).filter(Boolean).length/c.length).toString())),e(0,a+=1))}function h(t){0!=a&&e(0,a-=1)}m((()=>{}));return[a,c,u,p,d,i,o,r,s,g,h,function(){c[a]=this.__value,e(1,c)},[[]],t=>e(1,c[a]=t[1],c),()=>h(),()=>g(a),()=>h()]}class T extends t{constructor(t){super(),this.shadowRoot.innerHTML="",n(this,{target:this.shadowRoot,props:e(this.attributes),customElement:!0},N,M,o,{},null),t&&t.target&&i(t.target,this,t.anchor)}}customElements.define("compass-component",T);export{T as default};
+import{S as t,i as n,a as e,b as i,s as o,e as r,n as s,d as a,c as l,o as m,g as c,t as u,h as p,j as d,k as g,m as h,q as f,p as b,u as v,r as q}from"./index-8c09578c.js";import{w as x}from"./index-77787e10.js";import{loadLocaleContent as _}from"../../../../../../../../../js/libraries/serverTools.js";import{shuffleArray as z}from"../../../../../../../../../js/libraries/miscTools.js";function w(t,n,e){const i=t.slice();return i[19]=n[e],i[21]=e,i}function y(t){let n,e,r,s,l,m,b,v,q=t[5].heading+"",x=t[0],_=S(t);return{c(){n=c("div"),e=c("div"),r=c("h1"),s=u(q),l=p(),m=c("img"),v=p(),_.c(),d(m,"id","compass-img"),g(m.src,b="/img/common/compass.svg")||d(m,"src","/img/common/compass.svg"),d(m,"alt","compass"),d(e,"id","text-container"),d(n,"id","container")},m(t,o){i(t,n,o),h(n,e),h(e,r),h(r,s),h(e,l),h(e,m),h(e,v),_.m(e,null)},p(t,n){32&n&&q!==(q=t[5].heading+"")&&f(s,q),1&n&&o(x,x=t[0])?(_.d(1),_=S(t),_.c(),_.m(e,null)):_.p(t,n)},d(t){t&&a(n),_.d(t)}}}function k(t){let n,e,o,r,s,l,m,g,v,q,x,_,z,w,y,k,j,C,S,B,M,N,T,D;return{c(){n=c("p"),n.textContent="You are compatible with ...",e=p(),o=c("ul"),r=c("li"),s=u("capitalism by "),l=c("span"),m=u(t[2]),g=u("%"),v=p(),q=c("li"),x=u("vanguardism by "),_=c("span"),z=u(t[3]),w=u("%"),y=p(),k=c("li"),j=u("libertarian socialism by "),C=c("span"),S=u(t[4]),B=u("%"),M=p(),N=c("button"),N.textContent="back",d(o,"class","results-list"),d(N,"class","quiz-buttons")},m(a,c){i(a,n,c),i(a,e,c),i(a,o,c),h(o,r),h(r,s),h(r,l),h(l,m),h(r,g),h(o,v),h(o,q),h(q,x),h(q,_),h(_,z),h(q,w),h(o,y),h(o,k),h(k,j),h(k,C),h(C,S),h(k,B),i(a,M,c),i(a,N,c),T||(D=b(N,"click",t[16]),T=!0)},p(t,n){4&n&&f(m,t[2]),8&n&&f(z,t[3]),16&n&&f(S,t[4])},d(t){t&&a(n),t&&a(e),t&&a(o),t&&a(M),t&&a(N),T=!1,D()}}}function j(t){let n,e,o,r,s,l,m,g,x,_=t[5].qs[t[0]].q+"",z=t[5].qs[t[0]].as,y=[];for(let n=0;ne(6,o=t)));let s=x({});l(t,s,(t=>e(5,i=t))),_(s,"countries",r),_(s,"compass-component",r,(function(t){for(let n of t.qs)z(n.as)}));let a=0,c=[],u="",p="",d="";function g(t){null!=c[t]&&at.includes("C"))).filter(Boolean).length/c.length).toString()),e(3,p=Math.round(100*c.map((t=>t.includes("V"))).filter(Boolean).length/c.length).toString()),e(4,d=Math.round(100*c.map((t=>t.includes("LS"))).filter(Boolean).length/c.length).toString())),e(0,a+=1))}function h(t){0!=a&&e(0,a-=1)}m((()=>{}));return[a,c,u,p,d,i,o,r,s,g,h,function(){c[a]=this.__value,e(1,c)},[[]],t=>e(1,c[a]=t[1],c),()=>h(),()=>g(a),()=>h()]}class T extends t{constructor(t){super(),this.shadowRoot.innerHTML="",n(this,{target:this.shadowRoot,props:e(this.attributes),customElement:!0},N,M,o,{},null),t&&t.target&&i(t.target,this,t.anchor)}}customElements.define("compass-component",T);export{T as default};
diff --git a/Server/public/js/components/cookies-dialog.js b/Server/public/js/components/cookies-dialog.js
index 79c9c70..f05779f 100644
--- a/Server/public/js/components/cookies-dialog.js
+++ b/Server/public/js/components/cookies-dialog.js
@@ -1 +1 @@
-import{S as e,i as s,a as t,b as o,s as i,f as a,n as r,h as n,d as c,o as d}from"./index-4348483d.js";function p(e){let s;return{c(){s=a("div"),s.innerHTML="We use cookies to improve your experience, personalise your content and analyse site usage. By clicking “OK”, you agree to the use of cookies.
",this.c=r,n(s,"id","wrapper")},m(e,t){o(e,s,t)},p:r,i:r,o:r,d(e){e&&c(s)}}}function u(e){return d((()=>{})),[]}class h extends e{constructor(e){super(),this.shadowRoot.innerHTML="",s(this,{target:this.shadowRoot,props:t(this.attributes),customElement:!0},u,p,i,{},null),e&&e.target&&o(e.target,this,e.anchor)}}customElements.define("cookies-dialog",h);export{h as default};
+import{S as e,i as s,a as t,b as o,s as i,g as a,n as r,j as n,d as c,o as d}from"./index-8c09578c.js";function p(e){let s;return{c(){s=a("div"),s.innerHTML="We use cookies to improve your experience, personalise your content and analyse site usage. By clicking “OK”, you agree to the use of cookies.
",this.c=r,n(s,"id","wrapper")},m(e,t){o(e,s,t)},p:r,i:r,o:r,d(e){e&&c(s)}}}function u(e){return d((()=>{})),[]}class h extends e{constructor(e){super(),this.shadowRoot.innerHTML="",s(this,{target:this.shadowRoot,props:t(this.attributes),customElement:!0},u,p,i,{},null),e&&e.target&&o(e.target,this,e.anchor)}}customElements.define("cookies-dialog",h);export{h as default};
diff --git a/Server/public/js/components/cooperatives-add-component.js b/Server/public/js/components/cooperatives-add-component.js
new file mode 100644
index 0000000..3c6fb45
--- /dev/null
+++ b/Server/public/js/components/cooperatives-add-component.js
@@ -0,0 +1 @@
+import{S as t,i as e,a as n,b as o,s as i,e as r,n as a,d as s,c as l,o as c,f as m,g as p,h as u,j as d,k as g,l as f,m as h,p as b,r as w}from"./index-8c09578c.js";import{w as y}from"./index-77787e10.js";import{getData as v,loadLocaleContent as x,sendData as k}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as j,translate as S}from"../../../../../../../../../js/libraries/mapTools.js";import"../../../../../../../../../js/components/map-component.js";function z(t){let e,n,i,r,a,l,c,m,y,v,x,k,j,L,S,z,T,C,N,O,H,M,A,$,E,J,U,q,D,G,I,R,K,P,Q;return{c(){e=p("div"),n=p("div"),i=p("h1"),i.textContent="Add a Group",r=u(),a=p("img"),c=u(),m=p("p"),m.textContent="If there are no groups in your town with whom you can organize then do the following:",y=u(),v=p("ol"),v.innerHTML="Click on the map to show us where you are located; \n Add a way to contact you or leave blank for a pin to point to our discord; \n Press "Submit" to add yourself to our map; \n Verify yourself by having a chat with us at our Discord server to show on the map; ",x=u(),k=p("div"),j=p("label"),j.textContent="Location:",L=u(),S=p("div"),z=p("input"),T=u(),C=p("div"),N=u(),O=p("div"),H=p("label"),H.textContent="Contact:",M=u(),A=p("div"),$=p("input"),E=u(),J=p("div"),U=u(),q=p("button"),q.textContent="Submit",D=u(),G=p("p"),I=u(),R=p("map-component"),d(a,"id","groups-img"),g(a.src,l="/img/common/groups.svg")||d(a,"src","/img/common/groups.svg"),d(a,"alt","groups"),d(m,"class","description"),d(j,"for","address-input"),d(z,"id","address-input"),d(z,"type","text"),z.readOnly=!0,d(C,"class","ghost-input"),d(S,"class","input-wrapper"),d(k,"id","address-input-wrapper"),d(k,"class","input-label-wrapper"),d(H,"for","contact-input"),d($,"id","contact-input"),d($,"type","text"),d(J,"class","ghost-input"),d(A,"class","input-wrapper"),d(O,"class","input-label-wrapper"),d(q,"id","submit-button"),d(G,"id","confirmation-msg"),f(R,"id","map"),f(R,"callback",K=t[15]),d(n,"id","text-container"),d(e,"id","container")},m(s,l){o(s,e,l),h(e,n),h(n,i),h(n,r),h(n,a),h(n,c),h(n,m),h(n,y),h(n,v),h(n,x),h(n,k),h(k,j),h(k,L),h(k,S),h(S,z),t[10](z),h(S,T),h(S,C),h(n,N),h(n,O),h(O,H),h(O,M),h(O,A),h(A,$),t[12]($),h(A,E),h(A,J),h(n,U),h(n,q),h(n,D),h(n,G),t[14](G),h(n,I),h(n,R),P||(Q=[b(z,"input",t[11]),b($,"input",t[13]),b(q,"click",t[9])],P=!0)},p(t,e){16&e&&K!==(K=t[15])&&f(R,"callback",K)},d(n){n&&s(e),t[10](null),t[12](null),t[14](null),P=!1,w(Q)}}}function T(t){let e,n=3==t[3]&&z(t);return{c(){n&&n.c(),e=r()},m(t,i){n&&n.m(t,i),o(t,e,i)},p(t,o){3==t[3]?n?n.p(t,o):(n=z(t),n.c(),n.m(e.parentNode,e)):n&&(n.d(1),n=null)},d(t){n&&n.d(t),t&&s(e)}}}function C(t){let e,n=t[3],l=T(t);return{c(){l.c(),e=r(),this.c=a},m(t,n){l.m(t,n),o(t,e,n)},p(t,[o]){8&o&&i(n,n=t[3])?(l.d(1),l=T(t),l.c(),l.m(e.parentNode,e)):l.p(t,o)},i:a,o:a,d(t){t&&s(e),l.d(t)}}}function N(t){t.nextElementSibling.innerHTML=t.value}function O(t,e,n){let o,i,r=y(0);l(t,r,(t=>n(3,o=t)));let a,s,p=y({});l(t,p,(t=>n(4,i=t)));let u,d,g,f;v("/assets/groups.json",(t=>{a=JSON.parse(t),s={};for(let t of a){let e=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),e in s?s[e].push(t):s[e]=[t]}r.update((t=>t+1))}));let h=0,b=0,w=function(t,e){let n=new L.Icon({iconUrl:"/img/common/markers/marker-black.png",shadowUrl:"https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]});return L.marker([t,e],{icon:n})}(0,0);w.setOpacity(0);let z=x(p,"groups-component",r);function T(t,e,n){let o,i=""+e.Group+" ";for(let r of["location","members","contact"]){let a=e[r]+": ";if("contact"==r)i+=a+""+t.contact+" ";else if("location"==r){let r,s=[t.country,t.state,t.town].filter((t=>null!=t&&null!=t));r="en"==n?s.map((t=>t)).join(", "):s.map((t=>S(e,t))).join(", "),i+=a+r+" ",o=[t.latitude,t.longitude]}else i+=a+t[r]+" "}return{text:i,coordinates:o}}function C(t,e,o){let i=t([22,0],2);j(a,s,i,e,o,T,"green"),w.addTo(i),i.on("click",(function(t){let e=t.latlng.lat,o=t.latlng.lng;h=e,b=o,function(t,e,n){let o=L.latLng(e,n);t.setLatLng(o)}(w,e,o),w.setOpacity(1),v(`https://nominatim.openstreetmap.org/reverse?lat=${e}&lon=${o}&format=jsonv2`,(t=>{let e=(t=JSON.parse(t)).address,o=e.city||e.town||e.village||e.hamlet,i=e.state,r=e.country;null!=i?r+=", "+i:i="",null!=o?r+=", "+o:o="",n(1,d.value=r,d),N(d)})),function(t,e){v(`https://nominatim.openstreetmap.org/reverse?lat=${t}&lon=${e}&format=jsonv2&accept-language=en`,(t=>{let e=(t=JSON.parse(t)).address,n=e.city||e.town||e.village||e.hamlet,o=e.state,i=e.country;null!=o||(o=""),null!=n||(n=""),f=[i,o,n]}))}(e,o)}))}function O(t){!1!==t?(n(0,u.innerHTML="You have been added to our database! Now go to our Discord to verify yourself.",u),n(0,u.style.color="green",u)):(n(0,u.innerHTML="Something went wrong.",u),n(0,u.style.color="red",u))}x(p,"countries",r),c((()=>{}));return[u,d,g,o,i,r,p,z,C,function(){if(null!=f){let t={country:f[0],state:f[1],town:f[2],latitude:h,longitude:b,contact:g.value};""==t.state&&(t.state=null),""==t.town&&(t.town=null),""==t.contact&&(t.contact=null),k("/"+z+"/groups-add-post/",t,O)}},function(t){m[t?"unshift":"push"]((()=>{d=t,n(1,d)}))},()=>N(d),function(t){m[t?"unshift":"push"]((()=>{g=t,n(2,g)}))},()=>N(g),function(t){m[t?"unshift":"push"]((()=>{u=t,n(0,u)}))},t=>C(t,i,z)]}class H extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},O,C,i,{},null),t&&t.target&&o(t.target,this,t.anchor)}}customElements.define("cooperatives-add-component",H);export{H as default};
diff --git a/Server/public/js/components/cooperatives-component.js b/Server/public/js/components/cooperatives-component.js
index 772910c..cdf7a37 100644
--- a/Server/public/js/components/cooperatives-component.js
+++ b/Server/public/js/components/cooperatives-component.js
@@ -1 +1 @@
-import{S as t,i as e,a as o,b as n,s as r,e as i,n as a,d as s,c,o as m,f as l,t as p,g,h as d,j as f,k as h,l as u,m as b,p as w}from"./index-4348483d.js";import{w as x}from"./index-71440b21.js";import{addMarkersCoops as v,coopsByCountry as j}from"../../../../../../../../../js/coops.js";import{loadLocaleContent as k}from"../../../../../../../../../js/libraries/serverTools.js";import"../../../../../../../../../js/components/map-component.js";function y(t,e,o){const n=t.slice();return n[9]=e[o][0],n[10]=e[o][1],n}function z(t,e,o){const n=t.slice();return n[13]=e[o],n}function D(t){let e,o,r,i,a,c,m,x,v,k,z,D,E,O,R,T,_,A,C,H,L=t[0].cooperatives+"",M=t[0].p1+"",S=t[0].subheading1+"",q=t[0]["map-prompt"]+"",B=Object.entries(j),F=[];for(let e=0;eo(1,r=t)));let a=x({});c(t,a,(t=>o(0,n=t)));let s=k(a,"countries",i);function l(t,e){let o=t([22,0],2);v(o,e,s)}k(a,"cooperatives-component",i),m((()=>{}));return[n,r,i,a,s,l,function(t){return"en"==s?t:n[t]},function(t){return t.location[0].map((t=>"en"==s?t:n[t])).join(", ")},t=>l(t,n)]}class _ extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},T,R,r,{},null),t&&t.target&&n(t.target,this,t.anchor)}}customElements.define("cooperatives-component",_);export{_ as default};
+import{S as t,i as e,a as o,b as n,s as r,e as i,n as s,d as a,c,o as m,g as l,t as p,h as g,j as d,k as u,l as f,m as h,q as b,u as w}from"./index-8c09578c.js";import{w as x}from"./index-77787e10.js";import{loadLocaleContent as v,getData as j}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as k,translate as y}from"../../../../../../../../../js/libraries/mapTools.js";import{addCoopPinContent as z}from"../../../../../../../../../js/mapFuncs.js";import"../../../../../../../../../js/components/map-component.js";function N(t,e,o){const n=t.slice();return n[12]=e[o][0],n[3]=e[o][1],n}function O(t,e,o){const n=t.slice();return n[15]=e[o],n}function T(t){let e,o,r,i,s,c,m,x,v,j,k,y,z,O,T,D,R,S,_,q,A=t[1].cooperatives+"",C=t[1].p1+"",F=t[1].subheading1+"",H=t[1]["map-prompt"]+"",J=Object.entries(t[0]),K=[];for(let e=0;eo(2,r=t)));let s,a,l=x({});c(t,l,(t=>o(1,n=t)));let p=v(l,"cooperatives-component",i);v(l,"countries",i);function g(t,e,o){let n=t([22,0],2);k(s,a,n,e,o,z,"blue")}j("/assets/cooperatives.json",(t=>{o(3,s=JSON.parse(t)),o(0,a={});for(let t of s){let e=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),e in a?a[e].push(t):o(0,a[e]=[t],a)}i.update((t=>t+1))})),m((()=>{}));return[a,n,r,s,i,l,p,g,function(t){return"en"==p?t:y(n,t)},function(t){return[t.country,t.state,t.town].filter((t=>null!=t)).map((t=>"en"==p?t:y(n,t))).join(", ")},t=>g(t,n,p)]}class q extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},_,S,r,{},null),t&&t.target&&n(t.target,this,t.anchor)}}customElements.define("cooperatives-component",q);export{q as default};
diff --git a/Server/public/js/components/footer-component.js b/Server/public/js/components/footer-component.js
index 008f55c..9784739 100644
--- a/Server/public/js/components/footer-component.js
+++ b/Server/public/js/components/footer-component.js
@@ -1 +1 @@
-import{S as t,i as e,a as o,b as r,s as a,e as i,n,d as s,c as m,f as c,t as f,g as d,h as l,v as g,l as h,q as p,m as u}from"./index-4348483d.js";import{w as b}from"./index-71440b21.js";import{loadLocaleContent as w}from"../../../../../../../../../js/libraries/serverTools.js";function v(t){let e,o,a,i,n,m,b,w,v,k,y,x,L,j,z,U,_,C,T,B,H,M,R=t[1].contactUs+"",A=t[1].inviteLink+"",D=t[1].inviteLink+"";return{c(){e=c("footer"),o=c("div"),a=c("div"),i=c("div"),n=c("h2"),m=f(R),b=d(),w=c("p"),v=f("Discord: "),k=c("a"),y=f(A),x=d(),L=c("p"),j=f("WhatsApp: "),z=c("a"),U=f(D),_=d(),C=c("button"),C.innerHTML=' ',T=d(),B=c("p"),B.innerHTML='Licensed under a Creative Commons CC BY 4.0 license ',l(k,"href","https://discord.gg/Qk8KUk787z"),l(k,"target","_blank"),l(k,"rel","noreferrer"),g(k,"margin-left","1.8rem"),l(z,"href","https://chat.whatsapp.com/BhnmUNljUxJ2AjeHUwyTKh"),l(z,"target","_blank"),l(z,"rel","noreferrer"),g(z,"margin-left","0.5rem"),l(i,"id","contact-us-container"),l(a,"id","footer-grid-content-container"),l(a,"class","logged"),l(C,"id","footer-up"),l(C,"aria-label","go up"),l(B,"id","footer-copyright"),l(o,"id","footer-content-container")},m(s,c){r(s,e,c),h(e,o),h(o,a),h(a,i),h(i,n),h(n,m),h(i,b),h(i,w),h(w,v),h(w,k),h(k,y),h(i,x),h(i,L),h(L,j),h(L,z),h(z,U),h(o,_),h(o,C),h(o,T),h(o,B),H||(M=p(C,"click",t[4]),H=!0)},p(t,e){2&e&&R!==(R=t[1].contactUs+"")&&u(m,R),2&e&&A!==(A=t[1].inviteLink+"")&&u(y,A),2&e&&D!==(D=t[1].inviteLink+"")&&u(U,D)},d(t){t&&s(e),H=!1,M()}}}function k(t){let e,o=2==t[0]&&v(t);return{c(){o&&o.c(),e=i()},m(t,a){o&&o.m(t,a),r(t,e,a)},p(t,r){2==t[0]?o?o.p(t,r):(o=v(t),o.c(),o.m(e.parentNode,e)):o&&(o.d(1),o=null)},d(t){o&&o.d(t),t&&s(e)}}}function y(t){let e,o=t[0],m=k(t);return{c(){m.c(),e=i(),this.c=n},m(t,o){m.m(t,o),r(t,e,o)},p(t,[r]){1&r&&a(o,o=t[0])?(m.d(1),m=k(t),m.c(),m.m(e.parentNode,e)):m.p(t,r)},i:n,o:n,d(t){t&&s(e),m.d(t)}}}function x(t,e,o){let r,a,i=b(0);m(t,i,(t=>o(0,r=t)));let n=b({});m(t,n,(t=>o(1,a=t))),w(n,"countries",i),w(n,"footer-component",i);return[r,a,i,n,()=>{location.href="#"}]}class L extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},x,y,a,{},null),t&&t.target&&r(t.target,this,t.anchor)}}customElements.define("footer-component",L);export{L as default};
+import{S as t,i as e,a as o,b as r,s as a,e as i,n,d as s,c as m,g as c,t as f,h as d,j as l,w as g,m as p,p as h,q as u}from"./index-8c09578c.js";import{w}from"./index-77787e10.js";import{loadLocaleContent as b}from"../../../../../../../../../js/libraries/serverTools.js";function v(t){let e,o,a,i,n,m,w,b,v,k,y,x,L,j,z,U,_,C,T,B,H,M,R=t[1].contactUs+"",A=t[1].inviteLink+"",D=t[1].inviteLink+"";return{c(){e=c("footer"),o=c("div"),a=c("div"),i=c("div"),n=c("h2"),m=f(R),w=d(),b=c("p"),v=f("Discord: "),k=c("a"),y=f(A),x=d(),L=c("p"),j=f("WhatsApp: "),z=c("a"),U=f(D),_=d(),C=c("button"),C.innerHTML=' ',T=d(),B=c("p"),B.innerHTML='Licensed under a Creative Commons CC BY 4.0 license ',l(k,"href","https://discord.gg/Qk8KUk787z"),l(k,"target","_blank"),l(k,"rel","noreferrer"),g(k,"margin-left","1.8rem"),l(z,"href","https://chat.whatsapp.com/BhnmUNljUxJ2AjeHUwyTKh"),l(z,"target","_blank"),l(z,"rel","noreferrer"),g(z,"margin-left","0.5rem"),l(i,"id","contact-us-container"),l(a,"id","footer-grid-content-container"),l(a,"class","logged"),l(C,"id","footer-up"),l(C,"aria-label","go up"),l(B,"id","footer-copyright"),l(o,"id","footer-content-container")},m(s,c){r(s,e,c),p(e,o),p(o,a),p(a,i),p(i,n),p(n,m),p(i,w),p(i,b),p(b,v),p(b,k),p(k,y),p(i,x),p(i,L),p(L,j),p(L,z),p(z,U),p(o,_),p(o,C),p(o,T),p(o,B),H||(M=h(C,"click",t[4]),H=!0)},p(t,e){2&e&&R!==(R=t[1].contactUs+"")&&u(m,R),2&e&&A!==(A=t[1].inviteLink+"")&&u(y,A),2&e&&D!==(D=t[1].inviteLink+"")&&u(U,D)},d(t){t&&s(e),H=!1,M()}}}function k(t){let e,o=2==t[0]&&v(t);return{c(){o&&o.c(),e=i()},m(t,a){o&&o.m(t,a),r(t,e,a)},p(t,r){2==t[0]?o?o.p(t,r):(o=v(t),o.c(),o.m(e.parentNode,e)):o&&(o.d(1),o=null)},d(t){o&&o.d(t),t&&s(e)}}}function y(t){let e,o=t[0],m=k(t);return{c(){m.c(),e=i(),this.c=n},m(t,o){m.m(t,o),r(t,e,o)},p(t,[r]){1&r&&a(o,o=t[0])?(m.d(1),m=k(t),m.c(),m.m(e.parentNode,e)):m.p(t,r)},i:n,o:n,d(t){t&&s(e),m.d(t)}}}function x(t,e,o){let r,a,i=w(0);m(t,i,(t=>o(0,r=t)));let n=w({});m(t,n,(t=>o(1,a=t))),b(n,"countries",i),b(n,"footer-component",i);return[r,a,i,n,()=>{location.href="#"}]}class L extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},x,y,a,{},null),t&&t.target&&r(t.target,this,t.anchor)}}customElements.define("footer-component",L);export{L as default};
diff --git a/Server/public/js/components/groups-add-component.js b/Server/public/js/components/groups-add-component.js
index b1931fa..67a18d0 100644
--- a/Server/public/js/components/groups-add-component.js
+++ b/Server/public/js/components/groups-add-component.js
@@ -1 +1 @@
-import{S as t,i as n,a as e,b as o,s as i,e as r,n as a,d as s,c as l,o as m,w as c,f as p,g as u,h as d,j as g,k as h,l as f,q as b,r as w}from"./index-4348483d.js";import{w as y}from"./index-71440b21.js";import{addMarkersGroups as v}from"../../../../../../../../../js/groups.js";import{getData as x,loadLocaleContent as k,sendData as j}from"../../../../../../../../../js/libraries/serverTools.js";import"../../../../../../../../../js/components/map-component.js";function S(t){let n,e,i,r,a,l,m,c,y,v,x,k,j,L,S,z,C,T,N,O,H,M,A,$,q,E,J,U,D,I,R,G,K,P,Q;return{c(){n=p("div"),e=p("div"),i=p("h1"),i.textContent="Add a Group",r=u(),a=p("img"),m=u(),c=p("p"),c.textContent="If there are no groups in your town with whom you can organize then do the following:",y=u(),v=p("ol"),v.innerHTML="Click on the map to show us where you are located; \n Add a way to contact you or leave blank for a pin to point to our discord; \n Press "Submit" to add yourself to our map; \n Verify yourself by having a chat with us at our Discord server to show on the map; ",x=u(),k=p("div"),j=p("label"),j.textContent="Location:",L=u(),S=p("div"),z=p("input"),C=u(),T=p("div"),N=u(),O=p("div"),H=p("label"),H.textContent="Contact:",M=u(),A=p("div"),$=p("input"),q=u(),E=p("div"),J=u(),U=p("button"),U.textContent="Submit",D=u(),I=p("p"),R=u(),G=p("map-component"),d(a,"id","groups-img"),g(a.src,l="/img/common/groups.svg")||d(a,"src","/img/common/groups.svg"),d(a,"alt","groups"),d(c,"class","description"),d(j,"for","address-input"),d(z,"id","address-input"),d(z,"type","text"),z.readOnly=!0,d(T,"class","ghost-input"),d(S,"class","input-wrapper"),d(k,"id","address-input-wrapper"),d(k,"class","input-label-wrapper"),d(H,"for","contact-input"),d($,"id","contact-input"),d($,"type","text"),d(E,"class","ghost-input"),d(A,"class","input-wrapper"),d(O,"class","input-label-wrapper"),d(U,"id","submit-button"),d(I,"id","confirmation-msg"),h(G,"id","map"),h(G,"callback",K=t[15]),d(e,"id","text-container"),d(n,"id","container")},m(s,l){o(s,n,l),f(n,e),f(e,i),f(e,r),f(e,a),f(e,m),f(e,c),f(e,y),f(e,v),f(e,x),f(e,k),f(k,j),f(k,L),f(k,S),f(S,z),t[10](z),f(S,C),f(S,T),f(e,N),f(e,O),f(O,H),f(O,M),f(O,A),f(A,$),t[12]($),f(A,q),f(A,E),f(e,J),f(e,U),f(e,D),f(e,I),t[14](I),f(e,R),f(e,G),P||(Q=[b(z,"input",t[11]),b($,"input",t[13]),b(U,"click",t[9])],P=!0)},p(t,n){16&n&&K!==(K=t[15])&&h(G,"callback",K)},d(e){e&&s(n),t[10](null),t[12](null),t[14](null),P=!1,w(Q)}}}function z(t){let n,e=3==t[3]&&S(t);return{c(){e&&e.c(),n=r()},m(t,i){e&&e.m(t,i),o(t,n,i)},p(t,o){3==t[3]?e?e.p(t,o):(e=S(t),e.c(),e.m(n.parentNode,n)):e&&(e.d(1),e=null)},d(t){e&&e.d(t),t&&s(n)}}}function C(t){let n,e=t[3],l=z(t);return{c(){l.c(),n=r(),this.c=a},m(t,e){l.m(t,e),o(t,n,e)},p(t,[o]){8&o&&i(e,e=t[3])?(l.d(1),l=z(t),l.c(),l.m(n.parentNode,n)):l.p(t,o)},i:a,o:a,d(t){t&&s(n),l.d(t)}}}function T(t){t.nextElementSibling.innerHTML=t.value}function N(t,n,e){let o,i,r=y(0);l(t,r,(t=>e(3,o=t)));let a,s,p=y({});l(t,p,(t=>e(4,i=t)));let u,d,g,h;x("/assets/groups.json",(t=>{a=JSON.parse(t),s={};for(let t of a){let n=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),n in s?s[n].push(t):s[n]=[t]}r.update((t=>t+1))}));let f=0,b=0,w=function(t,n){let e=new L.Icon({iconUrl:"/img/common/markers/marker-black.png",shadowUrl:"https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]});return L.marker([t,n],{icon:e})}(0,0);w.setOpacity(0);let S=k(p,"groups-component",r);function z(t,n,o){let i=t([22,0],2);v(a,s,i,n,o),w.addTo(i),i.on("click",(function(t){let n=t.latlng.lat,o=t.latlng.lng;f=n,b=o,function(t,n,e){let o=L.latLng(n,e);t.setLatLng(o)}(w,n,o),w.setOpacity(1),x(`https://nominatim.openstreetmap.org/reverse?lat=${n}&lon=${o}&format=jsonv2`,(t=>{let n=(t=JSON.parse(t)).address,o=n.city||n.town||n.village||n.hamlet,i=n.state,r=n.country;null!=i?r+=", "+i:i="",null!=o?r+=", "+o:o="",e(1,d.value=r,d),T(d)})),function(t,n){x(`https://nominatim.openstreetmap.org/reverse?lat=${t}&lon=${n}&format=jsonv2&accept-language=en`,(t=>{let n=(t=JSON.parse(t)).address,e=n.city||n.town||n.village||n.hamlet,o=n.state,i=n.country;null!=o||(o=""),null!=e||(e=""),h=[i,o,e]}))}(n,o)}))}function C(t){!1!==t?(e(0,u.innerHTML="You have been added to our database! Now go to our Discord to verify yourself.",u),e(0,u.style.color="green",u)):(e(0,u.innerHTML="Something went wrong.",u),e(0,u.style.color="red",u))}k(p,"countries",r),m((()=>{}));return[u,d,g,o,i,r,p,S,z,function(){if(null!=h){let t={country:h[0],state:h[1],town:h[2],latitude:f,longitude:b,contact:g.value};""==t.state&&(t.state=null),""==t.town&&(t.town=null),""==t.contact&&(t.contact=null),j("/"+S+"/groups-add-post/",t,C)}},function(t){c[t?"unshift":"push"]((()=>{d=t,e(1,d)}))},()=>T(d),function(t){c[t?"unshift":"push"]((()=>{g=t,e(2,g)}))},()=>T(g),function(t){c[t?"unshift":"push"]((()=>{u=t,e(0,u)}))},t=>z(t,i,S)]}class O extends t{constructor(t){super(),this.shadowRoot.innerHTML="",n(this,{target:this.shadowRoot,props:e(this.attributes),customElement:!0},N,C,i,{},null),t&&t.target&&o(t.target,this,t.anchor)}}customElements.define("groups-add-component",O);export{O as default};
+import{S as t,i as e,a as n,b as o,s as i,e as r,n as a,d as s,c as l,o as c,f as m,g as p,h as u,j as d,k as g,l as f,m as h,p as b,r as w}from"./index-8c09578c.js";import{w as y}from"./index-77787e10.js";import{getData as v,loadLocaleContent as x,sendData as k}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as j,translate as S}from"../../../../../../../../../js/libraries/mapTools.js";import"../../../../../../../../../js/components/map-component.js";function z(t){let e,n,i,r,a,l,c,m,y,v,x,k,j,L,S,z,T,C,N,O,H,M,A,$,E,J,U,q,D,G,I,R,K,P,Q;return{c(){e=p("div"),n=p("div"),i=p("h1"),i.textContent="Add a Group",r=u(),a=p("img"),c=u(),m=p("p"),m.textContent="If there are no groups in your town with whom you can organize then do the following:",y=u(),v=p("ol"),v.innerHTML="Click on the map to show us where you are located; \n Add a way to contact you or leave blank for a pin to point to our discord; \n Press "Submit" to add yourself to our map; \n Verify yourself by having a chat with us at our Discord server to show on the map; ",x=u(),k=p("div"),j=p("label"),j.textContent="Location:",L=u(),S=p("div"),z=p("input"),T=u(),C=p("div"),N=u(),O=p("div"),H=p("label"),H.textContent="Contact:",M=u(),A=p("div"),$=p("input"),E=u(),J=p("div"),U=u(),q=p("button"),q.textContent="Submit",D=u(),G=p("p"),I=u(),R=p("map-component"),d(a,"id","groups-img"),g(a.src,l="/img/common/groups.svg")||d(a,"src","/img/common/groups.svg"),d(a,"alt","groups"),d(m,"class","description"),d(j,"for","address-input"),d(z,"id","address-input"),d(z,"type","text"),z.readOnly=!0,d(C,"class","ghost-input"),d(S,"class","input-wrapper"),d(k,"id","address-input-wrapper"),d(k,"class","input-label-wrapper"),d(H,"for","contact-input"),d($,"id","contact-input"),d($,"type","text"),d(J,"class","ghost-input"),d(A,"class","input-wrapper"),d(O,"class","input-label-wrapper"),d(q,"id","submit-button"),d(G,"id","confirmation-msg"),f(R,"id","map"),f(R,"callback",K=t[15]),d(n,"id","text-container"),d(e,"id","container")},m(s,l){o(s,e,l),h(e,n),h(n,i),h(n,r),h(n,a),h(n,c),h(n,m),h(n,y),h(n,v),h(n,x),h(n,k),h(k,j),h(k,L),h(k,S),h(S,z),t[10](z),h(S,T),h(S,C),h(n,N),h(n,O),h(O,H),h(O,M),h(O,A),h(A,$),t[12]($),h(A,E),h(A,J),h(n,U),h(n,q),h(n,D),h(n,G),t[14](G),h(n,I),h(n,R),P||(Q=[b(z,"input",t[11]),b($,"input",t[13]),b(q,"click",t[9])],P=!0)},p(t,e){16&e&&K!==(K=t[15])&&f(R,"callback",K)},d(n){n&&s(e),t[10](null),t[12](null),t[14](null),P=!1,w(Q)}}}function T(t){let e,n=3==t[3]&&z(t);return{c(){n&&n.c(),e=r()},m(t,i){n&&n.m(t,i),o(t,e,i)},p(t,o){3==t[3]?n?n.p(t,o):(n=z(t),n.c(),n.m(e.parentNode,e)):n&&(n.d(1),n=null)},d(t){n&&n.d(t),t&&s(e)}}}function C(t){let e,n=t[3],l=T(t);return{c(){l.c(),e=r(),this.c=a},m(t,n){l.m(t,n),o(t,e,n)},p(t,[o]){8&o&&i(n,n=t[3])?(l.d(1),l=T(t),l.c(),l.m(e.parentNode,e)):l.p(t,o)},i:a,o:a,d(t){t&&s(e),l.d(t)}}}function N(t){t.nextElementSibling.innerHTML=t.value}function O(t,e,n){let o,i,r=y(0);l(t,r,(t=>n(3,o=t)));let a,s,p=y({});l(t,p,(t=>n(4,i=t)));let u,d,g,f;v("/assets/groups.json",(t=>{a=JSON.parse(t),s={};for(let t of a){let e=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),e in s?s[e].push(t):s[e]=[t]}r.update((t=>t+1))}));let h=0,b=0,w=function(t,e){let n=new L.Icon({iconUrl:"/img/common/markers/marker-black.png",shadowUrl:"https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]});return L.marker([t,e],{icon:n})}(0,0);w.setOpacity(0);let z=x(p,"groups-component",r);function T(t,e,n){let o,i=""+e.Group+" ";for(let r of["location","members","contact"]){let a=e[r]+": ";if("contact"==r)i+=a+""+t.contact+" ";else if("location"==r){let r,s=[t.country,t.state,t.town].filter((t=>null!=t&&null!=t));r="en"==n?s.map((t=>t)).join(", "):s.map((t=>S(e,t))).join(", "),i+=a+r+" ",o=[t.latitude,t.longitude]}else i+=a+t[r]+" "}return{text:i,coordinates:o}}function C(t,e,o){let i=t([22,0],2);j(a,s,i,e,o,T,"green"),w.addTo(i),i.on("click",(function(t){let e=t.latlng.lat,o=t.latlng.lng;h=e,b=o,function(t,e,n){let o=L.latLng(e,n);t.setLatLng(o)}(w,e,o),w.setOpacity(1),v(`https://nominatim.openstreetmap.org/reverse?lat=${e}&lon=${o}&format=jsonv2`,(t=>{let e=(t=JSON.parse(t)).address,o=e.city||e.town||e.village||e.hamlet,i=e.state,r=e.country;null!=i?r+=", "+i:i="",null!=o?r+=", "+o:o="",n(1,d.value=r,d),N(d)})),function(t,e){v(`https://nominatim.openstreetmap.org/reverse?lat=${t}&lon=${e}&format=jsonv2&accept-language=en`,(t=>{let e=(t=JSON.parse(t)).address,n=e.city||e.town||e.village||e.hamlet,o=e.state,i=e.country;null!=o||(o=""),null!=n||(n=""),f=[i,o,n]}))}(e,o)}))}function O(t){!1!==t?(n(0,u.innerHTML="You have been added to our database! Now go to our Discord to verify yourself.",u),n(0,u.style.color="green",u)):(n(0,u.innerHTML="Something went wrong.",u),n(0,u.style.color="red",u))}x(p,"countries",r),c((()=>{}));return[u,d,g,o,i,r,p,z,C,function(){if(null!=f){let t={country:f[0],state:f[1],town:f[2],latitude:h,longitude:b,contact:g.value};""==t.state&&(t.state=null),""==t.town&&(t.town=null),""==t.contact&&(t.contact=null),k("/"+z+"/groups-add-post/",t,O)}},function(t){m[t?"unshift":"push"]((()=>{d=t,n(1,d)}))},()=>N(d),function(t){m[t?"unshift":"push"]((()=>{g=t,n(2,g)}))},()=>N(g),function(t){m[t?"unshift":"push"]((()=>{u=t,n(0,u)}))},t=>C(t,i,z)]}class H extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},O,C,i,{},null),t&&t.target&&o(t.target,this,t.anchor)}}customElements.define("groups-add-component",H);export{H as default};
diff --git a/Server/public/js/components/groups-component.js b/Server/public/js/components/groups-component.js
index dc4b9cd..17ab175 100644
--- a/Server/public/js/components/groups-component.js
+++ b/Server/public/js/components/groups-component.js
@@ -1 +1 @@
-import{S as t,i as o,a as n,b as e,s as r,e as s,n as a,d as i,c as m,o as c,f as l,t as p,g as u,h as g,j as d,k as f,l as h,m as b,p as j}from"./index-4348483d.js";import{w as x}from"./index-71440b21.js";import{addMarkersGroups as y,translate as v}from"../../../../../../../../../js/groups.js";import{loadLocaleContent as w,getData as k}from"../../../../../../../../../js/libraries/serverTools.js";import"../../../../../../../../../js/components/map-component.js";function z(t,o,n){const e=t.slice();return e[12]=o[n][0],e[3]=o[n][1],e}function N(t,o,n){const e=t.slice();return e[15]=o[n],e}function O(t){let o,n,r,s,a,m,c,x,y,v,w,k,N,O,D,R,S,T,A,C,H=t[1].groups+"",J=t[1].p1+"",K=t[1].subheading1+"",L=t[1]["map-prompt"]+"",M=Object.entries(t[0]),Q=[];for(let o=0;on(2,r=t)));let a,i,l=x({});m(t,l,(t=>n(1,e=t)));let p=w(l,"groups-component",s);w(l,"countries",s);function u(t,o,n){let e=t([22,0],2);y(a,i,e,o,n)}k("/assets/groups.json",(t=>{n(3,a=JSON.parse(t)),n(0,i={});for(let t of a){let o=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),o in i?i[o].push(t):n(0,i[o]=[t],i)}s.update((t=>t+1))})),c((()=>{}));return[i,e,r,a,s,l,p,u,function(t){return"en"==p?t:v(e,t)},function(t){return[t.country,t.state,t.town].filter((t=>null!=t)).map((t=>"en"==p?t:v(e,t))).join(", ")},t=>u(t,e,p)]}class A extends t{constructor(t){super(),this.shadowRoot.innerHTML="",o(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},T,S,r,{},null),t&&t.target&&e(t.target,this,t.anchor)}}customElements.define("groups-component",A);export{A as default};
+import{S as t,i as o,a as n,b as e,s as r,e as s,n as a,d as i,c as m,o as c,g as l,t as p,h as u,j as g,k as d,l as f,m as h,q as b,u as j}from"./index-8c09578c.js";import{w as x}from"./index-77787e10.js";import{loadLocaleContent as y,getData as v}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as w,translate as k}from"../../../../../../../../../js/libraries/mapTools.js";import{addGroupPinContent as z}from"../../../../../../../../../js/mapFuncs.js";import"../../../../../../../../../js/components/map-component.js";function N(t,o,n){const e=t.slice();return e[12]=o[n][0],e[3]=o[n][1],e}function O(t,o,n){const e=t.slice();return e[15]=o[n],e}function T(t){let o,n,r,s,a,m,c,x,y,v,w,k,z,O,T,D,R,S,q,A,C=t[1].groups+"",F=t[1].p1+"",H=t[1].subheading1+"",J=t[1]["map-prompt"]+"",K=Object.entries(t[0]),L=[];for(let o=0;on(2,r=t)));let a,i,l=x({});m(t,l,(t=>n(1,e=t)));let p=y(l,"groups-component",s);y(l,"countries",s);function u(t,o,n){let e=t([22,0],2);w(a,i,e,o,n,z,"green")}v("/assets/groups.json",(t=>{n(3,a=JSON.parse(t)),n(0,i={});for(let t of a){let o=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),o in i?i[o].push(t):n(0,i[o]=[t],i)}s.update((t=>t+1))})),c((()=>{}));return[i,e,r,a,s,l,p,u,function(t){return"en"==p?t:k(e,t)},function(t){return[t.country,t.state,t.town].filter((t=>null!=t)).map((t=>"en"==p?t:k(e,t))).join(", ")},t=>u(t,e,p)]}class A extends t{constructor(t){super(),this.shadowRoot.innerHTML="",o(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},q,S,r,{},null),t&&t.target&&e(t.target,this,t.anchor)}}customElements.define("groups-component",A);export{A as default};
diff --git a/Server/public/js/components/index-54dd49e1.js b/Server/public/js/components/index-54dd49e1.js
new file mode 100644
index 0000000..70a80e3
--- /dev/null
+++ b/Server/public/js/components/index-54dd49e1.js
@@ -0,0 +1,513 @@
+
+(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
+function noop() { }
+function add_location(element, file, line, column, char) {
+ element.__svelte_meta = {
+ loc: { file, line, column, char }
+ };
+}
+function run(fn) {
+ return fn();
+}
+function blank_object() {
+ return Object.create(null);
+}
+function run_all(fns) {
+ fns.forEach(run);
+}
+function is_function(thing) {
+ return typeof thing === 'function';
+}
+function safe_not_equal(a, b) {
+ return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
+}
+let src_url_equal_anchor;
+function src_url_equal(element_src, url) {
+ if (!src_url_equal_anchor) {
+ src_url_equal_anchor = document.createElement('a');
+ }
+ src_url_equal_anchor.href = url;
+ return element_src === src_url_equal_anchor.href;
+}
+function is_empty(obj) {
+ return Object.keys(obj).length === 0;
+}
+function validate_store(store, name) {
+ if (store != null && typeof store.subscribe !== 'function') {
+ throw new Error(`'${name}' is not a store with a 'subscribe' method`);
+ }
+}
+function subscribe(store, ...callbacks) {
+ if (store == null) {
+ return noop;
+ }
+ const unsub = store.subscribe(...callbacks);
+ return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;
+}
+function component_subscribe(component, store, callback) {
+ component.$$.on_destroy.push(subscribe(store, callback));
+}
+function append(target, node) {
+ target.appendChild(node);
+}
+function insert(target, node, anchor) {
+ target.insertBefore(node, anchor || null);
+}
+function detach(node) {
+ node.parentNode.removeChild(node);
+}
+function destroy_each(iterations, detaching) {
+ for (let i = 0; i < iterations.length; i += 1) {
+ if (iterations[i])
+ iterations[i].d(detaching);
+ }
+}
+function element(name) {
+ return document.createElement(name);
+}
+function svg_element(name) {
+ return document.createElementNS('http://www.w3.org/2000/svg', name);
+}
+function text(data) {
+ return document.createTextNode(data);
+}
+function space() {
+ return text(' ');
+}
+function empty() {
+ return text('');
+}
+function listen(node, event, handler, options) {
+ node.addEventListener(event, handler, options);
+ return () => node.removeEventListener(event, handler, options);
+}
+function attr(node, attribute, value) {
+ if (value == null)
+ node.removeAttribute(attribute);
+ else if (node.getAttribute(attribute) !== value)
+ node.setAttribute(attribute, value);
+}
+function set_custom_element_data(node, prop, value) {
+ if (prop in node) {
+ node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;
+ }
+ else {
+ attr(node, prop, value);
+ }
+}
+function children(element) {
+ return Array.from(element.childNodes);
+}
+function set_style(node, key, value, important) {
+ if (value === null) {
+ node.style.removeProperty(key);
+ }
+ else {
+ node.style.setProperty(key, value, important ? 'important' : '');
+ }
+}
+function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {
+ const e = document.createEvent('CustomEvent');
+ e.initCustomEvent(type, bubbles, cancelable, detail);
+ return e;
+}
+class HtmlTag {
+ constructor(is_svg = false) {
+ this.is_svg = false;
+ this.is_svg = is_svg;
+ this.e = this.n = null;
+ }
+ c(html) {
+ this.h(html);
+ }
+ m(html, target, anchor = null) {
+ if (!this.e) {
+ if (this.is_svg)
+ this.e = svg_element(target.nodeName);
+ else
+ this.e = element(target.nodeName);
+ this.t = target;
+ this.c(html);
+ }
+ this.i(anchor);
+ }
+ h(html) {
+ this.e.innerHTML = html;
+ this.n = Array.from(this.e.childNodes);
+ }
+ i(anchor) {
+ for (let i = 0; i < this.n.length; i += 1) {
+ insert(this.t, this.n[i], anchor);
+ }
+ }
+ p(html) {
+ this.d();
+ this.h(html);
+ this.i(this.a);
+ }
+ d() {
+ this.n.forEach(detach);
+ }
+}
+function attribute_to_object(attributes) {
+ const result = {};
+ for (const attribute of attributes) {
+ result[attribute.name] = attribute.value;
+ }
+ return result;
+}
+
+let current_component;
+function set_current_component(component) {
+ current_component = component;
+}
+function get_current_component() {
+ if (!current_component)
+ throw new Error('Function called outside component initialization');
+ return current_component;
+}
+/**
+ * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.
+ * It must be called during the component's initialisation (but doesn't need to live *inside* the component;
+ * it can be called from an external module).
+ *
+ * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).
+ *
+ * https://svelte.dev/docs#run-time-svelte-onmount
+ */
+function onMount(fn) {
+ get_current_component().$$.on_mount.push(fn);
+}
+/**
+ * Associates an arbitrary `context` object with the current component and the specified `key`
+ * and returns that object. The context is then available to children of the component
+ * (including slotted content) with `getContext`.
+ *
+ * Like lifecycle functions, this must be called during component initialisation.
+ *
+ * https://svelte.dev/docs#run-time-svelte-setcontext
+ */
+function setContext(key, context) {
+ get_current_component().$$.context.set(key, context);
+ return context;
+}
+/**
+ * Retrieves the context that belongs to the closest parent component with the specified `key`.
+ * Must be called during component initialisation.
+ *
+ * https://svelte.dev/docs#run-time-svelte-getcontext
+ */
+function getContext(key) {
+ return get_current_component().$$.context.get(key);
+}
+
+const dirty_components = [];
+const binding_callbacks = [];
+const render_callbacks = [];
+const flush_callbacks = [];
+const resolved_promise = Promise.resolve();
+let update_scheduled = false;
+function schedule_update() {
+ if (!update_scheduled) {
+ update_scheduled = true;
+ resolved_promise.then(flush);
+ }
+}
+function add_render_callback(fn) {
+ render_callbacks.push(fn);
+}
+// flush() calls callbacks in this order:
+// 1. All beforeUpdate callbacks, in order: parents before children
+// 2. All bind:this callbacks, in reverse order: children before parents.
+// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT
+// for afterUpdates called during the initial onMount, which are called in
+// reverse order: children before parents.
+// Since callbacks might update component values, which could trigger another
+// call to flush(), the following steps guard against this:
+// 1. During beforeUpdate, any updated components will be added to the
+// dirty_components array and will cause a reentrant call to flush(). Because
+// the flush index is kept outside the function, the reentrant call will pick
+// up where the earlier call left off and go through all dirty components. The
+// current_component value is saved and restored so that the reentrant call will
+// not interfere with the "parent" flush() call.
+// 2. bind:this callbacks cannot trigger new flush() calls.
+// 3. During afterUpdate, any updated components will NOT have their afterUpdate
+// callback called a second time; the seen_callbacks set, outside the flush()
+// function, guarantees this behavior.
+const seen_callbacks = new Set();
+let flushidx = 0; // Do *not* move this inside the flush() function
+function flush() {
+ const saved_component = current_component;
+ do {
+ // first, call beforeUpdate functions
+ // and update components
+ while (flushidx < dirty_components.length) {
+ const component = dirty_components[flushidx];
+ flushidx++;
+ set_current_component(component);
+ update(component.$$);
+ }
+ set_current_component(null);
+ dirty_components.length = 0;
+ flushidx = 0;
+ while (binding_callbacks.length)
+ binding_callbacks.pop()();
+ // then, once components are updated, call
+ // afterUpdate functions. This may cause
+ // subsequent updates...
+ for (let i = 0; i < render_callbacks.length; i += 1) {
+ const callback = render_callbacks[i];
+ if (!seen_callbacks.has(callback)) {
+ // ...so guard against infinite loops
+ seen_callbacks.add(callback);
+ callback();
+ }
+ }
+ render_callbacks.length = 0;
+ } while (dirty_components.length);
+ while (flush_callbacks.length) {
+ flush_callbacks.pop()();
+ }
+ update_scheduled = false;
+ seen_callbacks.clear();
+ set_current_component(saved_component);
+}
+function update($$) {
+ if ($$.fragment !== null) {
+ $$.update();
+ run_all($$.before_update);
+ const dirty = $$.dirty;
+ $$.dirty = [-1];
+ $$.fragment && $$.fragment.p($$.ctx, dirty);
+ $$.after_update.forEach(add_render_callback);
+ }
+}
+const outroing = new Set();
+function transition_in(block, local) {
+ if (block && block.i) {
+ outroing.delete(block);
+ block.i(local);
+ }
+}
+
+const globals = (typeof window !== 'undefined'
+ ? window
+ : typeof globalThis !== 'undefined'
+ ? globalThis
+ : global);
+function mount_component(component, target, anchor, customElement) {
+ const { fragment, after_update } = component.$$;
+ fragment && fragment.m(target, anchor);
+ if (!customElement) {
+ // onMount happens before the initial afterUpdate
+ add_render_callback(() => {
+ const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);
+ // if the component was destroyed immediately
+ // it will update the `$$.on_destroy` reference to `null`.
+ // the destructured on_destroy may still reference to the old array
+ if (component.$$.on_destroy) {
+ component.$$.on_destroy.push(...new_on_destroy);
+ }
+ else {
+ // Edge case - component was destroyed immediately,
+ // most likely as a result of a binding initialising
+ run_all(new_on_destroy);
+ }
+ component.$$.on_mount = [];
+ });
+ }
+ after_update.forEach(add_render_callback);
+}
+function destroy_component(component, detaching) {
+ const $$ = component.$$;
+ if ($$.fragment !== null) {
+ run_all($$.on_destroy);
+ $$.fragment && $$.fragment.d(detaching);
+ // TODO null out other refs, including component.$$ (but need to
+ // preserve final state?)
+ $$.on_destroy = $$.fragment = null;
+ $$.ctx = [];
+ }
+}
+function make_dirty(component, i) {
+ if (component.$$.dirty[0] === -1) {
+ dirty_components.push(component);
+ schedule_update();
+ component.$$.dirty.fill(0);
+ }
+ component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));
+}
+function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {
+ const parent_component = current_component;
+ set_current_component(component);
+ const $$ = component.$$ = {
+ fragment: null,
+ ctx: [],
+ // state
+ props,
+ update: noop,
+ not_equal,
+ bound: blank_object(),
+ // lifecycle
+ on_mount: [],
+ on_destroy: [],
+ on_disconnect: [],
+ before_update: [],
+ after_update: [],
+ context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
+ // everything else
+ callbacks: blank_object(),
+ dirty,
+ skip_bound: false,
+ root: options.target || parent_component.$$.root
+ };
+ append_styles && append_styles($$.root);
+ let ready = false;
+ $$.ctx = instance
+ ? instance(component, options.props || {}, (i, ret, ...rest) => {
+ const value = rest.length ? rest[0] : ret;
+ if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
+ if (!$$.skip_bound && $$.bound[i])
+ $$.bound[i](value);
+ if (ready)
+ make_dirty(component, i);
+ }
+ return ret;
+ })
+ : [];
+ $$.update();
+ ready = true;
+ run_all($$.before_update);
+ // `false` as a special case of no DOM component
+ $$.fragment = create_fragment ? create_fragment($$.ctx) : false;
+ if (options.target) {
+ if (options.hydrate) {
+ const nodes = children(options.target);
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ $$.fragment && $$.fragment.l(nodes);
+ nodes.forEach(detach);
+ }
+ else {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ $$.fragment && $$.fragment.c();
+ }
+ if (options.intro)
+ transition_in(component.$$.fragment);
+ mount_component(component, options.target, options.anchor, options.customElement);
+ flush();
+ }
+ set_current_component(parent_component);
+}
+let SvelteElement;
+if (typeof HTMLElement === 'function') {
+ SvelteElement = class extends HTMLElement {
+ constructor() {
+ super();
+ this.attachShadow({ mode: 'open' });
+ }
+ connectedCallback() {
+ const { on_mount } = this.$$;
+ this.$$.on_disconnect = on_mount.map(run).filter(is_function);
+ // @ts-ignore todo: improve typings
+ for (const key in this.$$.slotted) {
+ // @ts-ignore todo: improve typings
+ this.appendChild(this.$$.slotted[key]);
+ }
+ }
+ attributeChangedCallback(attr, _oldValue, newValue) {
+ this[attr] = newValue;
+ }
+ disconnectedCallback() {
+ run_all(this.$$.on_disconnect);
+ }
+ $destroy() {
+ destroy_component(this, 1);
+ this.$destroy = noop;
+ }
+ $on(type, callback) {
+ // TODO should this delegate to addEventListener?
+ if (!is_function(callback)) {
+ return noop;
+ }
+ const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
+ callbacks.push(callback);
+ return () => {
+ const index = callbacks.indexOf(callback);
+ if (index !== -1)
+ callbacks.splice(index, 1);
+ };
+ }
+ $set($$props) {
+ if (this.$$set && !is_empty($$props)) {
+ this.$$.skip_bound = true;
+ this.$$set($$props);
+ this.$$.skip_bound = false;
+ }
+ }
+ };
+}
+
+function dispatch_dev(type, detail) {
+ document.dispatchEvent(custom_event(type, Object.assign({ version: '3.52.0' }, detail), { bubbles: true }));
+}
+function append_dev(target, node) {
+ dispatch_dev('SvelteDOMInsert', { target, node });
+ append(target, node);
+}
+function insert_dev(target, node, anchor) {
+ dispatch_dev('SvelteDOMInsert', { target, node, anchor });
+ insert(target, node, anchor);
+}
+function detach_dev(node) {
+ dispatch_dev('SvelteDOMRemove', { node });
+ detach(node);
+}
+function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {
+ const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];
+ if (has_prevent_default)
+ modifiers.push('preventDefault');
+ if (has_stop_propagation)
+ modifiers.push('stopPropagation');
+ dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });
+ const dispose = listen(node, event, handler, options);
+ return () => {
+ dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });
+ dispose();
+ };
+}
+function attr_dev(node, attribute, value) {
+ attr(node, attribute, value);
+ if (value == null)
+ dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });
+ else
+ dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });
+}
+function prop_dev(node, property, value) {
+ node[property] = value;
+ dispatch_dev('SvelteDOMSetProperty', { node, property, value });
+}
+function set_data_dev(text, data) {
+ data = '' + data;
+ if (text.wholeText === data)
+ return;
+ dispatch_dev('SvelteDOMSetData', { node: text, data });
+ text.data = data;
+}
+function validate_each_argument(arg) {
+ if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {
+ let msg = '{#each} only iterates over array-like objects.';
+ if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {
+ msg += ' You can use a spread to convert this iterable into an array.';
+ }
+ throw new Error(msg);
+ }
+}
+function validate_slots(name, slot, keys) {
+ for (const slot_key of Object.keys(slot)) {
+ if (!~keys.indexOf(slot_key)) {
+ console.warn(`<${name}> received an unexpected slot "${slot_key}".`);
+ }
+ }
+}
+
+export { destroy_each as A, prop_dev as B, flush as C, set_style as D, getContext as E, setContext as F, svg_element as G, is_function as H, HtmlTag as I, SvelteElement as S, attribute_to_object as a, insert_dev as b, validate_store as c, dispatch_dev as d, component_subscribe as e, empty as f, detach_dev as g, binding_callbacks as h, init as i, element as j, space as k, add_location as l, attr_dev as m, noop as n, onMount as o, src_url_equal as p, set_custom_element_data as q, append_dev as r, safe_not_equal as s, listen_dev as t, run_all as u, validate_slots as v, globals as w, validate_each_argument as x, text as y, set_data_dev as z };
diff --git a/Server/public/js/components/index-6955b43d.js b/Server/public/js/components/index-6955b43d.js
new file mode 100644
index 0000000..a13d879
--- /dev/null
+++ b/Server/public/js/components/index-6955b43d.js
@@ -0,0 +1,53 @@
+
+(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
+import { n as noop, s as safe_not_equal } from './index-54dd49e1.js';
+
+const subscriber_queue = [];
+/**
+ * Create a `Writable` store that allows both updating and reading by subscription.
+ * @param {*=}value initial value
+ * @param {StartStopNotifier=}start start and stop notifications for subscriptions
+ */
+function writable(value, start = noop) {
+ let stop;
+ const subscribers = new Set();
+ function set(new_value) {
+ if (safe_not_equal(value, new_value)) {
+ value = new_value;
+ if (stop) { // store is ready
+ const run_queue = !subscriber_queue.length;
+ for (const subscriber of subscribers) {
+ subscriber[1]();
+ subscriber_queue.push(subscriber, value);
+ }
+ if (run_queue) {
+ for (let i = 0; i < subscriber_queue.length; i += 2) {
+ subscriber_queue[i][0](subscriber_queue[i + 1]);
+ }
+ subscriber_queue.length = 0;
+ }
+ }
+ }
+ }
+ function update(fn) {
+ set(fn(value));
+ }
+ function subscribe(run, invalidate = noop) {
+ const subscriber = [run, invalidate];
+ subscribers.add(subscriber);
+ if (subscribers.size === 1) {
+ stop = start(set) || noop;
+ }
+ run(value);
+ return () => {
+ subscribers.delete(subscriber);
+ if (subscribers.size === 0) {
+ stop();
+ stop = null;
+ }
+ };
+ }
+ return { set, update, subscribe };
+}
+
+export { writable as w };
diff --git a/Server/public/js/components/index-77787e10.js b/Server/public/js/components/index-77787e10.js
new file mode 100644
index 0000000..b14d61f
--- /dev/null
+++ b/Server/public/js/components/index-77787e10.js
@@ -0,0 +1 @@
+import{n,s as t}from"./index-8c09578c.js";const e=[];function s(s,o=n){let c;const i=new Set;function f(n){if(t(s,n)&&(s=n,c)){const n=!e.length;for(const n of i)n[1](),e.push(n,s);if(n){for(let n=0;n{i.delete(r),0===i.size&&(c(),c=null)}}}}export{s as w};
diff --git a/Server/public/js/components/index-8c09578c.js b/Server/public/js/components/index-8c09578c.js
new file mode 100644
index 0000000..de4894e
--- /dev/null
+++ b/Server/public/js/components/index-8c09578c.js
@@ -0,0 +1 @@
+function t(){}function n(t){return t()}function e(){return Object.create(null)}function o(t){t.forEach(n)}function s(t){return"function"==typeof t}function r(t,n){return t!=t?n==n:t!==n||t&&"object"==typeof t||"function"==typeof t}let i,c;function a(t,n){return i||(i=document.createElement("a")),i.href=n,t===i.href}function u(n,e,o){n.$$.on_destroy.push(function(n,...e){if(null==n)return t;const o=n.subscribe(...e);return o.unsubscribe?()=>o.unsubscribe():o}(e,o))}function f(t,n){t.appendChild(n)}function l(t,n,e){t.insertBefore(n,e||null)}function h(t){t.parentNode.removeChild(t)}function d(t,n){for(let e=0;et.removeEventListener(n,e,o)}function y(t,n,e){null==e?t.removeAttribute(n):t.getAttribute(n)!==e&&t.setAttribute(n,e)}function _(t,n,e){n in t?t[n]="boolean"==typeof t[n]&&""===e||e:y(t,n,e)}function x(t,n){n=""+n,t.wholeText!==n&&(t.data=n)}function v(t,n,e,o){null===e?t.style.removeProperty(n):t.style.setProperty(n,e,o?"important":"")}class E{constructor(t=!1){this.is_svg=!1,this.is_svg=t,this.e=this.n=null}c(t){this.h(t)}m(t,n,e=null){var o;this.e||(this.is_svg?this.e=(o=n.nodeName,document.createElementNS("http://www.w3.org/2000/svg",o)):this.e=$(n.nodeName),this.t=n,this.c(t)),this.i(e)}h(t){this.e.innerHTML=t,this.n=Array.from(this.e.childNodes)}i(t){for(let n=0;n{const o=e.length?e[0]:n;return m.ctx&&f(m.ctx[t],m.ctx[t]=o)&&(!m.skip_bound&&m.bound[t]&&m.bound[t](o),g&&D(r,t)),n})):[],m.update(),g=!0,o(m.before_update),m.fragment=!!u&&u(m.ctx),i.target){if(i.hydrate){const t=function(t){return Array.from(t.childNodes)}(i.target);m.fragment&&m.fragment.l(t),t.forEach(h)}else m.fragment&&m.fragment.c();i.intro&&((b=r.$$.fragment)&&b.i&&(F.delete(b),b.i(y))),function(t,e,r,i){const{fragment:c,after_update:a}=t.$$;c&&c.m(e,r),i||O((()=>{const e=t.$$.on_mount.map(n).filter(s);t.$$.on_destroy?t.$$.on_destroy.push(...e):o(e),t.$$.on_mount=[]})),a.forEach(O)}(r,i.target,i.anchor,i.customElement),z()}var b,y;k(p)}let I;"function"==typeof HTMLElement&&(I=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){const{on_mount:t}=this.$$;this.$$.on_disconnect=t.map(n).filter(s);for(const t in this.$$.slotted)this.appendChild(this.$$.slotted[t])}attributeChangedCallback(t,n,e){this[t]=e}disconnectedCallback(){o(this.$$.on_disconnect)}$destroy(){!function(t,n){const e=t.$$;null!==e.fragment&&(o(e.on_destroy),e.fragment&&e.fragment.d(n),e.on_destroy=e.fragment=null,e.ctx=[])}(this,1),this.$destroy=t}$on(n,e){if(!s(e))return t;const o=this.$$.callbacks[n]||(this.$$.callbacks[n]=[]);return o.push(e),()=>{const t=o.indexOf(e);-1!==t&&o.splice(t,1)}}$set(t){var n;this.$$set&&(n=t,0!==Object.keys(n).length)&&(this.$$.skip_bound=!0,this.$$set(t),this.$$.skip_bound=!1)}});export{E as H,I as S,w as a,l as b,u as c,h as d,g as e,S as f,$ as g,m as h,G as i,y as j,a as k,_ as l,f as m,t as n,N as o,b as p,x as q,o as r,r as s,p as t,d as u,z as v,v as w,A as x,s as y};
diff --git a/Server/public/js/components/index-ac368ab0.js b/Server/public/js/components/index-ac368ab0.js
new file mode 100644
index 0000000..551af6e
--- /dev/null
+++ b/Server/public/js/components/index-ac368ab0.js
@@ -0,0 +1,53 @@
+
+(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
+import { n as noop, s as safe_not_equal } from './index-d77c7bdd.js';
+
+const subscriber_queue = [];
+/**
+ * Create a `Writable` store that allows both updating and reading by subscription.
+ * @param {*=}value initial value
+ * @param {StartStopNotifier=}start start and stop notifications for subscriptions
+ */
+function writable(value, start = noop) {
+ let stop;
+ const subscribers = new Set();
+ function set(new_value) {
+ if (safe_not_equal(value, new_value)) {
+ value = new_value;
+ if (stop) { // store is ready
+ const run_queue = !subscriber_queue.length;
+ for (const subscriber of subscribers) {
+ subscriber[1]();
+ subscriber_queue.push(subscriber, value);
+ }
+ if (run_queue) {
+ for (let i = 0; i < subscriber_queue.length; i += 2) {
+ subscriber_queue[i][0](subscriber_queue[i + 1]);
+ }
+ subscriber_queue.length = 0;
+ }
+ }
+ }
+ }
+ function update(fn) {
+ set(fn(value));
+ }
+ function subscribe(run, invalidate = noop) {
+ const subscriber = [run, invalidate];
+ subscribers.add(subscriber);
+ if (subscribers.size === 1) {
+ stop = start(set) || noop;
+ }
+ run(value);
+ return () => {
+ subscribers.delete(subscriber);
+ if (subscribers.size === 0) {
+ stop();
+ stop = null;
+ }
+ };
+ }
+ return { set, update, subscribe };
+}
+
+export { writable as w };
diff --git a/Server/public/js/components/index-d77c7bdd.js b/Server/public/js/components/index-d77c7bdd.js
new file mode 100644
index 0000000..756ce7c
--- /dev/null
+++ b/Server/public/js/components/index-d77c7bdd.js
@@ -0,0 +1,521 @@
+
+(function(l, r) { if (!l || l.getElementById('livereloadscript')) return; r = l.createElement('script'); r.async = 1; r.src = '//' + (self.location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1'; r.id = 'livereloadscript'; l.getElementsByTagName('head')[0].appendChild(r) })(self.document);
+function noop() { }
+function add_location(element, file, line, column, char) {
+ element.__svelte_meta = {
+ loc: { file, line, column, char }
+ };
+}
+function run(fn) {
+ return fn();
+}
+function blank_object() {
+ return Object.create(null);
+}
+function run_all(fns) {
+ fns.forEach(run);
+}
+function is_function(thing) {
+ return typeof thing === 'function';
+}
+function safe_not_equal(a, b) {
+ return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
+}
+let src_url_equal_anchor;
+function src_url_equal(element_src, url) {
+ if (!src_url_equal_anchor) {
+ src_url_equal_anchor = document.createElement('a');
+ }
+ src_url_equal_anchor.href = url;
+ return element_src === src_url_equal_anchor.href;
+}
+function is_empty(obj) {
+ return Object.keys(obj).length === 0;
+}
+function validate_store(store, name) {
+ if (store != null && typeof store.subscribe !== 'function') {
+ throw new Error(`'${name}' is not a store with a 'subscribe' method`);
+ }
+}
+function subscribe(store, ...callbacks) {
+ if (store == null) {
+ return noop;
+ }
+ const unsub = store.subscribe(...callbacks);
+ return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;
+}
+function component_subscribe(component, store, callback) {
+ component.$$.on_destroy.push(subscribe(store, callback));
+}
+function append(target, node) {
+ target.appendChild(node);
+}
+function insert(target, node, anchor) {
+ target.insertBefore(node, anchor || null);
+}
+function detach(node) {
+ node.parentNode.removeChild(node);
+}
+function destroy_each(iterations, detaching) {
+ for (let i = 0; i < iterations.length; i += 1) {
+ if (iterations[i])
+ iterations[i].d(detaching);
+ }
+}
+function element(name) {
+ return document.createElement(name);
+}
+function svg_element(name) {
+ return document.createElementNS('http://www.w3.org/2000/svg', name);
+}
+function text(data) {
+ return document.createTextNode(data);
+}
+function space() {
+ return text(' ');
+}
+function empty() {
+ return text('');
+}
+function listen(node, event, handler, options) {
+ node.addEventListener(event, handler, options);
+ return () => node.removeEventListener(event, handler, options);
+}
+function attr(node, attribute, value) {
+ if (value == null)
+ node.removeAttribute(attribute);
+ else if (node.getAttribute(attribute) !== value)
+ node.setAttribute(attribute, value);
+}
+function set_custom_element_data(node, prop, value) {
+ if (prop in node) {
+ node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;
+ }
+ else {
+ attr(node, prop, value);
+ }
+}
+function children(element) {
+ return Array.from(element.childNodes);
+}
+function set_style(node, key, value, important) {
+ if (value === null) {
+ node.style.removeProperty(key);
+ }
+ else {
+ node.style.setProperty(key, value, important ? 'important' : '');
+ }
+}
+function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {
+ const e = document.createEvent('CustomEvent');
+ e.initCustomEvent(type, bubbles, cancelable, detail);
+ return e;
+}
+class HtmlTag {
+ constructor(is_svg = false) {
+ this.is_svg = false;
+ this.is_svg = is_svg;
+ this.e = this.n = null;
+ }
+ c(html) {
+ this.h(html);
+ }
+ m(html, target, anchor = null) {
+ if (!this.e) {
+ if (this.is_svg)
+ this.e = svg_element(target.nodeName);
+ else
+ this.e = element(target.nodeName);
+ this.t = target;
+ this.c(html);
+ }
+ this.i(anchor);
+ }
+ h(html) {
+ this.e.innerHTML = html;
+ this.n = Array.from(this.e.childNodes);
+ }
+ i(anchor) {
+ for (let i = 0; i < this.n.length; i += 1) {
+ insert(this.t, this.n[i], anchor);
+ }
+ }
+ p(html) {
+ this.d();
+ this.h(html);
+ this.i(this.a);
+ }
+ d() {
+ this.n.forEach(detach);
+ }
+}
+function attribute_to_object(attributes) {
+ const result = {};
+ for (const attribute of attributes) {
+ result[attribute.name] = attribute.value;
+ }
+ return result;
+}
+
+let current_component;
+function set_current_component(component) {
+ current_component = component;
+}
+function get_current_component() {
+ if (!current_component)
+ throw new Error('Function called outside component initialization');
+ return current_component;
+}
+/**
+ * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.
+ * It must be called during the component's initialisation (but doesn't need to live *inside* the component;
+ * it can be called from an external module).
+ *
+ * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).
+ *
+ * https://svelte.dev/docs#run-time-svelte-onmount
+ */
+function onMount(fn) {
+ get_current_component().$$.on_mount.push(fn);
+}
+/**
+ * Associates an arbitrary `context` object with the current component and the specified `key`
+ * and returns that object. The context is then available to children of the component
+ * (including slotted content) with `getContext`.
+ *
+ * Like lifecycle functions, this must be called during component initialisation.
+ *
+ * https://svelte.dev/docs#run-time-svelte-setcontext
+ */
+function setContext(key, context) {
+ get_current_component().$$.context.set(key, context);
+ return context;
+}
+/**
+ * Retrieves the context that belongs to the closest parent component with the specified `key`.
+ * Must be called during component initialisation.
+ *
+ * https://svelte.dev/docs#run-time-svelte-getcontext
+ */
+function getContext(key) {
+ return get_current_component().$$.context.get(key);
+}
+
+const dirty_components = [];
+const binding_callbacks = [];
+const render_callbacks = [];
+const flush_callbacks = [];
+const resolved_promise = Promise.resolve();
+let update_scheduled = false;
+function schedule_update() {
+ if (!update_scheduled) {
+ update_scheduled = true;
+ resolved_promise.then(flush);
+ }
+}
+function add_render_callback(fn) {
+ render_callbacks.push(fn);
+}
+// flush() calls callbacks in this order:
+// 1. All beforeUpdate callbacks, in order: parents before children
+// 2. All bind:this callbacks, in reverse order: children before parents.
+// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT
+// for afterUpdates called during the initial onMount, which are called in
+// reverse order: children before parents.
+// Since callbacks might update component values, which could trigger another
+// call to flush(), the following steps guard against this:
+// 1. During beforeUpdate, any updated components will be added to the
+// dirty_components array and will cause a reentrant call to flush(). Because
+// the flush index is kept outside the function, the reentrant call will pick
+// up where the earlier call left off and go through all dirty components. The
+// current_component value is saved and restored so that the reentrant call will
+// not interfere with the "parent" flush() call.
+// 2. bind:this callbacks cannot trigger new flush() calls.
+// 3. During afterUpdate, any updated components will NOT have their afterUpdate
+// callback called a second time; the seen_callbacks set, outside the flush()
+// function, guarantees this behavior.
+const seen_callbacks = new Set();
+let flushidx = 0; // Do *not* move this inside the flush() function
+function flush() {
+ const saved_component = current_component;
+ do {
+ // first, call beforeUpdate functions
+ // and update components
+ while (flushidx < dirty_components.length) {
+ const component = dirty_components[flushidx];
+ flushidx++;
+ set_current_component(component);
+ update(component.$$);
+ }
+ set_current_component(null);
+ dirty_components.length = 0;
+ flushidx = 0;
+ while (binding_callbacks.length)
+ binding_callbacks.pop()();
+ // then, once components are updated, call
+ // afterUpdate functions. This may cause
+ // subsequent updates...
+ for (let i = 0; i < render_callbacks.length; i += 1) {
+ const callback = render_callbacks[i];
+ if (!seen_callbacks.has(callback)) {
+ // ...so guard against infinite loops
+ seen_callbacks.add(callback);
+ callback();
+ }
+ }
+ render_callbacks.length = 0;
+ } while (dirty_components.length);
+ while (flush_callbacks.length) {
+ flush_callbacks.pop()();
+ }
+ update_scheduled = false;
+ seen_callbacks.clear();
+ set_current_component(saved_component);
+}
+function update($$) {
+ if ($$.fragment !== null) {
+ $$.update();
+ run_all($$.before_update);
+ const dirty = $$.dirty;
+ $$.dirty = [-1];
+ $$.fragment && $$.fragment.p($$.ctx, dirty);
+ $$.after_update.forEach(add_render_callback);
+ }
+}
+const outroing = new Set();
+function transition_in(block, local) {
+ if (block && block.i) {
+ outroing.delete(block);
+ block.i(local);
+ }
+}
+
+const globals = (typeof window !== 'undefined'
+ ? window
+ : typeof globalThis !== 'undefined'
+ ? globalThis
+ : global);
+function mount_component(component, target, anchor, customElement) {
+ const { fragment, after_update } = component.$$;
+ fragment && fragment.m(target, anchor);
+ if (!customElement) {
+ // onMount happens before the initial afterUpdate
+ add_render_callback(() => {
+ const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);
+ // if the component was destroyed immediately
+ // it will update the `$$.on_destroy` reference to `null`.
+ // the destructured on_destroy may still reference to the old array
+ if (component.$$.on_destroy) {
+ component.$$.on_destroy.push(...new_on_destroy);
+ }
+ else {
+ // Edge case - component was destroyed immediately,
+ // most likely as a result of a binding initialising
+ run_all(new_on_destroy);
+ }
+ component.$$.on_mount = [];
+ });
+ }
+ after_update.forEach(add_render_callback);
+}
+function destroy_component(component, detaching) {
+ const $$ = component.$$;
+ if ($$.fragment !== null) {
+ run_all($$.on_destroy);
+ $$.fragment && $$.fragment.d(detaching);
+ // TODO null out other refs, including component.$$ (but need to
+ // preserve final state?)
+ $$.on_destroy = $$.fragment = null;
+ $$.ctx = [];
+ }
+}
+function make_dirty(component, i) {
+ if (component.$$.dirty[0] === -1) {
+ dirty_components.push(component);
+ schedule_update();
+ component.$$.dirty.fill(0);
+ }
+ component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));
+}
+function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {
+ const parent_component = current_component;
+ set_current_component(component);
+ const $$ = component.$$ = {
+ fragment: null,
+ ctx: [],
+ // state
+ props,
+ update: noop,
+ not_equal,
+ bound: blank_object(),
+ // lifecycle
+ on_mount: [],
+ on_destroy: [],
+ on_disconnect: [],
+ before_update: [],
+ after_update: [],
+ context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
+ // everything else
+ callbacks: blank_object(),
+ dirty,
+ skip_bound: false,
+ root: options.target || parent_component.$$.root
+ };
+ append_styles && append_styles($$.root);
+ let ready = false;
+ $$.ctx = instance
+ ? instance(component, options.props || {}, (i, ret, ...rest) => {
+ const value = rest.length ? rest[0] : ret;
+ if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
+ if (!$$.skip_bound && $$.bound[i])
+ $$.bound[i](value);
+ if (ready)
+ make_dirty(component, i);
+ }
+ return ret;
+ })
+ : [];
+ $$.update();
+ ready = true;
+ run_all($$.before_update);
+ // `false` as a special case of no DOM component
+ $$.fragment = create_fragment ? create_fragment($$.ctx) : false;
+ if (options.target) {
+ if (options.hydrate) {
+ const nodes = children(options.target);
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ $$.fragment && $$.fragment.l(nodes);
+ nodes.forEach(detach);
+ }
+ else {
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ $$.fragment && $$.fragment.c();
+ }
+ if (options.intro)
+ transition_in(component.$$.fragment);
+ mount_component(component, options.target, options.anchor, options.customElement);
+ flush();
+ }
+ set_current_component(parent_component);
+}
+let SvelteElement;
+if (typeof HTMLElement === 'function') {
+ SvelteElement = class extends HTMLElement {
+ constructor() {
+ super();
+ this.attachShadow({ mode: 'open' });
+ }
+ connectedCallback() {
+ const { on_mount } = this.$$;
+ this.$$.on_disconnect = on_mount.map(run).filter(is_function);
+ // @ts-ignore todo: improve typings
+ for (const key in this.$$.slotted) {
+ // @ts-ignore todo: improve typings
+ this.appendChild(this.$$.slotted[key]);
+ }
+ }
+ attributeChangedCallback(attr, _oldValue, newValue) {
+ this[attr] = newValue;
+ }
+ disconnectedCallback() {
+ run_all(this.$$.on_disconnect);
+ }
+ $destroy() {
+ destroy_component(this, 1);
+ this.$destroy = noop;
+ }
+ $on(type, callback) {
+ // TODO should this delegate to addEventListener?
+ if (!is_function(callback)) {
+ return noop;
+ }
+ const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));
+ callbacks.push(callback);
+ return () => {
+ const index = callbacks.indexOf(callback);
+ if (index !== -1)
+ callbacks.splice(index, 1);
+ };
+ }
+ $set($$props) {
+ if (this.$$set && !is_empty($$props)) {
+ this.$$.skip_bound = true;
+ this.$$set($$props);
+ this.$$.skip_bound = false;
+ }
+ }
+ };
+}
+
+function dispatch_dev(type, detail) {
+ document.dispatchEvent(custom_event(type, Object.assign({ version: '3.52.0' }, detail), { bubbles: true }));
+}
+function append_dev(target, node) {
+ dispatch_dev('SvelteDOMInsert', { target, node });
+ append(target, node);
+}
+function insert_dev(target, node, anchor) {
+ dispatch_dev('SvelteDOMInsert', { target, node, anchor });
+ insert(target, node, anchor);
+}
+function detach_dev(node) {
+ dispatch_dev('SvelteDOMRemove', { node });
+ detach(node);
+}
+function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {
+ const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];
+ if (has_prevent_default)
+ modifiers.push('preventDefault');
+ if (has_stop_propagation)
+ modifiers.push('stopPropagation');
+ dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });
+ const dispose = listen(node, event, handler, options);
+ return () => {
+ dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });
+ dispose();
+ };
+}
+function attr_dev(node, attribute, value) {
+ attr(node, attribute, value);
+ if (value == null)
+ dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });
+ else
+ dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });
+}
+function prop_dev(node, property, value) {
+ node[property] = value;
+ dispatch_dev('SvelteDOMSetProperty', { node, property, value });
+}
+function set_data_dev(text, data) {
+ data = '' + data;
+ if (text.wholeText === data)
+ return;
+ dispatch_dev('SvelteDOMSetData', { node: text, data });
+ text.data = data;
+}
+function validate_each_argument(arg) {
+ if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {
+ let msg = '{#each} only iterates over array-like objects.';
+ if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {
+ msg += ' You can use a spread to convert this iterable into an array.';
+ }
+ throw new Error(msg);
+ }
+}
+function validate_slots(name, slot, keys) {
+ for (const slot_key of Object.keys(slot)) {
+ if (!~keys.indexOf(slot_key)) {
+ console.warn(`<${name}> received an unexpected slot "${slot_key}".`);
+ }
+ }
+}
+function loop_guard(timeout) {
+ const start = Date.now();
+ return () => {
+ if (Date.now() - start > timeout) {
+ throw new Error('Infinite loop detected');
+ }
+ };
+}
+
+export { set_data_dev as A, destroy_each as B, prop_dev as C, flush as D, set_style as E, getContext as F, setContext as G, svg_element as H, is_function as I, HtmlTag as J, SvelteElement as S, attribute_to_object as a, insert_dev as b, validate_store as c, dispatch_dev as d, component_subscribe as e, empty as f, detach_dev as g, binding_callbacks as h, init as i, element as j, space as k, add_location as l, attr_dev as m, noop as n, onMount as o, src_url_equal as p, set_custom_element_data as q, append_dev as r, safe_not_equal as s, listen_dev as t, run_all as u, validate_slots as v, loop_guard as w, globals as x, validate_each_argument as y, text as z };
diff --git a/Server/public/js/components/join-us-component.js b/Server/public/js/components/join-us-component.js
index 51c41ce..2743737 100644
--- a/Server/public/js/components/join-us-component.js
+++ b/Server/public/js/components/join-us-component.js
@@ -1 +1 @@
-import{S as o,i as t,a as i,b as e,s as r,e as n,n as a,d as s,c as m,o as l,f as c,t as p,g as u,j as g,h as d,k as h,l as f,m as b}from"./index-4348483d.js";import{w as v}from"./index-71440b21.js";import{addMarkersGroups as j,groupsMarkersLayer as k}from"../../../../../../../../../js/groups.js";import{addMarkersCoops as w,coopsMarkersLayer as y}from"../../../../../../../../../js/coops.js";import{addMarkersCommunes as x,communesMarkersLayer as P}from"../../../../../../../../../js/communes.js";import{addMarkersParties as N,partiesMarkersLayer as S}from"../../../../../../../../../js/parties.js";import{loadLocaleContent as T,getData as z}from"../../../../../../../../../js/libraries/serverTools.js";import"../../../../../../../../../js/components/map-component.js";function O(o){let t,i,r,n,a,m,l,v,j,k,w,y,x,P,N,S,T,z,O,U,A,D,H,L,C,G,K,M,E,J,Q,R,W,Y,_,B,q,F,I,V,X,Z,$,oo,to,io,eo,ro,no,ao,so,mo,lo,co,po,uo,go,ho,fo,bo,vo,jo,ko,wo,yo,xo,Po,No,So,To,zo,Oo,Uo,Ao,Do,Ho,Lo,Co,Go,Ko,Mo,Eo,Jo,Qo=o[1].heading+"",Ro=o[1].condition1+"",Wo=o[1].condition2+"",Yo=o[1].condition3+"",_o=o[1].conditionsOutcome+"",Bo=o[1].subheading1+"",qo=o[1].valueProposition1+"",Fo=o[1].valueProposition2+"",Io=o[1].valueProposition3+"",Vo=o[1].valueProposition4+"",Xo=o[1].valueProposition5+"",Zo=o[1].subheading2+"",$o=o[1].findOur+"",ot=o[1].group+"",tt=o[1].commune+"",it=o[1].cooperative+"",et=o[1].or+"",rt=o[1].party+"",nt=o[1].nearYou+"",at=o[1].noneNear+"",st=o[1].WhatsAppGroup+"",mt=o[1].or+"",lt=o[1].DiscordServer+"",ct=o[1].helpStart+"";return{c(){t=c("div"),i=c("div"),r=c("h1"),n=p(Qo),a=u(),m=c("img"),v=u(),j=c("ol"),k=c("li"),w=p(Ro),y=u(),x=c("li"),P=p(Wo),N=u(),S=c("li"),T=p(Yo),z=u(),O=c("p"),U=u(),A=c("h2"),D=p(Bo),H=u(),L=c("ol"),C=c("li"),G=p(qo),K=u(),M=c("li"),E=p(Fo),J=u(),Q=c("li"),R=p(Io),W=u(),Y=c("li"),_=p(Vo),B=u(),q=c("p"),F=p(Xo),I=u(),V=c("h2"),X=p(Zo),Z=u(),$=c("div"),oo=c("p"),to=p($o),io=u(),eo=c("ol"),ro=c("li"),no=c("a"),ao=p(ot),so=p(","),mo=u(),lo=c("li"),co=c("a"),po=p(tt),uo=u(),go=c("li"),ho=c("a"),fo=p(it),bo=u(),vo=p(et),jo=u(),ko=c("li"),wo=c("a"),yo=p(rt),xo=u(),Po=c("p"),No=p(nt),So=u(),To=c("p"),zo=p(at),Oo=u(),Uo=c("a"),Ao=p(st),Do=u(),Ho=p(mt),Lo=u(),Co=c("a"),Go=p(lt),Ko=p(ct),Mo=u(),Eo=c("map-component"),g(m.src,l="/img/common/join-group.svg")||d(m,"src","/img/common/join-group.svg"),d(m,"id","join-group"),d(m,"alt","join group"),d(j,"id","condition-list"),d(L,"id","value-proposition-list"),d(no,"href","/"+o[4]+"/groups"),d(co,"href","/"+o[4]+"/communes"),d(ho,"href","/"+o[4]+"/cooperatives"),d(wo,"href","/"+o[4]+"/parties"),d(eo,"id","entities-list"),d($,"id","call-to-action-list"),d(Uo,"href","https://chat.whatsapp.com/BhnmUNljUxJ2AjeHUwyTKh"),d(Uo,"target","_blank"),d(Uo,"rel","noreferrer"),d(Co,"href","https://discord.gg/Qk8KUk787z"),d(Co,"target","_blank"),d(Co,"rel","noreferrer"),h(Eo,"id","map"),h(Eo,"callback",Jo=o[6]),d(i,"id","text-container"),d(t,"id","container")},m(o,s){e(o,t,s),f(t,i),f(i,r),f(r,n),f(i,a),f(i,m),f(i,v),f(i,j),f(j,k),f(k,w),f(j,y),f(j,x),f(x,P),f(j,N),f(j,S),f(S,T),f(j,z),f(j,O),O.innerHTML=_o,f(i,U),f(i,A),f(A,D),f(i,H),f(i,L),f(L,C),f(C,G),f(L,K),f(L,M),f(M,E),f(L,J),f(L,Q),f(Q,R),f(L,W),f(L,Y),f(Y,_),f(L,B),f(L,q),f(q,F),f(i,I),f(i,V),f(V,X),f(i,Z),f(i,$),f($,oo),f(oo,to),f($,io),f($,eo),f(eo,ro),f(ro,no),f(no,ao),f(ro,so),f(eo,mo),f(eo,lo),f(lo,co),f(co,po),f(eo,uo),f(eo,go),f(go,ho),f(ho,fo),f(go,bo),f(go,vo),f(eo,jo),f(eo,ko),f(ko,wo),f(wo,yo),f($,xo),f($,Po),f(Po,No),f(i,So),f(i,To),f(To,zo),f(To,Oo),f(To,Uo),f(Uo,Ao),f(To,Do),f(To,Ho),f(To,Lo),f(To,Co),f(Co,Go),f(To,Ko),f(i,Mo),f(i,Eo)},p(o,t){2&t&&Qo!==(Qo=o[1].heading+"")&&b(n,Qo),2&t&&Ro!==(Ro=o[1].condition1+"")&&b(w,Ro),2&t&&Wo!==(Wo=o[1].condition2+"")&&b(P,Wo),2&t&&Yo!==(Yo=o[1].condition3+"")&&b(T,Yo),2&t&&_o!==(_o=o[1].conditionsOutcome+"")&&(O.innerHTML=_o),2&t&&Bo!==(Bo=o[1].subheading1+"")&&b(D,Bo),2&t&&qo!==(qo=o[1].valueProposition1+"")&&b(G,qo),2&t&&Fo!==(Fo=o[1].valueProposition2+"")&&b(E,Fo),2&t&&Io!==(Io=o[1].valueProposition3+"")&&b(R,Io),2&t&&Vo!==(Vo=o[1].valueProposition4+"")&&b(_,Vo),2&t&&Xo!==(Xo=o[1].valueProposition5+"")&&b(F,Xo),2&t&&Zo!==(Zo=o[1].subheading2+"")&&b(X,Zo),2&t&&$o!==($o=o[1].findOur+"")&&b(to,$o),2&t&&ot!==(ot=o[1].group+"")&&b(ao,ot),2&t&&tt!==(tt=o[1].commune+"")&&b(po,tt),2&t&&it!==(it=o[1].cooperative+"")&&b(fo,it),2&t&&et!==(et=o[1].or+"")&&b(vo,et),2&t&&rt!==(rt=o[1].party+"")&&b(yo,rt),2&t&&nt!==(nt=o[1].nearYou+"")&&b(No,nt),2&t&&at!==(at=o[1].noneNear+"")&&b(zo,at),2&t&&st!==(st=o[1].WhatsAppGroup+"")&&b(Ao,st),2&t&&mt!==(mt=o[1].or+"")&&b(Ho,mt),2&t&<!==(lt=o[1].DiscordServer+"")&&b(Go,lt),2&t&&ct!==(ct=o[1].helpStart+"")&&b(Ko,ct),2&t&&Jo!==(Jo=o[6])&&h(Eo,"callback",Jo)},d(o){o&&s(t)}}}function U(o){let t,i=7==o[0]&&O(o);return{c(){i&&i.c(),t=n()},m(o,r){i&&i.m(o,r),e(o,t,r)},p(o,e){7==o[0]?i?i.p(o,e):(i=O(o),i.c(),i.m(t.parentNode,t)):i&&(i.d(1),i=null)},d(o){i&&i.d(o),o&&s(t)}}}function A(o){let t,i=o[0],m=U(o);return{c(){m.c(),t=n(),this.c=a},m(o,i){m.m(o,i),e(o,t,i)},p(o,[e]){1&e&&r(i,i=o[0])?(m.d(1),m=U(o),m.c(),m.m(t.parentNode,t)):m.p(o,e)},i:a,o:a,d(o){o&&s(t),m.d(o)}}}function D(o,t,i){let e,r,n=v(0);m(o,n,(o=>i(0,e=o)));let a,s,c=v({});m(o,c,(o=>i(1,r=o))),T(c,"groups-component",n),T(c,"communes-component",n),T(c,"cooperatives-component",n),T(c,"parties-component",n),T(c,"countries",n);let p=T(c,"join-us-component",n);function u(o,t,i){let e=o([22,0],2);j(a,s,e,t,i),x(e,t,i),w(e,t,i),N(e,t,i);let r={Groups:k,Communes:P,Coops:y,Parties:S};L.control.layers(null,r).addTo(e)}z("/assets/groups.json",(o=>{a=JSON.parse(o),s={};for(let o of a){let t=o.country;null==o.contact&&(o.contact="https://discord.gg/Qk8KUk787z"),t in s?s[t].push(o):s[t]=[o]}n.update((o=>o+1))})),l((()=>{}));return[e,r,n,c,p,u,o=>u(o,r,p)]}class H extends o{constructor(o){super(),this.shadowRoot.innerHTML="",t(this,{target:this.shadowRoot,props:i(this.attributes),customElement:!0},D,A,r,{},null),o&&o.target&&e(o.target,this,o.anchor)}}customElements.define("join-us-component",H);export{H as default};
+import{S as o,i as t,a as i,b as e,s as r,e as n,n as s,d as a,c as m,o as l,g as c,t as p,h as u,k as g,j as d,l as h,m as f,q as b}from"./index-8c09578c.js";import{w as v}from"./index-77787e10.js";import{loadLocaleContent as k,getData as j}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as w}from"../../../../../../../../../js/libraries/mapTools.js";import{addGroupPinContent as y,addCommunePinContent as x,addCoopPinContent as P,addPartyPinContent as T}from"../../../../../../../../../js/mapFuncs.js";import"../../../../../../../../../js/components/map-component.js";function A(o){let t,i,r,n,s,m,l,v,k,j,w,y,x,P,T,A,N,S,z,D,O,U,C,H,L,F,K,M,B,E,G,J,Q,R,W,Y,_,q,I,V,X,Z,$,oo,to,io,eo,ro,no,so,ao,mo,lo,co,po,uo,go,ho,fo,bo,vo,ko,jo,wo,yo,xo,Po,To,Ao,No,So,zo,Do,Oo,Uo,Co,Ho,Lo,Fo,Ko,Mo,Bo,Eo,Go=o[1].heading+"",Jo=o[1].condition1+"",Qo=o[1].condition2+"",Ro=o[1].condition3+"",Wo=o[1].conditionsOutcome+"",Yo=o[1].subheading1+"",_o=o[1].valueProposition1+"",qo=o[1].valueProposition2+"",Io=o[1].valueProposition3+"",Vo=o[1].valueProposition4+"",Xo=o[1].valueProposition5+"",Zo=o[1].subheading2+"",$o=o[1].findOur+"",ot=o[1].group+"",tt=o[1].commune+"",it=o[1].cooperative+"",et=o[1].or+"",rt=o[1].party+"",nt=o[1].nearYou+"",st=o[1].noneNear+"",at=o[1].WhatsAppGroup+"",mt=o[1].or+"",lt=o[1].DiscordServer+"",ct=o[1].helpStart+"";return{c(){t=c("div"),i=c("div"),r=c("h1"),n=p(Go),s=u(),m=c("img"),v=u(),k=c("ol"),j=c("li"),w=p(Jo),y=u(),x=c("li"),P=p(Qo),T=u(),A=c("li"),N=p(Ro),S=u(),z=c("p"),D=u(),O=c("h2"),U=p(Yo),C=u(),H=c("ol"),L=c("li"),F=p(_o),K=u(),M=c("li"),B=p(qo),E=u(),G=c("li"),J=p(Io),Q=u(),R=c("li"),W=p(Vo),Y=u(),_=c("p"),q=p(Xo),I=u(),V=c("h2"),X=p(Zo),Z=u(),$=c("div"),oo=c("p"),to=p($o),io=u(),eo=c("ol"),ro=c("li"),no=c("a"),so=p(ot),ao=p(","),mo=u(),lo=c("li"),co=c("a"),po=p(tt),uo=u(),go=c("li"),ho=c("a"),fo=p(it),bo=u(),vo=p(et),ko=u(),jo=c("li"),wo=c("a"),yo=p(rt),xo=u(),Po=c("p"),To=p(nt),Ao=u(),No=c("p"),So=p(st),zo=u(),Do=c("a"),Oo=p(at),Uo=u(),Co=p(mt),Ho=u(),Lo=c("a"),Fo=p(lt),Ko=p(ct),Mo=u(),Bo=c("map-component"),g(m.src,l="/img/common/join-group.svg")||d(m,"src","/img/common/join-group.svg"),d(m,"id","join-group"),d(m,"alt","join group"),d(k,"id","condition-list"),d(H,"id","value-proposition-list"),d(no,"href","/"+o[4]+"/groups"),d(co,"href","/"+o[4]+"/communes"),d(ho,"href","/"+o[4]+"/cooperatives"),d(wo,"href","/"+o[4]+"/parties"),d(eo,"id","entities-list"),d($,"id","call-to-action-list"),d(Do,"href","https://chat.whatsapp.com/BhnmUNljUxJ2AjeHUwyTKh"),d(Do,"target","_blank"),d(Do,"rel","noreferrer"),d(Lo,"href","https://discord.gg/Qk8KUk787z"),d(Lo,"target","_blank"),d(Lo,"rel","noreferrer"),h(Bo,"id","map"),h(Bo,"callback",Eo=o[6]),h(Bo,"colors",["#23AC20","#CA2437","#217BC9","#FFD326"]),d(i,"id","text-container"),d(t,"id","container")},m(o,a){e(o,t,a),f(t,i),f(i,r),f(r,n),f(i,s),f(i,m),f(i,v),f(i,k),f(k,j),f(j,w),f(k,y),f(k,x),f(x,P),f(k,T),f(k,A),f(A,N),f(k,S),f(k,z),z.innerHTML=Wo,f(i,D),f(i,O),f(O,U),f(i,C),f(i,H),f(H,L),f(L,F),f(H,K),f(H,M),f(M,B),f(H,E),f(H,G),f(G,J),f(H,Q),f(H,R),f(R,W),f(H,Y),f(H,_),f(_,q),f(i,I),f(i,V),f(V,X),f(i,Z),f(i,$),f($,oo),f(oo,to),f($,io),f($,eo),f(eo,ro),f(ro,no),f(no,so),f(ro,ao),f(eo,mo),f(eo,lo),f(lo,co),f(co,po),f(eo,uo),f(eo,go),f(go,ho),f(ho,fo),f(go,bo),f(go,vo),f(eo,ko),f(eo,jo),f(jo,wo),f(wo,yo),f($,xo),f($,Po),f(Po,To),f(i,Ao),f(i,No),f(No,So),f(No,zo),f(No,Do),f(Do,Oo),f(No,Uo),f(No,Co),f(No,Ho),f(No,Lo),f(Lo,Fo),f(No,Ko),f(i,Mo),f(i,Bo)},p(o,t){2&t&&Go!==(Go=o[1].heading+"")&&b(n,Go),2&t&&Jo!==(Jo=o[1].condition1+"")&&b(w,Jo),2&t&&Qo!==(Qo=o[1].condition2+"")&&b(P,Qo),2&t&&Ro!==(Ro=o[1].condition3+"")&&b(N,Ro),2&t&&Wo!==(Wo=o[1].conditionsOutcome+"")&&(z.innerHTML=Wo),2&t&&Yo!==(Yo=o[1].subheading1+"")&&b(U,Yo),2&t&&_o!==(_o=o[1].valueProposition1+"")&&b(F,_o),2&t&&qo!==(qo=o[1].valueProposition2+"")&&b(B,qo),2&t&&Io!==(Io=o[1].valueProposition3+"")&&b(J,Io),2&t&&Vo!==(Vo=o[1].valueProposition4+"")&&b(W,Vo),2&t&&Xo!==(Xo=o[1].valueProposition5+"")&&b(q,Xo),2&t&&Zo!==(Zo=o[1].subheading2+"")&&b(X,Zo),2&t&&$o!==($o=o[1].findOur+"")&&b(to,$o),2&t&&ot!==(ot=o[1].group+"")&&b(so,ot),2&t&&tt!==(tt=o[1].commune+"")&&b(po,tt),2&t&&it!==(it=o[1].cooperative+"")&&b(fo,it),2&t&&et!==(et=o[1].or+"")&&b(vo,et),2&t&&rt!==(rt=o[1].party+"")&&b(yo,rt),2&t&&nt!==(nt=o[1].nearYou+"")&&b(To,nt),2&t&&st!==(st=o[1].noneNear+"")&&b(So,st),2&t&&at!==(at=o[1].WhatsAppGroup+"")&&b(Oo,at),2&t&&mt!==(mt=o[1].or+"")&&b(Co,mt),2&t&<!==(lt=o[1].DiscordServer+"")&&b(Fo,lt),2&t&&ct!==(ct=o[1].helpStart+"")&&b(Ko,ct),2&t&&Eo!==(Eo=o[6])&&h(Bo,"callback",Eo)},d(o){o&&a(t)}}}function N(o){let t,i=10==o[0]&&A(o);return{c(){i&&i.c(),t=n()},m(o,r){i&&i.m(o,r),e(o,t,r)},p(o,e){10==o[0]?i?i.p(o,e):(i=A(o),i.c(),i.m(t.parentNode,t)):i&&(i.d(1),i=null)},d(o){i&&i.d(o),o&&a(t)}}}function S(o){let t,i=o[0],m=N(o);return{c(){m.c(),t=n(),this.c=s},m(o,i){m.m(o,i),e(o,t,i)},p(o,[e]){1&e&&r(i,i=o[0])?(m.d(1),m=N(o),m.c(),m.m(t.parentNode,t)):m.p(o,e)},i:s,o:s,d(o){o&&a(t),m.d(o)}}}function z(o,t,i){let e,r,n=v(0);m(o,n,(o=>i(0,e=o)));let s=v({});m(o,s,(o=>i(1,r=o)));let a={},c={};k(s,"groups-component",n),k(s,"communes-component",n),k(s,"cooperatives-component",n),k(s,"parties-component",n),k(s,"countries",n);let p=k(s,"join-us-component",n),u=(o,t)=>{a[t]=JSON.parse(o),c[t]={};for(let o of a[t]){let i=o.country;null==o.contact&&(o.contact="https://discord.gg/Qk8KUk787z"),i in c[t]?c[t][i].push(o):c[t][i]=[o]}n.update((o=>o+1))};function g(o,t,i){let e=o([22,0],2),r=w(a.groups,c.groups,e,t,i,y,"green"),n=w(a.communes,c.communes,e,t,i,x,"red"),s=w(a.cooperatives,c.cooperatives,e,t,i,P,"blue"),m=w(a.parties,c.parties,e,t,i,T,"gold"),l={};l[t.groups]=r,l[t.communes]=n,l[t.cooperatives]=s,l[t.parties]=m,L.control.layers(null,l).addTo(e)}j("/assets/groups.json",(o=>u(o,"groups"))),j("/assets/communes.json",(o=>u(o,"communes"))),j("/assets/cooperatives.json",(o=>u(o,"cooperatives"))),j("/assets/parties.json",(o=>u(o,"parties"))),l((()=>{}));return[e,r,n,s,p,g,o=>g(o,r,p)]}class D extends o{constructor(o){super(),this.shadowRoot.innerHTML="",t(this,{target:this.shadowRoot,props:i(this.attributes),customElement:!0},z,S,r,{},null),o&&o.target&&e(o.target,this,o.anchor)}}customElements.define("join-us-component",D);export{D as default};
diff --git a/Server/public/js/components/landing-component.js b/Server/public/js/components/landing-component.js
index 01fc18b..5ea6676 100644
--- a/Server/public/js/components/landing-component.js
+++ b/Server/public/js/components/landing-component.js
@@ -1 +1 @@
-import{S as t,i as o,a as i,b as e,s as r,e as n,n as s,d as m,c as a,o as c,w as p,f as g,g as d,t as l,h as u,j as h,v as f,k as v,l as w,m as x}from"./index-4348483d.js";import{w as b}from"./index-71440b21.js";import{addMarkersGroups as j,groupsMarkersLayer as T}from"../../../../../../../../../js/groups.js";import{addMarkersCoops as k,coopsMarkersLayer as y}from"../../../../../../../../../js/coops.js";import{addMarkersCommunes as U,communesMarkersLayer as z}from"../../../../../../../../../js/communes.js";import{addMarkersParties as N,partiesMarkersLayer as C}from"../../../../../../../../../js/parties.js";import{getData as A,loadLocaleContent as E}from"../../../../../../../../../js/libraries/serverTools.js";import"../../../../../../../../../js/components/map-component.js";function F(t){let o,i,r,n,s,a,c,p,b,j,T,k,y,U,z,N,C,L,A,E,F,H,K,M,Q,R,S,W,B,D,J,O,_,q,G,I,P,V,X,Y,Z,$,tt,ot,it,et,rt,nt,st,mt,at,ct,pt,gt,dt,lt,ut,ht,ft,vt,wt,xt,bt,jt,Tt,kt,yt,Ut=t[3].top+"",zt=t[3].groupsTitle+"",Nt=t[3].groupsText+"",Ct=t[3].communesTitle+"",Lt=t[3].communesText+"",At=t[3].cooperativesTitle+"",Et=t[3].cooperativesText+"",Ft=t[3].partiesTitle+"",Ht=t[3].partiesText+"",Kt=t[3].findUs+"",Mt=t[3].whatNow+"",Qt=t[3].joinUs+"",Rt=t[3].talkWithUs+"";return{c(){o=g("div"),i=g("picture"),i.innerHTML=' \n \n ',r=d(),n=g("div"),s=g("p"),a=l(Ut),c=d(),p=g("div"),b=g("div"),j=g("a"),T=g("h2"),k=l(zt),y=d(),U=g("img"),N=d(),C=g("p"),L=l(Nt),A=d(),E=g("div"),F=g("a"),H=g("h2"),K=l(Ct),M=d(),Q=g("img"),S=d(),W=g("p"),B=l(Lt),D=d(),J=g("div"),O=g("a"),_=g("h2"),q=l(At),G=d(),I=g("img"),V=d(),X=g("p"),Y=l(Et),Z=d(),$=g("div"),tt=g("a"),ot=g("h2"),it=l(Ft),et=d(),rt=g("img"),st=d(),mt=g("p"),at=l(Ht),ct=d(),pt=g("h1"),gt=l(Kt),dt=d(),lt=g("map-component"),ht=d(),ft=g("h1"),vt=l(Mt),wt=d(),xt=g("div"),bt=g("a"),jt=l(Qt),Tt=d(),kt=g("a"),yt=l(Rt),u(j,"href","/"+t[6]+"/groups"),u(U,"id","groups-img"),h(U.src,z="/img/common/groups.svg")||u(U,"src","/img/common/groups.svg"),u(U,"alt","groups"),u(F,"href","/"+t[6]+"/communes"),u(Q,"id","communes-img"),h(Q.src,R="/img/common/commune.svg")||u(Q,"src","/img/common/commune.svg"),u(Q,"alt","communes"),u(O,"href","/"+t[6]+"/coops"),u(I,"id","coops-img"),h(I.src,P="/img/common/coops.svg")||u(I,"src","/img/common/coops.svg"),u(I,"alt","coops"),u(tt,"href","/"+t[6]+"/parties"),u(rt,"id","parties-img"),h(rt.src,nt="/img/common/parties.svg")||u(rt,"src","/img/common/parties.svg"),u(rt,"alt","coops"),u(p,"id","container-grid"),f(p,"--grid-width",t[1]),u(pt,"id","find-us"),v(lt,"id","map"),v(lt,"callback",ut=t[9]),v(lt,"colors",["#23AC20","#CA2437","#217BC9","#FFD326"]),u(bt,"class","link-button"),u(bt,"href","/"+t[6]+"/join-us"),u(kt,"class","link-button"),u(kt,"href","https://discord.gg/Qk8KUk787z"),u(kt,"target","_blank"),u(kt,"rel","noreferrer"),u(xt,"id","action-container"),u(n,"id","text-container"),u(o,"id","container")},m(m,g){e(m,o,g),w(o,i),w(o,r),w(o,n),w(n,s),w(s,a),w(n,c),w(n,p),w(p,b),w(b,j),w(j,T),w(T,k),w(b,y),w(b,U),w(b,N),w(b,C),w(C,L),w(p,A),w(p,E),w(E,F),w(F,H),w(H,K),w(E,M),w(E,Q),w(E,S),w(E,W),w(W,B),w(p,D),w(p,J),w(J,O),w(O,_),w(_,q),w(J,G),w(J,I),w(J,V),w(J,X),w(X,Y),w(p,Z),w(p,$),w($,tt),w(tt,ot),w(ot,it),w($,et),w($,rt),w($,st),w($,mt),w(mt,at),t[8](p),w(n,ct),w(n,pt),w(pt,gt),w(n,dt),w(n,lt),w(n,ht),w(n,ft),w(ft,vt),w(n,wt),w(n,xt),w(xt,bt),w(bt,jt),w(xt,Tt),w(xt,kt),w(kt,yt)},p(t,o){8&o&&Ut!==(Ut=t[3].top+"")&&x(a,Ut),8&o&&zt!==(zt=t[3].groupsTitle+"")&&x(k,zt),8&o&&Nt!==(Nt=t[3].groupsText+"")&&x(L,Nt),8&o&&Ct!==(Ct=t[3].communesTitle+"")&&x(K,Ct),8&o&&Lt!==(Lt=t[3].communesText+"")&&x(B,Lt),8&o&&At!==(At=t[3].cooperativesTitle+"")&&x(q,At),8&o&&Et!==(Et=t[3].cooperativesText+"")&&x(Y,Et),8&o&&Ft!==(Ft=t[3].partiesTitle+"")&&x(it,Ft),8&o&&Ht!==(Ht=t[3].partiesText+"")&&x(at,Ht),2&o&&f(p,"--grid-width",t[1]),8&o&&Kt!==(Kt=t[3].findUs+"")&&x(gt,Kt),8&o&&ut!==(ut=t[9])&&v(lt,"callback",ut),8&o&&Mt!==(Mt=t[3].whatNow+"")&&x(vt,Mt),8&o&&Qt!==(Qt=t[3].joinUs+"")&&x(jt,Qt),8&o&&Rt!==(Rt=t[3].talkWithUs+"")&&x(yt,Rt)},d(i){i&&m(o),t[8](null)}}}function H(t){let o,i=7==t[2]&&F(t);return{c(){i&&i.c(),o=n()},m(t,r){i&&i.m(t,r),e(t,o,r)},p(t,e){7==t[2]?i?i.p(t,e):(i=F(t),i.c(),i.m(o.parentNode,o)):i&&(i.d(1),i=null)},d(t){i&&i.d(t),t&&m(o)}}}function K(t){let o,i=t[2],a=H(t);return{c(){a.c(),o=n(),this.c=s},m(t,i){a.m(t,i),e(t,o,i)},p(t,[e]){4&e&&r(i,i=t[2])?(a.d(1),a=H(t),a.c(),a.m(o.parentNode,o)):a.p(t,e)},i:s,o:s,d(t){t&&m(o),a.d(t)}}}function M(t,o,i){let e,r,n,s,m=b(0);a(t,m,(t=>i(2,e=t)));let g,d,l=b({});function u(t){i(1,s="1fr 1fr")}a(t,l,(t=>i(3,r=t)));A("/assets/groups.json",(t=>{g=JSON.parse(t),d={};for(let t of g){let o=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),o in d?d[o].push(t):d[o]=[t]}m.update((t=>t+1))})),E(l,"groups-component",m),E(l,"communes-component",m),E(l,"cooperatives-component",m),E(l,"parties-component",m),E(l,"countries",m);let h=E(l,"landing-component",m,u);function f(t,o,i){let e=t([22,0],2);j(g,d,e,o,i),U(e,o,i),k(e,o,i),N(e,o,i);let r={};r[o.groups]=T,r[o.communes]=z,r[o.cooperatives]=y,r[o.parties]=C,L.control.layers(null,r).addTo(e)}u(),c((()=>{}));return[n,s,e,r,m,l,h,f,function(t){p[t?"unshift":"push"]((()=>{n=t,i(0,n)}))},t=>f(t,r,h)]}class Q extends t{constructor(t){super(),this.shadowRoot.innerHTML="",o(this,{target:this.shadowRoot,props:i(this.attributes),customElement:!0},M,K,r,{},null),t&&t.target&&e(t.target,this,t.anchor)}}customElements.define("landing-component",Q);export{Q as default};
+import{S as t,i as e,a as o,b as i,s as r,e as s,n,d as a,c as m,o as c,f as p,g,h as d,t as l,j as u,k as h,w as f,l as v,m as w,q as x}from"./index-8c09578c.js";import{w as b}from"./index-77787e10.js";import{getData as T,loadLocaleContent as j}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as k}from"../../../../../../../../../js/libraries/mapTools.js";import{addGroupPinContent as y,addCommunePinContent as U,addCoopPinContent as z,addPartyPinContent as N}from"../../../../../../../../../js/mapFuncs.js";import"../../../../../../../../../js/components/map-component.js";function C(t){let e,o,r,s,n,m,c,p,b,T,j,k,y,U,z,N,C,F,L,A,E,H,K,M,Q,R,S,W,q,B,D,J,O,_,G,I,P,V,X,Y,Z,$,tt,et,ot,it,rt,st,nt,at,mt,ct,pt,gt,dt,lt,ut,ht,ft,vt,wt,xt,bt,Tt,jt,kt,yt,Ut=t[3].top+"",zt=t[3].groupsTitle+"",Nt=t[3].groupsText+"",Ct=t[3].partiesTitle+"",Ft=t[3].partiesText+"",Lt=t[3].cooperativesTitle+"",At=t[3].cooperativesText+"",Et=t[3].communesTitle+"",Ht=t[3].communesText+"",Kt=t[3].findUs+"",Mt=t[3].whatNow+"",Qt=t[3].joinUs+"",Rt=t[3].talkWithUs+"";return{c(){e=g("div"),o=g("picture"),o.innerHTML=' \n \n ',r=d(),s=g("div"),n=g("p"),m=l(Ut),c=d(),p=g("div"),b=g("div"),T=g("a"),j=g("h2"),k=l(zt),y=d(),U=g("img"),N=d(),C=g("p"),F=l(Nt),L=d(),A=g("div"),E=g("a"),H=g("h2"),K=l(Ct),M=d(),Q=g("img"),S=d(),W=g("p"),q=l(Ft),B=d(),D=g("div"),J=g("a"),O=g("h2"),_=l(Lt),G=d(),I=g("img"),V=d(),X=g("p"),Y=l(At),Z=d(),$=g("div"),tt=g("a"),et=g("h2"),ot=l(Et),it=d(),rt=g("img"),nt=d(),at=g("p"),mt=l(Ht),ct=d(),pt=g("h1"),gt=l(Kt),dt=d(),lt=g("map-component"),ht=d(),ft=g("h1"),vt=l(Mt),wt=d(),xt=g("div"),bt=g("a"),Tt=l(Qt),jt=d(),kt=g("a"),yt=l(Rt),u(T,"href","/"+t[6]+"/groups"),u(U,"id","groups-img"),h(U.src,z="/img/common/groups.svg")||u(U,"src","/img/common/groups.svg"),u(U,"alt","groups"),u(E,"href","/"+t[6]+"/parties"),u(Q,"id","parties-img"),h(Q.src,R="/img/common/parties.svg")||u(Q,"src","/img/common/parties.svg"),u(Q,"alt","coops"),u(J,"href","/"+t[6]+"/coops"),u(I,"id","coops-img"),h(I.src,P="/img/common/coops.svg")||u(I,"src","/img/common/coops.svg"),u(I,"alt","coops"),u(tt,"href","/"+t[6]+"/communes"),u(rt,"id","communes-img"),h(rt.src,st="/img/common/communes.svg")||u(rt,"src","/img/common/communes.svg"),u(rt,"alt","communes"),u(p,"id","container-grid"),f(p,"--grid-width",t[1]),u(pt,"id","find-us"),v(lt,"id","map"),v(lt,"callback",ut=t[9]),v(lt,"colors",["#23AC20","#CA2437","#217BC9","#FFD326"]),u(bt,"class","link-button"),u(bt,"href","/"+t[6]+"/join-us"),u(kt,"class","link-button"),u(kt,"href","https://discord.gg/Qk8KUk787z"),u(kt,"target","_blank"),u(kt,"rel","noreferrer"),u(xt,"id","action-container"),u(s,"id","text-container"),u(e,"id","container")},m(a,g){i(a,e,g),w(e,o),w(e,r),w(e,s),w(s,n),w(n,m),w(s,c),w(s,p),w(p,b),w(b,T),w(T,j),w(j,k),w(b,y),w(b,U),w(b,N),w(b,C),w(C,F),w(p,L),w(p,A),w(A,E),w(E,H),w(H,K),w(A,M),w(A,Q),w(A,S),w(A,W),w(W,q),w(p,B),w(p,D),w(D,J),w(J,O),w(O,_),w(D,G),w(D,I),w(D,V),w(D,X),w(X,Y),w(p,Z),w(p,$),w($,tt),w(tt,et),w(et,ot),w($,it),w($,rt),w($,nt),w($,at),w(at,mt),t[8](p),w(s,ct),w(s,pt),w(pt,gt),w(s,dt),w(s,lt),w(s,ht),w(s,ft),w(ft,vt),w(s,wt),w(s,xt),w(xt,bt),w(bt,Tt),w(xt,jt),w(xt,kt),w(kt,yt)},p(t,e){8&e&&Ut!==(Ut=t[3].top+"")&&x(m,Ut),8&e&&zt!==(zt=t[3].groupsTitle+"")&&x(k,zt),8&e&&Nt!==(Nt=t[3].groupsText+"")&&x(F,Nt),8&e&&Ct!==(Ct=t[3].partiesTitle+"")&&x(K,Ct),8&e&&Ft!==(Ft=t[3].partiesText+"")&&x(q,Ft),8&e&&Lt!==(Lt=t[3].cooperativesTitle+"")&&x(_,Lt),8&e&&At!==(At=t[3].cooperativesText+"")&&x(Y,At),8&e&&Et!==(Et=t[3].communesTitle+"")&&x(ot,Et),8&e&&Ht!==(Ht=t[3].communesText+"")&&x(mt,Ht),2&e&&f(p,"--grid-width",t[1]),8&e&&Kt!==(Kt=t[3].findUs+"")&&x(gt,Kt),8&e&&ut!==(ut=t[9])&&v(lt,"callback",ut),8&e&&Mt!==(Mt=t[3].whatNow+"")&&x(vt,Mt),8&e&&Qt!==(Qt=t[3].joinUs+"")&&x(Tt,Qt),8&e&&Rt!==(Rt=t[3].talkWithUs+"")&&x(yt,Rt)},d(o){o&&a(e),t[8](null)}}}function F(t){let e,o=10==t[2]&&C(t);return{c(){o&&o.c(),e=s()},m(t,r){o&&o.m(t,r),i(t,e,r)},p(t,i){10==t[2]?o?o.p(t,i):(o=C(t),o.c(),o.m(e.parentNode,e)):o&&(o.d(1),o=null)},d(t){o&&o.d(t),t&&a(e)}}}function A(t){let e,o=t[2],m=F(t);return{c(){m.c(),e=s(),this.c=n},m(t,o){m.m(t,o),i(t,e,o)},p(t,[i]){4&i&&r(o,o=t[2])?(m.d(1),m=F(t),m.c(),m.m(e.parentNode,e)):m.p(t,i)},i:n,o:n,d(t){t&&a(e),m.d(t)}}}function E(t,e,o){let i,r,s,n,a=b(0);m(t,a,(t=>o(2,i=t)));let g=b({});m(t,g,(t=>o(3,r=t)));let d={},l={};function u(t){o(1,n="1fr 1fr")}let h=(t,e)=>{d[e]=JSON.parse(t),l[e]={};for(let t of d[e]){let o=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),o in l[e]?l[e][o].push(t):l[e][o]=[t]}a.update((t=>t+1))};T("/assets/groups.json",(t=>h(t,"groups"))),T("/assets/communes.json",(t=>h(t,"communes"))),T("/assets/cooperatives.json",(t=>h(t,"cooperatives"))),T("/assets/parties.json",(t=>h(t,"parties"))),j(g,"groups-component",a),j(g,"communes-component",a),j(g,"cooperatives-component",a),j(g,"parties-component",a),j(g,"countries",a);let f=j(g,"landing-component",a,u);function v(t,e,o){let i=t([22,0],2),r=k(d.groups,l.groups,i,e,o,y,"green"),s=k(d.communes,l.communes,i,e,o,U,"red"),n=k(d.cooperatives,l.cooperatives,i,e,o,z,"blue"),a=k(d.parties,l.parties,i,e,o,N,"gold"),m={};m[e.groups]=r,m[e.communes]=s,m[e.cooperatives]=n,m[e.parties]=a,L.control.layers(null,m).addTo(i)}u(),c((()=>{}));return[s,n,i,r,a,g,f,v,function(t){p[t?"unshift":"push"]((()=>{s=t,o(0,s)}))},t=>v(t,r,f)]}class H extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},E,A,r,{},null),t&&t.target&&i(t.target,this,t.anchor)}}customElements.define("landing-component",H);export{H as default};
diff --git a/Server/public/js/components/legend-component.js b/Server/public/js/components/legend-component.js
index 6a643c7..9646ee3 100644
--- a/Server/public/js/components/legend-component.js
+++ b/Server/public/js/components/legend-component.js
@@ -1 +1 @@
-import{S as t,i as e,a as s,b as o,u as n,s as r,f as i,n as a,h as l,d as c,p,o as u,g as h,t as d,v as m,l as f,q as g,m as y,w as $}from"./index-4348483d.js";import{pullLegendData as b}from"../../../../../../../../../js/predict/charts.js";function w(t,e,s){const o=t.slice();return o[10]=e[s],o[11]=e,o[12]=s,o}function x(t){let e,s,n,r,a,p,u,$,b=t[10].name+"",w=t[12];const x=()=>t[6](e,w),k=()=>t[6](null,w);function v(){return t[7](t[12])}return{c(){e=i("button"),s=i("div"),n=h(),r=i("span"),a=d(b),p=h(),l(s,"class","marker"),m(s,"background-color",t[10].color)},m(t,i){o(t,e,i),f(e,s),f(e,n),f(e,r),f(r,a),f(e,p),x(),u||($=g(e,"click",v),u=!0)},p(e,o){t=e,1&o&&m(s,"background-color",t[10].color),1&o&&b!==(b=t[10].name+"")&&y(a,b),w!==t[12]&&(k(),w=t[12],x())},d(t){t&&c(e),k(),u=!1,$()}}}function k(t){let e,s=t[0],n=[];for(let e=0;et._id)),c=a[t];for(let t=0;t{c()}));return t.$$set=t=>{"option"in t&&s(4,n=t.option),"chart"in t&&s(5,r=t.chart),"data"in t&&s(3,i=t.data)},[a,l,p,i,n,r,function(t,e){$[t?"unshift":"push"]((()=>{l[e]=t,s(1,l)}))},t=>p(t)]}class j extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:s(this.attributes),customElement:!0},v,k,r,{option:4,chart:5,data:3},null),t&&(t.target&&o(t.target,this,t.anchor),t.props&&(this.$set(t.props),n()))}static get observedAttributes(){return["option","chart","data"]}get option(){return this.$$.ctx[4]}set option(t){this.$$set({option:t}),n()}get chart(){return this.$$.ctx[5]}set chart(t){this.$$set({chart:t}),n()}get data(){return this.$$.ctx[3]}set data(t){this.$$set({data:t}),n()}}customElements.define("legend-component",j);export{j as default};
+import{S as t,i as e,a as s,b as o,v as n,s as r,g as i,n as a,j as l,d as c,u as p,o as u,h,t as d,w as m,m as f,p as g,q as y,f as $}from"./index-8c09578c.js";import{pullLegendData as b}from"../../../../../../../../../js/predict/charts.js";function w(t,e,s){const o=t.slice();return o[10]=e[s],o[11]=e,o[12]=s,o}function x(t){let e,s,n,r,a,p,u,$,b=t[10].name+"",w=t[12];const x=()=>t[6](e,w),k=()=>t[6](null,w);function j(){return t[7](t[12])}return{c(){e=i("button"),s=i("div"),n=h(),r=i("span"),a=d(b),p=h(),l(s,"class","marker"),m(s,"background-color",t[10].color)},m(t,i){o(t,e,i),f(e,s),f(e,n),f(e,r),f(r,a),f(e,p),x(),u||($=g(e,"click",j),u=!0)},p(e,o){t=e,1&o&&m(s,"background-color",t[10].color),1&o&&b!==(b=t[10].name+"")&&y(a,b),w!==t[12]&&(k(),w=t[12],x())},d(t){t&&c(e),k(),u=!1,$()}}}function k(t){let e,s=t[0],n=[];for(let e=0;et._id)),c=a[t];for(let t=0;t{c()}));return t.$$set=t=>{"option"in t&&s(4,n=t.option),"chart"in t&&s(5,r=t.chart),"data"in t&&s(3,i=t.data)},[a,l,p,i,n,r,function(t,e){$[t?"unshift":"push"]((()=>{l[e]=t,s(1,l)}))},t=>p(t)]}class v extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:s(this.attributes),customElement:!0},j,k,r,{option:4,chart:5,data:3},null),t&&(t.target&&o(t.target,this,t.anchor),t.props&&(this.$set(t.props),n()))}static get observedAttributes(){return["option","chart","data"]}get option(){return this.$$.ctx[4]}set option(t){this.$$set({option:t}),n()}get chart(){return this.$$.ctx[5]}set chart(t){this.$$set({chart:t}),n()}get data(){return this.$$.ctx[3]}set data(t){this.$$set({data:t}),n()}}customElements.define("legend-component",v);export{v as default};
diff --git a/Server/public/js/components/loadscreen-component.js b/Server/public/js/components/loadscreen-component.js
index 4feb1ba..614bede 100644
--- a/Server/public/js/components/loadscreen-component.js
+++ b/Server/public/js/components/loadscreen-component.js
@@ -1 +1 @@
-import{S as t,i as s,a as e,b as n,s as o,f as a,n as i,h as d,v as r,d as u,o as c,w as l}from"./index-4348483d.js";function h(t){let s;return{c(){s=a("div"),this.c=i,d(s,"id","loadscreen"),r(s,"width","100%"),r(s,"height","100%"),r(s,"background","white"),r(s,"position","absolute"),r(s,"z-index","100000")},m(e,o){n(e,s,o),t[1](s)},p:i,i:i,o:i,d(e){e&&u(s),t[1](null)}}}function p(t,s,e){let n;return c((()=>{window.addEventListener("load",(function(){e(0,n.parentNode.host.style.display="none",n)}))})),[n,function(t){l[t?"unshift":"push"]((()=>{n=t,e(0,n)}))}]}class f extends t{constructor(t){super(),s(this,{target:this.shadowRoot,props:e(this.attributes),customElement:!0},p,h,o,{},null),t&&t.target&&n(t.target,this,t.anchor)}}customElements.define("loadscreen-component",f);export{f as default};
+import{S as t,i as s,a as e,b as n,s as o,g as a,n as i,j as r,w as d,d as c,o as u,f as l}from"./index-8c09578c.js";function h(t){let s;return{c(){s=a("div"),this.c=i,r(s,"id","loadscreen"),d(s,"width","100%"),d(s,"height","100%"),d(s,"background","white"),d(s,"position","absolute"),d(s,"z-index","100000")},m(e,o){n(e,s,o),t[1](s)},p:i,i:i,o:i,d(e){e&&c(s),t[1](null)}}}function p(t,s,e){let n;return u((()=>{window.addEventListener("load",(function(){e(0,n.parentNode.host.style.display="none",n)}))})),[n,function(t){l[t?"unshift":"push"]((()=>{n=t,e(0,n)}))}]}class f extends t{constructor(t){super(),s(this,{target:this.shadowRoot,props:e(this.attributes),customElement:!0},p,h,o,{},null),t&&t.target&&n(t.target,this,t.anchor)}}customElements.define("loadscreen-component",f);export{f as default};
diff --git a/Server/public/js/components/manifesto-component.js b/Server/public/js/components/manifesto-component.js
index e0230b8..2bdf1eb 100644
--- a/Server/public/js/components/manifesto-component.js
+++ b/Server/public/js/components/manifesto-component.js
@@ -1 +1 @@
-import{S as t,i as e,a as n,b as i,s as l,e as o,n as r,d as s,c,o as a,w as d,f as m,h as u,l as f,t as h,g as p,j as g,v as w,q as b,m as x,p as y,y as v,H as k}from"./index-4348483d.js";import{w as H}from"./index-71440b21.js";import{loadLocaleContent as j,getData as I}from"../../../../../../../../../js/libraries/serverTools.js";import{px2rem as L}from"../../../../../../../../../js/libraries/miscTools.js";function T(t,e,n){const i=t.slice();return i[33]=e[n],i[34]=e,i[35]=n,i}function Y(t,e,n){const i=t.slice();return i[36]=e[n],i}function C(t,e,n){const i=t.slice();return i[36]=e[n],i}function M(t,e,n){const i=t.slice();return i[41]=e[n],i[42]=e,i[43]=n,i}function z(t,e,n){const i=t.slice();return i[44]=e[n],i[45]=e,i[46]=n,i}function A(t){let e,n,o=t[0],r=K(t);return{c(){e=m("div"),n=m("div"),r.c(),u(n,"id","text-container"),u(e,"id","container")},m(l,o){i(l,e,o),f(e,n),r.m(n,null),t[28](e)},p(t,e){1&e[0]&&l(o,o=t[0])?(r.d(1),r=K(t),r.c(),r.m(n,null)):r.p(t,e)},d(n){n&&s(e),r.d(n),t[28](null)}}}function V(t){let e,n,l,o,r,c,a=t[41].name+"",d=t[41];const g=()=>t[21](n,d),w=()=>t[21](null,d);function x(){return t[22](t[41])}return{c(){e=m("div"),n=m("button"),l=h(a),o=p(),u(n,"class","level0 heading-button"),u(e,"class","heading-button-wrapper")},m(t,s){i(t,e,s),f(e,n),f(n,l),g(),f(e,o),r||(c=b(n,"click",x),r=!0)},p(e,n){d!==(t=e)[41]&&(w(),d=t[41],g())},d(t){t&&s(e),w(),r=!1,c()}}}function O(t){let e,n=t[41],l=[];for(let e=0;et[19](n,d),w=()=>t[19](null,d);function x(){return t[20](t[44])}return{c(){e=m("div"),n=m("button"),l=h(a),o=p(),u(n,"class","level1 heading-button"),u(e,"class","heading-button-wrapper")},m(t,s){i(t,e,s),f(e,n),f(n,l),g(),f(e,o),r||(c=b(n,"click",x),r=!0)},p(e,n){d!==(t=e)[44]&&(w(),d=t[44],g())},d(t){t&&s(e),w(),r=!1,c()}}}function S(t){let e;let n=function(t,e){return Array.isArray(t[41])?O:V}(t),l=n(t);return{c(){l.c(),e=o()},m(t,n){l.m(t,n),i(t,e,n)},p(t,e){l.p(t,e)},d(t){l.d(t),t&&s(e)}}}function E(t){let e;let n=function(t,e){return t[33],"ul"==Object.keys(t[33])[0]?D:(t[33],"ol"==Object.keys(t[33])[0]?W:(t[33],"h3"==t[33].type?q:(t[33],"h2"==t[33].type?_:"#"==t[33][0]?B:N)))}(t),l=n(t);return{c(){l.c(),e=o()},m(t,n){l.m(t,n),i(t,e,n)},p(t,e){l.p(t,e)},d(t){l.d(t),t&&s(e)}}}function N(t){let e,n,l,o=t[33]+"";return{c(){e=m("p"),n=new k(!1),l=p(),n.a=l,u(e,"class","margin-end")},m(t,r){i(t,e,r),n.m(o,e),f(e,l)},p:r,d(t){t&&s(e)}}}function B(t){let e,n=t[33].slice(2,t[33].length)+"";return{c(){e=m("h1")},m(t,l){i(t,e,l),e.innerHTML=n},p:r,d(t){t&&s(e)}}}function _(t){let e,n,l,o,r,c=t[33].line+"",a=t[33];const d=()=>t[26](n,a),h=()=>t[26](null,a);return{c(){e=m("button"),n=m("h2"),l=p(),u(n,"id",t[33].id),w(e,"display","block"),w(e,"width","100%")},m(s,a){i(s,e,a),f(e,n),n.innerHTML=c,d(),f(e,l),o||(r=b(e,"click",(function(){v(t[6].scrollIntoView({block:"start"},!0))&&t[6].scrollIntoView({block:"start"},!0).apply(this,arguments)})),o=!0)},p(e,n){a!==(t=e)[33]&&(h(),a=t[33],d())},d(t){t&&s(e),h(),o=!1,r()}}}function q(t){let e,n,l,o,r,c=t[33].line+"",a=t[33];const d=()=>t[25](n,a),h=()=>t[25](null,a);return{c(){e=m("button"),n=m("h3"),l=p(),u(n,"id",t[33].id),w(e,"display","block"),w(e,"width","100%")},m(s,a){i(s,e,a),f(e,n),n.innerHTML=c,d(),f(e,l),o||(r=b(e,"click",(function(){v(t[6].scrollIntoView({block:"start"},!0))&&t[6].scrollIntoView({block:"start"},!0).apply(this,arguments)})),o=!0)},p(e,n){a!==(t=e)[33]&&(h(),a=t[33],d())},d(t){t&&s(e),h(),o=!1,r()}}}function W(t){let e,n,l=t[33].ol,o=[];for(let e=0;en(9,i=t)));let k=H({});c(t,k,(t=>n(10,l=t))),j(k,"countries",v);let T=j(k,"manifesto-component",v);const Y=["ul","ol"];function C(t){w[t].scrollIntoView({block:"start"},!0)}I("/locales/"+T+"/manifesto.txt",(function(t){let e,i=t.split(/\r?\n/),l=0;for(let t=0;tn.includes("<"+t+">"))).findIndex((t=>t));if(-1!=o){let e=Y[o],l={};l[e]=[];let r=""+e+">";for(;;){if(t+=1,n=i[t],n.includes(r)){p.push(l);break}l[e].push(n)}}else if("###"==n.slice(0,3)){let t=n.slice(4,n.length),i=t.toLowerCase().trim().replaceAll(" ","-");e.push({id:i,name:t,index:l}),l+=1,p.push({type:"h3",id:i,line:t,index:l})}else if("##"==n.slice(0,2)){let t=n.slice(3,n.length),i=t.toLowerCase().trim().replaceAll(" ","-");b.push({id:t.toLowerCase().trim().replaceAll(" ","-"),name:t,index:l}),l+=1,e=[],b.push(e),p.push({type:"h2",id:i,line:t,index:l})}else p.push(n)}n(0,o+=1)})),addEventListener("scroll",(t=>{if(window.innerWidth>1080){let t=L(window.scrollY),e=L(f.getBoundingClientRect().bottom+window.scrollY),i=L(u.getBoundingClientRect().bottom+window.scrollY);if(t>x&&t<5||t=e-1.5)y-=i-(e-1.5);else if(y>-5&&(y=-5),t<5&&0!=t){let t=L(u.offsetHeight-window.innerHeight);y=-Math.min(L(window.scrollY),5+t+2.5)}else if(twindow.innerHeight){let e=L(u.offsetHeight)-L(window.innerHeight);y>-(e+8)?y+=x-t:y=-(e+8)}n(6,u.style.marginTop=y+"rem",u),x=L(window.scrollY)}else n(6,u.style.marginTop="0rem",u)})),a((()=>{let t=localStorage.getItem("manifesto-hide-content");null!=t&&null!=t&&"true"==t&&U(s,m)}));return[o,r,s,m,g,w,u,f,h,i,l,p,b,v,k,C,function(t){d[t?"unshift":"push"]((()=>{s=t,n(2,s)}))},function(t){d[t?"unshift":"push"]((()=>{r=t,n(1,r)}))},()=>U(s,m),function(t,e){d[t?"unshift":"push"]((()=>{g[e.index]=t,n(4,g)}))},t=>C(t.id),function(t,e){d[t?"unshift":"push"]((()=>{g[e.index]=t,n(4,g)}))},t=>C(t.id),function(t){d[t?"unshift":"push"]((()=>{m=t,n(3,m)}))},function(t){d[t?"unshift":"push"]((()=>{u=t,n(6,u)}))},function(t,e){d[t?"unshift":"push"]((()=>{w[e.id]=t,n(5,w)}))},function(t,e){d[t?"unshift":"push"]((()=>{w[e.id]=t,n(5,w)}))},function(t){d[t?"unshift":"push"]((()=>{h=t,n(8,h)}))},function(t){d[t?"unshift":"push"]((()=>{f=t,n(7,f)}))}]}class Z extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},X,Q,l,{},null,[-1,-1]),t&&t.target&&i(t.target,this,t.anchor)}}customElements.define("manifesto-component",Z);export{Z as default};
+import{S as t,i as e,a as n,b as i,s as l,e as o,n as r,d as s,c,o as a,f as d,g as m,j as u,m as f,t as h,h as p,k as g,w,p as b,q as x,u as y,y as v,H as k}from"./index-8c09578c.js";import{w as H}from"./index-77787e10.js";import{loadLocaleContent as j,getData as I}from"../../../../../../../../../js/libraries/serverTools.js";import{px2rem as L}from"../../../../../../../../../js/libraries/miscTools.js";function T(t,e,n){const i=t.slice();return i[33]=e[n],i[34]=e,i[35]=n,i}function Y(t,e,n){const i=t.slice();return i[36]=e[n],i}function C(t,e,n){const i=t.slice();return i[36]=e[n],i}function M(t,e,n){const i=t.slice();return i[41]=e[n],i[42]=e,i[43]=n,i}function z(t,e,n){const i=t.slice();return i[44]=e[n],i[45]=e,i[46]=n,i}function A(t){let e,n,o=t[0],r=K(t);return{c(){e=m("div"),n=m("div"),r.c(),u(n,"id","text-container"),u(e,"id","container")},m(l,o){i(l,e,o),f(e,n),r.m(n,null),t[28](e)},p(t,e){1&e[0]&&l(o,o=t[0])?(r.d(1),r=K(t),r.c(),r.m(n,null)):r.p(t,e)},d(n){n&&s(e),r.d(n),t[28](null)}}}function V(t){let e,n,l,o,r,c,a=t[41].name+"",d=t[41];const g=()=>t[21](n,d),w=()=>t[21](null,d);function x(){return t[22](t[41])}return{c(){e=m("div"),n=m("button"),l=h(a),o=p(),u(n,"class","level0 heading-button"),u(e,"class","heading-button-wrapper")},m(t,s){i(t,e,s),f(e,n),f(n,l),g(),f(e,o),r||(c=b(n,"click",x),r=!0)},p(e,n){d!==(t=e)[41]&&(w(),d=t[41],g())},d(t){t&&s(e),w(),r=!1,c()}}}function O(t){let e,n=t[41],l=[];for(let e=0;et[19](n,d),w=()=>t[19](null,d);function x(){return t[20](t[44])}return{c(){e=m("div"),n=m("button"),l=h(a),o=p(),u(n,"class","level1 heading-button"),u(e,"class","heading-button-wrapper")},m(t,s){i(t,e,s),f(e,n),f(n,l),g(),f(e,o),r||(c=b(n,"click",x),r=!0)},p(e,n){d!==(t=e)[44]&&(w(),d=t[44],g())},d(t){t&&s(e),w(),r=!1,c()}}}function S(t){let e;let n=function(t,e){return Array.isArray(t[41])?O:V}(t),l=n(t);return{c(){l.c(),e=o()},m(t,n){l.m(t,n),i(t,e,n)},p(t,e){l.p(t,e)},d(t){l.d(t),t&&s(e)}}}function E(t){let e;let n=function(t,e){return t[33],"ul"==Object.keys(t[33])[0]?D:(t[33],"ol"==Object.keys(t[33])[0]?W:(t[33],"h3"==t[33].type?q:(t[33],"h2"==t[33].type?_:"#"==t[33][0]?B:N)))}(t),l=n(t);return{c(){l.c(),e=o()},m(t,n){l.m(t,n),i(t,e,n)},p(t,e){l.p(t,e)},d(t){l.d(t),t&&s(e)}}}function N(t){let e,n,l,o=t[33]+"";return{c(){e=m("p"),n=new k(!1),l=p(),n.a=l,u(e,"class","margin-end")},m(t,r){i(t,e,r),n.m(o,e),f(e,l)},p:r,d(t){t&&s(e)}}}function B(t){let e,n=t[33].slice(2,t[33].length)+"";return{c(){e=m("h1")},m(t,l){i(t,e,l),e.innerHTML=n},p:r,d(t){t&&s(e)}}}function _(t){let e,n,l,o,r,c=t[33].line+"",a=t[33];const d=()=>t[26](n,a),h=()=>t[26](null,a);return{c(){e=m("button"),n=m("h2"),l=p(),u(n,"id",t[33].id),w(e,"display","block"),w(e,"width","100%")},m(s,a){i(s,e,a),f(e,n),n.innerHTML=c,d(),f(e,l),o||(r=b(e,"click",(function(){v(t[6].scrollIntoView({block:"start"},!0))&&t[6].scrollIntoView({block:"start"},!0).apply(this,arguments)})),o=!0)},p(e,n){a!==(t=e)[33]&&(h(),a=t[33],d())},d(t){t&&s(e),h(),o=!1,r()}}}function q(t){let e,n,l,o,r,c=t[33].line+"",a=t[33];const d=()=>t[25](n,a),h=()=>t[25](null,a);return{c(){e=m("button"),n=m("h3"),l=p(),u(n,"id",t[33].id),w(e,"display","block"),w(e,"width","100%")},m(s,a){i(s,e,a),f(e,n),n.innerHTML=c,d(),f(e,l),o||(r=b(e,"click",(function(){v(t[6].scrollIntoView({block:"start"},!0))&&t[6].scrollIntoView({block:"start"},!0).apply(this,arguments)})),o=!0)},p(e,n){a!==(t=e)[33]&&(h(),a=t[33],d())},d(t){t&&s(e),h(),o=!1,r()}}}function W(t){let e,n,l=t[33].ol,o=[];for(let e=0;en(9,i=t)));let k=H({});c(t,k,(t=>n(10,l=t))),j(k,"countries",v);let T=j(k,"manifesto-component",v);const Y=["ul","ol"];function C(t){w[t].scrollIntoView({block:"start"},!0)}I("/locales/"+T+"/manifesto.txt",(function(t){let e,i=t.split(/\r?\n/),l=0;for(let t=0;tn.includes("<"+t+">"))).findIndex((t=>t));if(-1!=o){let e=Y[o],l={};l[e]=[];let r=""+e+">";for(;;){if(t+=1,n=i[t],n.includes(r)){p.push(l);break}l[e].push(n)}}else if("###"==n.slice(0,3)){let t=n.slice(4,n.length),i=t.toLowerCase().trim().replaceAll(" ","-");e.push({id:i,name:t,index:l}),l+=1,p.push({type:"h3",id:i,line:t,index:l})}else if("##"==n.slice(0,2)){let t=n.slice(3,n.length),i=t.toLowerCase().trim().replaceAll(" ","-");b.push({id:t.toLowerCase().trim().replaceAll(" ","-"),name:t,index:l}),l+=1,e=[],b.push(e),p.push({type:"h2",id:i,line:t,index:l})}else p.push(n)}n(0,o+=1)})),addEventListener("scroll",(t=>{if(window.innerWidth>1080){let t=L(window.scrollY),e=L(f.getBoundingClientRect().bottom+window.scrollY),i=L(u.getBoundingClientRect().bottom+window.scrollY);if(t>x&&t<5||t=e-1.5)y-=i-(e-1.5);else if(y>-5&&(y=-5),t<5&&0!=t){let t=L(u.offsetHeight-window.innerHeight);y=-Math.min(L(window.scrollY),5+t+2.5)}else if(twindow.innerHeight){let e=L(u.offsetHeight)-L(window.innerHeight);y>-(e+8)?y+=x-t:y=-(e+8)}n(6,u.style.marginTop=y+"rem",u),x=L(window.scrollY)}else n(6,u.style.marginTop="0rem",u)})),a((()=>{let t=localStorage.getItem("manifesto-hide-content");null!=t&&null!=t&&"true"==t&&U(s,m)}));return[o,r,s,m,g,w,u,f,h,i,l,p,b,v,k,C,function(t){d[t?"unshift":"push"]((()=>{s=t,n(2,s)}))},function(t){d[t?"unshift":"push"]((()=>{r=t,n(1,r)}))},()=>U(s,m),function(t,e){d[t?"unshift":"push"]((()=>{g[e.index]=t,n(4,g)}))},t=>C(t.id),function(t,e){d[t?"unshift":"push"]((()=>{g[e.index]=t,n(4,g)}))},t=>C(t.id),function(t){d[t?"unshift":"push"]((()=>{m=t,n(3,m)}))},function(t){d[t?"unshift":"push"]((()=>{u=t,n(6,u)}))},function(t,e){d[t?"unshift":"push"]((()=>{w[e.id]=t,n(5,w)}))},function(t,e){d[t?"unshift":"push"]((()=>{w[e.id]=t,n(5,w)}))},function(t){d[t?"unshift":"push"]((()=>{h=t,n(8,h)}))},function(t){d[t?"unshift":"push"]((()=>{f=t,n(7,f)}))}]}class Z extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},X,Q,l,{},null,[-1,-1]),t&&t.target&&i(t.target,this,t.anchor)}}customElements.define("manifesto-component",Z);export{Z as default};
diff --git a/Server/public/js/components/map-component.js b/Server/public/js/components/map-component.js
index ec2f98e..456ada1 100644
--- a/Server/public/js/components/map-component.js
+++ b/Server/public/js/components/map-component.js
@@ -1 +1 @@
-import{S as t,i as e,a as o,b as s,u as a,s as r,f as l,n,h as i,d as c,o as m,w as h}from"./index-4348483d.js";function p(t){let e;return{c(){e=l("div"),this.c=n,i(e,"id","map")},m(o,a){s(o,e,a),t[3](e)},p:n,i:n,o:n,d(o){o&&c(e),t[3](null)}}}function u(t,e,o){let s,{callback:a=null}=e,{colors:r=null}=e;function l(t,e){let o=L.map(s,{center:t,zoom:e});return L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'© OpenStreetMap contributors',minNativeZoom:2,minZoom:2,maxNativeZoom:14,maxZoom:14}).addTo(o),o}return m((()=>{if(a(l),null!=r){let t=s.getElementsByClassName("leaflet-control-layers-overlays")[0].children;for(let e=0;e{"callback"in t&&o(1,a=t.callback),"colors"in t&&o(2,r=t.colors)},[s,a,r,function(t){h[t?"unshift":"push"]((()=>{s=t,o(0,s)}))}]}class d extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},u,p,r,{callback:1,colors:2},null),t&&(t.target&&s(t.target,this,t.anchor),t.props&&(this.$set(t.props),a()))}static get observedAttributes(){return["callback","colors"]}get callback(){return this.$$.ctx[1]}set callback(t){this.$$set({callback:t}),a()}get colors(){return this.$$.ctx[2]}set colors(t){this.$$set({colors:t}),a()}}customElements.define("map-component",d);export{d as default};
+import{S as t,i as e,a as o,b as s,v as a,s as r,g as l,n as i,j as n,d as c,o as m,f as p}from"./index-8c09578c.js";function h(t){let e;return{c(){e=l("div"),this.c=i,n(e,"id","map")},m(o,a){s(o,e,a),t[3](e)},p:i,i:i,o:i,d(o){o&&c(e),t[3](null)}}}function u(t,e,o){let s,{callback:a=null}=e,{colors:r=null}=e;function l(t,e){let o=L.map(s,{center:t,zoom:e});return L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'© OpenStreetMap contributors',minNativeZoom:2,minZoom:2,maxNativeZoom:14,maxZoom:14}).addTo(o),o}return m((()=>{if(a(l),null!=r){let t=s.getElementsByClassName("leaflet-control-layers-overlays")[0].children;for(let e=0;e{"callback"in t&&o(1,a=t.callback),"colors"in t&&o(2,r=t.colors)},[s,a,r,function(t){p[t?"unshift":"push"]((()=>{s=t,o(0,s)}))}]}class d extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:o(this.attributes),customElement:!0},u,h,r,{callback:1,colors:2},null),t&&(t.target&&s(t.target,this,t.anchor),t.props&&(this.$set(t.props),a()))}static get observedAttributes(){return["callback","colors"]}get callback(){return this.$$.ctx[1]}set callback(t){this.$$set({callback:t}),a()}get colors(){return this.$$.ctx[2]}set colors(t){this.$$set({colors:t}),a()}}customElements.define("map-component",d);export{d as default};
diff --git a/Server/public/js/components/navbar-component.js b/Server/public/js/components/navbar-component.js
index 1064ab1..0ee69b1 100644
--- a/Server/public/js/components/navbar-component.js
+++ b/Server/public/js/components/navbar-component.js
@@ -1 +1 @@
-import{S as e,i as t,a as n,b as o,s as i,e as r,n as a,d as l,c as s,o as d,t as c,g as m,f as h,h as p,j as g,l as u,q as f,m as b,p as w,r as v,w as y}from"./index-4348483d.js";import{w as k}from"./index-71440b21.js";import{loadLocaleContent as x,locales as j}from"../../../../../../../../../js/libraries/serverTools.js";function H(e,t,n){const o=e.slice();return o[17]=t[n][0],o[18]=t[n][1],o}function z(e){let t,n,i,r,a,s,d,y,k,x,z,L,W,M,O,E,N,S,R,U,q,I,X,A,B,C,D,F,G,J,K,P,Q,V,Y,Z,$,_,ee,te,ne,oe,ie,re,ae,le,se,de,ce,me=e[11]()+"",he=e[4].orgName+"",pe=e[4].manifesto+"",ge=e[4].joinUs+"",ue=e[4].groups+"",fe=e[4].communes+"",be=e[4].cooperatives+"",we=e[4].parties+"",ve=e[4].partners+"",ye=Object.entries(j),ke=[];for(let t=0;t',d=m(),y=h("a"),k=h("img"),z=m(),L=h("span"),W=m(),M=h("nav"),O=h("ul"),E=h("li"),N=h("a"),S=c(pe),R=m(),U=h("li"),q=h("a"),I=c(ge),X=m(),A=h("li"),B=h("a"),C=c(ue),D=m(),F=h("li"),G=h("a"),J=c(fe),K=m(),P=h("li"),Q=h("a"),V=c(be),Y=m(),Z=h("li"),$=h("a"),_=c(we),ee=m(),te=h("li"),ne=h("a"),oe=c(ve),ie=m(),re=h("li"),ae=h("button"),ae.innerHTML=' \n \n ',le=m(),se=h("div");for(let e=0;en(4,o=e)));let h=x(m,"navbar-component",c);function p(e){localStorage.setItem("locale",e);let t=location.href.split("/"),n=Object.keys(j);t=t.filter((e=>!n.includes(e)));let o=t.slice(0,t.length-1).join("/")+"/"+e+"/"+t[t.length-1];location.href=o}d((()=>{}));return[i,r,a,l,o,c,m,h,function(){i.checked?n(1,r.style.background="white",r):setTimeout((()=>{n(1,r.style.position="relative",r),n(1,r.style.background="",r),n(1,r.style.boxShadow="",r)}),510)},function(){"block"==a.style.display?n(2,a.style.display="none",a):n(2,a.style.display="block",a)},p,function(){if("ru"==h){let e=()=>{null==l?setTimeout(e,100):(window.innerWidth<1700&&window.innerWidth>1400||window.innerWidth<400)&&"100%"!=l.style.lineHeight?(n(3,l.style.lineHeight="120%",l),n(3,l.style.top="1rem",l),n(3,l.style.width="16rem",l)):(window.innerWidth>1700||window.innerWidth>400&&window.innerWidth<1400)&&"400%"!=l.style.lineHeight&&(n(3,l.style.lineHeight="400%",l),n(3,l.style.top="0rem",l),n(3,l.style.width="auto",l))};e(),addEventListener("resize",e)}},function(e){y[e?"unshift":"push"]((()=>{i=e,n(0,i)}))},function(e){y[e?"unshift":"push"]((()=>{l=e,n(3,l)}))},e=>p(e),function(e){y[e?"unshift":"push"]((()=>{a=e,n(2,a)}))},function(e){y[e?"unshift":"push"]((()=>{r=e,n(1,r)}))}]}class M extends e{constructor(e){super(),this.shadowRoot.innerHTML="",t(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},W,L,i,{},null),e&&e.target&&o(e.target,this,e.anchor)}}customElements.define("navbar-component",M);export{M as default};
+import{S as e,i as t,a as n,b as o,s as i,e as r,n as a,d as l,c as s,o as d,t as c,h as m,g as h,j as p,k as u,m as g,p as f,q as b,u as w,r as v,f as y}from"./index-8c09578c.js";import{w as k}from"./index-77787e10.js";import{loadLocaleContent as x,locales as j}from"../../../../../../../../../js/libraries/serverTools.js";function H(e,t,n){const o=e.slice();return o[17]=t[n][0],o[18]=t[n][1],o}function z(e){let t,n,i,r,a,s,d,y,k,x,z,L,W,M,O,E,N,S,R,U,q,I,X,A,B,C,D,F,G,J,K,P,Q,V,Y,Z,$,_,ee,te,ne,oe,ie,re,ae,le,se,de,ce,me=e[11]()+"",he=e[4].orgName+"",pe=e[4].manifesto+"",ue=e[4].joinUs+"",ge=e[4].groups+"",fe=e[4].communes+"",be=e[4].cooperatives+"",we=e[4].parties+"",ve=e[4].partners+"",ye=Object.entries(j),ke=[];for(let t=0;t',d=m(),y=h("a"),k=h("img"),z=m(),L=h("span"),W=m(),M=h("nav"),O=h("ul"),E=h("li"),N=h("a"),S=c(pe),R=m(),U=h("li"),q=h("a"),I=c(ue),X=m(),A=h("li"),B=h("a"),C=c(ge),D=m(),F=h("li"),G=h("a"),J=c(fe),K=m(),P=h("li"),Q=h("a"),V=c(be),Y=m(),Z=h("li"),$=h("a"),_=c(we),ee=m(),te=h("li"),ne=h("a"),oe=c(ve),ie=m(),re=h("li"),ae=h("button"),ae.innerHTML=' \n \n ',le=m(),se=h("div");for(let e=0;en(4,o=e)));let h=x(m,"navbar-component",c);function p(e){localStorage.setItem("locale",e);let t=location.href.split("/"),n=Object.keys(j);t=t.filter((e=>!n.includes(e)));let o=t.slice(0,t.length-1).join("/")+"/"+e+"/"+t[t.length-1];location.href=o}d((()=>{}));return[i,r,a,l,o,c,m,h,function(){i.checked?n(1,r.style.background="white",r):setTimeout((()=>{n(1,r.style.position="relative",r),n(1,r.style.background="",r),n(1,r.style.boxShadow="",r)}),510)},function(){"block"==a.style.display?n(2,a.style.display="none",a):n(2,a.style.display="block",a)},p,function(){if("ru"==h){let e=()=>{null==l?setTimeout(e,100):(window.innerWidth<1700&&window.innerWidth>1400||window.innerWidth<400)&&"100%"!=l.style.lineHeight?(n(3,l.style.lineHeight="120%",l),n(3,l.style.top="1rem",l),n(3,l.style.width="16rem",l)):(window.innerWidth>1700||window.innerWidth>400&&window.innerWidth<1400)&&"400%"!=l.style.lineHeight&&(n(3,l.style.lineHeight="400%",l),n(3,l.style.top="0rem",l),n(3,l.style.width="auto",l))};e(),addEventListener("resize",e)}},function(e){y[e?"unshift":"push"]((()=>{i=e,n(0,i)}))},function(e){y[e?"unshift":"push"]((()=>{l=e,n(3,l)}))},e=>p(e),function(e){y[e?"unshift":"push"]((()=>{a=e,n(2,a)}))},function(e){y[e?"unshift":"push"]((()=>{r=e,n(1,r)}))}]}class M extends e{constructor(e){super(),this.shadowRoot.innerHTML="",t(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},W,L,i,{},null),e&&e.target&&o(e.target,this,e.anchor)}}customElements.define("navbar-component",M);export{M as default};
diff --git a/Server/public/js/components/pane-aligner.js b/Server/public/js/components/pane-aligner.js
index 784b939..3374096 100644
--- a/Server/public/js/components/pane-aligner.js
+++ b/Server/public/js/components/pane-aligner.js
@@ -1 +1 @@
-import{S as i,i as e,a,b as t,s as n,f as r,g as s,n as d,h as o,l,d as m,x as p,o as h,w as g}from"./index-4348483d.js";import{debounce as c}from"../../../../../../../../../js/libraries/miscTools.js";function f(i){let e,a,n,p,h,g,c,f,u,b;return{c(){e=r("div"),a=r("div"),n=r("div"),p=r("div"),p.innerHTML=' ',h=s(),g=r("div"),g.innerHTML=' ',c=s(),f=r("div"),f.innerHTML=' ',u=s(),b=r("div"),b.innerHTML=' ',this.c=d,o(p,"id","sidebar-left"),o(p,"class","pane"),o(g,"id","sidebar-left2"),o(g,"class","pane"),o(n,"id","sidebars-left"),o(n,"class","sidebar"),o(f,"id","sidebar-right"),o(f,"class","pane sidebar"),o(b,"id","main-pane"),o(b,"class","pane"),o(a,"class","pane-container"),o(e,"id","root"),o(e,"class","pane-centering")},m(r,s){t(r,e,s),l(e,a),l(a,n),l(n,p),i[5](p),l(n,h),l(n,g),i[6](g),l(a,c),l(a,f),i[7](f),l(a,u),l(a,b),i[8](b),i[9](e)},p:d,i:d,o:d,d(a){a&&m(e),i[5](null),i[6](null),i[7](null),i[8](null),i[9](null)}}}function u(i,e,a){let t,n,r,s,d,o=null!=p("alignerParent")?p("alignerParent").switchView:void 0,l=!1,m=!1,f=!1;function u(){if(null!=t.parentNode){let i=t.parentNode.host.childNodes;if(0==i.length)setTimeout(u,50);else{let e=!1,n=t.parentNode.innerHTML;for(let a of i)"sidebar-left"!=a.slot||l?"sidebar-left2"!=a.slot||m?"sidebar-right"!=a.slot||f||(n=n.replace("#sidebar-right{display:none;","#sidebar-right{"),f=!0,e=!0):(n=n.replace("#sidebar-left2{display:none}",""),m=!0,e=!0):(n=n.replace("#sidebar-left{display:none}",""),l=!0,e=!0);null!=o&&(n=n.replace("1880px",o),e=!0),e&&a(0,t.parentNode.innerHTML=n,t)}}}return window.addEventListener("resize",c(u,100)),h((()=>{u()})),[t,n,r,s,d,function(i){g[i?"unshift":"push"]((()=>{r=i,a(2,r)}))},function(i){g[i?"unshift":"push"]((()=>{s=i,a(3,s)}))},function(i){g[i?"unshift":"push"]((()=>{d=i,a(4,d)}))},function(i){g[i?"unshift":"push"]((()=>{n=i,a(1,n)}))},function(i){g[i?"unshift":"push"]((()=>{t=i,a(0,t)}))}]}class b extends i{constructor(i){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:a(this.attributes),customElement:!0},u,f,n,{},null),i&&i.target&&t(i.target,this,i.anchor)}}customElements.define("pane-aligner",b);export{b as default};
+import{S as i,i as e,a,b as t,s as n,g as r,h as s,n as d,j as o,m as l,d as m,x as p,o as h,f as g}from"./index-8c09578c.js";import{debounce as c}from"../../../../../../../../../js/libraries/miscTools.js";function f(i){let e,a,n,p,h,g,c,f,u,b;return{c(){e=r("div"),a=r("div"),n=r("div"),p=r("div"),p.innerHTML=' ',h=s(),g=r("div"),g.innerHTML=' ',c=s(),f=r("div"),f.innerHTML=' ',u=s(),b=r("div"),b.innerHTML=' ',this.c=d,o(p,"id","sidebar-left"),o(p,"class","pane"),o(g,"id","sidebar-left2"),o(g,"class","pane"),o(n,"id","sidebars-left"),o(n,"class","sidebar"),o(f,"id","sidebar-right"),o(f,"class","pane sidebar"),o(b,"id","main-pane"),o(b,"class","pane"),o(a,"class","pane-container"),o(e,"id","root"),o(e,"class","pane-centering")},m(r,s){t(r,e,s),l(e,a),l(a,n),l(n,p),i[5](p),l(n,h),l(n,g),i[6](g),l(a,c),l(a,f),i[7](f),l(a,u),l(a,b),i[8](b),i[9](e)},p:d,i:d,o:d,d(a){a&&m(e),i[5](null),i[6](null),i[7](null),i[8](null),i[9](null)}}}function u(i,e,a){let t,n,r,s,d,o=null!=p("alignerParent")?p("alignerParent").switchView:void 0,l=!1,m=!1,f=!1;function u(){if(null!=t.parentNode){let i=t.parentNode.host.childNodes;if(0==i.length)setTimeout(u,50);else{let e=!1,n=t.parentNode.innerHTML;for(let a of i)"sidebar-left"!=a.slot||l?"sidebar-left2"!=a.slot||m?"sidebar-right"!=a.slot||f||(n=n.replace("#sidebar-right{display:none;","#sidebar-right{"),f=!0,e=!0):(n=n.replace("#sidebar-left2{display:none}",""),m=!0,e=!0):(n=n.replace("#sidebar-left{display:none}",""),l=!0,e=!0);null!=o&&(n=n.replace("1880px",o),e=!0),e&&a(0,t.parentNode.innerHTML=n,t)}}}return window.addEventListener("resize",c(u,100)),h((()=>{u()})),[t,n,r,s,d,function(i){g[i?"unshift":"push"]((()=>{r=i,a(2,r)}))},function(i){g[i?"unshift":"push"]((()=>{s=i,a(3,s)}))},function(i){g[i?"unshift":"push"]((()=>{d=i,a(4,d)}))},function(i){g[i?"unshift":"push"]((()=>{n=i,a(1,n)}))},function(i){g[i?"unshift":"push"]((()=>{t=i,a(0,t)}))}]}class b extends i{constructor(i){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:a(this.attributes),customElement:!0},u,f,n,{},null),i&&i.target&&t(i.target,this,i.anchor)}}customElements.define("pane-aligner",b);export{b as default};
diff --git a/Server/public/js/components/parties-add-component.js b/Server/public/js/components/parties-add-component.js
new file mode 100644
index 0000000..5872196
--- /dev/null
+++ b/Server/public/js/components/parties-add-component.js
@@ -0,0 +1 @@
+import{S as t,i as e,a as n,b as i,s as o,e as a,n as r,d as s,c as l,o as c,f as m,g as p,h as u,j as d,k as f,l as g,m as h,p as b,r as w}from"./index-8c09578c.js";import{w as y}from"./index-77787e10.js";import{getData as v,loadLocaleContent as x,sendData as k}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as j,translate as S}from"../../../../../../../../../js/libraries/mapTools.js";import"../../../../../../../../../js/components/map-component.js";function z(t){let e,n,o,a,r,l,c,m,y,v,x,k,j,L,S,z,T,C,N,O,H,M,A,$,E,J,U,q,D,I,P,R,G,K,Q;return{c(){e=p("div"),n=p("div"),o=p("h1"),o.textContent="Add a Party",a=u(),r=p("img"),c=u(),m=p("p"),m.textContent="If there are no parties in your country which you can join then do the following:",y=u(),v=p("ol"),v.innerHTML="Click on the map to show us where you are located; \n Add a way to contact you or leave blank for a pin to point to our discord; \n Press "Submit" to add yourself to our map; \n Verify yourself by having a chat with us at our Discord server to show on the map; ",x=u(),k=p("div"),j=p("label"),j.textContent="Location:",L=u(),S=p("div"),z=p("input"),T=u(),C=p("div"),N=u(),O=p("div"),H=p("label"),H.textContent="Contact:",M=u(),A=p("div"),$=p("input"),E=u(),J=p("div"),U=u(),q=p("button"),q.textContent="Submit",D=u(),I=p("p"),P=u(),R=p("map-component"),d(r,"id","parties-img"),f(r.src,l="/img/common/parties.svg")||d(r,"src","/img/common/parties.svg"),d(r,"alt","parties"),d(m,"class","description"),d(j,"for","address-input"),d(z,"id","address-input"),d(z,"type","text"),z.readOnly=!0,d(C,"class","ghost-input"),d(S,"class","input-wrapper"),d(k,"id","address-input-wrapper"),d(k,"class","input-label-wrapper"),d(H,"for","contact-input"),d($,"id","contact-input"),d($,"type","text"),d(J,"class","ghost-input"),d(A,"class","input-wrapper"),d(O,"class","input-label-wrapper"),d(q,"id","submit-button"),d(I,"id","confirmation-msg"),g(R,"id","map"),g(R,"callback",G=t[15]),d(n,"id","text-container"),d(e,"id","container")},m(s,l){i(s,e,l),h(e,n),h(n,o),h(n,a),h(n,r),h(n,c),h(n,m),h(n,y),h(n,v),h(n,x),h(n,k),h(k,j),h(k,L),h(k,S),h(S,z),t[10](z),h(S,T),h(S,C),h(n,N),h(n,O),h(O,H),h(O,M),h(O,A),h(A,$),t[12]($),h(A,E),h(A,J),h(n,U),h(n,q),h(n,D),h(n,I),t[14](I),h(n,P),h(n,R),K||(Q=[b(z,"input",t[11]),b($,"input",t[13]),b(q,"click",t[9])],K=!0)},p(t,e){16&e&&G!==(G=t[15])&&g(R,"callback",G)},d(n){n&&s(e),t[10](null),t[12](null),t[14](null),K=!1,w(Q)}}}function T(t){let e,n=3==t[3]&&z(t);return{c(){n&&n.c(),e=a()},m(t,o){n&&n.m(t,o),i(t,e,o)},p(t,i){3==t[3]?n?n.p(t,i):(n=z(t),n.c(),n.m(e.parentNode,e)):n&&(n.d(1),n=null)},d(t){n&&n.d(t),t&&s(e)}}}function C(t){let e,n=t[3],l=T(t);return{c(){l.c(),e=a(),this.c=r},m(t,n){l.m(t,n),i(t,e,n)},p(t,[i]){8&i&&o(n,n=t[3])?(l.d(1),l=T(t),l.c(),l.m(e.parentNode,e)):l.p(t,i)},i:r,o:r,d(t){t&&s(e),l.d(t)}}}function N(t){t.nextElementSibling.innerHTML=t.value}function O(t,e,n){let i,o,a=y(0);l(t,a,(t=>n(3,i=t)));let r,s,p=y({});l(t,p,(t=>n(4,o=t)));let u,d,f,g;v("/assets/parties.json",(t=>{r=JSON.parse(t),s={};for(let t of r){let e=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),e in s?s[e].push(t):s[e]=[t]}a.update((t=>t+1))}));let h=0,b=0,w=function(t,e){let n=new L.Icon({iconUrl:"/img/common/markers/marker-black.png",shadowUrl:"https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]});return L.marker([t,e],{icon:n})}(0,0);w.setOpacity(0);let z=x(p,"parties-component",a);function T(t,e,n){let i,o=""+e.Group+" ";for(let a of["location","members","contact"]){let r=e[a]+": ";if("contact"==a)o+=r+""+t.contact+" ";else if("location"==a){let a,s=[t.country,t.state,t.town].filter((t=>null!=t&&null!=t));a="en"==n?s.map((t=>t)).join(", "):s.map((t=>S(e,t))).join(", "),o+=r+a+" ",i=[t.latitude,t.longitude]}else o+=r+t[a]+" "}return{text:o,coordinates:i}}function C(t,e,i){let o=t([22,0],2);j(r,s,o,e,i,T,"green"),w.addTo(o),o.on("click",(function(t){let e=t.latlng.lat,i=t.latlng.lng;h=e,b=i,function(t,e,n){let i=L.latLng(e,n);t.setLatLng(i)}(w,e,i),w.setOpacity(1),v(`https://nominatim.openstreetmap.org/reverse?lat=${e}&lon=${i}&format=jsonv2`,(t=>{let e=(t=JSON.parse(t)).address,i=e.city||e.town||e.village||e.hamlet,o=e.state,a=e.country;null!=o?a+=", "+o:o="",null!=i?a+=", "+i:i="",n(1,d.value=a,d),N(d)})),function(t,e){v(`https://nominatim.openstreetmap.org/reverse?lat=${t}&lon=${e}&format=jsonv2&accept-language=en`,(t=>{let e=(t=JSON.parse(t)).address,n=e.city||e.town||e.village||e.hamlet,i=e.state,o=e.country;null!=i||(i=""),null!=n||(n=""),g=[o,i,n]}))}(e,i)}))}function O(t){!1!==t?(n(0,u.innerHTML="You have been added to our database! Now go to our Discord to verify yourself.",u),n(0,u.style.color="green",u)):(n(0,u.innerHTML="Something went wrong.",u),n(0,u.style.color="red",u))}x(p,"countries",a),c((()=>{}));return[u,d,f,i,o,a,p,z,C,function(){if(null!=g){let t={country:g[0],state:g[1],town:g[2],latitude:h,longitude:b,contact:f.value};""==t.state&&(t.state=null),""==t.town&&(t.town=null),""==t.contact&&(t.contact=null),k("/"+z+"/parties-add-post/",t,O)}},function(t){m[t?"unshift":"push"]((()=>{d=t,n(1,d)}))},()=>N(d),function(t){m[t?"unshift":"push"]((()=>{f=t,n(2,f)}))},()=>N(f),function(t){m[t?"unshift":"push"]((()=>{u=t,n(0,u)}))},t=>C(t,o,z)]}class H extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},O,C,o,{},null),t&&t.target&&i(t.target,this,t.anchor)}}customElements.define("parties-add-component",H);export{H as default};
diff --git a/Server/public/js/components/parties-component.js b/Server/public/js/components/parties-component.js
index b0e9dd2..a9a59d1 100644
--- a/Server/public/js/components/parties-component.js
+++ b/Server/public/js/components/parties-component.js
@@ -1 +1 @@
-import{S as t,i as e,a as n,b as o,s as i,e as r,n as a,d as m,c as s,o as l,f as c,t as p,g,h as d,j as h,k as f,l as u,m as b,p as x}from"./index-4348483d.js";import{w as y}from"./index-71440b21.js";import{addMarkersParties as w,partiesByCountry as j}from"../../../../../../../../../js/parties.js";import{loadLocaleContent as v}from"../../../../../../../../../js/libraries/serverTools.js";import"../../../../../../../../../js/components/map-component.js";function k(t,e,n){const o=t.slice();return o[9]=e[n][0],o[10]=e[n][1],o}function z(t,e,n){const o=t.slice();return o[13]=e[n],o}function D(t){let e,n,i,r,a,s,l,y,w,v,z,D,E,O,R,T,A,C,H,L,M=t[0].parties+"",S=t[0].p1+"",_=t[0].subheading1+"",q=t[0]["map-prompt"]+"",B=Object.entries(j),F=[];for(let e=0;en(1,i=t)));let a=y({});s(t,a,(t=>n(0,o=t))),v(a,"countries",r);let m=v(a,"parties-component",r);function c(t,e,n){let o=t([22,0],2);w(o,e,n)}l((()=>{}));return[o,i,r,a,m,c,function(t){return"en"==m?t:o[t]},function(t){return"en"==m?t.location:o[t.location]},t=>c(t,o,m)]}class A extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},T,R,i,{},null),t&&t.target&&o(t.target,this,t.anchor)}}customElements.define("parties-component",A);export{A as default};
+import{S as t,i as e,a as n,b as o,s as r,e as i,n as a,d as s,c as m,o as c,g as l,t as p,h as g,j as d,k as h,l as f,m as u,q as b,u as w}from"./index-8c09578c.js";import{w as x}from"./index-77787e10.js";import{loadLocaleContent as j,getData as y}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as v,translate as k}from"../../../../../../../../../js/libraries/mapTools.js";import{addPartyPinContent as z}from"../../../../../../../../../js/mapFuncs.js";import"../../../../../../../../../js/components/map-component.js";function N(t,e,n){const o=t.slice();return o[12]=e[n][0],o[3]=e[n][1],o}function O(t,e,n){const o=t.slice();return o[15]=e[n],o}function T(t){let e,n,r,i,a,m,c,x,j,y,v,k,z,O,T,D,R,S,_,q,A=t[1].parties+"",C=t[1].p1+"",F=t[1].subheading1+"",H=t[1]["map-prompt"]+"",J=Object.entries(t[0]),K=[];for(let e=0;en(2,r=t)));let a,s,l=x({});m(t,l,(t=>n(1,o=t)));let p=j(l,"parties-component",i);j(l,"countries",i);function g(t,e,n){let o=t([22,0],2);v(a,s,o,e,n,z,"gold")}y("/assets/parties.json",(t=>{n(3,a=JSON.parse(t)),n(0,s={});for(let t of a){let e=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),e in s?s[e].push(t):n(0,s[e]=[t],s)}i.update((t=>t+1))})),c((()=>{}));return[s,o,r,a,i,l,p,g,function(t){return"en"==p?t:k(o,t)},function(t){return[t.country,t.state,t.town].filter((t=>null!=t)).map((t=>"en"==p?t:k(o,t))).join(", ")},t=>g(t,o,p)]}class q extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},_,S,r,{},null),t&&t.target&&o(t.target,this,t.anchor)}}customElements.define("parties-component",q);export{q as default};
diff --git a/Server/public/js/components/partners-add-component.js b/Server/public/js/components/partners-add-component.js
new file mode 100644
index 0000000..cd126de
--- /dev/null
+++ b/Server/public/js/components/partners-add-component.js
@@ -0,0 +1 @@
+import{S as t,i as o,a as n,b as e,s as r,e as a,n as i,d as c,c as s,o as m,g as l,t as p,h as u,j as g,k as d,l as f,m as h,q as b,u as j}from"./index-8c09578c.js";import{w as x}from"./index-77787e10.js";import{loadLocaleContent as y,getData as w}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as k,translate as v}from"../../../../../../../../../js/libraries/mapTools.js";import"../../../../../../../../../js/components/map-component.js";function z(t,o,n){const e=t.slice();return e[13]=o[n][0],e[3]=o[n][1],e}function N(t,o,n){const e=t.slice();return e[16]=o[n],e}function O(t){let o,n,r,a,i,s,m,x,y,w,k,v,N,O,T,E,R,S,_,q,A=t[1].groups+"",C=t[1].p1+"",G=t[1].subheading1+"",H=t[1]["map-prompt"]+"",J=Object.entries(t[0]),K=[];for(let o=0;on(2,r=t)));let i,c,l=x({});s(t,l,(t=>n(1,e=t)));let p=y(l,"groups-component",a);y(l,"countries",a);function u(t,o,n){let e,r=""+o.Group+" ";for(let a of["location","members","contact"]){let i=o[a]+": ";if("contact"==a)r+=i+""+t.contact+" ";else if("location"==a){let a,c=[t.country,t.state,t.town].filter((t=>null!=t&&null!=t));a="en"==n?c.map((t=>t)).join(", "):c.map((t=>v(o,t))).join(", "),r+=i+a+" ",e=[t.latitude,t.longitude]}else r+=i+t[a]+" "}return{text:r,coordinates:e}}function g(t,o,n){let e=t([22,0],2);k(i,c,e,o,n,u,"green")}w("/assets/groups.json",(t=>{n(3,i=JSON.parse(t)),n(0,c={});for(let t of i){let o=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),o in c?c[o].push(t):n(0,c[o]=[t],c)}a.update((t=>t+1))})),m((()=>{}));return[c,e,r,i,a,l,p,g,function(t){return"en"==p?t:v(e,t)},function(t){return[t.country,t.state,t.town].filter((t=>null!=t)).map((t=>"en"==p?t:v(e,t))).join(", ")},t=>g(t,e,p)]}class _ extends t{constructor(t){super(),this.shadowRoot.innerHTML="",o(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},S,R,r,{},null),t&&t.target&&e(t.target,this,t.anchor)}}customElements.define("partners-component",_);export{_ as default};
diff --git a/Server/public/js/components/partners-component.js b/Server/public/js/components/partners-component.js
index 32063c5..98b85fc 100644
--- a/Server/public/js/components/partners-component.js
+++ b/Server/public/js/components/partners-component.js
@@ -1 +1 @@
-import{S as t,i as n,a as e,b as o,s as r,e as i,n as a,d as m,c as s,o as l,f as c,t as g,g as p,h as d,j as h,l as f,m as u,p as b}from"./index-4348483d.js";import{w as x}from"./index-71440b21.js";import{loadLocaleContent as y}from"../../../../../../../../../js/libraries/serverTools.js";import{partnersByCountry as j}from"../../../../../../../../../js/partners.js";import"../../../../../../../../../js/components/map-component.js";function w(t,n,e){const o=t.slice();return o[7]=n[e][0],o[8]=n[e][1],o}function v(t,n,e){const o=t.slice();return o[11]=n[e],o}function k(t){let n,e,r,i,a,s,l,x,y,v,k,z,E,N,O=t[0].heading+"",R=t[0].p1+"",T=t[0].subheading1+"",A=Object.entries(j),C=[];for(let n=0;ne(1,r=t)));let a=x({});s(t,a,(t=>e(0,o=t))),y(a,"countries",i);let m=y(a,"partners-component",i);return l((()=>{})),[o,r,i,a,function(t){return"en"==m?t:o[t]},function(t){return t.location[0].map((t=>"en"==m?t:o[t])).join(", ")}]}class R extends t{constructor(t){super(),this.shadowRoot.innerHTML="",n(this,{target:this.shadowRoot,props:e(this.attributes),customElement:!0},O,N,r,{},null),t&&t.target&&o(t.target,this,t.anchor)}}customElements.define("partners-component",R);export{R as default};
+import{S as t,i as e,a as n,b as o,s as r,e as i,n as a,d as s,c as m,o as c,g as l,t as p,h as g,j as d,k as h,l as f,m as u,q as b,u as w}from"./index-8c09578c.js";import{w as x}from"./index-77787e10.js";import{loadLocaleContent as j,getData as v}from"../../../../../../../../../js/libraries/serverTools.js";import{addMarkersEntries as y,translate as k}from"../../../../../../../../../js/libraries/mapTools.js";import{addPartnersPinContent as z}from"../../../../../../../../../js/mapFuncs.js";import"../../../../../../../../../js/components/map-component.js";function N(t,e,n){const o=t.slice();return o[12]=e[n][0],o[3]=e[n][1],o}function O(t,e,n){const o=t.slice();return o[15]=e[n],o}function T(t){let e,n,r,i,a,m,c,x,j,v,y,k,z,O,T,D,R,S,_,q,A=t[1].heading+"",C=t[1].p1+"",F=t[1].subheading1+"",H=t[1]["map-prompt"]+"",J=Object.entries(t[0]),K=[];for(let e=0;en(2,r=t)));let a,s,l=x({});m(t,l,(t=>n(1,o=t)));let p=j(l,"partners-component",i);j(l,"countries",i);function g(t,e,n){let o=t([22,0],2);y(a,s,o,e,n,z,"blue")}v("/assets/partners.json",(t=>{n(3,a=JSON.parse(t)),n(0,s={});for(let t of a){let e=t.country;null==t.contact&&(t.contact="https://discord.gg/Qk8KUk787z"),e in s?s[e].push(t):n(0,s[e]=[t],s)}i.update((t=>t+1))})),c((()=>{}));return[s,o,r,a,i,l,p,g,function(t){return"en"==p?t:k(o,t)},function(t){return[t.country,t.state,t.town].filter((t=>null!=t)).map((t=>"en"==p?t:k(o,t))).join(", ")},t=>g(t,o,p)]}class q extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:n(this.attributes),customElement:!0},_,S,r,{},null),t&&t.target&&o(t.target,this,t.anchor)}}customElements.define("partners-component",q);export{q as default};
diff --git a/Server/public/js/components/select-component.js b/Server/public/js/components/select-component.js
index df38f5d..88eb532 100644
--- a/Server/public/js/components/select-component.js
+++ b/Server/public/js/components/select-component.js
@@ -1 +1 @@
-import{S as t,i as e,a as r,b as i,u as o,s as n,f as l,n as s,h as a,d,o as u,t as c,g as h,j as p,v as f,l as m,q as v,m as b,p as g,w}from"./index-4348483d.js";import{px2rem as y,getTextWidth as x,getCanvasFont as $}from"../../../../../../../../../js/libraries/miscTools.js";function k(t,e,r){const i=t.slice();return i[26]=e[r],i[27]=e,i[28]=r,i}function z(t){let e,r,o,n,s,a,u=t[26]+"",p=t[28];const f=()=>t[14](e,p),g=()=>t[14](null,p);function w(){return t[15](t[28])}return{c(){e=l("button"),r=l("span"),o=c(u),n=h(),e.value=t[28]},m(t,l){i(t,e,l),m(e,r),m(r,o),m(e,n),f(),s||(a=v(e,"click",w),s=!0)},p(e,r){t=e,4&r&&u!==(u=t[26]+"")&&b(o,u),p!==t[28]&&(g(),p=t[28],f())},d(t){t&&d(e),g(),s=!1,a()}}}function L(t){let e,r,o,n,s,u,w,y,x,$,L,j=(null!=t[0]?t[0]:"")+"",M=t[2],T=[];for(let e=0;ee==t));r(6,n.innerHTML=t,n),r(5,p[i].style.display="none",p),r(11,c=i)}r(8,f+=1)}}function b(t,e){null!=t&&null!=e&&e[t]!=d&&(r(0,d=e[t]),r(8,f+=1))}function g(){"none"==o.style.display?r(4,o.style.display="initial",o):r(4,o.style.display="none",o)}function k(t,e){r(11,c=t),r(0,d=a[t]),null!=e&&null!=e&&e(t)}function z(){r(4,o.style.display="none",o)}function L(t,e){let r;if(null!=t&&null!=e){let i=getComputedStyle(t).getPropertyValue("--width");if(isNaN(i)||""==i){if(null==m)return m=new ResizeObserver((()=>L(t,e))),void m.observe(l);i=getComputedStyle(l).getPropertyValue("width"),r=y(parseFloat(i.slice(0,i.length-2)))}else r=parseFloat(i.slice(0,i.length-2));let o=[];for(let t=0;tr){let t=1.1*n+"rem";e.style.width=t;for(let r=0;r{n=t,r(6,n)}))}function M(t){w[t?"unshift":"push"]((()=>{l=t,r(7,l)}))}function T(t,e){w[t?"unshift":"push"]((()=>{p[e]=t,r(5,p)}))}u((()=>{h.addEventListener("focusout",z)}));const E=t=>k(t,s);function H(t){w[t?"unshift":"push"]((()=>{o=t,r(4,o)}))}function R(t){w[t?"unshift":"push"]((()=>{i=t,r(3,i)}))}return t.$$set=t=>{"callback"in t&&r(1,s=t.callback),"options"in t&&r(2,a=t.options),"value"in t&&r(0,d=t.value),"valueindex"in t&&r(11,c=t.valueindex)},t.$$.update=()=>{5&t.$$.dirty&&v(d,a),2052&t.$$.dirty&&b(c,a),24&t.$$.dirty&&L(i,o)},[d,s,a,i,o,p,n,l,f,g,k,c,j,M,T,E,H,R]}class T extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:r(this.attributes),customElement:!0},M,j,n,{callback:1,options:2,value:0,valueindex:11},null),t&&(t.target&&i(t.target,this,t.anchor),t.props&&(this.$set(t.props),o()))}static get observedAttributes(){return["callback","options","value","valueindex"]}get callback(){return this.$$.ctx[1]}set callback(t){this.$$set({callback:t}),o()}get options(){return this.$$.ctx[2]}set options(t){this.$$set({options:t}),o()}get value(){return this.$$.ctx[0]}set value(t){this.$$set({value:t}),o()}get valueindex(){return this.$$.ctx[11]}set valueindex(t){this.$$set({valueindex:t}),o()}}customElements.define("select-component",T);export{T as default};
+import{S as t,i as e,a as r,b as i,v as o,s as n,g as l,n as s,j as a,d,o as u,t as c,h,k as p,w as f,m,p as v,q as b,u as g,f as w}from"./index-8c09578c.js";import{px2rem as y,getTextWidth as x,getCanvasFont as $}from"../../../../../../../../../js/libraries/miscTools.js";function k(t,e,r){const i=t.slice();return i[26]=e[r],i[27]=e,i[28]=r,i}function z(t){let e,r,o,n,s,a,u=t[26]+"",p=t[28];const f=()=>t[14](e,p),g=()=>t[14](null,p);function w(){return t[15](t[28])}return{c(){e=l("button"),r=l("span"),o=c(u),n=h(),e.value=t[28]},m(t,l){i(t,e,l),m(e,r),m(r,o),m(e,n),f(),s||(a=v(e,"click",w),s=!0)},p(e,r){t=e,4&r&&u!==(u=t[26]+"")&&b(o,u),p!==t[28]&&(g(),p=t[28],f())},d(t){t&&d(e),g(),s=!1,a()}}}function L(t){let e,r,o,n,s,u,w,y,x,$,L,j=(null!=t[0]?t[0]:"")+"",M=t[2],T=[];for(let e=0;ee==t));r(6,n.innerHTML=t,n),r(5,p[i].style.display="none",p),r(11,c=i)}r(8,f+=1)}}function b(t,e){null!=t&&null!=e&&e[t]!=d&&(r(0,d=e[t]),r(8,f+=1))}function g(){"none"==o.style.display?r(4,o.style.display="initial",o):r(4,o.style.display="none",o)}function k(t,e){r(11,c=t),r(0,d=a[t]),null!=e&&null!=e&&e(t)}function z(){r(4,o.style.display="none",o)}function L(t,e){let r;if(null!=t&&null!=e){let i=getComputedStyle(t).getPropertyValue("--width");if(isNaN(i)||""==i){if(null==m)return m=new ResizeObserver((()=>L(t,e))),void m.observe(l);i=getComputedStyle(l).getPropertyValue("width"),r=y(parseFloat(i.slice(0,i.length-2)))}else r=parseFloat(i.slice(0,i.length-2));let o=[];for(let t=0;tr){let t=1.1*n+"rem";e.style.width=t;for(let r=0;r{n=t,r(6,n)}))}function M(t){w[t?"unshift":"push"]((()=>{l=t,r(7,l)}))}function T(t,e){w[t?"unshift":"push"]((()=>{p[e]=t,r(5,p)}))}u((()=>{h.addEventListener("focusout",z)}));const E=t=>k(t,s);function H(t){w[t?"unshift":"push"]((()=>{o=t,r(4,o)}))}function R(t){w[t?"unshift":"push"]((()=>{i=t,r(3,i)}))}return t.$$set=t=>{"callback"in t&&r(1,s=t.callback),"options"in t&&r(2,a=t.options),"value"in t&&r(0,d=t.value),"valueindex"in t&&r(11,c=t.valueindex)},t.$$.update=()=>{5&t.$$.dirty&&v(d,a),2052&t.$$.dirty&&b(c,a),24&t.$$.dirty&&L(i,o)},[d,s,a,i,o,p,n,l,f,g,k,c,j,M,T,E,H,R]}class T extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:r(this.attributes),customElement:!0},M,j,n,{callback:1,options:2,value:0,valueindex:11},null),t&&(t.target&&i(t.target,this,t.anchor),t.props&&(this.$set(t.props),o()))}static get observedAttributes(){return["callback","options","value","valueindex"]}get callback(){return this.$$.ctx[1]}set callback(t){this.$$set({callback:t}),o()}get options(){return this.$$.ctx[2]}set options(t){this.$$set({options:t}),o()}get value(){return this.$$.ctx[0]}set value(t){this.$$set({value:t}),o()}get valueindex(){return this.$$.ctx[11]}set valueindex(t){this.$$set({valueindex:t}),o()}}customElements.define("select-component",T);export{T as default};
diff --git a/Server/public/js/components/switch-component.js b/Server/public/js/components/switch-component.js
index bd960dc..8029be9 100644
--- a/Server/public/js/components/switch-component.js
+++ b/Server/public/js/components/switch-component.js
@@ -1 +1 @@
-import{S as t,i as e,a as s,b as c,u as i,s as a,f as r,g as o,n as h,h as n,l,q as d,d as u,r as p,o as b}from"./index-4348483d.js";import"../../../../../../../../../js/libraries/miscTools.js";function k(t){let e,s,i,a,b,k;return{c(){e=r("label"),s=r("input"),i=o(),a=r("span"),this.c=h,n(s,"type","checkbox"),n(a,"class","switch-span"),n(e,"class","switch")},m(r,o){c(r,e,o),l(e,s),s.checked=t[0],l(e,i),l(e,a),b||(k=[d(s,"change",t[4]),d(s,"click",t[1])],b=!0)},p(t,[e]){1&e&&(s.checked=t[0])},i:h,o:h,d(t){t&&u(e),b=!1,p(k)}}}function g(t,e,s){let{callback:c=null}=e,{checked:i=!1}=e;const a=()=>{setTimeout((()=>{null!=c?(s(0,i=!i),c()):a()}),100)};return b((()=>{})),t.$$set=t=>{"callback"in t&&s(2,c=t.callback),"checked"in t&&s(0,i=t.checked)},[i,function(){null!=c&&(s(0,i=!i),c())},c,a,function(){i=this.checked,s(0,i)}]}class m extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:s(this.attributes),customElement:!0},g,k,a,{callback:2,checked:0,toggle:3},null),t&&(t.target&&c(t.target,this,t.anchor),t.props&&(this.$set(t.props),i()))}static get observedAttributes(){return["callback","checked","toggle"]}get callback(){return this.$$.ctx[2]}set callback(t){this.$$set({callback:t}),i()}get checked(){return this.$$.ctx[0]}set checked(t){this.$$set({checked:t}),i()}get toggle(){return this.$$.ctx[3]}}customElements.define("switch-component",m);export{m as default};
+import{S as t,i as e,a as s,b as c,v as i,s as a,g as r,h as o,n as h,j as n,m as l,p as d,d as p,r as u,o as b}from"./index-8c09578c.js";import"../../../../../../../../../js/libraries/miscTools.js";function k(t){let e,s,i,a,b,k;return{c(){e=r("label"),s=r("input"),i=o(),a=r("span"),this.c=h,n(s,"type","checkbox"),n(a,"class","switch-span"),n(e,"class","switch")},m(r,o){c(r,e,o),l(e,s),s.checked=t[0],l(e,i),l(e,a),b||(k=[d(s,"change",t[4]),d(s,"click",t[1])],b=!0)},p(t,[e]){1&e&&(s.checked=t[0])},i:h,o:h,d(t){t&&p(e),b=!1,u(k)}}}function g(t,e,s){let{callback:c=null}=e,{checked:i=!1}=e;const a=()=>{setTimeout((()=>{null!=c?(s(0,i=!i),c()):a()}),100)};return b((()=>{})),t.$$set=t=>{"callback"in t&&s(2,c=t.callback),"checked"in t&&s(0,i=t.checked)},[i,function(){null!=c&&(s(0,i=!i),c())},c,a,function(){i=this.checked,s(0,i)}]}class m extends t{constructor(t){super(),this.shadowRoot.innerHTML="",e(this,{target:this.shadowRoot,props:s(this.attributes),customElement:!0},g,k,a,{callback:2,checked:0,toggle:3},null),t&&(t.target&&c(t.target,this,t.anchor),t.props&&(this.$set(t.props),i()))}static get observedAttributes(){return["callback","checked","toggle"]}get callback(){return this.$$.ctx[2]}set callback(t){this.$$set({callback:t}),i()}get checked(){return this.$$.ctx[0]}set checked(t){this.$$set({checked:t}),i()}get toggle(){return this.$$.ctx[3]}}customElements.define("switch-component",m);export{m as default};
diff --git a/Server/public/js/libraries/mapTools.js b/Server/public/js/libraries/mapTools.js
new file mode 100644
index 0000000..1f9cfb4
--- /dev/null
+++ b/Server/public/js/libraries/mapTools.js
@@ -0,0 +1,90 @@
+let contactGeneral =["https://discord.gg/4BUau4AZre","DiscordInviteLink"]
+
+export function translate(content, x) {
+ let out = content[x]
+ if (out==undefined) {
+ return x
+ }
+ else {
+ return out
+ }
+}
+
+function addMarkersToLayer(g,layer,content,locale,addPinContent,markerColor) {
+ let {text,coordinates} = addPinContent(g,content,locale)
+ var markerIcon = new L.Icon({
+ iconUrl: 'https://www.libsoc.org/img/common/markers/marker-' + markerColor + '.png',
+ shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
+ iconSize: [25, 41],
+ iconAnchor: [12, 41],
+ popupAnchor: [1, -34],
+ shadowSize: [41, 41]
+ })
+ let marker = L.marker(coordinates, {icon: markerIcon})
+ marker.addTo(layer).bindPopup(text)
+}
+
+export function addMarkersEntries(entries,entriesByCountry,map,content,locale,addPinContent,markerColor) {
+ let entriesMarkersLayer = L.layerGroup()
+ let entriesMarkersLayerOut = L.layerGroup()
+ let entriesMarkersLayerIn = L.layerGroup()
+ for (let g of entries) {
+ if (g.country!="Online" && g.country!="Worldwide") {
+ addMarkersToLayer(g,entriesMarkersLayerIn,content,locale,addPinContent,markerColor)
+ }
+ }
+ for (let gs of Object.values(entriesByCountry)) {
+ if (gs.length==1) {
+ let g = {...gs[0]}
+ g.country = [g.country]
+ if (g.country!="Online" && g.country!="Worldwide") {
+ addMarkersToLayer(g,entriesMarkersLayerOut,content,locale,addPinContent,markerColor)
+ }
+ }
+ else {
+ if (gs[0].country!="Online" && gs[0].country!="Worldwide") {
+ let locationName = gs[0].country
+ let locationCoordinates = [0,0]
+ let members = 0
+ let contact = gs[0].contact
+ for (let g of gs) {
+ locationCoordinates[0] += g.latitude
+ locationCoordinates[1] += g.longitude
+ members += g.members
+ if (g.contact[0]!=gs[0].contact[0]) {
+ contact = contactGeneral
+ }
+ }
+ locationCoordinates[0] = locationCoordinates[0]/gs.length
+ locationCoordinates[1] = locationCoordinates[1]/gs.length
+ let gNew = {
+ country: locationName,
+ latitude: locationCoordinates[0],
+ longitude: locationCoordinates[1],
+ members: members,
+ contact: contact
+ }
+ addMarkersToLayer(gNew,entriesMarkersLayerOut,content,locale,addPinContent,markerColor)
+ }
+ }
+ }
+
+ entriesMarkersLayerOut.addTo(entriesMarkersLayer)
+ entriesMarkersLayer.addTo(map)
+ map.on("zoomend", () => onZoomEnd(map,entriesMarkersLayer,entriesMarkersLayerOut,entriesMarkersLayerIn))
+ return entriesMarkersLayer
+}
+
+function onZoomEnd(map,entriesMarkersLayer,entriesMarkersLayerOut,entriesMarkersLayerIn) {
+ let zoomLevel = map.getZoom()
+ if (zoomLevel==3) {
+ entriesMarkersLayer.removeLayer(entriesMarkersLayerIn)
+ entriesMarkersLayerOut.addTo(entriesMarkersLayer)
+ }
+ else if (zoomLevel==4) {
+ entriesMarkersLayer.removeLayer(entriesMarkersLayerOut)
+ entriesMarkersLayerIn.addTo(entriesMarkersLayer)
+ }
+}
+
+
diff --git a/Server/public/js/mapFuncs.js b/Server/public/js/mapFuncs.js
new file mode 100644
index 0000000..f37d0d7
--- /dev/null
+++ b/Server/public/js/mapFuncs.js
@@ -0,0 +1,178 @@
+import { translate } from "/js/libraries/mapTools.js"
+
+export function addGroupPinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Group"]+" "
+ for (let field of ["location","members","contact"]) {
+ let fieldText = content[field] + ": "
+ if (field=="contact") {
+ text += fieldText + "" + g.contact + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
+
+export function addCommunePinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Commune"]+" "
+ for (let field of ["location","status","members","contact"]) {
+ let fieldText = content[field] + ": "
+ if (field=="contact") {
+ text += fieldText + "" + g.contact + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else if (field=="status") {
+ text += fieldText + content[g[field]] + " "
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
+
+export function addCoopPinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Cooperative"]+" "
+ for (let field of ["logo","name","location","workers","status","website","contact","description"]) {
+ let fieldText
+ if (field!="logo") {
+ fieldText = content[field] + ": "
+ }
+ if (field=="logo") {
+ text += " " + " "
+ }
+ else if (field=="contact") {
+ text += fieldText + "" + g.contact + " " + " "
+ }
+ else if (field=="website") {
+ text += fieldText + "" + g.website + " " + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else if (field=="market" || field=="status" || field=="description") {
+ text += fieldText + g[field] + " "
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
+
+export function addPartyPinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Cooperative"]+" "
+ for (let field of ["logo","name","location","website","contact","description"]) {
+ let fieldText
+ if (field!="logo") {
+ fieldText = content[field] + ": "
+ }
+ if (field=="logo") {
+ text += " " + " "
+ }
+ else if (field=="link") {
+ text += fieldText + "" + g.link + " " + " "
+ }
+ else if (field=="website") {
+ text += fieldText + "" + g.website + " " + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else if (field=="description") {
+ text += fieldText + content[g[field]] + " "
+ }
+ else if (field=="contact") {
+ text += fieldText + "" + g.contact + " " + " "
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
+
+export function addPartnersPinContent(g,content,locale) {
+ let coordinates
+ let text = ""+content["Partner"]+" "
+ for (let field of ["logo","name","location","website","contact","description"]) {
+ let fieldText
+ if (field!="logo") {
+ fieldText = content[field] + ": "
+ }
+ if (field=="logo") {
+ text += " " + " "
+ }
+ else if (field=="contact") {
+ text += fieldText + "" + g.contact + " " + " "
+ }
+ else if (field=="website") {
+ text += fieldText + "" + g.website + " " + " "
+ }
+ else if (field=="location") {
+ let location = [g.country,g.state,g.town].filter(x => x!=null && x!=undefined)
+ let locationString
+ if (locale=="en") {
+ locationString = location.map(x => x).join(", ")
+ }
+ else {
+ locationString = location.map(x => translate(content, x)).join(", ")
+ }
+ text += fieldText + locationString + " "
+ coordinates = [g.latitude,g.longitude]
+ }
+ else if (field=="description") {
+ text += fieldText + g[field] + " "
+ }
+ else {
+ text += fieldText + g[field] + " "
+ }
+ }
+ return {text,coordinates}
+}
\ No newline at end of file
diff --git a/Server/public/locales/en/communes-component.json b/Server/public/locales/en/communes-component.json
index e9c522f..99f0d64 100644
--- a/Server/public/locales/en/communes-component.json
+++ b/Server/public/locales/en/communes-component.json
@@ -10,5 +10,6 @@
"forming": "forming",
"WhatsAppInviteLink": "WhatsApp invite link",
"DiscordInviteLink": "Discord invite link",
- "Commune": "Commune"
+ "Commune": "Commune",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/public/locales/en/cooperatives-component.json b/Server/public/locales/en/cooperatives-component.json
index b246fd4..06ce0d2 100644
--- a/Server/public/locales/en/cooperatives-component.json
+++ b/Server/public/locales/en/cooperatives-component.json
@@ -18,6 +18,7 @@
"descriptionChironHealth": "Chiron Health is a health platform providing courses and services on the topics of nutrition, exercise, sleep and mental wellbeing.",
"herbalTeas": "herbal teas",
"kuuskDescription": "Kuusk is an online store that sells herbal teas from exclusively local wild plants, as well as an online gathering course.",
- "Cooperative": "Cooperative"
+ "Cooperative": "Cooperative",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/public/locales/en/countries.json b/Server/public/locales/en/countries.json
index 8919b1b..0e0dcd2 100644
--- a/Server/public/locales/en/countries.json
+++ b/Server/public/locales/en/countries.json
@@ -1,3 +1,3 @@
{
- "map-prompt": "Want to appear on our map? Contact us!"
+
}
\ No newline at end of file
diff --git a/Server/public/locales/en/groups-component.json b/Server/public/locales/en/groups-component.json
index 18e5fb4..9a4eaf7 100644
--- a/Server/public/locales/en/groups-component.json
+++ b/Server/public/locales/en/groups-component.json
@@ -8,5 +8,6 @@
"contact": "Contact",
"DiscordInviteLink": "Discord invite link",
"WhatsAppInviteLink": "WhatsApp invite link",
- "Group": "Group"
+ "Group": "Group",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/public/locales/en/parties-component.json b/Server/public/locales/en/parties-component.json
index 317e43c..4fa7607 100644
--- a/Server/public/locales/en/parties-component.json
+++ b/Server/public/locales/en/parties-component.json
@@ -5,8 +5,10 @@
"name": "Name",
"location": "Location",
"members": "Members",
- "link": "Link",
+ "website": "Website",
+ "contact": "Contact",
"description": "Description",
"descriptionRoots": "We are a left libertarian organization based in Ireland. We have a focus on rebuilding the country's infrastructure, sense of governance, housing, agricultural industries and youth affairs.",
- "Party": "Party"
+ "Party": "Party",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/public/locales/en/partners-component.json b/Server/public/locales/en/partners-component.json
index f677ace..37421c6 100644
--- a/Server/public/locales/en/partners-component.json
+++ b/Server/public/locales/en/partners-component.json
@@ -5,10 +5,11 @@
"subheading2": "Online",
"name": "Name",
"location": "Location",
- "type": "Type",
- "link": "Link",
+ "website": "Website",
+ "contact": "Contact",
"description": "Description",
"typeGaiasFall": "a place for discussions",
- "descriptionGaiasFall": "Gaia's Fall is a server that promotes Solarpunk ideals, environmentalism, anarchism, and anti-capitalism. We encourage civil debates, discussions of theories and possibilities, and the creation of communities focused on shaping a better world."
+ "descriptionGaiasFall": "Gaia's Fall is a server that promotes Solarpunk ideals, environmentalism, anarchism, and anti-capitalism. We encourage civil debates, discussions of theories and possibilities, and the creation of communities focused on shaping a better world.",
+ "map-prompt": "Want to appear on our map? Contact us!"
}
\ No newline at end of file
diff --git a/Server/public/locales/ru/communes-component.json b/Server/public/locales/ru/communes-component.json
index d8e3064..b8bf573 100644
--- a/Server/public/locales/ru/communes-component.json
+++ b/Server/public/locales/ru/communes-component.json
@@ -9,5 +9,6 @@
"forming": "формируется",
"WhatsAppInviteLink": "WhatsApp ссылка",
"DiscordInviteLink": "Discord ссылка",
- "Commune": "Коммуна"
+ "Commune": "Коммуна",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/public/locales/ru/cooperatives-component.json b/Server/public/locales/ru/cooperatives-component.json
index c04de71..c824886 100644
--- a/Server/public/locales/ru/cooperatives-component.json
+++ b/Server/public/locales/ru/cooperatives-component.json
@@ -18,5 +18,6 @@
"descriptionChironHealth": "Chiron Health — это платформа о здоровье, предлагающая курсы и услуги по вопросам питания, физических упражнений, сна и психического благополучия",
"herbalTeas": "травяные чаи",
"kuuskDescription": "Kuusk — интернет-магазин, в котором продаются травяные чаи исключительно из местных дикорастущих растений, а также онлайн-курс по собирательству.",
- "Cooperative": "Кооператив"
+ "Cooperative": "Кооператив",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/public/locales/ru/countries.json b/Server/public/locales/ru/countries.json
index 56dd33d..0e0dcd2 100644
--- a/Server/public/locales/ru/countries.json
+++ b/Server/public/locales/ru/countries.json
@@ -1,30 +1,3 @@
{
- "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!",
- "Online": "Онлайн",
- "Denmark": "Дания",
- "Estonia": "Эстония",
- "Greece": "Греция",
- "Latvia": "Латвия",
- "Canada": "Канада",
- "Ireland": "Ирландия",
- "Germany": "Германия",
- "USA": "CША",
- "Bulgaria": "Болгария",
- "Thailand": "Тайланд",
- "Colorado": "Колорадо",
- "Georgia": "Джорджия",
- "Ohio": "Огайо",
- "Copenhagen": "Копенгаген",
- "Kolding": "Колдинг",
- "Kohtla-Järve": "Кохтла-Ярве",
- "Athens": "Афины",
- "Riga": "Рига",
- "Halifax": "Галифакс",
- "Montreal": "Монреаль",
- "Wiesbaden": "Висбаден",
- "Florida": "Флорида",
- "Tallinn": "Таллинн",
- "Varna": "Варна",
- "Louisville": "Луисвилл",
- "Toronto": "Торонто"
+
}
\ No newline at end of file
diff --git a/Server/public/locales/ru/groups-component.json b/Server/public/locales/ru/groups-component.json
index 4d0d9ff..b81838a 100644
--- a/Server/public/locales/ru/groups-component.json
+++ b/Server/public/locales/ru/groups-component.json
@@ -7,5 +7,6 @@
"contact": "Контакт",
"DiscordInviteLink": "Discord ссылка",
"WhatsAppInviteLink": "WhatsApp ссылка",
- "Group": "Группа"
+ "Group": "Группа",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/public/locales/ru/join-us-component.json b/Server/public/locales/ru/join-us-component.json
index 8ec1522..5b4df5d 100644
--- a/Server/public/locales/ru/join-us-component.json
+++ b/Server/public/locales/ru/join-us-component.json
@@ -30,5 +30,6 @@
"market": "Рынок",
"workers": "Работники",
"description": "Описание",
- "website": "Вебсайт"
+ "website": "Вебсайт",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/public/locales/ru/landing-component.json b/Server/public/locales/ru/landing-component.json
index e134c65..5eb789b 100644
--- a/Server/public/locales/ru/landing-component.json
+++ b/Server/public/locales/ru/landing-component.json
@@ -11,5 +11,6 @@
"findUs": "Найди нас",
"whatNow": "Что теперь?",
"joinUs": "Присоединяйся",
- "talkWithUs": "Напиши нам"
+ "talkWithUs": "Напиши нам",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/public/locales/ru/parties-component.json b/Server/public/locales/ru/parties-component.json
index 9a3d3fd..768b953 100644
--- a/Server/public/locales/ru/parties-component.json
+++ b/Server/public/locales/ru/parties-component.json
@@ -5,9 +5,11 @@
"name": "Имя",
"location": "Локация",
"members": "Участники",
- "link": "Ссылка",
+ "website": "Вебсайт",
+ "contact": "Контакт",
"description": "Описание",
"ireland": "Ирландия",
"descriptionRoots": "Мы — левая либертарная организация, базирующаяся в Ирландии. Мы уделяем особое внимание восстановлению инфраструктуры страны, самоуправлению, жилищному строительству, сельскохозяйственной промышленности и делам молодежи.",
- "Party": "Партия"
+ "Party": "Партия",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/public/locales/ru/partners-component.json b/Server/public/locales/ru/partners-component.json
index 3ebd453..4d5a616 100644
--- a/Server/public/locales/ru/partners-component.json
+++ b/Server/public/locales/ru/partners-component.json
@@ -6,8 +6,10 @@
"name": "Название",
"location": "Локация",
"type": "Тип",
- "link": "Ссылка",
+ "website": "Вебсайт",
+ "contact": "Контакт",
"description": "Описание",
"typeGaiasFall": "место для общения",
- "descriptionGaiasFall": "Gaia's Fall — это сервер, который продвигает идеалы соларпанка, защиту окружающей среды, анархизм и антикапитализм. Мы поощряем гражданские дебаты, обсуждение теорий и возможностей, а также создание сообществ, сосредоточенных на формировании лучшего мира."
+ "descriptionGaiasFall": "Gaia's Fall — это сервер, который продвигает идеалы соларпанка, защиту окружающей среды, анархизм и антикапитализм. Мы поощряем гражданские дебаты, обсуждение теорий и возможностей, а также создание сообществ, сосредоточенных на формировании лучшего мира.",
+ "map-prompt": "Хочешь оказаться на нашей карте? Напиши нам!"
}
\ No newline at end of file
diff --git a/Server/routes.jl b/Server/routes.jl
index 94b5019..7c3157c 100644
--- a/Server/routes.jl
+++ b/Server/routes.jl
@@ -5,24 +5,50 @@ using Server.BasicController
#---Basic-----------------------------------------------------------
+route("/:locale/*", BasicController.landing, named = :landing)
+
route("/:locale/manifesto/*", BasicController.manifesto, named = :manifest)
route("/:locale/join-us/*", BasicController.join_us, named = :join_us)
-route("/:locale/groups/*", BasicController.groups, named = :groups)
-
-route("/:locale/groups-add/*", BasicController.groups_add, named = :groups_add)
-
-route("/:locale/groups-add-post/*", BasicController.groups_add_post, method = POST, named = :groups_add_post)
-
-route("/:locale/cooperatives/*", BasicController.cooperatives, named = :cooperatives)
-
-route("/:locale/communes/*", BasicController.communes, named = :communes)
-
-route("/:locale/parties/*", BasicController.parties, named = :parties)
-
-route("/:locale/partners/*", BasicController.partners, named = :partners)
-
route("/:locale/political-compass/*", BasicController.political_compass, named = :political_compass)
-route("/:locale/*", BasicController.landing, named = :landing)
+#---Groups----------------------------------------------------------
+
+route("/:locale/groups/*", GroupsController.groups, named = :groups)
+
+route("/:locale/groups-add/*", GroupsController.groups_add, named = :groups_add)
+
+route("/:locale/groups-add-post/*", GroupsController.groups_add_post, method = POST, named = :groups_add_post)
+
+#---Coops----------------------------------------------------------
+
+route("/:locale/cooperatives/*", CooperativesController.cooperatives, named = :cooperatives)
+
+route("/:locale/cooperatives-add/*", CooperativesController.cooperatives_add, named = :cooperatives_add)
+
+route("/:locale/cooperatives-add-post/*", CooperativesController.cooperatives_add_post, method = POST, named = :cooperatives_add_post)
+
+#---Communes----------------------------------------------------------
+
+route("/:locale/communes/*", CommunesController.communes, named = :communes)
+
+route("/:locale/communes-add/*", CommunesController.communes_add, named = :communes_add)
+
+route("/:locale/communes-add-post/*", CommunesController.communes_add_post, method = POST, named = :communes_add_post)
+
+#---Parties----------------------------------------------------------
+
+route("/:locale/parties/*", PartiesController.parties, named = :parties)
+
+route("/:locale/parties-add/*", PartiesController.parties_add, named = :parties_add)
+
+route("/:locale/parties-add-post/*", PartiesController.parties_add_post, method = POST, named = :parties_add_post)
+
+#---Partners---------------------------------------------------------
+
+route("/:locale/partners/*", PartnersController.partners, named = :partners)
+
+route("/:locale/partners-add/*", PartnersController.partners_add, named = :partners_add)
+
+route("/:locale/partners-add-post/*", PartnersController.partners_add_post, method = POST, named = :partners_add_post)
\ No newline at end of file