Compare commits

..

7 Commits

Author SHA1 Message Date
ducoterra
8db4d5afed make the button red 2020-05-02 18:08:30 -04:00
ducoterra
f45e289ed8 proper mobile centering 2020-04-26 21:11:18 -04:00
ducoterra
43c48d5216 achievements tracking 2020-04-26 20:51:56 -04:00
ducoterra
0cb3896e4b nice 2020-04-26 14:49:03 -04:00
ducoterra
e102db9f38 achievements! 2020-04-26 14:27:33 -04:00
ducoterra
15c5f5293a position fixed, overflow auto 2020-04-25 19:41:55 -04:00
ducoterra
f11f9a0d97 attempt fix with overflow 2020-04-25 19:35:09 -04:00
11 changed files with 227 additions and 35 deletions

3
.gitignore vendored
View File

@@ -1,3 +1,4 @@
venv/
__pycache__/
db/
db/
staticfiles/

6
.vscode/launch.json vendored
View File

@@ -12,7 +12,8 @@
"args": [
"test",
],
"django": true
"django": true,
"preLaunchTask": "Migrate"
},
{
"name": "Run Server",
@@ -23,7 +24,8 @@
"runserver",
"--noreload"
],
"django": true
"django": true,
"preLaunchTask": "Migrate"
}
]
}

24
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,24 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Collect Static",
"command": "venv/bin/python manage.py collectstatic --no-input",
"type": "shell",
"presentation": {
"reveal": "always"
},
"group": "build"
},
{
"dependsOn": "Collect Static",
"label": "Migrate",
"command": "venv/bin/python manage.py migrate",
"type": "shell",
"presentation": {
"reveal": "always"
},
"group": "build"
}
]
}

View File

@@ -24,6 +24,7 @@ SECRET_KEY = os.getenv("SECRET_KEY")
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True if os.getenv("DEBUG") == "True" else False
LOGGING_CONFIG = None
ALLOWED_HOSTS = os.getenv("ALLOWED_HOSTS", "localhost").split(",")

View File

@@ -0,0 +1,41 @@
.achievement {
position: absolute;
height: 100%;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
z-index: -1;
}
.achievement-animate {
animation-name: moveup;
animation-duration: 2s;
animation-fill-mode: forwards;
}
.achievment-column {
height: 100%;
overflow: auto;
text-align: center;
}
.achievement-text {
font-size: 4rem;
}
@media only screen and (max-width: 768px) {
.achievment-column {
height: 50%;
}
}
@keyframes moveup {
from {bottom: 0px;}
to {bottom: 200px; color: white;}
}
@keyframes fadeout {
from {}
to {color: transparent;}
}

View File

@@ -1,17 +1,32 @@
html, body {
height: 100%;
width: 100%;
touch-action: manipulation;
}
.section, .container {
height: 100%;
}
.container {
.columns {
height: 100%;
}
.button-column {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
text-align: center;
height: 100%;
}
@media only screen and (max-width: 768px) {
.button-column {
height: 50%;
}
}
.button-container {
position: absolute;
}

View File

@@ -1,6 +1,25 @@
const csrftoken = getCookie('csrftoken');
const button = document.getElementById("BUTTON");
const count = document.getElementById("COUNT");
const button_container = document.getElementById("button-container");
const achievement = document.getElementById("achievement");
const achievement_list = document.getElementById("achievement-list");
const achievement_column = document.getElementById("achievement-column");
function add_achievement(text) {
if (text != undefined) {
achievement.querySelector(".achievement-text").innerText = text;
achievement.classList.remove("achievement-animate");
void achievement.offsetWidth;
achievement.classList.add("achievement-animate");
var elem = document.createElement("div");
elem.innerText = text;
achievement_list.appendChild(elem);
achievement_column.scrollTo(0, achievement_list.scrollHeight);
}
}
// when button is clicked submit an empty post request
button.addEventListener("click", event => {
@@ -18,6 +37,7 @@ button.addEventListener("click", event => {
})
.then((data) => {
count.innerText = data.pressed;
add_achievement(data.achievement);
}).finally(() => {
button.disabled = false;
button.classList.remove("is-loading");

View File

@@ -5,7 +5,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content= "width=device-width, user-scalable=no">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The Button</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.2/css/bulma.min.css">
<script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>

View File

@@ -4,6 +4,7 @@
{% block css %}
<link rel="stylesheet" href="{% static 'ui/button.css' %}">
<link rel="stylesheet" href="{% static 'ui/achievement.css' %}">
{% endblock %}
{% block js %}
@@ -13,16 +14,33 @@
{% block body %}
<section class="section">
<div class="container">
<div>
<h1 class="title">
The Button
</h1>
<button class="button is-primary" id="BUTTON">Press</button>
<div class="columns">
<div class="column">
</div>
<div><br></div>
<div>
<h1 class="title" id="COUNT">{{ pressed }}</h1>
<div class="button-column column">
<div>
<h1 class="title">
The Button
</h1>
<button class="button is-danger" id="BUTTON">Press</button>
</div>
<div><br></div>
<div>
<h1 class="title" id="COUNT">{{ pressed }}</h1>
</div>
<div id="achievement" class="achievement">
<div>
<div class="achievement-text"></div>
</div>
</div>
</div>
<div class="column achievment-column" id = "achievement-column">
<div class="achievements-list" id="achievement-list">
<h1 class="title">Achievements</h1>
{% for key,value in achievement.items %}
<div>{{ value }}</div>
{% endfor %}
</div>
</div>
</div>
</section>

View File

@@ -1,5 +1,5 @@
from django.contrib.auth.models import AnonymousUser, User
from django.test import RequestFactory, TestCase
from django.test import RequestFactory, TestCase, Client
from .views import button
@@ -11,23 +11,31 @@ class SimpleTest(TestCase):
username='testuser', email='test@test.test', password='testpass')
def test_button(self):
# Create an instance of a GET request.
request = self.factory.get('/snippets')
request.user = self.user
request.session = self.client.session
response = button(request)
# Test initial load
c = Client()
response = c.get('/button')
self.assertEqual(response.status_code, 301)
response = c.get('/button/')
self.assertEqual(response.status_code, 200)
request = self.factory.post(
'/button',
data={},
content_type='application/json'
)
request.session = self.client.session
response = button(request)
self.assertEqual(response.status_code, 200)
self.assertEqual(request.session.get('pressed'), 1)
self.assertEqual(response.context.get("achievement"), {})
response = button(request)
# Test first achievement
response = c.post('/button/', {})
self.assertEqual(response.status_code, 200)
self.assertEqual(request.session.get('pressed'), 2)
self.assertEqual(response.json().get("pressed"), 1)
self.assertEqual(response.json().get("achievement"), "Clicked!")
self.assertEqual(c.session.get('pressed'), 1)
# Test second achievement
response = c.post('/button/', {})
self.assertEqual(response.status_code, 200)
self.assertEqual(response.json().get("pressed"), 2)
self.assertEqual(response.json().get("achievement"), "Clicked Twice!")
self.assertEqual(c.session.get('pressed'), 2)
# Test no achievement
response = c.post('/button/', {})
self.assertEqual(response.status_code, 200)
self.assertEqual(response.json().get("pressed"), 3)
self.assertEqual(response.json().get("achievement"), None)
self.assertEqual(c.session.get('pressed'), 3)

View File

@@ -1,8 +1,61 @@
from django.shortcuts import render
from django.http import JsonResponse
achievements = {
1: "Clicked!",
2: "Clicked Twice!",
4: "2^2",
8: "2^3",
16: "2^4",
24: "I'm that old",
32: "2^5",
64: "2^6",
69: "Nice",
100: "one hundred",
128: "2^7",
200: "two hundred",
250: "quarter thousand",
256: "2^8",
300: "three hundred",
400: "four hundred",
420: "Blaze it",
500: "half thousand",
512: "2^9",
600: "six hundred",
700: "seven hundred",
800: "eight hundred",
900: "nine hundred",
1000: "full thousand",
1024: "2^10",
1776: "America",
1914: "Some War here",
1938: "Some more war here",
1950: "Lots of war in here",
2000: "Computers die",
2008: "Houses die",
2019: "People die",
2048: "2048!",
2500: "Keep going!",
3000: "three thousand",
4000: "four thousand",
4096: "2^11",
5000: "halfway to ten thousand",
10001: "ten thousand one",
100000: "one hundred thousand",
1000000: "one million?",
10000000: "ten millions???",
100000000: "one hundo billion",
1000000000: "JK this is actually a billion though",
10000000000: "I'm not going to create another achievement",
100000000000: "one hundred billion",
1000000000000: "It's physically impossible to click this high"
}
def button(request):
PRESSED = 'pressed'
ACHIEVE = 'achievement'
try:
request.session[PRESSED]
except KeyError:
@@ -10,5 +63,14 @@ def button(request):
if request.method == "POST":
request.session[PRESSED] += 1
return JsonResponse({PRESSED: request.session[PRESSED]})
return render(request, "ui/button.html", {PRESSED: request.session[PRESSED]})
response = {
PRESSED: request.session[PRESSED],
ACHIEVE: achievements.get(request.session[PRESSED])
}
return JsonResponse(response)
pressed = request.session[PRESSED]
response = {PRESSED: pressed}
achieved = {k:v for k,v in achievements.items() if k <= pressed}
response.update({ACHIEVE: achieved})
return render(request, "ui/button.html", response)