diff --git a/assets/event_sources.json b/assets/event_sources.json
index b85dc61..19cee9c 100644
--- a/assets/event_sources.json
+++ b/assets/event_sources.json
@@ -1,470 +1,626 @@
{
- "googleCalendar": [
- {
- "name": "rva.rip Manually Added Events",
- "googleCalendarId": "1c16b938a56fea0342068f59730a90d90bec79d49d44c6fcc0b46915705b8cea@group.calendar.google.com",
- "city": "Oakland",
- "filters": [
- [["market","commercial"], "Market", ["title","description"]],
- ["palestine", "π΅πΈ", ["title","description"]],
- ["biking", "π²", ["title","description"]],
- ["sobriety", "π", "title"],
- ["free stuff", "Free Food", "title"],
- ["community","commercial"]
- ]
- },
- {
- "name": "Burning Van",
- "googleCalendarId": "burningvan69@gmail.com",
- "city": "Oakland",
- "filters": [
- ["community"],
- ["biking"]
- ]
- },
- {
- "name": "Anonymous Contributor CB",
- "googleCalendarId": "657b8cf1729356210e21d20c93e7696cd90fc8c06e32e22b0bc137318b8b0c00@group.calendar.google.com",
- "city": "Oakland",
- "filters": [
- ["community"],
- ["theater", "PLAY", "title"]
- ]
- },
- {
- "name": "Food Not Bombs",
- "googleCalendarId": "2eb28d433a637a4d0ba2d2969fa9ccbd7042d83f5992ff0aaafb01d70a299884@group.calendar.google.com",
- "city": "Oakland",
- "filters": [
- ["community"],
- ["free stuff", "Free", "title"],
- ["volunteering", "Volunteer", "title"]
- ]
- },
- {
- "name": "RVA Queer Soccer",
- "googleCalendarId": "rvaqueersoccer@gmail.com",
- "city": "Oakland",
- "filters": [
- ["community"],
- ["sports"]
- ]
- },
- {
- "name": "Dykes on Bikes RVA",
- "googleCalendarId": "0443449fed4f78e2434616b80b74c88bd6a942328e8583fa7f35fecdc1df97ca@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":dykes_on_bikes: ",
- "filters": [
- ["community"],
- ["biking"]
- ]
- },
- {
- "name": "James River Park Cleanup",
- "googleCalendarId": "029ddcdb1317ef7c5c4aa1ea53964073e72ae633462e014c83332f6ba0c91b41@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":fojrp: ",
- "filters": [
- ["ecology"],
- ["volunteering"]
- ]
- },
- {
- "name": "RVA.RIP Major Update Announcements",
- "googleCalendarId": "2847685acc28b260c69a05bd948038fffe1b00cc12424b6a35ef39480a3900c1@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":ripple: ",
- "filters": [
- ["community"],
- ["announcement"]
- ]
- },
- {
- "name": "MADRVA",
- "googleCalendarId": "7332d16dfa04b8b3e944e462f6dc832d5559036dbc9f15d9803f04d61ce5ad7d@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":madrva:",
- "filters": [
- ["community"],
- ["volunteering", "Free Store", "title"],
- ["free stuff", "Free Store", "title"]
- ]
- },
- {
- "name": "C's Weekly Rides Calendar",
- "googleCalendarId": "999072f138be452067352af67a3cc0370c7594ef8b8ae19fd4d73d3cd9471032@group.calendar.google.com",
- "city": "Oakland",
- "filters": [
- ["community"],
- ["biking"],
- ["sobriety", "π", "title"]
- ]
- },
- {
- "name": "Reasonable Morning Ride",
- "googleCalendarId": "56042348356c1aa89c4783614ea1ffe2414edd1717568c161e0c6ab4415c4423@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": "βπ² ",
- "filters": [
- ["community"],
- ["biking"]
- ]
- },
- {
- "name": "Coalition Theater",
- "googleCalendarId": "r1funfuomjmgs47jph9faksu32iu7ktb@import.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":coalition_theater: ",
- "suffixTitle": "",
- "filters": [
- ["community"],
- ["theater"]
- ]
- },
- {
- "name": "hackRVA",
- "googleCalendarId": "hack.rva@gmail.com",
- "city": "Oakland",
- "prefixTitle": ":hackrva: ",
- "suffixDescription": "
HackRVA is a member-run and organized non-profit makerspace in Richmond, Virginia. HackRVA is a space filled with tools, computers, and people who like to build, invent, tinker, expand their minds, and learn and share new skills. Youβll find a diverse group of individuals who are into electronics, woodworking, embedded software, metalworking, coding (programming), music, art, video, photography, 3D printing, sewing, textiles, and virtual realityβand thatβs for starters. HackRVA members have access to the makerspace, tools, community and learning opportunities through member-led workshops, events, and projects. For more information check out our website ww.hackrva.org !Poster ",
- "defaultLocation": "2026A Dabney Road, Richmond VA 23230",
- "filters": [
- [["community","diy"], "Open", ["title","description"]],
- ["invisible", "community"]
- ]
- },
- {
- "name": "Kasama Collective",
- "googleCalendarId": "c0ba770604500783fe65753bbbdd682b55b6bd50ad656c92706426758e5251b8@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":kasamacollective: ",
- "filters": [
- ["commercial"],
- ["market"]
- ]
- },
- {
- "name": "Outpost Adventure Club Calendar",
- "googleCalendarId": "info@outpostrichmond.com",
- "city": "Oakland",
- "prefixTitle": ":outpost: ",
- "filters": [
- ["community"],
- ["biking"]
- ]
- },
- {
- "name": "PSL Virginia @pslvirginia",
- "googleCalendarId": "7c07b5d92633673b1409ee65d643ddfde18cf257323136f95c9ceb3e5afda5de@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":psl:",
- "filters": [
- ["community"],
- ["socialism"],
- ["organizing"]
- ]
- },
- {
- "name": "Gold Lion Cafe",
- "googleCalendarId": "c_0e01d5366281ee1230a34c41e4f988fac5cb94324aec20d86f035457d14722df@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":goldlion: ",
- "defaultLocation": "1012 Hull St, Richmond, VA 23224, USA",
- "filters": [
- ["invisible", "undefined", "title"],
- [["music"], "Concert", ["title","description"]],
- ["invisible", "Community Meditation with Meg", "title"],
- ["community", "River City Writers Meeting", ["title","description"]],
- ["community", "Dance", ["title","description"]],
- ["community", "New to RVA Meetup", ["title","description"]],
- ["community", "Drawing", ["title","description"]],
- ["community", "Forum", ["title"]],
- ["community", "Community Morning", ["title"]],
- [["community","music"], "Live in da Garden", ["title","description"]],
- [["community"], "Vegan", ["title","description"]],
- [["community","ecology"], "Enviromental", ["title","description"]],
- [["music","karaoke"], "karaoke", ["title","description"]],
- [["community","sports"], "yoga", "title"],
- ["commercial","community"]
-
- ]
- },
- {
- "name": "@rvaqueerbookclub",
- "googleCalendarId": "63b6eb40d80e3feaec30d2d5bfcf3450aeb45bae641366a91c37bbc422be3bb1@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": "ππ ",
- "filters": [
- [["community","books"]]
- ]
- },
- {
- "name": "@broadstreetbullies804",
- "googleCalendarId": "4ce2fe20599863c927fb7a6a6ec6e0e10a50b438de070948b4daeafc9731e73f@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":BSB:",
- "filters": [
- ["community"],
- ["biking"]
- ]
- },
- {
- "name": "Sunrise Movement RVA",
- "googleCalendarId": "9848cc3a6ebfce17fb9a2f5aa72ae2ad315cf96e323e071540de5c5a6de2c701@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":sunrise: ",
- "filters": [
- ["community"],
- ["organizing"],
- ["ecology"]
- ]
- },
- {
- "name": "RVA Roll Patrol",
- "googleCalendarId": "rva.roll.patrol@gmail.com",
- "city": "Oakland",
- "prefixTitle": "πΌ",
- "filters": [
- ["community"],
- ["skating"],
- ["sports"]
- ]
- },
- {
- "name": "Rag and Bones Bicycle Cooperative",
- "googleCalendarId": "ragandbonesvolunteers@gmail.com",
- "city": "Oakland",
- "prefixTitle": "π π² ",
- "suffixTitle": " | Rag & Bones Bicycle Cooperative",
- "defaultLocation": "2916 North Avenue, Richmond VA 23230",
- "suffixDescription": " Website | Instagram | Facebook ",
- "filters": [
- ["community"],
- ["volunteering", "Open Hours", "title", "party"],
- ["music", "Benefit", ["title","description"]]
- ]
- },
- {
- "name": "New Habit Cinema",
- "googleCalendarId": "01cd966b384a29a5d1f8f341f8bb7aa56cad3b0233d0b20402a30ac640691690@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": "π½οΈ",
- "suffixDescription": "Instagram ",
- "filters": [
- ["community"],
- ["movies"]
- ]
- },
- {
- "name": "Continuity Press",
- "googleCalendarId": "de72cf999d4da30155c68eb7040ede22c0540275b3a884e355482100ec744765@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": "βΎοΈ ",
- "suffixTitle": " | Continuity Press",
- "filters": [
- ["community"],
- ["diy"]
- ]
- },
- {
- "name": "James River Anarchist Black Cross",
- "googleCalendarId": "jrabc1312@gmail.com",
- "city": "Oakland",
- "prefixTitle": ":jrabc: ",
- "suffixTitle": "",
- "filters": [
- ["community"],
- ["organizing"],
- ["socialism"]
- ]
- },
- {
- "name": "Girlspit",
- "googleCalendarId": "6beec3f66bcf6792c6920b8a59f5e1e8a736582c613a9e74e8189008f47d6dd6@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": "",
- "suffixTitle": "",
- "filters": [
- ["community"],
- ["music"]
- ]
- },
- {
- "name": "π΅ RVA Community Sing",
- "googleCalendarId": "905d99152584dc38b5565e9cdd3beb88b30e02bb8998164fc489563414795bbb@group.calendar.google.com",
- "city": "Oakland",
- "filters": [
- ["community"],
- ["music"]
- ]
- },
- {
- "name": "π³οΈββ§οΈ Layers of Change",
- "googleCalendarId": "6c7cd3cc0e9ff43a606292aafed9b215b100cab9d53c4892e651651abe13cf07@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":layersofchange: ",
- "filters": [
- ["community"],
- ["support"],
- ["transgender"]
- ]
- },
- {
- "name": "Anonymous Contributor Mycelium",
- "googleCalendarId": "fgucrprcbjr861qqa2t1r0qjvs@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": "πβπ« ",
- "filters": [
- ["community"],
- ["invisible", "Broadrock", "title"],
- ["invisible", "Gilpin", "title"],
- ["invisible", "FOJRP", "title"],
- ["invisible", "PSL", "title"],
- ["invisible", "Fnb", "title"],
- ["invisible", "James River Park System", "description"],
- ["activism", "red", "title"]
- ]
- },
- {
- "name": "π³οΈββ§οΈ Trans Jam Events",
- "googleCalendarId": "ff1e734c712e4c89069f15ee40a875e77f8e12844a1e398dae8ea19964407d70@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": ":transjam:π³οΈββ§οΈ ",
- "filters": [
- ["community"],
- ["transgender"]
- ]
- },
- {
- "name": "π²π―οΈ Secret Bike Club",
- "googleCalendarId": "6d2ce8d9e9d3821a56e2ef91cadbbd8791bf34891a90380787874cbb8c60aa45@group.calendar.google.com",
- "city": "Oakland",
- "filters": [
- ["community"],
- ["biking"]
- ]
- },
- {
- "name": "Known Contributor Rebel Rouser",
- "googleCalendarId": "3940f9dd4d7b006ada3c8643edafb9846fa182792ed08f376c107e18d05b3289@group.calendar.google.com",
- "city": "Oakland",
- "prefixTitle": "π ",
- "filters": [
- ["commercial"],
- ["drag"]
- ]
- }
- ],
- "squarespace": [
- {
- "name": "Richmond Grows Gardens",
- "url": "https://www.richmondgrowsgardens.org/events?format=json",
- "city": "Oakland",
- "prefixTitle": ":RVAGrowsGardens1: ",
- "suffixTitle": ":RVAGrowsGardens2:",
- "filters": [
- ["community"],
- ["ecology"]
- ]
- }
- ],
- "elfsight": [
- {
- "name": "Studio Two Three",
- "url": "https://core.service.elfsight.com/p/boot/?page=https%3A%2F%2Fwww.studiotwothree.org%2Fcommunity-events&w=24ddbed9-c732-4102-abd2-02990fae125b",
- "key": "24ddbed9-c732-4102-abd2-02990fae125b",
- "city": "Oakland",
- "prefixTitle": ":studiotwothree:",
- "eventTypes": [
- ["Courses and Workshops", "π"],
- ["Film Screenings", "π½"],
- ["Community Events", "π€"],
- ["Artist Markets", "ποΈ"],
- ["Private Events", "π"],
- ["Community Organizing Event", "π’"]
- ],
- "eventDefault": [
- "", ""
- ],
- "filters": [
- [["community", "movies"], "Film", ["title","description"]],
- [["community", "dance"], "dance", ["title"]],
- ["community", "Community Events", ["title","description"]],
- [["palestine","community"], "palestine", ["title","description"]],
- ["free stuff", "clothing swap", ["title","description"]],
- [["diy"], "Courses and Workshops", ["title","description"]],
- [["market"], "Artist Markets", ["title","description"]],
- [["community","organizing"], "Community Organizing Event", ["title","description"]],
- [["dance","sports"], "Choreo ", ["title","description"]],
- ["commercial","community"]
- ]
- },
- {
- "name": "Diversity Richmond",
- "url": "https://core.service.elfsight.com/p/boot/?page=https://www.diversityrichmond.org/events&w=3ef9dd43-ad54-43ff-ae47-41037c180d59",
- "key": "3ef9dd43-ad54-43ff-ae47-41037c180d59",
- "city": "Oakland",
- "eventTypes": [
- ["Iridian Gallery ", ":diversityiridian:"],
- ["Virginia Pride", ":diversitypride:"],
- ["Diversity Richmond", ":diversityrichmond:"],
- ["Diversity Thrift", ":diversitythrift:"]
- ],
- "eventDefault": [
- "Diversity Richmond", ":diversityrichmond:"
- ],
- "filters": [
- [["market"], "Market", ["title","description"]],
- [["art"], "Iridian Gallery", ["title","description"]],
- [["free stuff","community"], "Pantry", ["title","description"]],
- ["commercial","community"]
- ]
- }
- ],
- "libcal": [
- {
- "name": "Richmond Public Libraries",
- "url": "https://rvalibrary.libcal.com/process_search.php?site_id=12885&perpage=100&audience=4466",
- "city": "Oakland",
- "prefixTitle": ":rvalibrary: ",
- "suffixTitle": "",
- "filters": [
- ["nonprofit"],
- ["library"],
- ["invisible", "Board Meeting", "title"],
- ["invisible", "STAFF PLANNING", "title"],
- ["invisible", "Small Business Legal Workshop", "title"],
- ["invisible", "Office Hours", "title"],
- ["invisible", "Family Law", "title"],
- ["invisible", "Senior", "title"],
- ["invisible", "CANCELLED", "title"],
- ["invisible", "legal resources", "title"],
- ["invisible", "Blood Pressure", "title"],
- ["invisible", "Memory Lab", "title"],
- ["invisible", "Computer Basics", "title"],
- ["invisible", "Tech Tuesday", "title"],
- ["invisible", "Extended Hours", "title"],
- ["invisible", "Richmond Community Sing", "title"],
- ["invisible", "Civic Association Meeting", "title"],
- ["invisible", "Information Session", "title"],
- ["invisible", "Board of Trustee Meeting", "title"],
- ["invisible", "Affordable Housing Workshop", "title"],
- ["invisible", "Virginia Housing", "title"],
- ["invisible", "Internet", "title"],
- ["invisible", "USDOJ", "title"]
- ],
- "calendarToLocation": [
- ["Main","Main Library - Richmond Public Library"],
- ["Belmont","Belmont Branch - Richmond Public Library"],
- ["Broad Rock","Broad Rock Branch - Richmond Public Library"],
- ["East End","East End Branch - Richmond Public Library"],
- ["Ginter Park","Ginter Park Branch - Richmond Public Library"],
- ["Hull Street","Hull Street Branch - Richmond Public Library"],
- ["North Avenue","North Avenue Branch - Richmond Public Library"],
- ["West End","West End Branch - Richmond Public Library"],
- ["Westover Hills","Westover Hills Branch - Richmond Public Library"]
- ]
- }
- ]
+ "appConfig": {
+ "tagsHeader": [
+ {"name": "community", "fullName": "π« Community", "defaultValue": "true"},
+ {"name": "commercial", "fullName": "π© Commercial", "defaultValue": "true"},
+ {"name": "nonprofit", "fullName": "ποΈ Nonprofit", "defaultValue": "true"}
+ ],
+ "tagsHidden": ["hidden", "invisible", "internal"],
+ "tagsToShow": [
+ [
+ {"name": "activism", "fullName": "Critical Work", "defaultValue": "true"},
+ {"name": "palestine", "fullName": "π΅πΈ Palestine", "defaultValue": "true"},
+ {"name": "socialism", "fullName": "π© Socialism", "defaultValue": "true"},
+ {"name": "ecology", "fullName": "πΏ Ecology", "defaultValue": "true"},
+ {"name": "organizing", "fullName": "π€ Organizing", "defaultValue": "true"}
+ ],
+ [
+ {"name": "activities", "fullName": "Activities", "defaultValue": "true"},
+ {"name": "soccer", "fullName": "β½ Soccer", "defaultValue": "true"},
+ {"name": "biking", "fullName": "π² Biking", "defaultValue": "true"},
+ {"name": "skating", "fullName": "πΌπΉ Skating", "defaultValue": "true"},
+ {"name": "exercise", "fullName": "πͺ Exercise", "defaultValue": "true"},
+ {"name": "yoga", "fullName": "π§ Yoga", "defaultValue": "true"},
+ {"name": "dance", "fullName": "πͺ© Dancing", "defaultValue": "true"},
+ {"name": "karaoke", "fullName": "π€ Karaoke", "defaultValue": "true"},
+ {"name": "singing", "fullName": "π΅ Singing", "defaultValue": "true"},
+ {"name": "games", "fullName": "ππ₯οΈ Games", "defaultValue": "true"}
+ ],
+ [
+ {"name": "performance", "fullName": "Performances", "defaultValue": "true"},
+ {"name": "theater", "fullName": "π Theater", "defaultValue": "true"},
+ {"name": "music", "fullName": "πΈ Music", "defaultValue": "true"},
+ {"name": "drag", "fullName": "π Drag", "defaultValue": "true"},
+ {"name": "movies", "fullName": "π½οΈ Film & Movies", "defaultValue": "true"}
+ ],
+ [
+ {"name": "interests", "fullName": "Interest & Hobbies", "defaultValue": "true"},
+ {"name": "diy", "fullName": "π§ DIY", "defaultValue": "true"},
+ {"name": "books", "fullName": "π Books", "defaultValue": "true"},
+ {"name": "food", "fullName": "π² Food", "defaultValue": "true"},
+ {"name": "art", "fullName": "π¨ Art", "defaultValue": "true"},
+ {"name": "discussion", "fullName": "π¨οΈ Yapping & Talking", "defaultValue": "true"},
+ {"name": "sobriety", "fullName": "π Sobriety", "defaultValue": "true"}
+ ],
+ [
+ {"name": "other", "fullName": "Misc", "defaultValue": "true"},
+ {"name": "free stuff", "fullName": "πΆ Free Stuff", "defaultValue": "true"},
+ {"name": "volunteering", "fullName": "β»οΈ Volunteering", "defaultValue": "true"},
+ {"name": "market", "fullName": "ποΈ Market", "defaultValue": "true"},
+ {"name": "transgender", "fullName": "π³οΈββ§οΈ Transgeder :3", "defaultValue": "true"},
+ {"name": "festival", "fullName": "πͺ Festival", "defaultValue": "true"},
+ {"name": "announcement", "fullName": "π£οΈ Announcements!!!!", "defaultValue": "true"},
+ {"name": "unknownType", "fullName": "π€· idk", "defaultValue": "true"}
+ ]
+ ],
+ "eventApiToGrab": [
+ "/api/events/googleCalendar",
+ "/api/events/squarespace",
+ "/api/events/elfsight",
+ "/api/events/libcal"
+ ]
+ },
+ "googleCalendar": [
+ {
+ "name": "rva.rip Manually Added Events",
+ "googleCalendarId": "1c16b938a56fea0342068f59730a90d90bec79d49d44c6fcc0b46915705b8cea@group.calendar.google.com",
+ "city": "Oakland",
+ "filters": [
+ [["market","commercial"], "Market", ["title","description"]],
+ ["palestine", "π΅πΈ", ["title","description"]],
+ ["biking", "π²", ["title","description"]],
+ ["sobriety", "π", "title"],
+ ["free stuff", "Free Food", "title"],
+ ["community","commercial"],
+ ["music", "sundown", "title"],
+ ["music", "Dogwood Dell", "title"],
+ [["ecology","food","free stuff"], "Fonticello FF", "title"],
+ [["art"], "First Fridays", "title"],
+ ["unknownType", "This is a tag inserted for code purposes, this tag represents all tags which won't be categorized", "title"]
+ ]
+ },
+ {
+ "name": "Burning Van",
+ "googleCalendarId": "burningvan69@gmail.com",
+ "city": "Oakland",
+ "filters": [
+ ["community"],
+ ["biking"]
+ ]
+ },
+ {
+ "name": "Anonymous Contributor CB",
+ "googleCalendarId": "657b8cf1729356210e21d20c93e7696cd90fc8c06e32e22b0bc137318b8b0c00@group.calendar.google.com",
+ "city": "Oakland",
+ "filters": [
+ ["community"],
+ ["theater", "PLAY", "title"]
+ ]
+ },
+ {
+ "name": "Food Not Bombs",
+ "googleCalendarId": "2eb28d433a637a4d0ba2d2969fa9ccbd7042d83f5992ff0aaafb01d70a299884@group.calendar.google.com",
+ "city": "Oakland",
+ "filters": [
+ ["community"],
+ [["free stuff","food"], "Free", "title"],
+ ["volunteering", "Volunteer", "title"]
+ ]
+ },
+ {
+ "name": "RVA Queer Soccer",
+ "googleCalendarId": "rvaqueersoccer@gmail.com",
+ "city": "Oakland",
+ "filters": [
+ ["community"],
+ ["soccer"]
+ ]
+ },
+ {
+ "name": "Dykes on Bikes RVA",
+ "googleCalendarId": "0443449fed4f78e2434616b80b74c88bd6a942328e8583fa7f35fecdc1df97ca@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":dykes_on_bikes: ",
+ "filters": [
+ ["community"],
+ ["biking"]
+ ]
+ },
+ {
+ "name": "James River Park Cleanup",
+ "googleCalendarId": "029ddcdb1317ef7c5c4aa1ea53964073e72ae633462e014c83332f6ba0c91b41@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":fojrp: ",
+ "filters": [
+ ["nonprofit"],
+ ["ecology"],
+ ["volunteering"]
+ ]
+ },
+ {
+ "name": "RVA.RIP Major Update Announcements",
+ "googleCalendarId": "2847685acc28b260c69a05bd948038fffe1b00cc12424b6a35ef39480a3900c1@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":ripple: ",
+ "filters": [
+ ["community"],
+ ["announcement"]
+ ]
+ },
+ {
+ "name": "MADRVA",
+ "googleCalendarId": "7332d16dfa04b8b3e944e462f6dc832d5559036dbc9f15d9803f04d61ce5ad7d@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":madrva:",
+ "filters": [
+ ["community"],
+ ["volunteering", "Free Store", "title"],
+ ["free stuff", "Free Store", "title"]
+ ]
+ },
+ {
+ "name": "C's Weekly Rides Calendar",
+ "googleCalendarId": "999072f138be452067352af67a3cc0370c7594ef8b8ae19fd4d73d3cd9471032@group.calendar.google.com",
+ "city": "Oakland",
+ "filters": [
+ ["community"],
+ ["biking"],
+ ["sobriety", "π", "title"]
+ ]
+ },
+ {
+ "name": "Reasonable Morning Ride",
+ "googleCalendarId": "56042348356c1aa89c4783614ea1ffe2414edd1717568c161e0c6ab4415c4423@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": "βπ² ",
+ "filters": [
+ ["community"],
+ ["biking"]
+ ]
+ },
+ {
+ "name": "Coalition Theater",
+ "googleCalendarId": "r1funfuomjmgs47jph9faksu32iu7ktb@import.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":coalition_theater: ",
+ "suffixTitle": "",
+ "filters": [
+ ["nonprofit"],
+ ["theater"]
+ ]
+ },
+ {
+ "name": "hackRVA",
+ "googleCalendarId": "hack.rva@gmail.com",
+ "city": "Oakland",
+ "prefixTitle": ":hackrva: ",
+ "suffixDescription": " HackRVA is a member-run and organized non-profit makerspace in Richmond, Virginia. HackRVA is a space filled with tools, computers, and people who like to build, invent, tinker, expand their minds, and learn and share new skills. Youβll find a diverse group of individuals who are into electronics, woodworking, embedded software, metalworking, coding (programming), music, art, video, photography, 3D printing, sewing, textiles, and virtual realityβand thatβs for starters. HackRVA members have access to the makerspace, tools, community and learning opportunities through member-led workshops, events, and projects. For more information check out our website ww.hackrva.org !Poster ",
+ "defaultLocation": "2026A Dabney Road, Richmond VA 23230",
+ "filters": [
+ [["community","diy"], "Open", ["title","description"]],
+ ["invisible", "community"]
+ ]
+ },
+ {
+ "name": "Kasama Collective",
+ "googleCalendarId": "c0ba770604500783fe65753bbbdd682b55b6bd50ad656c92706426758e5251b8@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":kasamacollective: ",
+ "filters": [
+ ["commercial"],
+ ["market"]
+ ]
+ },
+ {
+ "name": "Outpost Adventure Club Calendar",
+ "googleCalendarId": "info@outpostrichmond.com",
+ "city": "Oakland",
+ "prefixTitle": ":outpost: ",
+ "filters": [
+ ["community"],
+ ["biking"],
+ [["invisible"], "microsoft teams", "description"]
+ ]
+ },
+ {
+ "name": "PSL Virginia @pslvirginia",
+ "googleCalendarId": "7c07b5d92633673b1409ee65d643ddfde18cf257323136f95c9ceb3e5afda5de@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":psl:",
+ "filters": [
+ ["community"],
+ ["organizing"],
+ ["socialism"]
+ ]
+ },
+ {
+ "name": "Gold Lion Cafe",
+ "googleCalendarId": "c_0e01d5366281ee1230a34c41e4f988fac5cb94324aec20d86f035457d14722df@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":goldlion: ",
+ "defaultLocation": "1012 Hull St, Richmond, VA 23224, USA",
+ "filters": [
+ ["invisible", "undefined", "title"],
+ [["music"], "Concert", ["title","description"]],
+ ["invisible", "Community Meditation with Meg", "title"],
+ [["community","art"], "write", ["title"]],
+ [["community","art"], "writing", ["title"]],
+ [["community","dance"], "Dance", ["title","description"]],
+ [["community","discussion"], "meetup", ["title","description"]],
+ ["community", "Drawing", ["title","description"]],
+ ["community", "Forum", ["title"]],
+ ["community", "Community Morning", ["title"]],
+ [["community","music"], "Live in da Garden", ["title","description"]],
+ [["community"], "Vegan", ["title","description"]],
+ [["community","ecology"], "Enviromental", ["title","description"]],
+ [["karaoke"], "karaoke", ["title","description"]],
+ [["yoga"], "yoga", "title"],
+ [["drag"], "drag", "title"],
+ [["movies"], "Bollywood", "title"],
+ [["drag"], "king", "title"],
+ [["invisible"], "chamber", "title"],
+ [["art"], "just femme & dandy", "title"],
+ [["food"], "Brunch Show", "title"],
+ [["drag"], "cabaret", "title"],
+ [["yoga"], "sound bath", "title"],
+ [["invisible"], "financial", "title"],
+ [["invisible"], "team meeting", "title"],
+ ["commercial","community"]
+
+ ]
+ },
+ {
+ "name": "@rvaqueerbookclub",
+ "googleCalendarId": "63b6eb40d80e3feaec30d2d5bfcf3450aeb45bae641366a91c37bbc422be3bb1@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": "ππ ",
+ "filters": [
+ [["community","books"]]
+ ]
+ },
+ {
+ "name": "@broadstreetbullies804",
+ "googleCalendarId": "4ce2fe20599863c927fb7a6a6ec6e0e10a50b438de070948b4daeafc9731e73f@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":BSB:",
+ "filters": [
+ ["community"],
+ ["biking"]
+ ]
+ },
+ {
+ "name": "Sunrise Movement RVA",
+ "googleCalendarId": "9848cc3a6ebfce17fb9a2f5aa72ae2ad315cf96e323e071540de5c5a6de2c701@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":sunrise: ",
+ "filters": [
+ ["community"],
+ ["organizing"],
+ ["ecology"]
+ ]
+ },
+ {
+ "name": "RVA Roll Patrol",
+ "googleCalendarId": "rva.roll.patrol@gmail.com",
+ "city": "Oakland",
+ "prefixTitle": "πΌ",
+ "filters": [
+ ["community"],
+ ["skating"]
+ ]
+ },
+ {
+ "name": "Rag and Bones Bicycle Cooperative",
+ "googleCalendarId": "ragandbonesvolunteers@gmail.com",
+ "city": "Oakland",
+ "prefixTitle": "π π² ",
+ "suffixTitle": " | Rag & Bones Bicycle Cooperative",
+ "defaultLocation": "2916 North Avenue, Richmond VA 23230",
+ "suffixDescription": " Website | Instagram | Facebook ",
+ "filters": [
+ ["community"],
+ ["volunteering", "Open Hours", "title", "party"],
+ ["music", "Benefit", ["title","description"]]
+ ]
+ },
+ {
+ "name": "New Habit Cinema",
+ "googleCalendarId": "01cd966b384a29a5d1f8f341f8bb7aa56cad3b0233d0b20402a30ac640691690@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": "π½οΈ",
+ "suffixDescription": "Instagram ",
+ "filters": [
+ ["community"],
+ ["movies"]
+ ]
+ },
+ {
+ "name": "Continuity Press",
+ "googleCalendarId": "de72cf999d4da30155c68eb7040ede22c0540275b3a884e355482100ec744765@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": "βΎοΈ ",
+ "suffixTitle": " | Continuity Press",
+ "filters": [
+ ["community"],
+ ["diy"]
+ ]
+ },
+ {
+ "name": "James River Anarchist Black Cross",
+ "googleCalendarId": "jrabc1312@gmail.com",
+ "city": "Oakland",
+ "prefixTitle": ":jrabc: ",
+ "suffixTitle": "",
+ "filters": [
+ ["community"],
+ ["organizing"],
+ ["socialism"],
+ ["discussion", "salon", "title"]
+ ]
+ },
+ {
+ "name": "Girlspit",
+ "googleCalendarId": "6beec3f66bcf6792c6920b8a59f5e1e8a736582c613a9e74e8189008f47d6dd6@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": "",
+ "suffixTitle": "",
+ "filters": [
+ ["community"],
+ ["music"]
+ ]
+ },
+ {
+ "name": "π΅ RVA Community Sing",
+ "googleCalendarId": "905d99152584dc38b5565e9cdd3beb88b30e02bb8998164fc489563414795bbb@group.calendar.google.com",
+ "city": "Oakland",
+ "filters": [
+ ["community"],
+ ["singing"]
+ ]
+ },
+ {
+ "name": "π³οΈββ§οΈ Layers of Change",
+ "googleCalendarId": "6c7cd3cc0e9ff43a606292aafed9b215b100cab9d53c4892e651651abe13cf07@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":layersofchange: ",
+ "filters": [
+ ["community"],
+ ["transgender"]
+ ]
+ },
+ {
+ "name": "Anonymous Contributor Mycelium",
+ "googleCalendarId": "fgucrprcbjr861qqa2t1r0qjvs@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": "πβπ« ",
+ "filters": [
+ ["community"],
+ ["invisible", "Broadrock", "title"],
+ ["invisible", "Gilpin", "title"],
+ ["invisible", "FOJRP", "title"],
+ ["invisible", "PSL", "title"],
+ ["invisible", "Fnb", "title"],
+ ["invisible", "James River Park System", "description"],
+ ["socialism", "red", "title"],
+ ["food", "dinner", "title"],
+ [["volunteering","ecology"], "JRP", "title"]
+ ]
+ },
+ {
+ "name": "π³οΈββ§οΈ Trans Jam Events",
+ "googleCalendarId": "ff1e734c712e4c89069f15ee40a875e77f8e12844a1e398dae8ea19964407d70@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": ":transjam:π³οΈββ§οΈ ",
+ "filters": [
+ ["community"],
+ ["transgender"]
+ ]
+ },
+ {
+ "name": "π²π―οΈ Secret Bike Club",
+ "googleCalendarId": "6d2ce8d9e9d3821a56e2ef91cadbbd8791bf34891a90380787874cbb8c60aa45@group.calendar.google.com",
+ "city": "Oakland",
+ "filters": [
+ ["community"],
+ ["biking"]
+ ]
+ },
+ {
+ "name": "Known Contributor Rebel Rouser",
+ "googleCalendarId": "3940f9dd4d7b006ada3c8643edafb9846fa182792ed08f376c107e18d05b3289@group.calendar.google.com",
+ "city": "Oakland",
+ "prefixTitle": "π ",
+ "filters": [
+ ["commercial"],
+ ["drag"]
+ ]
+ },
+ {
+ "name": "RVA4Palestine Coalition Events",
+ "googleCalendarId": "rva4palestine@gmail.com",
+ "city": "Oakland",
+ "prefixTitle": "π΅πΈ ",
+ "filters": [
+ ["community"],
+ ["palestine"],
+ ["art", "chalk", "title"],
+ ["organizing", "teach-in", "title"],
+ ["organizing", "city council", "title"],
+ ["organizing", "meeting", "title"],
+ ["organizing", "tenant", "title"],
+ ["organizing", "training", "title"],
+ ["socialism", " rwa", "title"],
+ ["socialism", "richmond worker", ["title","description"]],
+ ["exercise", "team hind", ["title","description"]]
+ ]
+ }
+ ],
+ "squarespace": [
+ {
+ "name": "Richmond Grows Gardens",
+ "url": "https://www.richmondgrowsgardens.org/events?format=json",
+ "city": "Oakland",
+ "prefixTitle": ":RVAGrowsGardens1: ",
+ "suffixTitle": ":RVAGrowsGardens2:",
+ "filters": [
+ ["community"],
+ ["ecology"]
+ ]
+ }
+ ],
+ "elfsight": [
+ {
+ "name": "Studio Two Three",
+ "url": "https://core.service.elfsight.com/p/boot/?page=https%3A%2F%2Fwww.studiotwothree.org%2Fcommunity-events&w=24ddbed9-c732-4102-abd2-02990fae125b",
+ "key": "24ddbed9-c732-4102-abd2-02990fae125b",
+ "city": "Oakland",
+ "prefixTitle": ":studiotwothree:",
+ "eventTypes": [
+ ["Courses and Workshops", "π"],
+ ["Film Screenings", "π½"],
+ ["Community Events", "π€"],
+ ["Artist Markets", "ποΈ"],
+ ["Private Events", "π"],
+ ["Community Organizing Event", "π’"]
+ ],
+ "eventDefault": [
+ "", ""
+ ],
+ "filters": [
+ [["community", "movies"], "Film", ["title","description"]],
+ [["community", "dance"], "dance", ["title"]],
+ ["community", "Community Events", ["title","description"]],
+ [["community","free stuff"], "Creative Mornings", ["title","description"]],
+ [["palestine","community"], "palestine", ["title","description"]],
+ ["free stuff", "clothing swap", ["title","description"]],
+ [["diy"], "Courses and Workshops", ["title","description"]],
+ [["market"], "Artist Markets", ["title","description"]],
+ [["community","organizing"], "Community Organizing Event", ["title","description"]],
+ [["dance"], "Choreo", ["title","description"]],
+ [["invisible"], "Nonprofit ", ["title"]],
+ [["market"], "palooza ", ["title"]],
+ [["ecology"], "pollinator ", ["title"]],
+ ["commercial","community"]
+ ]
+ },
+ {
+ "name": "Diversity Richmond",
+ "url": "https://core.service.elfsight.com/p/boot/?page=https://www.diversityrichmond.org/events&w=3ef9dd43-ad54-43ff-ae47-41037c180d59",
+ "key": "3ef9dd43-ad54-43ff-ae47-41037c180d59",
+ "city": "Oakland",
+ "eventTypes": [
+ ["Iridian Gallery ", ":diversityiridian:"],
+ ["Virginia Pride", ":diversitypride:"],
+ ["Diversity Richmond", ":diversityrichmond:"],
+ ["Diversity Thrift", ":diversitythrift:"]
+ ],
+ "eventDefault": [
+ "Diversity Richmond", ":diversityrichmond:"
+ ],
+ "filters": [
+ [["market"], "Market", ["title","description"]],
+ [["art"], "Iridian Gallery", ["title","description"]],
+ [["free stuff","community"], "Pantry", ["title","description"]],
+ [["invisible"], "Shop daily", ["description"]],
+ [["art"], "exhibition", ["description"]],
+ [["market","festival"], "big gay", ["title"]],
+ [["market","festival"], "bash", ["title"]],
+ [["market","festival"], "party", ["title"]],
+ [["free stuff"], "money management course", ["title"]],
+ [["drag"], "drag", ["title"]],
+ [["invisible"], "modlin center", ["title"]],
+ [["festival"], "prideFest", ["title"]],
+ ["commercial","community"]
+ ]
+ }
+ ],
+ "libcal": [
+ {
+ "name": "Richmond Public Libraries",
+ "url": "https://rvalibrary.libcal.com/process_search.php?site_id=12885&perpage=100&audience=4466",
+ "city": "Oakland",
+ "prefixTitle": ":rvalibrary: ",
+ "suffixTitle": "",
+ "filters": [
+ ["invisible", "Board Meeting", "title"],
+ ["invisible", "STAFF PLANNING", "title"],
+ ["invisible", "Small Business Legal Workshop", "title"],
+ ["invisible", "Office Hours", "title"],
+ ["invisible", "Family Law", "title"],
+ ["invisible", "Senior", "title"],
+ ["invisible", "CANCELLED", "title"],
+ ["invisible", "legal resources", "title"],
+ ["invisible", "Blood Pressure", "title"],
+ ["invisible", "Memory Lab", "title"],
+ ["invisible", "Computer Basics", "title"],
+ ["invisible", "Tech Tuesday", "title"],
+ ["invisible", "Extended Hours", "title"],
+ ["invisible", "Richmond Community Sing", "title"],
+ ["invisible", "Civic Association Meeting", "title"],
+ ["invisible", "Information Session", "title"],
+ ["invisible", "Board of Trustee Meeting", "title"],
+ ["invisible", "Affordable Housing Workshop", "title"],
+ ["invisible", "Virginia Housing", "title"],
+ ["invisible", "Internet", "title"],
+ ["invisible", "USDOJ", "title"],
+ ["invisible", "eviction", "title"],
+ ["exercise", "fitness", "title"],
+ ["invisible", "tech talk", "title"],
+ ["invisible", "canceled", "title"],
+ ["invisible", "G.E.D", "title"],
+ [["community","movies"], "Movie", "title"],
+ ["diy", "yarn", "title"],
+ [["community","books"], "page turners", "title"],
+ ["invisible", "public law", "description"],
+ ["invisible", "Estate", "title"],
+ [["community","books"], "book club", ["title","description"]],
+ ["invisible", "english language acquisition", "title"],
+ ["movies", "air conditioned cinema", "title"],
+ ["invisible", "help1rva", "title"],
+ ["invisible", "101", "title"],
+ ["games", "board game", "title"],
+ ["games", "boardgame", "title"],
+ ["invisible", "suicide", "title"],
+ ["diy", "crafters", "title"],
+ ["invisible", "financial", "title"],
+ ["organizing", "organizing 101", "description"],
+ ["organizing", "ACLU", ["description","title"]],
+ ["diy", "printing", ["description","title"]],
+ ["books", "author talk", ["description","title"]],
+ ["books", "book banter", ["description","title"]],
+ ["invisible", "help desk", ["description","title"]],
+ ["invisible", "law", "title"],
+ [["market", "food"], "shalom farm", "title"],
+ [["diy"], "special collections", ["description","title"]],
+ [["diy"], "sewing", ["description","title"]],
+ [["movies"], "films", ["title"]],
+ [["diy"], "sashiko", ["description","title"]],
+ [["diy"], "visible mending", ["description","title"]],
+ [["invisible"], "category: law", ["description","title"]],
+ [["diy"], "arpillera", ["description","title"]],
+ [["music"], "category: performances", ["description","title"]],
+ [["music"], "e-resource", ["description","title"]],
+ [["diy"], "crafting hour", ["description","title"]],
+ [["books"], "category: book discussion", ["description","title"]],
+ [["invisible"], "medicare", ["title"]],
+ [["invisible"], "genealogy", ["title"]],
+ [["invisible"], "childcare provider workshop", ["title"]],
+ [["invisible"], "adult english class", ["title"]],
+ [["invisible"], "family flicks!", ["title"]],
+ [["invisible"], "financieros", ["title"]],
+ ["nonprofit", "community"]
+ ],
+ "calendarToLocation": [
+ ["Main","Main Library - Richmond Public Library"],
+ ["Belmont","Belmont Branch - Richmond Public Library"],
+ ["Broad Rock","Broad Rock Branch - Richmond Public Library"],
+ ["East End","East End Branch - Richmond Public Library"],
+ ["Ginter Park","Ginter Park Branch - Richmond Public Library"],
+ ["Hull Street","Hull Street Branch - Richmond Public Library"],
+ ["North Avenue","North Avenue Branch - Richmond Public Library"],
+ ["West End","West End Branch - Richmond Public Library"],
+ ["Westover Hills","Westover Hills Branch - Richmond Public Library"]
+ ]
+ }
+ ]
}
\ No newline at end of file
diff --git a/components/App.vue b/components/App.vue
index bc8e409..31bf851 100644
--- a/components/App.vue
+++ b/components/App.vue
@@ -1,9 +1,8 @@
@@ -591,4 +465,4 @@ function updateCityIsEnabledSetting(newIsEnabled: boolean, cityId: string) {
-
+
\ No newline at end of file
diff --git a/components/CityFilterItem.vue b/components/CityFilterItem.vue
deleted file mode 100644
index a158842..0000000
--- a/components/CityFilterItem.vue
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
diff --git a/components/CountyFilterItem.vue b/components/CountyFilterItem.vue
deleted file mode 100644
index 9025555..0000000
--- a/components/CountyFilterItem.vue
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/components/FilterModal.vue b/components/FilterModal.vue
index 8b9d94c..b4fb130 100644
--- a/components/FilterModal.vue
+++ b/components/FilterModal.vue
@@ -1,126 +1,125 @@
-
-
-
-
+const emit = defineEmits<{
+ (e: 'confirm'): void;
+}>();
- { useIsAllCitiesInMarinCountyEnabled.value = true })()"
- @on-no="countyWrapper(false, MARIN_COUNTY_ID); ">
-
-
-
+// Development environment flag
+const isDevelopment = process.env.NODE_ENV === 'development';
-
-
-
-
-
-
+// Accessing tags from the imported JSON
+const tagsHeader = ref(eventSourcesJSON.appConfig.tagsHeader);
+const tagsHidden = ref(eventSourcesJSON.appConfig.tagsHidden);
+const tagsToShow = ref(eventSourcesJSON.appConfig.tagsToShow);
-
-
-
-
-
-
-
-
+// Computed property to flatten tagsToShow into a 1D array of strings, for the purpose of debugging to make sure there's no tags missing
+const tagsAllShown = computed(() => {
+ let flattened = [];
+ for (let i = 0; i < tagsToShow.value.length; i++) {
+ if (tagsToShow.value[i].length === 1) {
+ flattened.push(tagsToShow.value[i][0].map(tag => tag.name));
+ } else {
+ flattened.push(...tagsToShow.value[i].slice(1).map(tag => tag.name)); // Skip the first element (label) and add rest
+ }
+ }
+ flattened.push(...tagsHeader.value.map(tag => tag.name)); //Add the tagsHeader values to the array, ensuring that they're not left out from the list of ALL TAGS SHOWN
+ flattened.push(...tagsHidden.value); //Add the tagsHidden values to the array, ensuring that they're not left out from the list of ALL TAGS SHOWN
+ return flattened;
+});
-
-
-
-
-
-
+//
+const tagsNotShown = computed(() => { //A 1D array of tags that aren't featured in tagsAllShown but ARE featured in tags; used to show any tags that maybe should be visible in the UI or should be wiped from event_sources.json altogether.
+ const shownSet = new Set(tagsAllShown.value);
+ return tags.value.filter(tag => !shownSet.has(tag.name));
+});
-
-
-
-
-
-
-
+function handleEventSourceChange(tag: string, isEnabled: boolean) {
+ if (isEnabled) {
+ enableEventSource(tag);
+ } else {
+ disableEventSource(tag);
+ }
+}
+
+// Example function to toggle visibility
+function toggleTagVisibility(tagName: string) {
+ const tag = tags.value.find(t => t.name === tagName);
+ if (tag) {
+ tag.isVisible = !tag.isVisible;
+ }
+}
-
- Done
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ tag.name }}
+
+
+
+ Apply
+
+
+
diff --git a/components/TagFilterItem.vue b/components/TagFilterItem.vue
new file mode 100644
index 0000000..7313e0a
--- /dev/null
+++ b/components/TagFilterItem.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/components/TopicFilterItem.vue b/components/TopicFilterItem.vue
new file mode 100644
index 0000000..fc28839
--- /dev/null
+++ b/components/TopicFilterItem.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/public/css/style.css b/public/css/style.css
index c6fc6c0..f4d8419 100644
--- a/public/css/style.css
+++ b/public/css/style.css
@@ -73,6 +73,7 @@ body {
font-family: 'ChicagoFLF', 'Times New Roman', 'Georgia', serif;
font-size: 12px;
font-weight: normal;
+ color: var(--text-normal);
}
a {
@@ -219,7 +220,7 @@ div.fc-scrollgrid-sync-inner:not(.fc-daygrid-day-frame) {
.popper-box-inner button {
color: var(--border-outer);
font-family: 'ChicagoFLF';
- font-size: min(3.5vw, 1.2em);
+ font-size: min(1.2em);
background-color: var(--background-inner);
display: inline-block;
margin-bottom: 0px;
@@ -383,12 +384,21 @@ body.no-scroll {
display: flex;
flex-direction: column;
margin-top: 2px;
+ font-size: min(2em);
}
.popper-box-wrapper .popper-box-inner .city-header {
vertical-align: middle;
float: right;
- line-height: 20px;
- margin-left: 25px;
+ line-height: 30px;
+ margin-left: 36px;
+ font-size: min(0.75em);
+}
+
+.popper-box-inner input {
+ border: 1px solid var(--border-outer);
+ box-shadow: inset 1px 1px var(--background-alt),inset -1px -1px var(--text-faded);
+ text-indent: -99999em;
+ transform: scale(2.14286);
}
.popper-box-wrapper {
@@ -427,6 +437,26 @@ body.no-scroll {
linear-gradient(to bottom right, var(--rip-red), var(--rip-orange), var(--rip-yellow), var(--rip-green), var(--rip-blue), var(--rip-purple));
}
+.county-input {
+ margin: 2px;
+ font-size: 18px;
+ height: 30px;
+ width: 30px;
+ text-align: center;
+ text-indent: -1.6px;
+ border: 1px solid var(--border-outer);
+ vertical-align: text-bottom;
+ padding: 0;
+ line-height: 18px;
+}
+
+.county-input:active {
+ /* Start transition for longer press. Note: since the popper itself has a transition it is probably using that. */
+ transition: 0s;
+ background-image:
+ linear-gradient(to bottom right, var(--rip-red), var(--rip-orange), var(--rip-yellow), var(--rip-green), var(--rip-blue), var(--rip-purple));
+}
+
:root .fc .fc-daygrid-day-number {
text-decoration: dashed underline;
color: var(--text-normal);
@@ -546,3 +576,56 @@ body.no-scroll {
color: var(--rip-red);
filter: hue-rotate(300deg);
}
+
+/* Using this guide: https://moderncss.dev/pure-css-custom-checkbox-style/ */
+input[type="checkbox"] {
+ /* Add if not using autoprefixer */
+ -webkit-appearance: none;
+ appearance: none;
+ /* For iOS < 15 to remove gradient background */
+ background-color: var(--background-inner);
+ /* Not removed via appearance */
+ margin: 0;
+
+ font: inherit;
+ color: var(--background-alt);
+ width: 30px;
+ height: 30px;
+ transform: translateY(-0.075em);
+
+ display: inline-grid;
+ place-content: center;
+
+ border-radius: 3px;
+ border: 1px solid var(--border-outer);
+ box-shadow: inset 1px 1px var(--background-alt),inset -1px -1px var(--text-faded);
+ background-image: none;
+}
+
+input[type="checkbox"]:checked {
+ box-shadow: inset -1px -1px var(--background-alt),inset 1px 1px var(--text-faded);
+}
+
+
+input[type="checkbox"]::before {
+ content: "";
+ width: 1.2em;
+ height: 1.2em;
+ transform: scale(0);
+ transition: 120ms transform ease-in-out;
+ box-shadow: inset 1em 1em var(--text-normal);
+
+ transform-origin: bottom left;
+ clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
+}
+
+input[type="checkbox"]:checked::before {
+ transform: scale(1);
+}
+
+.filterButton button {
+ font-size: 1.5em;
+ width: 100%;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+}
\ No newline at end of file
diff --git a/server/api/events/elfsight.ts b/server/api/events/elfsight.ts
index 6d9807b..a6266bf 100644
--- a/server/api/events/elfsight.ts
+++ b/server/api/events/elfsight.ts
@@ -59,6 +59,7 @@ async function fetchElfsightEvents() {
return {
events: [],
city: source.city,
+ name: source.name,
} as EventNormalSource;
}
const elfsightJson = await response.json();
@@ -69,7 +70,8 @@ async function fetchElfsightEvents() {
const elfsightLocations = firstWidget.data.settings.locations;
return {
events: elfsightEvents.map(event => convertElfsightEventToFullCalendarEvent(event, source, elfsightEventTypes, elfsightLocations)),
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
})
);
diff --git a/server/api/events/eventbrite.ts b/server/api/events/eventbrite.ts
index eaf43eb..972a4a8 100644
--- a/server/api/events/eventbrite.ts
+++ b/server/api/events/eventbrite.ts
@@ -34,7 +34,8 @@ async function fetchEventbriteEvents() {
console.error(`Error fetching Eventbrite events for ${source.name}: ${res.status} ${res.statusText}`);
return {
events: [],
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
}
return res;
@@ -59,7 +60,8 @@ async function fetchEventbriteEvents() {
return {
events: newEvents,
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
});
}));
@@ -68,7 +70,8 @@ async function fetchEventbriteEvents() {
const eventsSeries = (await getEventSeries(source.url)).map(event => convertEventbriteAPIEventToFullCalendarEvent(event, source.sourceName));
return {
events: eventsSeries,
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
}));
const allEventbriteSources = eventbriteSources.concat(eventbriteSingleEventSeries);
diff --git a/server/api/events/forbidden-tickets.ts b/server/api/events/forbidden-tickets.ts
index aae002c..ec356e8 100644
--- a/server/api/events/forbidden-tickets.ts
+++ b/server/api/events/forbidden-tickets.ts
@@ -29,6 +29,7 @@ async function fetchForbiddenTicketsEvents() {
return {
events: [],
city: source.city,
+ name: source.name,
};
}
@@ -47,7 +48,8 @@ async function fetchForbiddenTicketsEvents() {
return {
events,
- city: source.city
+ city: source.city,
+ name: source.name,
};
})
);
diff --git a/server/api/events/google-calendar.ts b/server/api/events/googleCalendar.ts
similarity index 99%
rename from server/api/events/google-calendar.ts
rename to server/api/events/googleCalendar.ts
index e25587f..909abd3 100644
--- a/server/api/events/google-calendar.ts
+++ b/server/api/events/googleCalendar.ts
@@ -127,7 +127,8 @@ function formatTitleAndDateToID(inputDate: any, title: string) {
return {
events,
- city: source.city
+ city: source.city,
+ name: source.name,
};
})
);
diff --git a/server/api/events/instagram.ts b/server/api/events/instagram.ts
index 14dee5c..62fb97d 100644
--- a/server/api/events/instagram.ts
+++ b/server/api/events/instagram.ts
@@ -643,6 +643,7 @@ async function fetchInstagramEvents() {
return {
events,
city: source.city,
+ name: source.name,
};
}));
diff --git a/server/api/events/libcal.ts b/server/api/events/libcal.ts
index 8aa6ee1..fb69a7a 100644
--- a/server/api/events/libcal.ts
+++ b/server/api/events/libcal.ts
@@ -68,13 +68,15 @@ async function fetchlibcalEvents() {
return {
events: [],
city: source.city,
+ name: source.name,
} as EventNormalSource;
}
const libcalJson = await response.json();
const libcalEvents = libcalJson.results;
return {
events: libcalEvents.map(event => convertlibcalEventToFullCalendarEvent(libcalJson.timezone, event, source)),
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
})
);
@@ -100,9 +102,10 @@ function convertlibcalEventToFullCalendarEvent(timeZone: string, e, source) {
if (source.prefixTitle) { title = source.prefixTitle + title; }
if (source.suffixTitle) { title += source.suffixTitle; }
+ if (e.location) description = 'Location: '+e.location+' '+description;
+ if (e.categories_arr) e.categories_arr.forEach(category => { description = description + ' Category: '+category.name});
const tags = applyEventTags(source, title, description);
if (isDevelopment) title=tags.length+" "+title;
- if (e.location) description = 'Location: '+description;
return {
id: formatTitleAndDateToID(start.toUTC().toJSDate(), title),
diff --git a/server/api/events/squarespace.ts b/server/api/events/squarespace.ts
index 4d2e0cc..6fbe4b5 100644
--- a/server/api/events/squarespace.ts
+++ b/server/api/events/squarespace.ts
@@ -59,13 +59,15 @@ async function fetchSquarespaceEvents() {
return {
events: [],
city: source.city,
+ name: source.name,
} as EventNormalSource;
}
const squarespaceJson = await response.json();
const squarespaceEvents = squarespaceJson.upcoming || squarespaceJson.items;
return {
events: squarespaceEvents.map(event => convertSquarespaceEventToFullCalendarEvent(squarespaceJson.website.timeZone, event, source)),
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
})
);
diff --git a/server/api/events/timely.ts b/server/api/events/timely.ts
index 4b53858..41c5796 100644
--- a/server/api/events/timely.ts
+++ b/server/api/events/timely.ts
@@ -42,6 +42,7 @@ async function fetchTimelyEvents() {
return {
events: [],
city: source.city,
+ name: source.name,
};
}
@@ -62,7 +63,8 @@ async function fetchTimelyEvents() {
return {
events,
- city: source.city
+ city: source.city,
+ name: source.name,
};
})
);
diff --git a/server/api/events/tockify.ts b/server/api/events/tockify.ts
index f8ab25f..6029a08 100644
--- a/server/api/events/tockify.ts
+++ b/server/api/events/tockify.ts
@@ -28,14 +28,16 @@ async function fetchTockifyEvents() {
console.error(`Error fetching Tockify events for ${source.name}: ${res.status} ${res.statusText}`);
return {
events: [],
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
}
let tockifyJson = await res.json();
let tockifyEvents = tockifyJson.events;
return {
events: tockifyEvents.map(event => convertTockifyEventToFullCalendarEvent(event, url, source.name)),
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
}
)
diff --git a/server/api/events/with-friends.ts b/server/api/events/with-friends.ts
index dc033bd..5f4191f 100644
--- a/server/api/events/with-friends.ts
+++ b/server/api/events/with-friends.ts
@@ -38,6 +38,7 @@ async function fetchWithFriendsEvents() {
return {
events: [],
city: source.city,
+ name: source.name,
};
}
@@ -71,7 +72,8 @@ async function fetchWithFriendsEvents() {
return {
events,
- city: source.city
+ city: source.city,
+ name: source.name,
};
})
);
diff --git a/server/api/events/wix.ts b/server/api/events/wix.ts
index d77e502..eba392e 100644
--- a/server/api/events/wix.ts
+++ b/server/api/events/wix.ts
@@ -62,7 +62,8 @@ async function fetchWixEvents() {
console.error(`Error fetching Wix events for ${source.name}: ${response.status} ${response.statusText}`);
return {
events: [],
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
}
@@ -79,7 +80,8 @@ async function fetchWixEvents() {
return {
events: events,
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
}
));
diff --git a/server/api/events/wordpress-tribe.ts b/server/api/events/wordpress-tribe.ts
index 5123a3d..fb24296 100644
--- a/server/api/events/wordpress-tribe.ts
+++ b/server/api/events/wordpress-tribe.ts
@@ -29,7 +29,8 @@ async function fetchWordPressTribeEvents() {
}
return {
events: wpEvents.map(convertWordpressTribeEventToFullCalendarEvent),
- city: source.city
+ city: source.city,
+ name: source.name,
} as EventNormalSource;
}
));
diff --git a/server/tagsListServe.ts b/server/tagsListServe.ts
new file mode 100644
index 0000000..8ec07ec
--- /dev/null
+++ b/server/tagsListServe.ts
@@ -0,0 +1,59 @@
+import eventSourcesJSON from '@/assets/event_sources.json';
+
+export interface Tag {
+ name: string;
+ isVisible: boolean;
+ isHidden: boolean;
+ isHeader: boolean;
+}
+
+// Helper function to extract source names from URLs
+function extractSourceNames(urls: string[]): string[] {
+ return urls.map(url => {
+ const parts = url.split('/');
+ return parts[parts.length - 1]; // Returns the last segment after the last '/'
+ });
+}
+
+export function getAllTags(): Tag[] {
+ const tagsSet = new Set();
+
+ // Extract the source names from the configuration
+ const sourceNames = extractSourceNames(eventSourcesJSON.appConfig.eventApiToGrab);
+
+ // Iterate over each source type in eventSourcesJSON using the source names
+ sourceNames.forEach(sourceName => {
+ const eventSourceArray = eventSourcesJSON[sourceName];
+ if (eventSourceArray) {
+ eventSourceArray.forEach(source => {
+ source.filters.forEach(filter => {
+ if (Array.isArray(filter) && filter.length > 0) {
+ const firstFilterElement = filter[0];
+ if (Array.isArray(firstFilterElement)) {
+ // If the first element itself is an array, iterate through it
+ firstFilterElement.forEach(subTag => {
+ if (typeof subTag === 'string') {
+ tagsSet.add(subTag);
+ }
+ });
+ } else if (typeof firstFilterElement === 'string') {
+ // If it's a single string, add it directly
+ tagsSet.add(firstFilterElement);
+ }
+ }
+ });
+ });
+ }
+ });
+
+ const tagsHidden = new Set(eventSourcesJSON.appConfig.tagsHidden);
+ const tagsHeader = new Set(eventSourcesJSON.appConfig.tagsHeader.map(tag => tag.name));
+
+ // Convert the set of tags into an array of Tag objects, setting visibility based on tagsHidden
+ return Array.from(tagsSet).map(tag => ({
+ name: tag,
+ isVisible: !tagsHidden.has(tag), //Whether a tag is visible, this is meant to be updated on the user side
+ isHidden: tagsHidden.has(tag), //Whether a tag indicates that it ought to be hidden. This is permanent, if a tag has isHidden true then any event with it ought to be hidden forever
+ isHeader: tagsHeader.has(tag) //Whether a tag is a header tag, this means that it's a pre-requisite that atleast one visible Header tag should be on an event for the event to be visible at all.
+ }));
+}
diff --git a/utils/util.ts b/utils/util.ts
index 0efda99..bd6f81c 100644
--- a/utils/util.ts
+++ b/utils/util.ts
@@ -74,5 +74,9 @@ export function applyEventTags(source: any, title: string, description: string):
});
//Also apply name of calendar as a tag
//tags.push('ποΈ '+source.name);
+
+ // Adds the default tag `unknownType` if there's less than two tags on an event (each tag is ALWAYS assigned a header tag, so this is an easy way to check if it's been given any non-Header tags)
+ if (tags.length < 2) tags.push('unknownType');
+
return tags;
}
\ No newline at end of file