diff --git a/app/app/bundle_context.py b/app/app/bundle_context.py index be87622a344..a79d285bf8f 100644 --- a/app/app/bundle_context.py +++ b/app/app/bundle_context.py @@ -21,6 +21,7 @@ from cacheops import cached_as from perftools.models import JSONStore + @cached_as(JSONStore.objects.filter(view='bundleTags', key='bundleTags'), timeout=60) def templateTags(): diff --git a/app/app/templates/shared/hackathon-list.html b/app/app/templates/shared/hackathon-list.html index 62a713da822..463f9d025d7 100644 --- a/app/app/templates/shared/hackathon-list.html +++ b/app/app/templates/shared/hackathon-list.html @@ -1,87 +1,286 @@ -{% load date_fromisoformat timesince_fromisoformat %} -
- {% if events|length %} +{% load date_fromisoformat timesince_fromisoformat group_by_field group_in_columns %} +
-
- {% for event in events %} - + {% group_by_field events types 'type' as events_grouped_by_type %} + {% for events_by_type in events_grouped_by_type %} -
+
+ {% if events_by_type.list|length %} + {% for events_in_column in events_by_type.list|group_in_columns:3 %} +
+ {% for event in events_in_column %} + +
+
+ +
+
+

+ + {{ event.name }} + +

-
+
+ + - + + {% if event.total_prize %} {{ event.total_prize }}{% endif %} +
+
- -
-
- - {{ event.name }} - -
+
+

{{ event.summary }}

+
-
- From - - To - -
-
-

{{ event.summary }}

-
- {% if event.sponsor_profiles|length %} -
- Sponsored by - {% for sponsor in event.sponsor_profiles %} - +
+ {% if event.sponsor_profiles|length %} +
+
Sponsored by
+ {% for sponsor in event.sponsor_profiles|slice:":6" %} + + {% endfor %} + {% if event.sponsor_profiles|length > 6 %} + +{{ event.sponsor_profiles|length|add:"-6" }} + {% endif %} +
+ {% endif %} + +
+ {% if events_by_type.type == 'current' %} + + + Join Now + + + + "1 min" %}disabled{% endif %}"> + Prizes + + + {% elif events_by_type.type == 'upcoming' %} + + + Join Now + + + {% else %} + + + View Projects + + + {% endif %} +
+
+
+
+
{% endfor %} +
+ {% endfor %} + + + + {% else %} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% if events_by_type.type == 'current' %} +
No ongoing hackathons.
+ + {% elif events_by_type.type == 'upcoming' %} +
No upcoming hackathons.
+ + {% else %} +
No completed hackathons.
+ {% endif %} - -
- {% if event.end_date|timesince_fromisoformat <= "1 min" %} - - - Join - - {% endif %} - {% if event.display_showcase %} - - - - Showcase - - {% endif %} - {% if event.start_date|timesince_fromisoformat >= "1 min" and event.end_date|timesince_fromisoformat <= "1 min"%} - - - Prizes - - {% endif %} - {% if event.show_results %} - - - Projects - - {% endif %} -
-
+ {% endif %}
- {% endfor %} + {% endfor %}
-
- {% endif %}
+ + diff --git a/app/assets/v2/images/twitter_cards/tw_hackathon-list.png b/app/assets/v2/images/twitter_cards/tw_hackathon-list.png new file mode 100644 index 00000000000..1c5315f06d4 Binary files /dev/null and b/app/assets/v2/images/twitter_cards/tw_hackathon-list.png differ diff --git a/app/assets/v2/js/bubbles.js b/app/assets/v2/js/bubbles.js new file mode 100644 index 00000000000..4529fe3c798 --- /dev/null +++ b/app/assets/v2/js/bubbles.js @@ -0,0 +1,108 @@ +document.addEventListener('DOMContentLoaded', () => { + // configure the bubbles + const SCROLL_SPEED = 0.3; + const NOISE_SPEED = 0.004; + const NOISE_AMOUNT = 5; + const CANVAS_WIDTH = 2800; + const bubblesEl = document.querySelector('.bubbles'); + const bubbleSpecs = [ + { s: .6, x: 1134, y: 45 }, + { s: .6, x: 1620, y: 271 }, + { s: .6, x: 1761, y: 372 }, + { s: .6, x: 2499, y: 79 }, + { s: .6, x: 2704, y: 334 }, + { s: .6, x: 2271, y: 356 }, + { s: .6, x: 795, y: 226 }, + { s: .6, x: 276, y: 256 }, + { s: .6, x: 1210, y: 365 }, + { s: .6, x: 444, y: 193 }, + { s: .6, x: 2545, y: 387 }, + { s: .8, x: 1303, y: 193 }, + { s: .8, x: 907, y: 88 }, + { s: .8, x: 633, y: 320 }, + { s: .8, x: 323, y: 60 }, + { s: .8, x: 129, y: 357 }, + { s: .8, x: 1440, y: 342 }, + { s: .8, x: 1929, y: 293 }, + { s: .8, x: 2135, y: 198 }, + { s: .8, x: 2276, y: 82 }, + { s: .8, x: 2654, y: 182 }, + { s: .8, x: 2783, y: 60 }, + { x: 1519, y: 118 }, + { x: 1071, y: 233 }, + { x: 1773, y: 148 }, + { x: 2098, y: 385 }, + { x: 2423, y: 244 }, + { x: 901, y: 385 }, + { x: 624, y: 111 }, + { x: 75, y: 103 }, + { x: 413, y: 367 }, + { x: 2895, y: 271 }, + { x: 1990, y: 75 } + ]; + + class Bubbles { + constructor(specs) { + this.bubbles = []; + + specs.forEach((spec, index) => { + this.bubbles.push(new Bubble(index, spec)); + }); + + requestAnimationFrame(this.update.bind(this)); + bubblesEl.style.opacity = 1; + } + + update() { + this.bubbles.forEach(bubble => bubble.update()); + this.raf = requestAnimationFrame(this.update.bind(this)); + } + } + + class Bubble { + constructor(index, { + x, + y, + s = 1 + }) { + this.index = index; + this.x = x; + this.y = y; + this.scale = s; + + this.noiseSeedX = Math.floor(Math.random() * 64000); + this.noiseSeedY = Math.floor(Math.random() * 64000); + this.el = bubblesEl.children[index]; + if (!this.el) { + return; + } + + this.el.classList.add(`logo${this.index + 1}`); + } + + update() { + if (!this.el) { + return; + } + this.noiseSeedX += NOISE_SPEED; + this.noiseSeedY += NOISE_SPEED; + let randomX = noise.simplex2(this.noiseSeedX, 0); + let randomY = noise.simplex2(this.noiseSeedY, 0); + + this.x -= SCROLL_SPEED; + this.xWithNoise = this.x + (randomX * NOISE_AMOUNT); + this.yWithNoise = this.y + (randomY * NOISE_AMOUNT); + + if (this.x < -200) { + this.x = CANVAS_WIDTH; + } + + this.el.style.transform = `translate(${this.xWithNoise}px, ${this.yWithNoise}px) scale(${this.scale})`; + } + } + + noise.seed(Math.floor(Math.random() * 64000)); + + // init the bubbles + const bubbles = new Bubbles(bubbleSpecs); +}); diff --git a/app/assets/v2/js/pages/hackathon-list.js b/app/assets/v2/js/pages/hackathon-list.js index 5580c46ba34..25e891e1eda 100644 --- a/app/assets/v2/js/pages/hackathon-list.js +++ b/app/assets/v2/js/pages/hackathon-list.js @@ -1,20 +1,48 @@ -$(document).ready(function() { - $(document).on('click', '#tabs a', function(e) { - e.preventDefault(); - let target = $(this).data('href'); +document.addEventListener('DOMContentLoaded', () => { - $('.hackathons-list').addClass('hidden'); - $('.nav-link').removeClass('active'); - $('.nav-link').css('font-weight', ''); - $(this).addClass('active'); - $(this).css('font-weight', '700'); + const tabs = document.querySelectorAll('.hackathon-tabs a'); + const hacks = document.querySelectorAll('.hackathon-list'); + const loadTab = (target) => { + let hiddenRows = false; - $('.hackathon-list').addClass('hidden'); - $('.hackathon-list.' + target).removeClass('hidden'); + const hack = document.querySelector('.hackathon-list.' + target); + const rows = document.querySelectorAll('.hackathon-list.' + target + ' > .row'); + const more = document.querySelector('.hackathon-list.' + target + ' > .view-more'); - $('html,body').animate({ - scrollTop: '+=1px' + tabs.forEach((t) => t.classList.remove('active')); + document.querySelector('.nav-link[data-href="' + target + '"]').classList.add('active'); + + hacks.forEach((hack) => hack.classList.add('hidden')); + hack.classList.remove('hidden'); + + rows.forEach((row, indx) => { + if (indx > 1 && more.classList.contains('d-none')) { + hiddenRows = true; + row.classList.add('d-none'); + } + }); + + if (hiddenRows && more) { + const newMore = more.cloneNode(true); + + more.parentNode.replaceChild(newMore, more); + newMore.classList.add('d-block'); + newMore.classList.remove('d-none'); + newMore.addEventListener('click', () => { + newMore.classList.add('d-none'); + newMore.classList.remove('d-block'); + rows.forEach((hack) => hack.classList.remove('d-none')); + }); + } + }; + + tabs.forEach((tab) => { + tab.addEventListener('click', (e) => { + e.preventDefault(); + loadTab(e.target.dataset.href); }); }); + + loadTab(document.default_tab); }); diff --git a/app/assets/v2/scss/gc-utilities.scss b/app/assets/v2/scss/gc-utilities.scss index cc7eea2f414..87468ef1db0 100644 --- a/app/assets/v2/scss/gc-utilities.scss +++ b/app/assets/v2/scss/gc-utilities.scss @@ -82,6 +82,10 @@ background-color: $gc-grey-100; } +.bg-violet-100 { + background-color: $gc-violet-100; +} + .bg-violet-300 { background-color: $gc-violet-300; } @@ -90,6 +94,10 @@ background-color: $gc-violet-400; } +.bg-teal-300 { + background-color: $gc-teal-300; +} + .bg-pink-300 { background-color: $gc-pink-300; } diff --git a/app/assets/v2/scss/gitcoin.scss b/app/assets/v2/scss/gitcoin.scss index 92c03f03192..755812b2012 100644 --- a/app/assets/v2/scss/gitcoin.scss +++ b/app/assets/v2/scss/gitcoin.scss @@ -555,7 +555,7 @@ } .nav-tabs .nav-line { - color: #6F3FF5; + color: $gc-grey-500; border-width: 0px 0px 3px 0; } .nav-tabs .nav-line.active { diff --git a/app/dashboard/admin.py b/app/dashboard/admin.py index 438e4097eaf..dacd14703be 100644 --- a/app/dashboard/admin.py +++ b/app/dashboard/admin.py @@ -25,6 +25,7 @@ from django.utils.safestring import mark_safe from adminsortable2.admin import SortableInlineAdminMixin +from perftools.management.commands import create_page_cache from .models import ( Activity, Answer, BlockedIP, BlockedURLFilter, BlockedUser, Bounty, BountyEvent, BountyFulfillment, BountyInvites, @@ -35,7 +36,6 @@ TransactionHistory, TribeMember, TribesSubscription, UserAction, UserVerificationModel, ) -from perftools.management.commands import create_page_cache class BountyEventAdmin(admin.ModelAdmin): list_display = ['created_on', '__str__', 'event_type'] diff --git a/app/dashboard/gas_views.py b/app/dashboard/gas_views.py index d2618ec895c..756b98ddd51 100644 --- a/app/dashboard/gas_views.py +++ b/app/dashboard/gas_views.py @@ -246,11 +246,16 @@ def gas_history_view(request): events = JSONStore.objects.get(key='hackathons', view='hackathons').data[1] default_tab = 'current' + num_current = len([ele for ele in events if ele['type'] == 'current']) + num_upcoming = len([ele for ele in events if ele['type'] == 'upcoming']) + num_finished = len([ele for ele in events if ele['type'] == 'finished']) + tabs = [ - ('current', 'happening now'), - ('upcoming', 'upcoming'), - ('finished', 'completed'), + ('current', 'happening now', num_current), + ('upcoming', 'upcoming', num_upcoming), + ('finished', 'completed', num_finished), ] + context = { 'title': _('Live Ethereum (ETH) Gas History'), 'card_desc': _('See and comment on the Ethereum (ETH) Gas - Hourly History Graph'), @@ -262,6 +267,7 @@ def gas_history_view(request): 'granularity_options': granularity_options, 'events': events, 'tabs': tabs, + 'types': ['current', 'upcoming', 'finished'], 'default_tab': default_tab } return TemplateResponse(request, 'gas_history.html', context) diff --git a/app/dashboard/management/commands/bundle.py b/app/dashboard/management/commands/bundle.py index b32d6ba8cab..126d4b4b50d 100644 --- a/app/dashboard/management/commands/bundle.py +++ b/app/dashboard/management/commands/bundle.py @@ -7,9 +7,8 @@ from django.template import Context, Template from django.template.loaders.app_directories import get_app_template_dirs -from dashboard.templatetags.bundle import render - from app.bundle_context import context, templateTags +from dashboard.templatetags.bundle import render def rmdir(loc, depth=1): diff --git a/app/dashboard/migrations/0184_hackathonevent_total_prize.py b/app/dashboard/migrations/0184_hackathonevent_total_prize.py new file mode 100644 index 00000000000..86f0f5e196e --- /dev/null +++ b/app/dashboard/migrations/0184_hackathonevent_total_prize.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2021-07-17 03:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dashboard', '0183_auto_20210701_1339'), + ] + + operations = [ + migrations.AddField( + model_name='hackathonevent', + name='total_prize', + field=models.CharField(blank=True, help_text='extra text to display next the event dates on the hackathon list page', max_length=255, null=True), + ), + ] diff --git a/app/dashboard/models.py b/app/dashboard/models.py index 43db3d50e71..2535a1fcf39 100644 --- a/app/dashboard/models.py +++ b/app/dashboard/models.py @@ -5052,6 +5052,7 @@ class HackathonEvent(SuperModel): chat_channel_id = models.CharField(max_length=255, blank=True, null=True) use_circle = models.BooleanField(help_text=_('Use circle for the Hackathon'), default=False) visible = models.BooleanField(help_text=_('Can this HackathonEvent be seeing on /hackathons ?'), default=True) + total_prize = models.CharField(max_length=255, null=True, blank=True, help_text='extra text to display next the event dates on the hackathon list page') default_channels = ArrayField(models.CharField(max_length=255), blank=True, default=list) objects = HackathonEventQuerySet.as_manager() diff --git a/app/dashboard/templates/dashboard/hackathon/hackathons.html b/app/dashboard/templates/dashboard/hackathon/hackathons.html index ab19bbf3626..804ce010364 100644 --- a/app/dashboard/templates/dashboard/hackathon/hackathons.html +++ b/app/dashboard/templates/dashboard/hackathon/hackathons.html @@ -1,31 +1,61 @@ {% comment %} -Copyright (C) 2021 Gitcoin Core + Copyright (C) 2021 Gitcoin Core -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . {% endcomment %} -{% load i18n static humanize bundle %} +{% load i18n static bundle humanize %} + {% include 'shared/head.html' %} {% include 'shared/cards.html' %} - {% bundle css file dashboard_hackathons %} - - - {% endbundle %} - -
+ +
{% include 'shared/tag_manager_2.html' %} {% include 'shared/top_nav.html' with class='d-md-flex' %} - {% include 'shared/nav_hackathons.html' %} -
- -
-
-
- {% include 'shared/svg-embed/h35px_hackathons.svg' with extra_class='hackathon-logo-svg' %} -

Build with the coolest Web3 projects

-

Connect with a community of talented hackers, learn new tech, buidl cool projects, and earn exciting prizes!

- Become a Sponsor + +
+ {% include 'home/nav.html' %} +
+ +
+
+
+
+

Hey Hackers, go build cool stuff

+

Build a bunch of cool stuff, learn new tech, support the open source ecosystem, and earn cash and prizes!

+
+
+
-
-
-
-
- -

Subscribe to get the latest hackathon updates

-
+ -
-
-
-
- -
- -
-
-
-
-
- - - -
+ +
+
+
+

Explore Hackathons

-
-
-
+
- {% include 'shared/footer_scripts.html' with slim=1 %} - {% include 'shared/footer.html' %} - {% block 'scripts' %} - - {% endblock %} - - +
+
+
+
+
+
+ +
+
+ Want to become a sponsor or run an exclusive hackathon on Gitcoin? +
+ +
+
+
+
+
+ + +
+
+
+
+

Get the latest on Gitcoin

+ Subscribe for news, events, and announcements. +
+ +
+
+
+
+ +
+ +
+
+
+
+
+ + + +
+
+
+
+
+ + +
+
+
+
+

Why Join Hackathons on Gitcoin?

+ Earn a living while making the world a better place. Explore the experimental edge of Web3 with like-minded peers. +
+
+
+
+ + +
+
+
+ {% for sponsor in sponsors %} + {{ sponsor.handle }} + {% endfor %} +
+
+
+ + +
+
+
+
+
+
+
+
+

{{ testimonial.comment }}

+
+
+

{{ testimonial.handle }}
{{ testimonial.role }}

+
+
+ {% if testimonial.twitter_handle %} + + {% endif %} + {% if testimonial.github_handle %} + + {% endif %} +
+
+
+
+
+
+ {{ testimonial.handle }} +
+
+
+
+
+ + + +
+
+
+
+

How to get started

+
+
+
+
+
+ +
+
Explore hackathons
+ Join the Hackathons that best fit your skills. +
+
+
+ + +
+
Select a prize
+ Choose the prizes you think will be fun to work on. +
+
+
+ + > deploy code +
+
Get after it!
+ Select “Start Work” to indicate your participation. +
+ +
+
+ +
+
+
+ + +
+
+
+
+

Ready to get started?

+ Build cool stuff, learn new tech, support the open source ecosystem, and earn cash and prizes! + +
+
+ + +
+
+
+
+
+ {% include 'shared/footer.html' %} + {% include 'shared/footer_scripts.html' with slim=1 %} + + {% block 'scripts' %} + + + + + + + {% endblock %} diff --git a/app/dashboard/templatetags/group_by_field.py b/app/dashboard/templatetags/group_by_field.py new file mode 100644 index 00000000000..fe68c981476 --- /dev/null +++ b/app/dashboard/templatetags/group_by_field.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +"""Define the add_url_schema template tag to allow cleaning up url in templates. + +Copyright (C) 2021 Gitcoin Core + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +""" +from django import template + +register = template.Library() + +@register.simple_tag +def group_by_field(list_input, fields, field): + """Groups list_input into columns by pivotting on the given field (for each of the given fields)""" + output = [] + for fields_val in fields: + # collect columns details into a dict ({field:fields_val, 'list':[...]}) + group = {} + # eg group.type = "current" + group[field] = fields_val + # collate the list by pivotting only the matching elements + group['list'] = [ele for ele in list_input if ele[field] == fields_val] + # appending each dict to the output + output.append(group) + + return output diff --git a/app/dashboard/templatetags/group_in_columns.py b/app/dashboard/templatetags/group_in_columns.py new file mode 100644 index 00000000000..f2c27036f2c --- /dev/null +++ b/app/dashboard/templatetags/group_in_columns.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +"""Define the add_url_schema template tag to allow cleaning up url in templates. + +Copyright (C) 2021 Gitcoin Core + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +""" +import itertools + +from django import template + +register = template.Library() + +@register.filter +def group_in_columns(list_input, number_of_columns): + """Groups list_input into columns based on the number_of_columns required (to be used in a loop)""" + columns = int(number_of_columns) + items = iter(list_input) + while True: + column = list(itertools.islice(items, columns)) + if column: + yield column + else: + break diff --git a/app/dashboard/views.py b/app/dashboard/views.py index deec8404d41..3c81f6e88e8 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -24,6 +24,7 @@ import html import json import logging +import random import re import time import uuid @@ -5415,29 +5416,53 @@ def hackathon_registration(request): def get_hackathons(request): """Handle rendering all Hackathons.""" - if settings.DEBUG: - from perftools.management.commands import create_page_cache + sponsors = [] + events = get_hackathon_events() - create_page_cache.create_hackathon_list_page_cache() + num_current = 0 + num_upcoming = 0 + num_finished = 0 + + # count the number of each event type + for ele in events: + if ele['type'] == 'current': + num_current += 1 + elif ele['type'] == 'upcoming': + num_upcoming += 1 + elif ele['type'] == 'finished': + num_finished += 1 + + # curate the sponsors list + if ele.get('sponsor_profiles'): + sponsors.extend(ele.get('sponsor_profiles')) - events = get_hackathon_events() - num_current = len([ele for ele in events if ele['type'] == 'current']) - num_upcoming = len([ele for ele in events if ele['type'] == 'upcoming']) - num_finished = len([ele for ele in events if ele['type'] == 'finished']) tabs = [ ('current', 'happening now', num_current), ('upcoming', 'upcoming', num_upcoming), ('finished', 'completed', num_finished), ] + # shuffle the sponsors + random.shuffle(sponsors) + params = { 'active': 'hackathons', 'title': 'Hackathons', - 'avatar_url': request.build_absolute_uri(static('v2/images/twitter_cards/tw_cards-02.png')), + 'avatar_url': request.build_absolute_uri(static('v2/images/twitter_cards/tw_hackathon-list.png')), 'card_desc': "Gitcoin runs Virtual Hackathons. Learn, earn, and connect with the best hackers in the space -- only on Gitcoin.", 'tabs': tabs, + 'types': ['current', 'upcoming', 'finished'], 'events': events, + 'sponsors': sponsors[:33], 'default_tab': get_hackathons_page_default_tabs(), + 'testimonial': { + 'handle': '@cryptomental', + 'comment': "I think the great thing about Gitcoin is how easy it is for projects to reach out to worldwide talent. Gitcoin helps to find people who have time to contribute and increase speed of project development. Thanks to Gitcoin a bunch of interesting OpenSource projects got my attention!", + 'avatar_url': '', + 'github_handle': 'cryptomental', + 'twitter_handle': '', + 'role': 'Front End Developer' + } } return TemplateResponse(request, 'dashboard/hackathon/hackathons.html', params) diff --git a/app/retail/templates/about.html b/app/retail/templates/about.html index 15a1c59d883..bf7af5b511c 100644 --- a/app/retail/templates/about.html +++ b/app/retail/templates/about.html @@ -290,112 +290,12 @@

Get the latest from Gitcoin

{% include 'shared/footer.html' %} {% include 'shared/footer_scripts.html' with slim=1 %} - + + diff --git a/app/retail/templates/gas_history.html b/app/retail/templates/gas_history.html index f17d1249f6e..b4091f76672 100644 --- a/app/retail/templates/gas_history.html +++ b/app/retail/templates/gas_history.html @@ -46,12 +46,12 @@

{% trans "Gas History" %} ({{breakdown}}) {% trans "Alpha" {% endif %}

-
+