Finished UI for DetailedView

This commit is contained in:
Kristofers Solo 2023-06-29 00:15:37 +00:00
parent b68cd21f3b
commit dd0a699746
10 changed files with 173 additions and 59 deletions

View File

@ -19,9 +19,9 @@ from django.urls import include, path
urlpatterns = [ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("", include("account.urls")),
path("", include("fossdb.urls")), path("", include("fossdb.urls")),
path("", include("main.urls")), path("", include("main.urls")),
path("", include("account.urls")),
path("", include("django.contrib.auth.urls")), path("", include("django.contrib.auth.urls")),
path("__reload__/", include("django_browser_reload.urls")), path("__reload__/", include("django_browser_reload.urls")),
] ]

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.2 on 2023-06-28 22:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('fossdb', '0004_alter_tag_icon_star'),
]
operations = [
migrations.AddField(
model_name='operatingsystem',
name='is_linux',
field=models.BooleanField(blank=True, default=False),
),
]

View File

@ -18,6 +18,7 @@ class License(models.Model):
class OperatingSystem(models.Model): class OperatingSystem(models.Model):
name = models.CharField(max_length=100, unique=True) name = models.CharField(max_length=100, unique=True)
description = models.TextField(blank=True, default="") description = models.TextField(blank=True, default="")
is_linux = models.BooleanField(blank=True, default=False)
def __str__(self): def __str__(self):
return self.name return self.name
@ -75,6 +76,26 @@ class Project(models.Model):
def star_amount(self): def star_amount(self):
return self.star.count() return self.star.count()
@property
def runs_on_macos(self):
return self.operating_system.filter(operating_system__name="macOS").exists()
@property
def runs_on_linux(self):
return self.operating_system.filter(operating_system__is_linux=True).exists()
@property
def runs_on_windows(self):
return self.operating_system.filter(operating_system__name="Windows").exists()
@property
def runs_on_ios(self):
return self.operating_system.filter(operating_system__name="iOS").exists()
@property
def runs_on_android(self):
return self.operating_system.filter(operating_system__name="Android").exists()
def get_absolute_url(self): def get_absolute_url(self):
return f"/{self.owner}/{self.name}" return f"/{self.owner}/{self.name}"

View File

@ -1,48 +1,123 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load static %} {% load static %}
{% block title %}{{ project.owner }}/{{ project.name }}{% endblock %} {% block title %}{{ project.owner }}/{{ project.name }}{% endblock %}
{% block meta %}{% endblock %} {% block meta %}
<script src="{% static 'js/buttons.js' %}" defer></script>
{% endblock meta %}
{% block content %} {% block content %}
<h2>@{{ project.owner }}</h2> <div class="mx-auto font-condensed max-w-[60%]">
<h3>{{ project.name }}</h3> <div class="p-8">
<p>{{ project.description }}</p> <h1 class="text-center text-4xl font-abel">{{ project.name }}</h1>
<p> <h2 class="text-center text-2xl font-abel">
<a href="{{ project.projecthostingplatform.url }}" target="_blank">{{ project.projecthostingplatform.hosting_platform }}</a> <a href="{% url 'profile' project.owner.username %}">By <span class="underline">{{ project.owner }}</span></a>
</p> </h2>
<ul> <!-- os platform icons -->
{% for license in project.license.all %} <div class="my-4 flex justify-center items-center gap-x-4">
<li> <a href=""><i class="fa-brands fa-linux fa-lg hover:text-lightsteelblue-200 transform duration-300 ease-in-out
<a href="{{ license.url }}">{{ license }}</a> {% if project.runs_on_linux %}
</li> text-lightsteelblue-100
{% empty %} {% else %}
<p>No license</p> text-slategray-200
{% endfor %} {% endif %}"></i></a>
</ul> <a href=""><i class="fa-brands fa-windows fa-lg hover:text-lightsteelblue-200 transform duration-300 ease-in-out
<ul> {% if project.runs_on_windows %}
{% for os in project.operating_system.all %} text-lightsteelblue-100
<li>{{ os }}</li> {% else %}
{% empty %} text-slategray-200
<p>No OS</p> {% endif %}"></i></a>
{% endfor %} <a href=""><i class="fa-brands fa-apple fa-lg hover:text-lightsteelblue-200 transform duration-300 ease-in-out
</ul> {% if project.runs_on_macos %}
<ul> text-lightsteelblue-100
{% for tag in project.tag.all %} {% else %}
<li>{{ tag }}</li> text-slategray-200
{% empty %} {% endif %}"></i></a>
<p>No tag</p> <a href=""><i id="ios"
{% endfor %} class="fa-brands fa-app-store-ios fa-lg hover:text-lightsteelblue-200 transform duration-300 ease-in-out
</ul> {% if project.runs_on_ios %}
<ul> text-lightsteelblue-100
{% for language in project.projectprogramminglanguage_set.all %} {% else %}
<li>{{ language.programming_language }} {{ language.percentage }}&#37;</li> text-slategray-200
{% empty %} {% endif %}"></i></a>
<p>No language</p> <a href=""><i id="android"
{% endfor %} class="fa-brands fa-android fa-lg hover:text-lightsteelblue-200 transform duration-300 ease-in-out
</ul> {% if project.runs_on_android %}
<button> text-lightsteelblue-100
<a href="{% url 'project-update' project.owner project.name %}">Update</a> {% else %}
</button> text-slategray-200
<button> {% endif %}"></i></a>
<a href="{% url 'project-delete' project.owner project.name %}">Delete</a> </div>
</button> <!-- tags -->
<div class="my-8 flex flex-wrap justify-center items-start gap-2">
{% for tag in project.tag.all|dictsort:"name" %}
<a href="">
<span title="{{ tag.description }}"
class="bg-opacity-0 border rounded-xl border-slategray-200 px-3 text-xs min-w-16 hover:bg-steelblue-400 hover:bg-opacity-60 transform duration-300 ease-in-out">
{{ tag }}
</span>
</a>
{% endfor %}
</div>
<!-- programming languages -->
<div class="my-8 flex flex-wrap justify-center items-start gap-2">
{% for language in project.projectprogramminglanguage_set.all|dictsortreversed:"percentage" %}
<a href="">
<span title="{{ language.percentage }}%"
class="bg-opacity-0 border rounded-xl border-slategray-200 px-3 text-xs min-w-16 hover:bg-steelblue-400 hover:bg-opacity-60 transform duration-300 ease-in-out">
{{ language.programming_language }}
</span>
</a>
{% endfor %}
</div>
<!-- text -->
<p class="text-justify font-roboto my-12">{{ project.description }}</p>
<div class="">
<!-- hosting platform and licenses on one line -->
<div class="flex justify-between w-full mt-4 font-abel">
<!-- licenses -->
<div>
<button class="text-xl underline font-abel hover:text-lightsteelblue-200 transform duration-300 ease-in-out"
id="menu-button"
aria-haspopup="true"
aria-expanded="true">Licenses</button>
</div>
<!-- hosting platform -->
<div class="">
<p>
See project source code and read more <a class="underline text-skyblue-300 hover:text-cadetblue-300 transform duration-300 ease-in-out"
href="{{ project.projecthostingplatform.url }}"
target="_blank">here</a>!
</p>
</div>
</div>
<div class="w-full">
<div class="my-4 flex flex-wrap justify-center items-start gap-2"
role="menu"
id="dropdown-menu"
aria-orientation="vertical"
aria-labelledby="menu-button"
tabindex="-1"
style="display:none">
{% for license in project.license.all|dictsort:"short_name" %}
<a href="{{ license.url }}">
<span title="{{ license.full_name }}"
class="bg-opacity-0 border rounded-xl border-slategray-200 px-3 text-xs min-w-16 hover:bg-steelblue-400 hover:bg-opacity-60">
{{ license }}
</span>
</a>
{% endfor %}
</div>
</div>
</div>
</div>
{% if user == project.owner %}
<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">
<a href="{% url 'project-update' project.owner project.name %}">Update</a>
</button>
<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">
<a href="{% url 'project-delete' project.owner project.name %}">Delete</a>
</button>
</div>
{% endif %}
</div>
{% endblock %} {% endblock %}

View File

@ -3,18 +3,6 @@
{% block title %}{{ title }}{% endblock %} {% block title %}{{ title }}{% endblock %}
{% block meta %}{% endblock %} {% block meta %}{% endblock %}
{% block content %} {% block content %}
<p>{{ username }}</p>
<button>
<a href="{% url 'add-project' %}">Add Project</a>
</button>
<button>
<a href="/admin">Admin</a>
</button>
<br />
<form action="get">
{{ filter.form.as_p }}
<button type="submit">Filter</button>
</form>
{% for project in projects %} {% for project in projects %}
<div> <div>
<a href="{{ project.get_absolute_url }}">{{ project }}</a> <a href="{{ project.get_absolute_url }}">{{ project }}</a>

View File

@ -4,7 +4,7 @@ from . import views
urlpatterns = [ urlpatterns = [
path("explore/", views.ProjectListView.as_view(), name="explore"), path("explore/", views.ProjectListView.as_view(), name="explore"),
path("add/", views.ProjectCreateView.as_view(), name="add-project"), path("contribute/", views.ProjectCreateView.as_view(), name="contribute"),
path("<str:owner>/<str:project_name>/", views.ProjectDetailView.as_view(), name="project-detail"), path("<str:owner>/<str:project_name>/", views.ProjectDetailView.as_view(), name="project-detail"),
path("<str:owner>/<str:project_name>/edit/", views.ProjectUpdateView.as_view(), name="project-update"), path("<str:owner>/<str:project_name>/edit/", views.ProjectUpdateView.as_view(), name="project-update"),
path("<str:owner>/<str:project_name>/delete/", views.ProjectDeleteView.as_view(), name="project-delete"), path("<str:owner>/<str:project_name>/delete/", views.ProjectDeleteView.as_view(), name="project-delete"),

View File

@ -23,7 +23,7 @@ class ProjectListView(FilterView):
template_name = "explore.html" template_name = "explore.html"
filterset_class = ProjectFilter filterset_class = ProjectFilter
context_object_name = "projects" context_object_name = "projects"
paginate_by = 10 # optional 10 projects a page paginate_by = 100 # optional 10 projects a page
class ProjectCreateView(LoginRequiredMixin, CreateView): class ProjectCreateView(LoginRequiredMixin, CreateView):

View File

@ -126,6 +126,8 @@ module.exports = {
fontSize: { fontSize: {
base: "1rem", base: "1rem",
xl: "1.25rem", xl: "1.25rem",
"2xl": "1.5rem",
"3xl": "2rem",
"4xl": "4rem", "4xl": "4rem",
xs: "0.75rem", xs: "0.75rem",
}, },

View File

@ -75,7 +75,7 @@
<main class="flex flex-col flex-grow"> <main class="flex flex-col flex-grow">
{% block content %}{% endblock %} {% block content %}{% endblock %}
</main> </main>
<footer class="w-full h-32 flex items-center text-slategray-200 bg-gray-500 mt-4 font-condensed border-gradient-horizontal"> <footer class="w-full h-32 flex items-center text-slategray-200 bg-gray-500 mt-32 font-condensed border-gradient-horizontal">
<div class="p-8"> <div class="p-8">
<div class="space-y-4 text-left"> <div class="space-y-4 text-left">
<p> <p>

View File

@ -39,3 +39,13 @@ window.addEventListener("DOMContentLoaded", () => {
}) })
}) })
}) })
window.addEventListener("DOMContentLoaded", () => {
document
.getElementById("menu-button")
.addEventListener("click", function() {
document.getElementById("dropdown-menu").style.display =
this.ariaExpanded === "true" ? "none" : "flex"
this.ariaExpanded = this.ariaExpanded === "true" ? "false" : "true"
})
})