Created UI for CreateView

This commit is contained in:
Kristofers Solo 2023-06-29 15:03:53 +00:00
parent ccee378045
commit 7e8bf84c0b
8 changed files with 137 additions and 75 deletions

View File

@ -12,21 +12,20 @@
placeholder="Username" placeholder="Username"
name="username" name="username"
value="{{ form.username.value|default:'' }}" value="{{ form.username.value|default:'' }}"
class="verify mt-1 block rounded-md border-2 border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-lightsteelblue-100 focus:border-cadetblue-300" /> class="verify form-field submit-form" />
{% if form.username.errors %}<p class="text-indianred-100 text-xs italic">{{ form.username.errors }}</p>{% endif %} {% if form.username.errors %}<p class="text-indianred-100 text-xs italic">{{ form.username.errors }}</p>{% endif %}
<input type="password" <input type="password"
placeholder="Password" placeholder="Password"
name="password" name="password"
value="{{ form.username.value|default:'' }}" value="{{ form.username.value|default:'' }}"
class="verify mt-1 block rounded-md border-2 border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-lightsteelblue-100 focus:border-cadetblue-300" /> class="verify form-field submit-form" />
{% if form.password.errors %}<p class="text-indianred-100 text-xs italic">{{ form.password.errors }}</p>{% endif %} {% if form.password.errors %}<p class="text-indianred-100 text-xs italic">{{ form.password.errors }}</p>{% endif %}
<button type="submit" <button type="submit"
id="submit-button" id="submit-button"
class="px-12 py-2 border border-transparent rounded-md text-lightsteelblue-100 bg-slategray-200 opacity-50 transform ease-in-out duration-500 cursor-default"> class="button submit-button-disabled text-lightsteelblue-100 bg-slategray-200">Login</button>
Login
</button>
<p> <p>
Don't have an account? Create one <a class="underline text-skyblue-300" href="{% url 'signup' %}">Here</a>! Don't have an account? Create one <a class="underline text-skyblue-300 hover:text-cadetblue-300 transform duration-300 ease-in-out"
href="{% url 'signup' %}">Here</a>!
</p> </p>
</form> </form>
{% endblock %} {% endblock %}

View File

@ -13,33 +13,31 @@
placeholder="Username" placeholder="Username"
name="username" name="username"
value="{{ form.username.value|default:'' }}" value="{{ form.username.value|default:'' }}"
class="verify mt-1 block rounded-md border-2 border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-lightsteelblue-100 focus:border-cadetblue-300" /> class="verify form-field submit-form" />
{% if form.username.errors %}<p class="text-indianred-100 text-xs italic">{{ form.username.errors }}</p>{% endif %} {% if form.username.errors %}<p class="text-indianred-100 text-xs italic">{{ form.username.errors }}</p>{% endif %}
<input type="email" <input type="email"
placeholder="Email (optional)" placeholder="Email (optional)"
name="email" name="email"
value="{{ form.email.value|default:'' }}" value="{{ form.email.value|default:'' }}"
class="mt-1 block rounded-md border-2 border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-lightsteelblue-100 focus:border-cadetblue-300" /> class="form-field submit-form" />
{% if form.email.errors %}<p class="text-indianred-100 text-xs italic">{{ form.email.errors }}</p>{% endif %} {% if form.email.errors %}<p class="text-indianred-100 text-xs italic">{{ form.email.errors }}</p>{% endif %}
<input type="password" <input type="password"
placeholder="Password" placeholder="Password"
name="password1" name="password1"
value="{{ form.password1.value|default:'' }}" value="{{ form.password1.value|default:'' }}"
class="verify mt-1 block rounded-md border-2 border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-lightsteelblue-100 focus:border-cadetblue-300" /> class="verify form-field submit-form" />
{% if form.password1.errors %}<p class="text-indianred-100 text-xs italic">{{ form.password1.errors }}</p>{% endif %} {% if form.password1.errors %}<p class="text-indianred-100 text-xs italic">{{ form.password1.errors }}</p>{% endif %}
<input type="password" <input type="password"
placeholder="Confirm password" placeholder="Confirm password"
name="password2" name="password2"
value="{{ form.password2.value|default:'' }}" value="{{ form.password2.value|default:'' }}"
class="verify mt-1 block rounded-md border-2 border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-lightsteelblue-100 focus:border-cadetblue-300" /> class="verify form-field submit-form" />
{% if form.password2.errors %}<p class="text-indianred-100 text-xs italic">{{ form.password2.errors }}</p>{% endif %} {% if form.password2.errors %}<p class="text-indianred-100 text-xs italic">{{ form.password2.errors }}</p>{% endif %}
<button type="submit" <button type="submit"
id="submit-button" id="submit-button"
class="px-12 py-2 border border-transparent rounded-md text-lightsteelblue-100 bg-slategray-200 opacity-50 transform ease-in-out duration-500 cursor-default"> class="button submit-button-disabled text-lightsteelblue-100 bg-slategray-200" />Sign Up</button>
Sign Up <p>
</button> Have an account? Login <a class="underline text-skyblue-300" href="{% url 'login' %}">Here</a>!
<p> </p>
Have an account? Login <a class="underline text-skyblue-300" href="{% url 'login' %}">Here</a>! </form>
</p>
</form>
{% endblock %} {% endblock %}

View File

@ -3,32 +3,77 @@
{% block title %}{{ title }}{% endblock %} {% block title %}{{ title }}{% endblock %}
{% block meta %}{% endblock %} {% block meta %}{% endblock %}
{% block content %} {% block content %}
<form method="post" id="project-form"> <form class="flex flex-col items-center justify-center space-y-4 my-auto font-condensed"
method="post"
id="project-form">
{% csrf_token %} {% csrf_token %}
{{ form.as_p }} {{ form.name }}
{{ hosting_platform.management_form }} {{ form.description }}
{{ hosting_platform.as_table }} <div class="flex gap-4 justify-center">
<div id="language-formset"> <div class="">
{{ programming_language.management_form }} <p class="text-xl font-abel text-center">Licenses</p>
{% for form in programming_language %}<div class="language-form">{{ form.as_table }}</div>{% endfor %} {{ form.license }}
</div>
<div>
<p class="text-xl font-abel text-center">Tags</p>
{{ form.tag }}
</div>
<div>
<p class="text-xl font-abel text-center">Operating systems</p>
{{ form.operating_system }}
</div>
</div> </div>
<!-- This button will trigger the JS to append another language form --> {{ hosting_platform.management_form }}
<button type="button" id="add-more">+</button> <div class="flex gap-4 items-center">
<!-- Render the empty form, which you'll use as a template for new entries --> <p class="text-xl font-abel">Hosting platform:</p>
<!-- Wrap it in a container so you can reference it by id and hide it --> {{ hosting_platform }}
<div id="empty-form" style="display:none;">{{ empty_form.as_table }}</div> </div>
<button type="submit">Submit</button> {{ programming_languages.management_form }}
<!-- Languages container -->
<div class="" id="languages-container">
{% for language in programming_languages %}
<div class="languages flex gap-4 items-center">
{{ language.programming_language }}
{{ language.percentage }}
</div>
{% endfor %}
</div>
<!-- Hidden empty form used as a template -->
<div id="empty-form" style="display:none">
<div class="flex gap-4 items-center">
{{ programming_languages.empty_form.programming_language }}
{{ programming_languages.empty_form.percentage }}
<button class="button submit-button-enabled text-gray-500 bg-indianred-100 remove-btn"
type="button">Remove</button>
</div>
</div>
<div class="flex justify-between">
<button class="button submit-button-enabled bg-skyblue-300 text-gray-500"
type="button"
id="add-language">+</button>
</div>
<button class="button submit-button-enabled bg-mediumaquamarine text-gray-500"
ype="submit">Save</button>
</form> </form>
<script> <script type="text/javascript">
document.querySelector("#add-more").addEventListener("click", function() { window.addEventListener("DOMContentLoaded", () => {
var formIndex = document.querySelector("#id_language-TOTAL_FORMS").value; document.getElementById("add-language").addEventListener("click", () => {
var emptyFormDiv = document.querySelector("#empty-form"); var formIndex = document.getElementById("id_projectprogramminglanguage_set-TOTAL_FORMS");
var newFormHTML = emptyFormDiv.innerHTML.replace(/__prefix__/g, formIndex); var emptyForm = document.getElementById("empty-form").innerHTML;
var newFormDiv = document.createElement("div");
newFormDiv.className = "language-form"; emptyForm = emptyForm.replace(/__prefix__/g, formIndex.value);
newFormDiv.innerHTML = newFormHTML;
document.querySelector("#language-formset").append(newFormDiv); document.getElementById("languages-container")
document.querySelector("#id_language-TOTAL_FORMS").value = parseInt(formIndex) + 1; .insertAdjacentHTML("beforeend", emptyForm);
formIndex.value = parseInt(formIndex.value) + 1;
})
document.getElementById("languages-container").addEventListener("click", (e) => {
if (e.target && e.target.classList.contains("remove-btn")) {
e.target.previousElementSibling.previousElementSibling.value = "";
e.target.parentElement.style.display = "none"
}
});
}); });
</script> </script>
{% endblock %} {% endblock %}

View File

@ -9,9 +9,9 @@
{% csrf_token %} {% csrf_token %}
<input type="text" <input type="text"
id="confirm-input" id="confirm-input"
class="mt-1 block rounded-md border-2 border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-lightsteelblue-100 focus:border-cadetblue-300 text-center" /> class="text-center form-field border-slategray-200 hover:border-indianred-100 bg-gray-300 focus:border-indianred-100" />
<button id="submit-button" <button id="submit-button"
class="px-12 py-2 border border-transparent rounded-md text-lightsteelblue-100 font-bold uppercase bg-slategray-200 opacity-50 transform ease-in-out duration-500 cursor-default" class="button submit-button-disabled text-lightsteelblue-100 bg-slategray-200 uppercase font-bold"
type="submit">Delete</button> type="submit">Delete</button>
</form> </form>
<script type="text/javascript"> <script type="text/javascript">
@ -23,30 +23,26 @@
USER_INPUT.addEventListener("input", () => { USER_INPUT.addEventListener("input", () => {
if (confirm_string == USER_INPUT.value) { if (confirm_string == USER_INPUT.value) {
SUBMIT_BUTTON.classList.remove( SUBMIT_BUTTON.classList.remove(
"bg-slategray-200", "submit-button-disabled",
"text-lightsteelblue-100", "text-lightsteelblue-100",
"opacity-50", "bg-slategray-200"
"cursor-default"
) )
SUBMIT_BUTTON.classList.add( SUBMIT_BUTTON.classList.add(
"bg-indianred-100", "submit-button-enabled",
"text-gray-500", "text-gray-500",
"opacity-100", "bg-indianred-100",
"hover:opacity-60"
) )
SUBMIT_BUTTON.disabled = false SUBMIT_BUTTON.disabled = false
} else { } else {
SUBMIT_BUTTON.classList.remove( SUBMIT_BUTTON.classList.remove(
"bg-indianred-100", "submit-button-enabled",
"text-gray-500", "text-gray-500",
"opacity-100", "bg-indianred-100",
"hover:opacity-60"
) )
SUBMIT_BUTTON.classList.add( SUBMIT_BUTTON.classList.add(
"bg-slategray-200", "submit-button-disabled",
"text-lightsteelblue-100", "text-lightsteelblue-100",
"opacity-50", "bg-slategray-200"
"cursor-default"
) )
SUBMIT_BUTTON.disabled = true SUBMIT_BUTTON.disabled = true
} }

View File

@ -111,10 +111,10 @@
</div> </div>
{% if user == project.owner %} {% if user == project.owner %}
<div class="flex justify-between mt-8 mx-16"> <div class="flex justify-between mt-8 mx-16">
<button class="px-12 py-2 border border-transparent rounded-md text-gray-500 bg-skyblue-300 hover:opacity-60 transform ease-in-out duration-500"> <button class="button submit-button-enabled text-gray-500 bg-skyblue-300">
<a href="{% url 'project-update' project.owner project.name %}">Update</a> <a href="{% url 'project-update' project.owner project.name %}">Update</a>
</button> </button>
<button class="px-12 py-2 border border-transparent rounded-md text-gray-500 bg-burlywood hover:opacity-60 transform ease-in-out duration-500"> <button class="button submit-button-enabled text-gray-500 bg-burlywood hover:opacity-60">
<a href="{% url 'project-delete' project.owner project.name %}">Delete</a> <a href="{% url 'project-delete' project.owner project.name %}">Delete</a>
</button> </button>
</div> </div>

View File

@ -2,10 +2,6 @@
@tailwind components; @tailwind components;
@tailwind utilities; @tailwind utilities;
@import url("https://fonts.googleapis.com/css2?family=Abel&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Rationale&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap");
body { body {
@apply leading-[normal] m-0; @apply leading-[normal] m-0;
} }
@ -28,3 +24,27 @@ body {
background: linear-gradient(to right, transparent, #27a1b9, transparent); background: linear-gradient(to right, transparent, #27a1b9, transparent);
transform: translateY(-50%); transform: translateY(-50%);
} }
.form-field {
@apply mt-1 block rounded-md border-2;
}
.submit-form {
@apply border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-slategray-100 focus:border-cadetblue-300;
}
.checkbox-form {
@apply border-slategray-200 hover:border-lightsteelblue-100 bg-gray-300 placeholder-slategray-100 focus:border-cadetblue-300;
}
.button {
@apply font-abel px-12 py-2 border rounded-md transform ease-in-out duration-500;
}
.submit-button-disabled {
@apply opacity-50 cursor-default;
}
.submit-button-enabled {
@apply opacity-100 hover:opacity-60;
}

View File

@ -7,11 +7,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Abel&family=Rationale&family=Roboto+Condensed:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" <link href="https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap"
rel="stylesheet" /> rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Abel&family=Roboto+Condensed:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" <link href="https://fonts.googleapis.com/css2?family=Abel&display=swap"
rel="stylesheet" /> rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" <link href="https://fonts.googleapis.com/css2?family=Rationale&display=swap"
rel="stylesheet" /> rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" <link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
rel="stylesheet" /> rel="stylesheet" />

View File

@ -1,3 +1,11 @@
Array.from(document.getElementsByClassName("remove-btn")).forEach((button) => {
button.addEventListener("click", () => {
console.log("TRUE")
const hiddenDeleteInput = button.previousElementSibling
hiddenDeleteInput.value = "on"
button.parentElement.style.display = "none"
})
})
window.addEventListener("DOMContentLoaded", () => { window.addEventListener("DOMContentLoaded", () => {
const FORM_VERIFY = document.getElementsByClassName("verify") const FORM_VERIFY = document.getElementsByClassName("verify")
const SUBMIT_BUTTON = document.getElementById("submit-button") const SUBMIT_BUTTON = document.getElementById("submit-button")
@ -10,30 +18,26 @@ window.addEventListener("DOMContentLoaded", () => {
) )
if (ALL_FILLED) { if (ALL_FILLED) {
SUBMIT_BUTTON.classList.remove( SUBMIT_BUTTON.classList.remove(
"bg-slategray-200", "submit-button-disabled",
"text-lightsteelblue-100", "text-lightsteelblue-100",
"opacity-50", "bg-slategray-200"
"cursor-default"
) )
SUBMIT_BUTTON.classList.add( SUBMIT_BUTTON.classList.add(
"bg-skyblue-300", "submit-button-enabled",
"text-gray-500", "text-gray-500",
"opacity-100", "bg-skyblue-300"
"hover:opacity-60"
) )
SUBMIT_BUTTON.disabled = false SUBMIT_BUTTON.disabled = false
} else { } else {
SUBMIT_BUTTON.classList.remove( SUBMIT_BUTTON.classList.remove(
"bg-skyblue-300", "submit-button-enabled",
"text-gray-500", "text-gray-500",
"opacity-100", "bg-skyblue-300"
"hover:opacity-60"
) )
SUBMIT_BUTTON.classList.add( SUBMIT_BUTTON.classList.add(
"bg-slategray-200", "submit-button-disabled",
"text-lightsteelblue-100", "text-lightsteelblue-100",
"opacity-50", "bg-slategray-200"
"cursor-default"
) )
SUBMIT_BUTTON.disabled = true SUBMIT_BUTTON.disabled = true
} }