basic order page

This commit is contained in:
Laetitia Getti 2023-05-12 16:19:52 +02:00
parent 90dfb1c543
commit 42380cd17f
11 changed files with 279 additions and 157 deletions

View file

@ -1,29 +1,23 @@
from django import forms
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
from django.db import IntegrityError from django.db import IntegrityError
from la_chariotte.order.models import GroupedOrder, Item from la_chariotte.order.models import GroupedOrder, Item
from django.forms import ( # isort:skip
CharField,
DateInput,
DateTimeInput,
ModelForm,
Textarea,
TextInput,
)
class GroupedOrderForm(forms.ModelForm):
class GroupedOrderForm(ModelForm):
class Meta: class Meta:
model = GroupedOrder model = GroupedOrder
fields = ["name", "deadline", "delivery_date", "place", "description"] fields = ["name", "deadline", "delivery_date", "place", "description"]
widgets = { widgets = {
"name": TextInput(attrs={"placeholder": "ex : Des oranges pour Noël"}), "name": forms.TextInput(
"deadline": DateTimeInput(attrs={"placeholder": "JJ/MM/AAAA HH:MM"}), attrs={"placeholder": "ex : Des oranges pour Noël"}
"delivery_date": DateInput(attrs={"placeholder": "JJ/MM/AAAA"}), ),
"place": TextInput(attrs={"placeholder": "(facultatif)"}), "deadline": forms.DateTimeInput(attrs={"placeholder": "JJ/MM/AAAA HH:MM"}),
"description": Textarea( "delivery_date": forms.DateInput(attrs={"placeholder": "JJ/MM/AAAA"}),
"place": forms.TextInput(attrs={"placeholder": "(facultatif)"}),
"description": forms.Textarea(
attrs={ attrs={
"placeholder": "Plus d'infos sur la commande groupée ? (facultatif)" "placeholder": "Plus d'infos sur la commande groupée ? (facultatif)"
} }
@ -56,7 +50,7 @@ class GroupedOrderForm(ModelForm):
return cleaned_data return cleaned_data
class ItemCreateForm(ModelForm): class ItemCreateForm(forms.ModelForm):
class Meta: class Meta:
model = Item model = Item
fields = ["name", "price", "max_limit"] fields = ["name", "price", "max_limit"]

View file

@ -0,0 +1,49 @@
# Generated by Django 4.2 on 2023-05-12 09:48
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("order", "0016_alter_groupedorder_description"),
]
operations = [
migrations.CreateModel(
name="OrderAuthor",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("first_name", models.CharField(verbose_name="Prénom")),
("last_name", models.CharField(verbose_name="Nom")),
(
"phone",
models.CharField(
help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin",
verbose_name="Numéro de téléphone",
),
),
(
"email",
models.CharField(
verbose_name="Pour vous que l'organisateur·ice vous contacte en cas de besoin"
),
),
],
),
migrations.AlterField(
model_name="order",
name="author",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="order.orderauthor"
),
),
]

View file

@ -9,7 +9,7 @@ from la_chariotte.settings import AUTH_USER_MODEL
class GroupedOrder(models.Model): class GroupedOrder(models.Model):
name = models.CharField( name = models.CharField(
max_length=100, null=True, verbose_name="Titre de la commande" max_length=100, null=True, verbose_name="Titre de la commande"
) # optionnal )
orga = models.ForeignKey( orga = models.ForeignKey(
AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Organisateur·ice" AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Organisateur·ice"
) )
@ -55,13 +55,29 @@ class GroupedOrder(models.Model):
) )
class OrderAuthor(models.Model):
"""Created when a user orders without having an account - or when a user creates an account"""
# TODO faire le lien avec CustomUser (CustomUser hérite de OrderAuthor), pour ensuite préremplir quand on est connecté·e
first_name = models.CharField(verbose_name="Prénom")
last_name = models.CharField(verbose_name="Nom")
phone = models.CharField(
verbose_name="Numéro de téléphone",
help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin",
)
email = models.CharField(
verbose_name="Pour vous que l'organisateur·ice vous contacte en cas de besoin"
)
def __str__(self): # pragma: no cover
return f"{self.first_name} {self.last_name}"
class Order(models.Model): class Order(models.Model):
grouped_order = models.ForeignKey( grouped_order = models.ForeignKey(
GroupedOrder, on_delete=models.CASCADE, related_name="order_set" GroupedOrder, on_delete=models.CASCADE, related_name="order_set"
) )
author = models.CharField( author = models.ForeignKey(OrderAuthor, on_delete=models.CASCADE)
max_length=100, verbose_name="Personne qui passe la commande"
) # a changer, utiliser ForeignKey de user
def __str__(self): # pragma: no cover def __str__(self): # pragma: no cover
return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}" return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}"
@ -85,7 +101,7 @@ class Item(models.Model):
class OrderedItem(models.Model): class OrderedItem(models.Model):
"""Item in one specific Order, and its number""" """Item in one specific Order, and the number of articles"""
nb = models.PositiveSmallIntegerField(default=0) # works up to 32767 nb = models.PositiveSmallIntegerField(default=0) # works up to 32767
order = models.ForeignKey( order = models.ForeignKey(

View file

@ -26,15 +26,15 @@
<form method="post" action="{{ create_item_url }}"> <form method="post" action="{{ create_item_url }}">
{% csrf_token %} {% csrf_token %}
<td><input name="name" maxlength="100" placeholder="Nom du produit" required></input></td> <td><input name="name" maxlength="100" placeholder="Nom du produit" required></input></td>
<td><input name="price" maxlength="50" placeholder="5,40" required></input></td> <td><input name="price" size="2" placeholder="5,40" required></input></td>
<td><input name="max_limit" maxlength="50" placeholder="42"></input></td> <td><input name="max_limit" size="2" placeholder="42"></input></td>
<td><button type="submit" class="button is-primary">Ajouter</button></td> <td><button type="submit" class="button is-primary">Ajouter</button></td>
</tr> </tr>
{% for item in item_list %} {% for item in item_list %}
<tr> <tr>
<td>{{ item.name }}</td> <td>{{ item.name }}</td>
<td>{{ item.price }}</td> <td>{{ item.price }}</td>
<td>{{ item.max_limit }}</td> <td>{% if item.max_limit %}{{ item.max_limit }}{% else %}---{% endif %}</td>
<td>Supprimer (pas possible pour l'instant)</td> <td>Supprimer (pas possible pour l'instant)</td>
</tr> </tr>
{% endfor %} {% endfor %}

View file

@ -5,42 +5,84 @@
{% block content_title %}{{ grouped_order }} : commander{% endblock %} {% block content_title %}{{ grouped_order }} : commander{% endblock %}
{% block content %} {% block content %}
<p>{{ grouped_order }} <div class="box">
<p>Organisateur·ice : {{ grouped_order.orga }}</p> <div class="columns">
<p>Date de livraison : {{ grouped_order.delivery_date }}</p> <div class="column is-8">
<p>Date limite de commande : {{ grouped_order.deadline }}</p> <p class="title">{{ grouped_order }}</p>
{% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %} {% if grouped_order.description %}<p>{{ grouped_order.description }}</p>{% endif %}
{% if not user.is_authenticated %} {% if not user.is_authenticated %}
<p>Vous êtes l'organisateur·ice de cette commande groupée ? <p><span class="has-text-dark is-italic">Vous êtes l'organisateur·ice ?</span>
<a href="{% url 'order:grouped_order_overview' grouped_order.id %}"> <a href="{% url 'order:grouped_order_overview' grouped_order.id %}">
Connectez-vous pour accéder à la page de gestion</a> Connectez-vous pour accéder à la page de gestion</a>
</p> </p>
{% endif %} {% endif %}
</div>
{% if user == grouped_order.orga %} <div class="column">
<a href="{% url 'order:grouped_order_overview' grouped_order.id %}"> {% if grouped_order.place %}
Page de gestion de la comande groupée</a> <p>Lieu : {{ grouped_order.place }}</p>
{% endif %} {% endif %}
<p>Date de livraison : {{ grouped_order.delivery_date }}</p>
<p>Date limite de commande : {{ grouped_order.deadline }}</p>
{% if user == grouped_order.orga %}
<a class="button is-primary" href="{% url 'order:grouped_order_overview' grouped_order.id %}">
Gestion de la commande groupée</a>
{% else %}
<p>Organisateur·ice : {{ grouped_order.orga }}</p>
<a class="button is-light" href="mailto:{{ grouped_order.orga.username }}">Contacter l'organisateur·ice</a>
{% endif %}
</div>
</div>
</div>
<p>les produits disponibles pour cette commande groupée : </p> <div class="box">
{% if grouped_order.item_set.first %}
<ul> <p class="title">Commander</p>
<form method="post" action="{% url 'order:order' grouped_order.id %}">
<table class="table">
<thead>
<tr>
<th>Produit</th>
<th>Prix unitaire</th>
<th>Quantité</th>
<th>Total</th>
</tr>
</thead>
<tbody>
{% for item in grouped_order.item_set.all %} {% for item in grouped_order.item_set.all %}
<li> <tr>
{{ item }}
</li>
{% endfor %}
</ul>
<form action="{% url 'order:order' grouped_order.id %}" method="post">
{% csrf_token %} {% csrf_token %}
<fieldset> <td>{{ item.name }}</td>
<legend><h1>Commander</h1></legend> <td>{{ item.price }} €</td>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %} <td><input name="quantity_{{ item.id }}" size="2" value="0"></input></td>
{% for item in grouped_order.item_set.all %} <td>Total pour ce produit</td>
<input type="radio" name="item" id="item{{ forloop.counter }}" value="{{ item.id }}"> </tr>
<label for="item{{ forloop.counter }}">{{ item }}</label><br>
{% endfor %} {% endfor %}
</fieldset> </tbody>
<input type="submit" value="Order"> </table>
<br>
<p class="title">Vos informations</p>
<div class="columns">
<div class="column">
<p><label for="first_name">Prénom : </label>
<input id="first_name" type="text" name="first_name" required></p>
<p><label for="first_name">Nom : </label>
<input id="last_name" type="text" name="last_name" required></p>
</div>
<div class="column">
<p><label for="phone">Numéro de téléphone :</label>
<input id="phone" type="text" name="phone" required></p>
<p><label for="email">Adresse mail : </label>
<input id="email" type="text" name="email" required></p>
</div>
</div>
<div class="buttons">
<button type="submit" value="Order" class="button is-primary">Commander</button>
</div>
</form> </form>
{% else %}
<p>Il n'y a pas de produits disponibles dans cette commande !</p>
{% endif %}
</div>
{% endblock %} {% endblock %}

View file

@ -24,7 +24,7 @@
<ul> <ul>
{% for order in grouped_order.order_set.all %} {% for order in grouped_order.order_set.all %}
<li> <li>
{{ order }} : {{ order.ordered_items.count }} produits commandés {{ order }} : [prix total]
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>

View file

@ -5,7 +5,7 @@ from django.contrib import auth
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from la_chariotte.order.models import GroupedOrder, Item, Order from la_chariotte.order.models import GroupedOrder, Item, Order, OrderAuthor
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
@ -205,7 +205,7 @@ class TestGroupedOrderIndexView:
class TestGroupedOrderDetailView: class TestGroupedOrderDetailView:
def test_order_item(self, client, other_user): def test_order_item(self, client, other_user):
""" """
From the OrderDetailView, we order an item using the order form, and it creates an Order woth and Ordered_item inside From the OrderDetailView, we order an item using the order form, and it creates an Order with an Ordered_item inside
""" """
grouped_order = create_grouped_order( grouped_order = create_grouped_order(
days_before_delivery_date=5, days_before_delivery_date=5,
@ -214,7 +214,10 @@ class TestGroupedOrderDetailView:
orga_user=other_user, orga_user=other_user,
) )
item = Item.objects.create( item = Item.objects.create(
name="test item", grouped_order=grouped_order, price=1 name="test item 1", grouped_order=grouped_order, price=1
)
item2 = Item.objects.create(
name="test item 2", grouped_order=grouped_order, price=5
) )
detail_url = reverse( detail_url = reverse(
"order:grouped_order_detail", "order:grouped_order_detail",
@ -227,6 +230,7 @@ class TestGroupedOrderDetailView:
assert "test item" in response.content.decode() assert "test item" in response.content.decode()
assert "gr order test" in response.content.decode() assert "gr order test" in response.content.decode()
assert item.ordered_nb == 0 assert item.ordered_nb == 0
assert item2.ordered_nb == 0
order_url = reverse( order_url = reverse(
"order:order", "order:order",
kwargs={ kwargs={
@ -236,7 +240,12 @@ class TestGroupedOrderDetailView:
response = client.post( response = client.post(
order_url, order_url,
{ {
"item": item.pk, f"quantity_{item.pk}": 4,
f"quantity_{item2.pk}": 1,
"first_name": "Prénom",
"last_name": "Nom",
"phone": "0645632569",
"email": "test@mail.fr",
}, },
) )
assert response.status_code == 302 assert response.status_code == 302
@ -247,15 +256,18 @@ class TestGroupedOrderDetailView:
}, },
) )
item.refresh_from_db() item.refresh_from_db()
assert item.ordered_nb == 1 item2.refresh_from_db()
assert OrderAuthor.objects.first().first_name == "Prénom"
assert item.ordered_nb == 4
assert item2.ordered_nb == 1
order = Order.objects.first() order = Order.objects.first()
assert order.ordered_items.count() == 1 assert order.ordered_items.count() == 2
class TestGroupedOrderOrgaView: class TestGroupedOrderOverview:
def test_user_not_logged_redirect(self, client, other_user): def test_user_not_logged_redirect(self, client, other_user):
""" """
A user that is not logged cannot see the GroupedOrderOrgaView. They get redirected to the login view A user that is not logged cannot see the GroupedOrderOverview. They get redirected to the login view
""" """
grouped_order = create_grouped_order( grouped_order = create_grouped_order(
days_before_delivery_date=5, days_before_delivery_date=5,
@ -284,7 +296,7 @@ class TestGroupedOrderOrgaView:
def test_user_not_orga_redirect(self, client_log, other_user): def test_user_not_orga_redirect(self, client_log, other_user):
""" """
A user that is not orga cannot see the GroupedOrderOrgaView. A user that is not orga cannot see the GroupedOrderOverview.
They get a 403 forbidden error They get a 403 forbidden error
""" """
grouped_order = create_grouped_order( grouped_order = create_grouped_order(
@ -358,7 +370,7 @@ class TestGroupedOrderAddItemsView:
def test_get_manage_items__anonymous_user(self, client, other_user): def test_get_manage_items__anonymous_user(self, client, other_user):
""" """
A user that is not logged cannot see the GroupedOrderOrgaView. They get redirected to the login view A user that is not logged cannot see the GroupedOrderOverview. They get redirected to the login view
""" """
grouped_order = create_grouped_order( grouped_order = create_grouped_order(
days_before_delivery_date=5, days_before_delivery_date=5,

View file

@ -10,7 +10,7 @@ urlpatterns = [
), ),
path( path(
"<int:pk>/gerer", "<int:pk>/gerer",
views.GroupedOrderOrgaView.as_view(), views.GroupedOrderOverview.as_view(),
name="grouped_order_overview", name="grouped_order_overview",
), ),
path("<int:grouped_order_id>/commander/", views.order, name="order"), path("<int:grouped_order_id>/commander/", views.order, name="order"),

View file

@ -6,7 +6,7 @@ from django.utils import timezone
from django.views import generic from django.views import generic
from .forms import GroupedOrderForm, ItemCreateForm from .forms import GroupedOrderForm, ItemCreateForm
from .models import GroupedOrder, Item, Order, OrderedItem from .models import GroupedOrder, Item, Order, OrderAuthor, OrderedItem
class IndexView(LoginRequiredMixin, generic.ListView): class IndexView(LoginRequiredMixin, generic.ListView):
@ -59,7 +59,7 @@ class GroupedOrderDetailView(generic.DetailView):
context_object_name = "grouped_order" context_object_name = "grouped_order"
class GroupedOrderOrgaView(UserPassesTestMixin, generic.DetailView): class GroupedOrderOverview(UserPassesTestMixin, generic.DetailView):
"""Overview of a grouped order, for the organizer""" """Overview of a grouped order, for the organizer"""
model = GroupedOrder model = GroupedOrder
@ -124,12 +124,19 @@ class ItemCreateView(UserPassesTestMixin, generic.CreateView):
return GroupedOrder.objects.get(pk=grouped_order_id).orga == self.request.user return GroupedOrder.objects.get(pk=grouped_order_id).orga == self.request.user
def order( def order(request, grouped_order_id):
request, grouped_order_id """Creates an AnonymousUser, and an Order for this GroupedOrder, with related OrderedItems"""
): # crée une commande (order) pour cette commande groupée, avec l'item selectionné dedans
grouped_order = get_object_or_404(GroupedOrder, pk=grouped_order_id) grouped_order = get_object_or_404(GroupedOrder, pk=grouped_order_id)
try: try:
selected_item = grouped_order.item_set.get(pk=request.POST["item"]) # get a dict with (quantity_{{item_id}}:{{quantity}})
orders_dict = {
k: v for k, v in request.POST.items() if k.startswith("quantity")
}
first_name = request.POST["first_name"]
last_name = request.POST["last_name"]
phone = request.POST["phone"]
email = request.POST["email"]
# selected_item = grouped_order.item_set.get(pk=request.POST["item"])
except (KeyError, Item.DoesNotExist): except (KeyError, Item.DoesNotExist):
# Redisplay the order form for this grouped order. # Redisplay the order form for this grouped order.
return render( return render(
@ -137,14 +144,16 @@ def order(
"order/grouped_order_detail.html", "order/grouped_order_detail.html",
{ {
"grouped_order": grouped_order, "grouped_order": grouped_order,
"error_message": "You didn't select an item.", "error_message": "Veuillez remplir tous les champs",
}, },
) )
else: else:
order = Order.objects.create(author="Auteur teur", grouped_order=grouped_order) author = OrderAuthor.objects.create(first_name=first_name, last_name=last_name)
OrderedItem.objects.create(nb=1, order=order, item=selected_item) order = Order.objects.create(author=author, grouped_order=grouped_order)
compute_ordered_nb(selected_item) for k, v in orders_dict.items():
selected_item.save() item = grouped_order.item_set.get(pk=k.split("_")[1])
OrderedItem.objects.create(nb=v, order=order, item=item)
compute_ordered_nb(item)
# Always return an HttpResponseRedirect after successfully dealing # Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a # with POST data. This prevents data from being posted twice if a
# user hits the Back button. # user hits the Back button.
@ -154,7 +163,7 @@ def order(
def compute_ordered_nb(item): def compute_ordered_nb(item):
"""Calcule le nombre de produits de ce type commandés (pour cette commande groupée)""" """Computes the number of ordered articles for this item in this grouped order"""
ordered_nb = 0 ordered_nb = 0
for order in item.orders.all(): for order in item.orders.all():
ordered_nb += order.nb ordered_nb += order.nb

View file

@ -1054,12 +1054,12 @@ a.box:active {
color: #3850b7; color: #3850b7;
} }
.button.is-info { .button.is-info {
background-color: #A52951; background-color: #e9b049;
border-color: transparent; border-color: transparent;
color: #fff; color: #fff;
} }
.button.is-info:hover, .button.is-info.is-hovered { .button.is-info:hover, .button.is-info.is-hovered {
background-color: #9b264c; background-color: #e8ab3e;
border-color: transparent; border-color: transparent;
color: #fff; color: #fff;
} }
@ -1068,21 +1068,21 @@ a.box:active {
color: #fff; color: #fff;
} }
.button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) {
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25); box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
} }
.button.is-info:active, .button.is-info.is-active { .button.is-info:active, .button.is-info.is-active {
background-color: #912447; background-color: #e6a632;
border-color: transparent; border-color: transparent;
color: #fff; color: #fff;
} }
.button.is-info[disabled], fieldset[disabled] .button.is-info { .button.is-info[disabled], fieldset[disabled] .button.is-info {
background-color: #A52951; background-color: #e9b049;
border-color: #A52951; border-color: #e9b049;
box-shadow: none; box-shadow: none;
} }
.button.is-info.is-inverted { .button.is-info.is-inverted {
background-color: #fff; background-color: #fff;
color: #A52951; color: #e9b049;
} }
.button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered { .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered {
background-color: #f2f2f2; background-color: #f2f2f2;
@ -1091,32 +1091,32 @@ a.box:active {
background-color: #fff; background-color: #fff;
border-color: transparent; border-color: transparent;
box-shadow: none; box-shadow: none;
color: #A52951; color: #e9b049;
} }
.button.is-info.is-loading::after { .button.is-info.is-loading::after {
border-color: transparent transparent #fff #fff !important; border-color: transparent transparent #fff #fff !important;
} }
.button.is-info.is-outlined { .button.is-info.is-outlined {
background-color: transparent; background-color: transparent;
border-color: #A52951; border-color: #e9b049;
color: #A52951; color: #e9b049;
} }
.button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused { .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused {
background-color: #A52951; background-color: #e9b049;
border-color: #A52951; border-color: #e9b049;
color: #fff; color: #fff;
} }
.button.is-info.is-outlined.is-loading::after { .button.is-info.is-outlined.is-loading::after {
border-color: transparent transparent #A52951 #A52951 !important; border-color: transparent transparent #e9b049 #e9b049 !important;
} }
.button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after { .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after {
border-color: transparent transparent #fff #fff !important; border-color: transparent transparent #fff #fff !important;
} }
.button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined {
background-color: transparent; background-color: transparent;
border-color: #A52951; border-color: #e9b049;
box-shadow: none; box-shadow: none;
color: #A52951; color: #e9b049;
} }
.button.is-info.is-inverted.is-outlined { .button.is-info.is-inverted.is-outlined {
background-color: transparent; background-color: transparent;
@ -1125,10 +1125,10 @@ a.box:active {
} }
.button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused { .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused {
background-color: #fff; background-color: #fff;
color: #A52951; color: #e9b049;
} }
.button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after {
border-color: transparent transparent #A52951 #A52951 !important; border-color: transparent transparent #e9b049 #e9b049 !important;
} }
.button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined {
background-color: transparent; background-color: transparent;
@ -1137,18 +1137,18 @@ a.box:active {
color: #fff; color: #fff;
} }
.button.is-info.is-light { .button.is-info.is-light {
background-color: #fbeff3; background-color: #fdf7ed;
color: #cc3364; color: #845b10;
} }
.button.is-info.is-light:hover, .button.is-info.is-light.is-hovered { .button.is-info.is-light:hover, .button.is-info.is-light.is-hovered {
background-color: #f8e4eb; background-color: #fbf2e1;
border-color: transparent; border-color: transparent;
color: #cc3364; color: #845b10;
} }
.button.is-info.is-light:active, .button.is-info.is-light.is-active { .button.is-info.is-light:active, .button.is-info.is-light.is-active {
background-color: #f6dae3; background-color: #faedd6;
border-color: transparent; border-color: transparent;
color: #cc3364; color: #845b10;
} }
.button.is-success { .button.is-success {
background-color: hsl(153, 53%, 53%); background-color: hsl(153, 53%, 53%);
@ -2011,12 +2011,12 @@ div.icon-text {
color: #3850b7; color: #3850b7;
} }
.notification.is-info { .notification.is-info {
background-color: #A52951; background-color: #e9b049;
color: #fff; color: #fff;
} }
.notification.is-info.is-light { .notification.is-info.is-light {
background-color: #fbeff3; background-color: #fdf7ed;
color: #cc3364; color: #845b10;
} }
.notification.is-success { .notification.is-success {
background-color: hsl(153, 53%, 53%); background-color: hsl(153, 53%, 53%);
@ -2140,16 +2140,16 @@ div.icon-text {
background-image: linear-gradient(to right, hsl(229, 53%, 53%) 30%, hsl(0, 0%, 93%) 30%); background-image: linear-gradient(to right, hsl(229, 53%, 53%) 30%, hsl(0, 0%, 93%) 30%);
} }
.progress.is-info::-webkit-progress-value { .progress.is-info::-webkit-progress-value {
background-color: #A52951; background-color: #e9b049;
} }
.progress.is-info::-moz-progress-bar { .progress.is-info::-moz-progress-bar {
background-color: #A52951; background-color: #e9b049;
} }
.progress.is-info::-ms-fill { .progress.is-info::-ms-fill {
background-color: #A52951; background-color: #e9b049;
} }
.progress.is-info:indeterminate { .progress.is-info:indeterminate {
background-image: linear-gradient(to right, #A52951 30%, hsl(0, 0%, 93%) 30%); background-image: linear-gradient(to right, #e9b049 30%, hsl(0, 0%, 93%) 30%);
} }
.progress.is-success::-webkit-progress-value { .progress.is-success::-webkit-progress-value {
background-color: hsl(153, 53%, 53%); background-color: hsl(153, 53%, 53%);
@ -2274,8 +2274,8 @@ div.icon-text {
} }
.table td.is-info, .table td.is-info,
.table th.is-info { .table th.is-info {
background-color: #A52951; background-color: #e9b049;
border-color: #A52951; border-color: #e9b049;
color: #fff; color: #fff;
} }
.table td.is-success, .table td.is-success,
@ -2497,12 +2497,12 @@ div.icon-text {
color: #3850b7; color: #3850b7;
} }
.tag:not(body).is-info { .tag:not(body).is-info {
background-color: #A52951; background-color: #e9b049;
color: #fff; color: #fff;
} }
.tag:not(body).is-info.is-light { .tag:not(body).is-info.is-light {
background-color: #fbeff3; background-color: #fdf7ed;
color: #cc3364; color: #845b10;
} }
.tag:not(body).is-success { .tag:not(body).is-success {
background-color: hsl(153, 53%, 53%); background-color: hsl(153, 53%, 53%);
@ -2793,10 +2793,10 @@ a.tag:hover {
box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25);
} }
.is-info.textarea, .is-info.input { .is-info.textarea, .is-info.input {
border-color: #A52951; border-color: #e9b049;
} }
.is-info.textarea:focus, .is-info.input:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, .is-info.textarea:active, .is-info.input:active, .is-info.is-active.textarea, .is-info.is-active.input { .is-info.textarea:focus, .is-info.input:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, .is-info.textarea:active, .is-info.input:active, .is-info.is-active.textarea, .is-info.is-active.input {
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25); box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
} }
.is-success.textarea, .is-success.input { .is-success.textarea, .is-success.input {
border-color: hsl(153, 53%, 53%); border-color: hsl(153, 53%, 53%);
@ -3006,16 +3006,16 @@ a.tag:hover {
box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25); box-shadow: 0 0 0 0.125em rgba(72, 95, 199, 0.25);
} }
.select.is-info:not(:hover)::after { .select.is-info:not(:hover)::after {
border-color: #A52951; border-color: #e9b049;
} }
.select.is-info select { .select.is-info select {
border-color: #A52951; border-color: #e9b049;
} }
.select.is-info select:hover, .select.is-info select.is-hovered { .select.is-info select:hover, .select.is-info select.is-hovered {
border-color: #912447; border-color: #e6a632;
} }
.select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active {
box-shadow: 0 0 0 0.125em rgba(165, 41, 81, 0.25); box-shadow: 0 0 0 0.125em rgba(233, 176, 73, 0.25);
} }
.select.is-success:not(:hover)::after { .select.is-success:not(:hover)::after {
border-color: hsl(153, 53%, 53%); border-color: hsl(153, 53%, 53%);
@ -3217,22 +3217,22 @@ a.tag:hover {
color: #fff; color: #fff;
} }
.file.is-info .file-cta { .file.is-info .file-cta {
background-color: #A52951; background-color: #e9b049;
border-color: transparent; border-color: transparent;
color: #fff; color: #fff;
} }
.file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta {
background-color: #9b264c; background-color: #e8ab3e;
border-color: transparent; border-color: transparent;
color: #fff; color: #fff;
} }
.file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta {
border-color: transparent; border-color: transparent;
box-shadow: 0 0 0.5em rgba(165, 41, 81, 0.25); box-shadow: 0 0 0.5em rgba(233, 176, 73, 0.25);
color: #fff; color: #fff;
} }
.file.is-info:active .file-cta, .file.is-info.is-active .file-cta { .file.is-info:active .file-cta, .file.is-info.is-active .file-cta {
background-color: #912447; background-color: #e6a632;
border-color: transparent; border-color: transparent;
color: #fff; color: #fff;
} }
@ -3498,7 +3498,7 @@ a.tag:hover {
color: hsl(229, 53%, 53%); color: hsl(229, 53%, 53%);
} }
.help.is-info { .help.is-info {
color: #A52951; color: #e9b049;
} }
.help.is-success { .help.is-success {
color: hsl(153, 53%, 53%); color: hsl(153, 53%, 53%);
@ -4275,15 +4275,15 @@ button.dropdown-item.is-active {
color: #3850b7; color: #3850b7;
} }
.message.is-info { .message.is-info {
background-color: #fbeff3; background-color: #fdf7ed;
} }
.message.is-info .message-header { .message.is-info .message-header {
background-color: #A52951; background-color: #e9b049;
color: #fff; color: #fff;
} }
.message.is-info .message-body { .message.is-info .message-body {
border-color: #A52951; border-color: #e9b049;
color: #cc3364; color: #845b10;
} }
.message.is-success { .message.is-success {
background-color: #effaf5; background-color: #effaf5;
@ -4795,7 +4795,7 @@ button.dropdown-item.is-active {
} }
} }
.navbar.is-info { .navbar.is-info {
background-color: #A52951; background-color: #e9b049;
color: #fff; color: #fff;
} }
.navbar.is-info .navbar-brand > .navbar-item, .navbar.is-info .navbar-brand > .navbar-item,
@ -4806,7 +4806,7 @@ button.dropdown-item.is-active {
.navbar.is-info .navbar-brand .navbar-link:focus, .navbar.is-info .navbar-brand .navbar-link:focus,
.navbar.is-info .navbar-brand .navbar-link:hover, .navbar.is-info .navbar-brand .navbar-link:hover,
.navbar.is-info .navbar-brand .navbar-link.is-active { .navbar.is-info .navbar-brand .navbar-link.is-active {
background-color: #912447; background-color: #e6a632;
color: #fff; color: #fff;
} }
.navbar.is-info .navbar-brand .navbar-link::after { .navbar.is-info .navbar-brand .navbar-link::after {
@ -4832,7 +4832,7 @@ button.dropdown-item.is-active {
.navbar.is-info .navbar-end .navbar-link:focus, .navbar.is-info .navbar-end .navbar-link:focus,
.navbar.is-info .navbar-end .navbar-link:hover, .navbar.is-info .navbar-end .navbar-link:hover,
.navbar.is-info .navbar-end .navbar-link.is-active { .navbar.is-info .navbar-end .navbar-link.is-active {
background-color: #912447; background-color: #e6a632;
color: #fff; color: #fff;
} }
.navbar.is-info .navbar-start .navbar-link::after, .navbar.is-info .navbar-start .navbar-link::after,
@ -4842,11 +4842,11 @@ button.dropdown-item.is-active {
.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,
.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,
.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link {
background-color: #912447; background-color: #e6a632;
color: #fff; color: #fff;
} }
.navbar.is-info .navbar-dropdown a.navbar-item.is-active { .navbar.is-info .navbar-dropdown a.navbar-item.is-active {
background-color: #A52951; background-color: #e9b049;
color: #fff; color: #fff;
} }
} }
@ -5679,14 +5679,14 @@ a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-i
color: hsl(229, 53%, 53%); color: hsl(229, 53%, 53%);
} }
.panel.is-info .panel-heading { .panel.is-info .panel-heading {
background-color: #A52951; background-color: #e9b049;
color: #fff; color: #fff;
} }
.panel.is-info .panel-tabs a.is-active { .panel.is-info .panel-tabs a.is-active {
border-bottom-color: #A52951; border-bottom-color: #e9b049;
} }
.panel.is-info .panel-block.is-active .panel-icon { .panel.is-info .panel-block.is-active .panel-icon {
color: #A52951; color: #e9b049;
} }
.panel.is-success .panel-heading { .panel.is-success .panel-heading {
background-color: hsl(153, 53%, 53%); background-color: hsl(153, 53%, 53%);
@ -7802,39 +7802,39 @@ a.has-text-link-dark:hover, a.has-text-link-dark:focus {
} }
.has-text-info { .has-text-info {
color: #A52951 !important; color: #e9b049 !important;
} }
a.has-text-info:hover, a.has-text-info:focus { a.has-text-info:hover, a.has-text-info:focus {
color: #7c1f3d !important; color: #e49c1c !important;
} }
.has-background-info { .has-background-info {
background-color: #A52951 !important; background-color: #e9b049 !important;
} }
.has-text-info-light { .has-text-info-light {
color: #fbeff3 !important; color: #fdf7ed !important;
} }
a.has-text-info-light:hover, a.has-text-info-light:focus { a.has-text-info-light:hover, a.has-text-info-light:focus {
color: #f1c6d4 !important; color: #f7e3bf !important;
} }
.has-background-info-light { .has-background-info-light {
background-color: #fbeff3 !important; background-color: #fdf7ed !important;
} }
.has-text-info-dark { .has-text-info-dark {
color: #cc3364 !important; color: #845b10 !important;
} }
a.has-text-info-dark:hover, a.has-text-info-dark:focus { a.has-text-info-dark:hover, a.has-text-info-dark:focus {
color: #d65c83 !important; color: #b17a15 !important;
} }
.has-background-info-dark { .has-background-info-dark {
background-color: #cc3364 !important; background-color: #845b10 !important;
} }
.has-text-success { .has-text-success {
@ -9924,7 +9924,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
} }
} }
.hero.is-info { .hero.is-info {
background-color: #A52951; background-color: #e9b049;
color: #fff; color: #fff;
} }
.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),
@ -9943,7 +9943,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
} }
@media screen and (max-width: 1023px) { @media screen and (max-width: 1023px) {
.hero.is-info .navbar-menu { .hero.is-info .navbar-menu {
background-color: #A52951; background-color: #e9b049;
} }
} }
.hero.is-info .navbar-item, .hero.is-info .navbar-item,
@ -9953,7 +9953,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
.hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active,
.hero.is-info .navbar-link:hover, .hero.is-info .navbar-link:hover,
.hero.is-info .navbar-link.is-active { .hero.is-info .navbar-link.is-active {
background-color: #912447; background-color: #e6a632;
color: #fff; color: #fff;
} }
.hero.is-info .tabs a { .hero.is-info .tabs a {
@ -9964,7 +9964,7 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
opacity: 1; opacity: 1;
} }
.hero.is-info .tabs li.is-active a { .hero.is-info .tabs li.is-active a {
color: #A52951 !important; color: #e9b049 !important;
opacity: 1; opacity: 1;
} }
.hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a {
@ -9976,14 +9976,14 @@ a.has-text-danger-dark:hover, a.has-text-danger-dark:focus {
.hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover {
background-color: #fff; background-color: #fff;
border-color: #fff; border-color: #fff;
color: #A52951; color: #e9b049;
} }
.hero.is-info.is-bold { .hero.is-info.is-bold {
background-image: linear-gradient(141deg, #84174c 0%, #A52951 71%, #bf2840 100%); background-image: linear-gradient(141deg, #f07a0f 0%, #e9b049 71%, #f0d45b 100%);
} }
@media screen and (max-width: 768px) { @media screen and (max-width: 768px) {
.hero.is-info.is-bold .navbar-menu { .hero.is-info.is-bold .navbar-menu {
background-image: linear-gradient(141deg, #84174c 0%, #A52951 71%, #bf2840 100%); background-image: linear-gradient(141deg, #f07a0f 0%, #e9b049 71%, #f0d45b 100%);
} }
} }
.hero.is-success { .hero.is-success {

View file

@ -4,7 +4,7 @@ $beige: #e9b049
$bright-black: #280a13 $bright-black: #280a13
$primary: $betterave $primary: $betterave
$info: $betterave $info: $beige
$text: $bright-black $text: $bright-black
// Navbar // Navbar