Moved color themes CSS sheets to own folder, nicer crispy form for selecting theme

This commit is contained in:
eeintech 2020-09-08 16:24:22 -05:00
parent 8e2d568a42
commit 896fa131f0
9 changed files with 2870 additions and 808 deletions

View File

@ -9,7 +9,7 @@ from django.utils.translation import ugettext as _
from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field
from crispy_forms.bootstrap import PrependedText, AppendedText, PrependedAppendedText, StrictButton
from crispy_forms.bootstrap import PrependedText, AppendedText, PrependedAppendedText, StrictButton, Div
from django.contrib.auth.models import User
from common.models import ColorTheme
@ -165,8 +165,7 @@ class SetPasswordForm(HelperForm):
class ColorThemeSelectForm(forms.ModelForm):
""" Form for setting color theme
"""
""" Form for setting color theme """
class Meta:
model = ColorTheme
@ -179,8 +178,14 @@ class ColorThemeSelectForm(forms.ModelForm):
self.helper = FormHelper()
# Form rendering
self.helper.form_show_labels = False
self.helper.form_class = 'form-inline'
self.helper.layout = Layout(
Field('name'),
StrictButton(_('Apply Theme'), css_class='btn btn-primary', type='submit')
Div(
Div(Field('name'),
css_class='col-sm-6',
style='width: 200px;'),
Div(StrictButton(_('Apply Theme'), css_class='btn btn-primary', type='submit'),
css_class='col-sm-6',
style='width: auto;'),
css_class='row',
),
)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,42 @@
/* Color Theme: "Darker" by Radek Hladik */
.navbar-nav > li {
border-color: rgb(179, 179, 179);
}
.navbar-nav > li > a {
color:#0b2a62 !important;
}
.navbar-nav > li > a:hover {
color:#202020 !important;
}
.navbar-nav > .open > a {
color:#202020 !important;
}
.navbar {
background-color: rgb(189, 189, 189);
}
.table-condensed > tbody > tr > td {
border-top: 1px solid #062152 !important ;
}
.table-striped > tbody > tr > td {
border-top: 1px solid #92b3f1 ;
}
.table-bordered, .table-bordered > tbody > tr > td {
border: 1px solid rgb(182,182,182);
}
.table-bordered > thead > tr > th {
border: 1px solid rgb(182, 182, 182);
background-color: rgb(235, 235, 235);
}
h3 {
color:#06255d;
}

View File

@ -0,0 +1 @@
/* Color Theme: "Default" */

View File

@ -1,785 +0,0 @@
:root {
--primary-color: #335d88;
--secondary-color: #b69c80;
--highlight-color: #f5efe8;
--basic-color: #333;
--label-red: #e35a57;
--label-blue: #4194bd;
--label-green: #50aa51;
--label-grey: #aaa;
--label-yellow: #fdc82a;
}
.markdownx .row {
margin: 5px;
padding: 5px;
border: 1px solid #cce;
border-radius: 4px;
}
.markdownx-editor {
width: 100%;
border: 1px solid #cce;
border-radius: 3px;
padding: 10px;
}
.panel-content {
padding: 10px;
}
.markdownx-preview {
border: 1px solid #cce;
border-radius: 3px;
padding: 10px;
}
/* Progress bars */
.progress {
position: relative;
width: 100%;
margin-bottom: 0px;
background: #eeeef5;
}
.progress-bar {
opacity: 60%;
background: #2aa02a;
}
.progress-bar-under {
background: #eeaa33;
}
.progress-bar-over {
background: #337ab7;
}
.progress-value {
width: 100%;
color: #333;
position: absolute;
text-align: center;
top: 0px;
left: 0px;
font-size: 110%;
}
.qr-code {
max-width: 400px;
max-height: 400px;
align-content: center;
}
.qr-container {
width: 100%;
align-content: center;
}
.navbar-brand {
float: left;
}
.navbar-barcode-li {
border-left: none;
border-right: none;
}
.navbar-nav > li {
border-left: 1px solid;
border-right: 1px solid;
border-color: rgb(179, 179, 179);
}
.navbar-nav > li > a {
color:#0b2a62 !important;
}
.navbar-nav > li > a:hover {
color:#202020 !important;
}
.navbar-nav > .open > a {
color:#202020 !important;
}
.navbar-form {
padding-right: 3px;
}
.navbar {
background-color: rgb(189, 189, 189);
}
.table-condensed > tbody > tr > td {
border-top: 1px solid #062152 !important ;
}
.table-striped > tbody > tr > td {
border-top: 1px solid #92b3f1 ;
}
.table-bordered, .table-bordered > tbody > tr > td {
border: 1px solid rgb(182,182,182);
}
.table-bordered > thead > tr > th {
border: 1px solid rgb(182, 182, 182);
background-color: rgb(235, 235, 235);
}
h3 {
color:#06255d;
}
#barcode-scan {
margin-top: 8px;
}
.icon-header {
margin-right: 10px;
}
.glyphicon {
font-size: 18px;
}
.glyphicon-small {
font-size: 12px;
}
.glyphicon-right {
float: right;
}
.starred-part {
color: #ffbb00;
}
.red-cell {
background-color: #ec7f7f;
}
.part-price {
color: rgb(13, 245, 25);
}
.icon-red {
color: #c55;
}
.icon-green {
color: #43bb43;
}
.icon-blue {
color: #55c;
}
.icon-yellow {
color: #CC2;
}
/* CSS overrides for treeview */
.expand-icon {
font-size: 11px;
}
.treeview .badge {
font-size: 10px;
}
.treeview .list-group-item {
padding: 6px 12px;
}
.list-group-item-condensed {
padding: 5px 10px;
}
/* Extra label styles */
.label-large {
margin: 3px;
font-size: 100%;
border: 3px solid;
border-radius: 15px;
background: none;
padding-right: 10px;
padding-left: 10px;
padding-top: 5px;
padding-bottom: 5px;
}
.label-large-red {
color: var(--label-red);
border-color: var(--label-red);
}
.label-red {
background: var(--label-red);
}
.label-large-blue {
color: var(--label-blue);
border-color: var(--label-blue);
}
.label-blue {
background: var(--label-blue);
}
.label-large-green {
color: var(--label-green);
border-color: var(--label-green);
}
.label-green {
background: var(--label-green);
}
.label-large-grey {
color: var(--label-grey);
border-color: var(--label-grey);
}
.label-grey {
background: var(--label-grey);
}
.label-large-yellow {
color: var(--label-yellow);
border-color: var(--label-yellow);
}
.label-yellow {
background: var(--label-yellow);
}
.label-right {
float: right;
margin-left: 3px;
margin-right: 3px;
}
/* Bootstrap table overrides */
.stock-sub-group td {
background-color: #ebf4f4;
}
.sub-table {
margin-left: 45px;
margin-right: 45px;
}
.detail-icon .glyphicon {
color: #98d296;
}
/* Force select2 elements in modal forms to be full width */
.select-full-width {
width: 100%;
}
.basecurrency {
color: #050;
font-style: italic;
font-weight: bold;
}
.bomselect {
max-width: 250px;
}
.rowvalid {
color: #050;
}
.rowinvalid {
color: #A00;
font-style: italic;
}
.dropdown {
padding-left: 1px;
margin-left: 1px;
}
.dropdown-buttons {
display: inline-block
}
.dropdown-menu .open{
z-index: 1000;
position: relative;
overflow: visible;
}
/* Styles for table buttons and filtering */
.button-toolbar .btn {
margin-left: 1px;
margin-right: 1px;
}
.filter-list {
display: inline-block;
*display: inline;
margin-bottom: 1px;
margin-top: 1px;
vertical-align: middle;
margin: 1px;
padding: 2px;
background: #eee;
border: 1px solid #eee;
border-radius: 3px;
}
.filter-list .close {
cursor: pointer;
right: 0%;
padding-right: 2px;
padding-left: 2px;
transform: translate(0%, -25%);
}
.filter-list .close:hover {background: #bbb;}
.filter-tag {
display: inline-block;
*display: inline;
zoom: 1;
padding-left: 3px;
padding-right: 3px;
padding-top: 2px;
padding-bottom: 2px;
border: 1px solid #aaa;
border-radius: 3px;
background: #eee;
margin: 1px;
margin-left: 5px;
margin-right: 5px;
}
.filter-input {
display: inline-block;
*display: inline;
zoom: 1;
}
.filter-tag:hover {
background: #ddd;
}
/* Part image icons with full-display on mouse hover */
.hover-img-thumb {
background: #eee;
width: 28px;
height: 28px;
object-fit: contain;
border: 1px solid #cce;
}
.hover-img-large {
background: #eee;
display: none;
position: absolute;
z-index: 400;
border: 1px solid #555;
max-width: 250px;
}
.hover-icon {
margin-right: 10px;
}
.hover-icon:hover > .hover-img-large {
display: block;
}
/* dropzone class - for Drag-n-Drop file uploads */
.dropzone {
z-index: 2;
}
/*
.dropzone * {
pointer-events: none;
}
*/
.dragover {
background-color: #55A;
border: 1px dashed #111;
opacity: 0.1;
-moz-opacity: 10%;
-webkit-opacity: 10%;
}
/* grid display for part images */
.table-img-grid tr {
display: inline;
}
.table-img-grid td {
padding: 10px;
margin: 10px;
}
.table-img-grid .grid-image {
height: 128px;
width: 128px;
object-fit: contain;
background: #eee;
}
.btn-glyph {
padding-left: 6px;
padding-right: 6px;
padding-top: 3px;
padding-bottom: 2px;
}
.action-button {
font-size: 125%;
}
.action-buttons .btn {
font-size: 175%;
align-content: center;
vertical-align: middle;
padding-left: 6px;
padding-right: 6px;
padding-top: 3px;
padding-bottom: 2px;
};
.panel-heading .badge {
float: right;
}
.badge {
float: right;
background-color: #777;
color: #fff;
border-radius: 5px;
margin-left: 10px;
}
.badge-alert {
background-color: #f33;
}
.part-thumb {
width: 200px;
height: 200px;
margin: 2px;
padding: 3px;
object-fit: contain;
border: 1px solid #aaa;
border-radius: 3px;
}
.part-thumb-container:hover .part-thumb-overlay {
opacity: 1;
}
.part-thumb-overlay {
position: absolute;
top: 0;
left: 0;
opacity: 0;
transition: .25s ease;
padding: 15px;
margin: 5px;
}
.checkbox {
margin-left: 20px;
}
.checkboxinput {
padding-left: 5px;
padding-right: 5px;
}
.media {
padding-top: 15px;
}
.media-body {
padding-top: 10px;
overflow: visible;
}
.navigation {
}
.nav-tabs {
margin-bottom: 20px;
}
.settings-container {
width: 90%;
padding: 15px;
}
.settings-nav {
height: 100%;
width: 160px;
position: fixed;
z-index: 1;
//top: 0;
//left: 0;
overflow-x: hidden;
padding-top: 20px;
padding-right: 25px;
}
.settings-content {
margin-left: 175px;
padding: 0px 10px;
}
.breadcrump {
margin-bottom: 5px;
}
.inventree-body {
width: 100%;
padding: 5px;
margin: 10px;
}
.inventree-pre-content {
width: 100%;
clear: both;
}
.inventree-content {
padding-left: 5px;
padding-right: 5px;
padding-top: 5px;
width: auto;
transition: 0.1s;
}
.body {
padding-top: 70px;
}
.modal {
overflow: hidden;
z-index: 9999;
}
.modal-primary {
z-index: 10000;
}
.modal-secondary {
z-index: 11000;
}
.js-modal-form .checkbox {
margin-left: 0px;
}
.modal-dialog {
width: 60%;
}
.modal-secondary .modal-dialog {
width: 40%;
padding-top: 15px;
}
.modal-content h3 {
margin-top: 3px;
margin-bottom: 3px;
}
.modal-form-content {
border-radius: 0;
position:relative;
height: auto !important;
max-height: calc(100vh - 200px) !important;
overflow-y: scroll;
padding: 10px;
}
.modal input {
width: 100%;
}
input[type="submit"] {
color: #333;
background-color: #e6e6e6;
border-color: #adadad;
}
.modal textarea {
width: 100%;
}
/* Force a control-label div to be 100% width */
.modal .control-label {
width: 100%;
margin-top: 5px;
}
.modal .control-label .btn {
padding-top: 3px;
padding-bottom: 3px;
}
.modal .btn-secondary {
background-color: #5e7d87;
}
/* The side navigation menu */
.sidenav {
height: 100%; /* 100% Full-height */
width: 0px; /* 0 width - change this with JavaScript */
position: fixed; /* Stay in place */
background-color: #fff; /* Black*/
overflow-x: hidden; /* Disable horizontal scroll */
transition: 0.1s; /* 0.5 second transition effect to slide in the sidenav */
}
.wrapper {
align-items: stretch;
display: flex;
}
.help-inline {
color: #A11;
}
.notification-area {
position: fixed;
top: 0px;
margin-top: 20px;
width: 100%;
padding: 20px;
z-index: 5000;
pointer-events: none; // Prevent this div from blocking links underneath
}
.alert {
display: none;
border-radius: 5px;
opacity: 0.9;
pointer-events: all;
}
.alert-block {
display: block;
}
.btn {
margin-left: 2px;
margin-right: 2px;
}
.btn-remove {
padding: 3px;
padding-left: 5px;
padding-right: 5px;
color: #A11;
}
.btn-create {
padding: 3px;
padding-left: 5px;
padding-right: 5px;
color: #1A1;
}
.btn-edit {
padding: 3px;
padding: 3px;
padding-left: 5px;
padding-right: 5px;
color: #55E;
}
.button-toolbar {
padding-left: 0px;
}
.panel-group {
margin-bottom: 5px;
}
.panel-body {
padding: 10px;
}
.panel-group .panel {
border-radius: 2px;
}
.panel-heading {
padding: 5px 10px;
background-color: #fafafa;
}
.float-right {
float: right;
}
.warning-msg {
color: #e00;
}
.login {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.part-allocation {
padding: 3px 10px;
border: 1px solid #ccc;
border-radius: 2px;
}
.part-allocation-pass {
background-color: #dbf0db;
}
.part-allocation-underallocated {
background-color: #f0dbdb;
}
.part-allocation-overallocated {
background-color: #ccf5ff;
}
.glyphicon-refresh-animate {
-animation: spin .7s infinite linear;
-webkit-animation: spin2 .7s infinite linear;
}
@-webkit-keyframes spin2 {
from { -webkit-transform: rotate(0deg);}
to { -webkit-transform: rotate(360deg);}
}
@keyframes spin {
from { transform: scale(1) rotate(0deg);}
to { transform: scale(1) rotate(360deg);}
}

View File

@ -157,11 +157,12 @@ class Currency(models.Model):
class ColorTheme(models.Model):
""" Color Theme setting """
""" Color Theme Setting """
class ColorThemeChoices(models.TextChoices):
DEFAULT = '', _('Default')
DARKER = '-darker', _('Darker')
DARKER = 'darker', _('Darker')
DARK_READER = 'dark-reader', _('Dark Reader')
name = models.CharField(max_length=20,
choices=ColorThemeChoices.choices,

View File

@ -1,6 +1,7 @@
""" This module provides template tags for extra functionality
over and above the built-in Django tags.
"""
import os
from django import template
from InvenTree import version, settings
@ -91,9 +92,18 @@ def inventree_setting(key, *args, **kwargs):
@register.simple_tag()
def get_theme_css(username):
def get_color_theme_css(username):
try:
user_theme = ColorTheme.objects.filter(user=username).get().name
if not user_theme:
user_theme = 'default'
except ColorTheme.DoesNotExist:
user_theme = ''
return f'{settings.STATIC_URL}css/inventree' + user_theme + '.css'
user_theme = 'default'
# Build path to CSS sheet
inventree_css_sheet = os.path.join('css', 'color-themes', user_theme + '.css')
# Build static URL
inventree_css_static_url = os.path.join(settings.STATIC_URL, inventree_css_sheet)
return inventree_css_static_url

View File

@ -14,16 +14,10 @@
</div>
</div>
<div class='row'>
<div class='col-sm-6'>
<div style='float: left;'>
<form action="{% url 'settings-theme' %}" method="post">
{% csrf_token %}
{% load crispy_forms_tags %}
{% crispy form %}
</form>
</div>
</div>
</div>
<form action="{% url 'settings-theme' %}" method="post">
{% csrf_token %}
{% load crispy_forms_tags %}
{% crispy form %}
</form>
{% endblock %}

View File

@ -39,7 +39,8 @@
<link rel="stylesheet" href="{% static 'css/select2.css' %}">
<link rel="stylesheet" href="{% static 'css/select2-bootstrap.css' %}">
<link rel="stylesheet" href="{% static 'css/bootstrap-toggle.css' %}">
<link rel="stylesheet" href="{% get_theme_css user.get_username %}">
<link rel="stylesheet" href="{% static 'css/inventree.css' %}">
<link rel="stylesheet" href="{% get_color_theme_css user.get_username %}">
{% block css %}
{% endblock %}