mirror of
https://github.com/kristoferssolo/FOSSDB.git
synced 2025-10-21 17:50:35 +00:00
Created UI for CreateView
This commit is contained in:
parent
ccee378045
commit
7e8bf84c0b
@ -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 %}
|
||||||
|
|||||||
@ -13,31 +13,29 @@
|
|||||||
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
|
|
||||||
</button>
|
|
||||||
<p>
|
<p>
|
||||||
Have an account? Login <a class="underline text-skyblue-300" href="{% url 'login' %}">Here</a>!
|
Have an account? Login <a class="underline text-skyblue-300" href="{% url 'login' %}">Here</a>!
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@ -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>
|
||||||
<!-- This button will trigger the JS to append another language form -->
|
<div>
|
||||||
<button type="button" id="add-more">+</button>
|
<p class="text-xl font-abel text-center">Tags</p>
|
||||||
<!-- Render the empty form, which you'll use as a template for new entries -->
|
{{ form.tag }}
|
||||||
<!-- Wrap it in a container so you can reference it by id and hide it -->
|
</div>
|
||||||
<div id="empty-form" style="display:none;">{{ empty_form.as_table }}</div>
|
<div>
|
||||||
<button type="submit">Submit</button>
|
<p class="text-xl font-abel text-center">Operating systems</p>
|
||||||
|
{{ form.operating_system }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ hosting_platform.management_form }}
|
||||||
|
<div class="flex gap-4 items-center">
|
||||||
|
<p class="text-xl font-abel">Hosting platform:</p>
|
||||||
|
{{ hosting_platform }}
|
||||||
|
</div>
|
||||||
|
{{ 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 %}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@ -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" />
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user