diff --git a/smash/web/forms.py b/smash/web/forms.py index 514d9ac9f2a080c3908e756236e404a9b591e5eb..b86fed54e231d9dcae3672e3680fcd37e72d4375 100644 --- a/smash/web/forms.py +++ b/smash/web/forms.py @@ -3,7 +3,7 @@ from datetime import datetime from django import forms from django.forms import ModelForm, Form -from models import Subject, Worker, Appointment, Visit +from models import Subject, Worker, Appointment, Visit, AppointmentType """ Possible redundancy, but if need arises, contents of forms can be easily customized @@ -131,6 +131,8 @@ class AppointmentEditForm(ModelForm): datetime_when = forms.DateTimeField(label='Appointment on (YYYY-MM-DD HH:MM)', widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS) ) + appointment_types = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, + queryset=AppointmentType.objects.all()) def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) @@ -158,6 +160,8 @@ class AppointmentAddForm(ModelForm): datetime_when = forms.DateTimeField(label='Appointment on (YYYY-MM-DD HH:MM)', widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS) ) + appointment_types = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, + queryset=AppointmentType.objects.all()) def __init__(self, *args, **kwargs): user = kwargs.pop('user', None) @@ -186,6 +190,8 @@ class VisitDetailForm(ModelForm): ) post_mail_sent = forms.RadioSelect() + appointment_types = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, + queryset=AppointmentType.objects.all()) class Meta: model = Visit @@ -200,6 +206,8 @@ class VisitAddForm(ModelForm): datetime_end = forms.DateField(label="Visit ends on", widget=forms.TextInput(attrs=DATEPICKER_DATE_ATTRS) ) + appointment_types = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, + queryset=AppointmentType.objects.all()) class Meta: model = Visit diff --git a/smash/web/static/css/smash.css b/smash/web/static/css/smash.css new file mode 100644 index 0000000000000000000000000000000000000000..ca1d8dc0ecdbdac2987a5d6fb91b2fd4691abfb9 --- /dev/null +++ b/smash/web/static/css/smash.css @@ -0,0 +1,21 @@ +.multi-checkboxes ul { + list-style: none; + column-count: 3; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +.multi-checkboxes li { + margin: 0; + padding: 0; +} + +.flag-icon { + height: 20px; +} + +.multi-checkboxes .form-control:not(select) { + -moz-appearance: initial; + -webkit-appearance: initial; + appearance: initial; +} \ No newline at end of file diff --git a/smash/web/templates/_base.html b/smash/web/templates/_base.html index 685769f28a16609d7ec2f345e91e5ecc64703178..b39a2a395a209ff84398233c4fbdb17cdcb0a4c6 100644 --- a/smash/web/templates/_base.html +++ b/smash/web/templates/_base.html @@ -22,17 +22,14 @@ <link rel="stylesheet" href="{% static 'AdminLTE/css/skins/skin-green.min.css' %}"> - <style> - .flag-icon { - height: 20px; - } - </style> + <link rel="stylesheet" href="{% static 'css/smash.css' %}"> + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!--[if lt IE 9]> - <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> - <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> - <![endif]--> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> {% endblock styles %} </head> <!-- @@ -359,6 +356,7 @@ desired effect <!-- Default to the left --> 2017, Parkinson Research Clinic <!--(eg. <small> + <strong>Copyright © 2016 <a href="#">Company</a>.</strong> All rights reserved. </small>)--> {% endblock footer %} diff --git a/smash/web/templates/appointments/add.html b/smash/web/templates/appointments/add.html index 07b201acf2ac1faa2db151a7fe48ed68e269298d..493367200aa38eeb6caf3dcb62d8b2b6b3fac552 100644 --- a/smash/web/templates/appointments/add.html +++ b/smash/web/templates/appointments/add.html @@ -38,11 +38,10 @@ <form method="post" action="" class="form-horizontal"> {% csrf_token %} - <div class="box-body"> <div class="col-sm-6"> {% for field in form %} - <div class="form-group {% if field.errors %}has-error{% endif %}"> + <div class="form-group {% if field.errors %}has-error{% endif %} {% if field|is_checkbox %}multi-checkboxes{% endif %}"> <label class="col-sm-4 control-label"> {{ field.label }} </label> diff --git a/smash/web/templates/appointments/edit.html b/smash/web/templates/appointments/edit.html index 93ff194ab063c0799e0391d39e336babcbcb557d..eb50e3b8357f47ce2692b75f82ff31083ac6ec31 100644 --- a/smash/web/templates/appointments/edit.html +++ b/smash/web/templates/appointments/edit.html @@ -38,11 +38,10 @@ <div class="box-body"> {% for field in form %} - <div class="col-md-6 form-group {% if field.errors %}has-error{% endif %}"> + <div class="col-md-6 form-group {% if field.errors %}has-error{% endif %} {% if field|is_checkbox %}multi-checkboxes{% endif %}"> <label for="{# TODO #}" class="col-sm-4 control-label"> {{ field.label }} </label> - <div class="col-sm-8"> {{ field|add_class:'form-control' }} </div> diff --git a/smash/web/templates/visits/add.html b/smash/web/templates/visits/add.html index d82401432851415ef92cede1b3853e323e5d14f7..74a84ab4f6481ec5410cf13f54d59e151654249e 100644 --- a/smash/web/templates/visits/add.html +++ b/smash/web/templates/visits/add.html @@ -35,11 +35,10 @@ <div class="box-body"> <div class="col-sm-6"> {% for field in form %} - <div class="form-group {% if field.errors %}has-error{% endif %}"> + <div class="form-group {% if field.errors %}has-error{% endif %} {% if field|is_checkbox %}multi-checkboxes{% endif %}"> <label class="col-sm-4 control-label"> {{ field.label }} </label> - <div class="col-sm-8"> {{ field|add_class:'form-control' }} </div> diff --git a/smash/web/templates/visits/details.html b/smash/web/templates/visits/details.html index 5f4454951c9d2ec4ac1a017463343a83f37aa181..c215b15eeacf4900e2b724056eb4c7da5b39d480 100644 --- a/smash/web/templates/visits/details.html +++ b/smash/web/templates/visits/details.html @@ -41,7 +41,7 @@ {% csrf_token %} <div class="box-body"> {% for field in vform %} - <div class="col-md-6 form-group {% if field.errors %}has-error{% endif %}"> + <div class="col-md-6 form-group {% if field.errors %}has-error{% endif %} {% if field|is_checkbox %}multi-checkboxes{% endif %}"> <label for="{# TODO #}" class="col-sm-4 control-label"> {{ field.label }} </label> diff --git a/smash/web/templatetags/filters.py b/smash/web/templatetags/filters.py index 2df497f0ddaaefa14b4fcc94294fdee4913176b1..bcab430706abbc5c1d8240a276837b4b0cbc068a 100644 --- a/smash/web/templatetags/filters.py +++ b/smash/web/templatetags/filters.py @@ -1,5 +1,6 @@ # See: http://stackoverflow.com/a/18962481 from django import template +from django.forms import CheckboxSelectMultiple register = template.Library() @@ -7,6 +8,8 @@ register = template.Library() @register.filter(name='add_class') def add_class(value, arg): # Get all the field's initial css-classes + if isinstance(value.field.widget, CheckboxSelectMultiple): + return value css_classes = value.field.widget.attrs.get('class', ' ').split(' ') # Filter out zero-length class names ('') css_classes = filter(lambda x: len(x) > 0, css_classes) @@ -21,3 +24,8 @@ def add_class(value, arg): def disable(value): value.field.widget.attrs['disabled'] = 'disabled' return value + + +@register.filter(name='is_checkbox') +def is_checkbox(value): + return isinstance(value.field.widget, CheckboxSelectMultiple)