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 @@ + \ 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 @@ - \ No newline at end of file + + + 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