This commit is contained in:
Victor Alexandrovich Tsyrenschikov
2025-09-15 23:54:59 +05:00
parent 41f6699da9
commit 42ed1b04cb
69 changed files with 5614 additions and 0 deletions

0
apps/charts/__init__.py Normal file
View File

3
apps/charts/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
apps/charts/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ChartsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.charts'

View File

3
apps/charts/models.py Normal file
View File

@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

3
apps/charts/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

7
apps/charts/urls.py Normal file
View File

@@ -0,0 +1,7 @@
from django.urls import path
from apps.charts import views
urlpatterns = [
path("", views.index, name="charts"),
]

13
apps/charts/views.py Normal file
View File

@@ -0,0 +1,13 @@
from django.shortcuts import render
from django.core import serializers
from apps.pages.models import *
# Create your views here.
def index(request):
products = serializers.serialize('json', Product.objects.all())
context = {
'segment': 'charts',
'products': products
}
return render(request, 'charts/index.html', context)

5
apps/dyn_api/__init__.py Normal file
View File

@@ -0,0 +1,5 @@
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""

8
apps/dyn_api/admin.py Normal file
View File

@@ -0,0 +1,8 @@
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""
from django.contrib import admin
# Register your models here.

10
apps/dyn_api/apps.py Normal file
View File

@@ -0,0 +1,10 @@
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""
from django.apps import AppConfig
class DynApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.dyn_api'

63
apps/dyn_api/helpers.py Normal file
View File

@@ -0,0 +1,63 @@
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""
import datetime, sys, inspect, importlib
from functools import wraps
from django.db import models
from django.http import HttpResponseRedirect, HttpResponse
from rest_framework import serializers
class Utils:
@staticmethod
def get_class(config, name: str) -> models.Model:
return Utils.model_name_to_class(config[name])
@staticmethod
def get_manager(config, name: str) -> models.Manager:
return Utils.get_class(config, name).objects
@staticmethod
def get_serializer(config, name: str):
class Serializer(serializers.ModelSerializer):
class Meta:
model = Utils.get_class(config, name)
fields = '__all__'
return Serializer
@staticmethod
def model_name_to_class(name: str):
model_name = name.split('.')[-1]
model_import = name.replace('.'+model_name, '')
module = importlib.import_module(model_import)
cls = getattr(module, model_name)
return cls
def check_permission(function):
@wraps(function)
def wrap(viewRequest, *args, **kwargs):
try:
# Check user
if viewRequest.request.user.is_authenticated:
return function(viewRequest, *args, **kwargs)
# For authentication for guests
return HttpResponseRedirect('/login/')
except Exception as e:
# On error
return HttpResponse( 'Error: ' + str( e ) )
return wrap

View File

8
apps/dyn_api/tests.py Normal file
View File

@@ -0,0 +1,8 @@
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""
from django.test import TestCase
# Create your tests here.

16
apps/dyn_api/urls.py Normal file
View File

@@ -0,0 +1,16 @@
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""
from django.contrib import admin
from django.urls import path
from apps.dyn_api import views
urlpatterns = [
path('api/', views.index, name="dynamic_api"),
path('api/<str:model_name>/' , views.DynamicAPI.as_view(), name="model_api"),
path('api/<str:model_name>/<str:id>' , views.DynamicAPI.as_view()),
path('api/<str:model_name>/<str:id>/' , views.DynamicAPI.as_view()),
]

155
apps/dyn_api/views.py Normal file
View File

@@ -0,0 +1,155 @@
# -*- encoding: utf-8 -*-
"""
Copyright (c) 2019 - present AppSeed.us
"""
from django.http import Http404
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.shortcuts import render, redirect, get_object_or_404
from rest_framework.generics import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from django.http import HttpResponse
from django.conf import settings
DYNAMIC_API = {}
try:
DYNAMIC_API = getattr(settings, 'DYNAMIC_API')
except:
pass
from .helpers import Utils
def index(request):
context = {
'routes' : settings.DYNAMIC_API.keys(),
'segment': 'dynamic_api'
}
return render(request, 'dyn_api/index.html', context)
class DynamicAPI(APIView):
# READ : GET api/model/id or api/model
def get(self, request, **kwargs):
model_id = kwargs.get('id', None)
try:
if model_id is not None:
# Validate for integer
try:
model_id = int(model_id)
if model_id < 0:
raise ValueError('Expect positive int')
except ValueError as e:
return Response(data={
'message': 'Input Error = ' + str(e),
'success': False
}, status=400)
thing = get_object_or_404(Utils.get_manager(DYNAMIC_API, kwargs.get('model_name')), id=model_id)
model_serializer = Utils.get_serializer(DYNAMIC_API, kwargs.get('model_name'))(instance=thing)
output = model_serializer.data
else:
all_things = Utils.get_manager(DYNAMIC_API, kwargs.get('model_name')).all()
thing_serializer = Utils.get_serializer(DYNAMIC_API, kwargs.get('model_name'))
output = []
for thing in all_things:
output.append(thing_serializer(instance=thing).data)
except KeyError:
return Response(data={
'message': 'this model is not activated or not exist.',
'success': False
}, status=400)
except Http404:
return Response(data={
'message': 'object with given id not found.',
'success': False
}, status=404)
return Response(data={
'data': output,
'success': True
}, status=200)
# CREATE : POST api/model/
#@check_permission
def post(self, request, **kwargs):
try:
model_serializer = Utils.get_serializer(DYNAMIC_API, kwargs.get('model_name'))(data=request.data)
if model_serializer.is_valid():
model_serializer.save()
else:
return Response(data={
**model_serializer.errors,
'success': False
}, status=400)
except KeyError:
return Response(data={
'message': 'this model is not activated or not exist.',
'success': False
}, status=400)
return Response(data={
'message': 'Record Created.',
'success': True
}, status=200)
# UPDATE : PUT api/model/id/
#@check_permission
def put(self, request, **kwargs):
try:
thing = get_object_or_404(Utils.get_manager(DYNAMIC_API, kwargs.get('model_name')), id=kwargs.get('id'))
model_serializer = Utils.get_serializer(DYNAMIC_API, kwargs.get('model_name'))(instance=thing,
data=request.data,
partial=True)
if model_serializer.is_valid():
model_serializer.save()
else:
return Response(data={
**model_serializer.errors,
'success': False
}, status=400)
except KeyError:
return Response(data={
'message': 'this model is not activated or not exist.',
'success': False
}, status=400)
except Http404:
return Response(data={
'message': 'object with given id not found.',
'success': False
}, status=404)
return Response(data={
'message': 'Record Updated.',
'success': True
}, status=200)
# DELETE : DELETE api/model/id/
#@check_permission
def delete(self, request, **kwargs):
try:
model_manager = Utils.get_manager(DYNAMIC_API, kwargs.get('model_name'))
to_delete_id = kwargs.get('id')
model_manager.get(id=to_delete_id).delete()
except KeyError:
return Response(data={
'message': 'this model is not activated or not exist.',
'success': False
}, status=400)
except Utils.get_class(DYNAMIC_API, kwargs.get('model_name')).DoesNotExist as e:
return Response(data={
'message': 'object with given id not found.',
'success': False
}, status=404)
return Response(data={
'message': 'Record Deleted.',
'success': True
}, status=200)

0
apps/dyn_dt/.gitkeep Normal file
View File

0
apps/dyn_dt/__init__.py Normal file
View File

8
apps/dyn_dt/admin.py Normal file
View File

@@ -0,0 +1,8 @@
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(PageItems)
admin.site.register(HideShowFilter)
admin.site.register(ModelFilter)

5
apps/dyn_dt/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class DynDtConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.dyn_dt'

3
apps/dyn_dt/forms.py Normal file
View File

@@ -0,0 +1,3 @@
from django import forms
# Create your forms here.

View File

@@ -0,0 +1,63 @@
# Generated by Django 4.2.9 on 2025-03-30 11:44
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []
operations = [
migrations.CreateModel(
name="HideShowFilter",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("parent", models.CharField(blank=True, max_length=255, null=True)),
("key", models.CharField(max_length=255)),
("value", models.BooleanField(default=False)),
],
),
migrations.CreateModel(
name="ModelFilter",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("parent", models.CharField(blank=True, max_length=255, null=True)),
("key", models.CharField(max_length=255)),
("value", models.CharField(max_length=255)),
],
),
migrations.CreateModel(
name="PageItems",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("parent", models.CharField(blank=True, max_length=255, null=True)),
("items_per_page", models.IntegerField(default=25)),
],
),
]

View File

24
apps/dyn_dt/models.py Normal file
View File

@@ -0,0 +1,24 @@
from django.db import models
from django.utils.translation import gettext_lazy as _
# Create your models here.
class PageItems(models.Model):
parent = models.CharField(max_length=255, null=True, blank=True)
items_per_page = models.IntegerField(default=25)
class HideShowFilter(models.Model):
parent = models.CharField(max_length=255, null=True, blank=True)
key = models.CharField(max_length=255)
value = models.BooleanField(default=False)
def __str__(self):
return self.key
class ModelFilter(models.Model):
parent = models.CharField(max_length=255, null=True, blank=True)
key = models.CharField(max_length=255)
value = models.CharField(max_length=255)
def __str__(self):
return self.key

View File

View File

@@ -0,0 +1,22 @@
from django import template
from datetime import datetime
register = template.Library()
@register.filter(name="getattribute")
def getattribute(value, arg):
try:
attr_value = getattr(value, arg)
if isinstance(attr_value, datetime):
return attr_value.strftime("%Y-%m-%d %H:%M:%S")
return attr_value
except:
return ''
@register.filter
def get(dict_data, key):
return dict_data.get(key, [])

3
apps/dyn_dt/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

18
apps/dyn_dt/urls.py Normal file
View File

@@ -0,0 +1,18 @@
from django.urls import path
from apps.dyn_dt import views
urlpatterns = [
path('dynamic-dt/', views.index, name="dynamic_dt"),
path('create-filter/<str:model_name>/', views.create_filter, name="create_filter"),
path('create-page-items/<str:model_name>/', views.create_page_items, name="create_page_items"),
path('create-hide-show-items/<str:model_name>/', views.create_hide_show_filter, name="create_hide_show_filter"),
path('delete-filter/<str:model_name>/<int:id>/', views.delete_filter, name="delete_filter"),
path('create/<str:aPath>/', views.create, name="create"),
path('delete/<str:aPath>/<int:id>/', views.delete, name="delete"),
path('update/<str:aPath>/<int:id>/', views.update, name="update"),
path('export-csv/<str:aPath>/', views.ExportCSVView.as_view(), name='export_csv'),
path('dynamic-dt/<str:aPath>/', views.model_dt, name="model_dt"),
]

13
apps/dyn_dt/utils.py Normal file
View File

@@ -0,0 +1,13 @@
from django.db.models import Q
def user_filter(request, queryset, fields, fk_fields=[]):
value = request.GET.get('search')
if value:
dynamic_q = Q()
for field in fields:
if field not in fk_fields:
dynamic_q |= Q(**{f'{field}__icontains': value})
return queryset.filter(dynamic_q)
return queryset

315
apps/dyn_dt/views.py Normal file
View File

@@ -0,0 +1,315 @@
import requests, base64, json, csv
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.utils import timezone
from django.http import HttpResponse, JsonResponse
from django.utils.safestring import mark_safe
from django.conf import settings
from django.urls import reverse
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.urls import reverse
from django.views import View
from django.db import models
from pprint import pp
from apps.dyn_dt.models import ModelFilter, PageItems, HideShowFilter
from apps.dyn_dt.utils import user_filter
from cli import *
# Create your views here.
def index(request):
context = {
'routes' : settings.DYNAMIC_DATATB.keys(),
'segment': 'dynamic_dt'
}
return render(request, 'dyn_dt/index.html', context)
def create_filter(request, model_name):
model_name = model_name.lower()
if request.method == "POST":
keys = request.POST.getlist('key')
values = request.POST.getlist('value')
for i in range(len(keys)):
key = keys[i]
value = values[i]
ModelFilter.objects.update_or_create(
parent=model_name,
key=key,
defaults={'value': value}
)
return redirect(reverse('model_dt', args=[model_name]))
def create_page_items(request, model_name):
model_name = model_name.lower()
if request.method == 'POST':
items = request.POST.get('items')
page_items, created = PageItems.objects.update_or_create(
parent=model_name,
defaults={'items_per_page':items}
)
return redirect(reverse('model_dt', args=[model_name]))
def create_hide_show_filter(request, model_name):
model_name = model_name.lower()
if request.method == "POST":
data_str = list(request.POST.keys())[0]
data = json.loads(data_str)
HideShowFilter.objects.update_or_create(
parent=model_name,
key=data.get('key'),
defaults={'value': data.get('value')}
)
response_data = {'message': 'Model updated successfully'}
return JsonResponse(response_data)
return JsonResponse({'error': 'Invalid request'}, status=400)
def delete_filter(request, model_name, id):
model_name = model_name.lower()
filter_instance = ModelFilter.objects.get(id=id, parent=model_name)
filter_instance.delete()
return redirect(reverse('model_dt', args=[model_name]))
def get_model_field_names(model, field_type):
"""Returns a list of field names based on the given field type."""
return [
field.name for field in model._meta.get_fields()
if isinstance(field, field_type)
]
def model_dt(request, aPath):
aModelName = None
aModelClass = None
choices_dict = {}
if aPath in settings.DYNAMIC_DATATB.keys():
aModelName = settings.DYNAMIC_DATATB[aPath]
aModelClass = name_to_class(aModelName)
if not aModelClass:
return HttpResponse( ' > ERR: Getting ModelClass for path: ' + aPath )
#db_fields = [field.name for field in aModelClass._meta.get_fields() if not field.is_relation]
db_fields = [field.name for field in aModelClass._meta.fields]
fk_fields = get_model_fk_values(aModelClass)
db_filters = []
for f in db_fields:
if f not in fk_fields.keys():
db_filters.append( f )
for field in aModelClass._meta.fields:
if field.choices:
choices_dict[field.name] = field.choices
field_names = []
for field_name in db_fields:
fields, created = HideShowFilter.objects.get_or_create(key=field_name, parent=aPath.lower())
if fields.key in db_fields:
field_names.append(fields)
model_series = {}
for f in db_fields:
f_values = list ( aModelClass.objects.values_list( f, flat=True) )
model_series[ f ] = ', '.join( str(i) for i in f_values)
# model filter
filter_string = {}
filter_instance = ModelFilter.objects.filter(parent=aPath.lower())
for filter_data in filter_instance:
if filter_data.key in db_fields:
filter_string[f'{filter_data.key}__icontains'] = filter_data.value
order_by = request.GET.get('order_by', 'id')
if order_by not in db_fields:
order_by = 'id'
queryset = aModelClass.objects.filter(**filter_string).order_by(order_by)
item_list = user_filter(request, queryset, db_fields, fk_fields.keys())
# pagination
page_items = PageItems.objects.filter(parent=aPath.lower()).last()
p_items = 25
if page_items:
p_items = page_items.items_per_page
page = request.GET.get('page', 1)
paginator = Paginator(item_list, p_items)
try:
items = paginator.page(page)
except PageNotAnInteger:
return redirect(reverse('model_dt', args=[aPath]))
except EmptyPage:
return redirect(reverse('model_dt', args=[aPath]))
read_only_fields = ('id', )
integer_fields = get_model_field_names(aModelClass, models.IntegerField)
date_time_fields = get_model_field_names(aModelClass, models.DateTimeField)
email_fields = get_model_field_names(aModelClass, models.EmailField)
text_fields = get_model_field_names(aModelClass, (models.TextField, models.CharField))
context = {
'page_title': 'Dynamic DataTable - ' + aPath.lower().title(),
'link': aPath,
'field_names': field_names,
'db_field_names': db_fields,
'db_filters': db_filters,
'items': items,
'page_items': p_items,
'filter_instance': filter_instance,
'read_only_fields': read_only_fields,
'integer_fields': integer_fields,
'date_time_fields': date_time_fields,
'email_fields': email_fields,
'text_fields': text_fields,
'fk_fields_keys': list( fk_fields.keys() ),
'fk_fields': fk_fields ,
'choices_dict': choices_dict,
'segment': 'dynamic_dt'
}
return render(request, 'dyn_dt/model.html', context)
@login_required(login_url='/accounts/login/')
def create(request, aPath):
aModelClass = None
if aPath in settings.DYNAMIC_DATATB.keys():
aModelName = settings.DYNAMIC_DATATB[aPath]
aModelClass = name_to_class(aModelName)
if not aModelClass:
return HttpResponse( ' > ERR: Getting ModelClass for path: ' + aPath )
if request.method == 'POST':
data = {}
fk_fields = get_model_fk(aModelClass)
for attribute, value in request.POST.items():
if attribute == 'csrfmiddlewaretoken':
continue
# Process FKs
if attribute in fk_fields.keys():
value = name_to_class( fk_fields[attribute] ).objects.filter(id=value).first()
data[attribute] = value if value else ''
aModelClass.objects.create(**data)
return redirect(request.META.get('HTTP_REFERER'))
@login_required(login_url='/accounts/login/')
def delete(request, aPath, id):
aModelClass = None
if aPath in settings.DYNAMIC_DATATB.keys():
aModelName = settings.DYNAMIC_DATATB[aPath]
aModelClass = name_to_class(aModelName)
if not aModelClass:
return HttpResponse( ' > ERR: Getting ModelClass for path: ' + aPath )
item = aModelClass.objects.get(id=id)
item.delete()
return redirect(request.META.get('HTTP_REFERER'))
@login_required(login_url='/accounts/login/')
def update(request, aPath, id):
aModelClass = None
if aPath in settings.DYNAMIC_DATATB.keys():
aModelName = settings.DYNAMIC_DATATB[aPath]
aModelClass = name_to_class(aModelName)
if not aModelClass:
return HttpResponse( ' > ERR: Getting ModelClass for path: ' + aPath )
item = aModelClass.objects.get(id=id)
fk_fields = get_model_fk(aModelClass)
if request.method == 'POST':
for attribute, value in request.POST.items():
if attribute == 'csrfmiddlewaretoken':
continue
if getattr(item, attribute, value) is not None:
# Process FKs
if attribute in fk_fields.keys():
value = name_to_class( fk_fields[attribute] ).objects.filter(id=value).first()
setattr(item, attribute, value)
item.save()
return redirect(request.META.get('HTTP_REFERER'))
# Export as CSV
class ExportCSVView(View):
def get(self, request, aPath):
aModelName = None
aModelClass = None
if aPath in settings.DYNAMIC_DATATB.keys():
aModelName = settings.DYNAMIC_DATATB[aPath]
aModelClass = name_to_class(aModelName)
if not aModelClass:
return HttpResponse( ' > ERR: Getting ModelClass for path: ' + aPath )
db_field_names = [field.name for field in aModelClass._meta.get_fields()]
fields = []
show_fields = HideShowFilter.objects.filter(value=False, parent=aPath.lower())
for field in show_fields:
if field.key in db_field_names:
fields.append(field.key)
else:
print(f"Field {field.key} does not exist in {aModelClass} model.")
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename="{aPath.lower()}.csv"'
writer = csv.writer(response)
writer.writerow(fields) # Write the header
filter_string = {}
filter_instance = ModelFilter.objects.filter(parent=aPath.lower())
for filter_data in filter_instance:
filter_string[f'{filter_data.key}__icontains'] = filter_data.value
order_by = request.GET.get('order_by', 'id')
queryset = aModelClass.objects.filter(**filter_string).order_by(order_by)
items = user_filter(request, queryset, db_field_names)
for item in items:
row_data = []
for field in fields:
try:
row_data.append(getattr(item, field))
except AttributeError:
row_data.append('')
writer.writerow(row_data)
return response

0
apps/pages/__init__.py Normal file
View File

3
apps/pages/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
apps/pages/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class PagesConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "apps.pages"

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.9 on 2025-04-06 16:19
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Product',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=100)),
('info', models.CharField(default='', max_length=100)),
('price', models.IntegerField(blank=True, null=True)),
],
),
]

View File

12
apps/pages/models.py Normal file
View File

@@ -0,0 +1,12 @@
from django.db import models
# Create your models here.
class Product(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length = 100)
info = models.CharField(max_length = 100, default = '')
price = models.IntegerField(blank=True, null=True)
def __str__(self):
return self.name

3
apps/pages/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

7
apps/pages/urls.py Normal file
View File

@@ -0,0 +1,7 @@
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]

9
apps/pages/views.py Normal file
View File

@@ -0,0 +1,9 @@
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
# Page from the theme
return render(request, 'pages/index.html', {'segment': 'dashboard'})

0
config/__init__.py Normal file
View File

16
config/asgi.py Normal file
View File

@@ -0,0 +1,16 @@
"""
ASGI config for core project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
application = get_asgi_application()

207
config/settings.py Normal file
View File

@@ -0,0 +1,207 @@
"""
Django settings for core project.
Generated by 'django-admin startproject' using Django 4.1.2.
For more information on this file, see
https://docs.djangoproject.com/en/4.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.1/ref/settings/
"""
import os, random, string
from pathlib import Path
from dotenv import load_dotenv
from str2bool import str2bool
load_dotenv() # take environment variables from .env.
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY', 'Super_Secr3t_9999')
# Enable/Disable DEBUG Mode
DEBUG = str2bool(os.environ.get('DEBUG'))
#print(' DEBUG -> ' + str(DEBUG) )
# Docker HOST
ALLOWED_HOSTS = ['*']
# Add here your deployment HOSTS
CSRF_TRUSTED_ORIGINS = ['http://localhost:8000', 'http://localhost:5085', 'http://127.0.0.1:8000', 'http://127.0.0.1:5085']
RENDER_EXTERNAL_HOSTNAME = os.environ.get('RENDER_EXTERNAL_HOSTNAME')
if RENDER_EXTERNAL_HOSTNAME:
ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME)
# Application definition
INSTALLED_APPS = [
'jazzmin',
'admin_material.apps.AdminMaterialDashboardConfig',
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
# Serve UI pages
"apps.pages",
# Dynamic DT
"apps.dyn_dt",
# Dynamic API
"apps.dyn_api",
# Charts
"apps.charts",
# Tooling API-GEN
'rest_framework', # Include DRF # <-- NEW
'rest_framework.authtoken', # Include DRF Auth # <-- NEW
]
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"whitenoise.middleware.WhiteNoiseMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
"django.contrib.messages.middleware.MessageMiddleware",
"django.middleware.clickjacking.XFrameOptionsMiddleware",
]
ROOT_URLCONF = "config.urls"
UI_TEMPLATES = os.path.join(BASE_DIR, 'templates')
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [UI_TEMPLATES],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
WSGI_APPLICATION = "config.wsgi.application"
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
DB_ENGINE = os.getenv('DB_ENGINE' , None)
DB_USERNAME = os.getenv('DB_USERNAME' , None)
DB_PASS = os.getenv('DB_PASS' , None)
DB_HOST = os.getenv('DB_HOST' , None)
DB_PORT = os.getenv('DB_PORT' , None)
DB_NAME = os.getenv('DB_NAME' , None)
if DB_ENGINE and DB_NAME and DB_USERNAME:
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.' + DB_ENGINE,
'NAME' : DB_NAME,
'USER' : DB_USERNAME,
'PASSWORD': DB_PASS,
'HOST' : DB_HOST,
'PORT' : DB_PORT,
},
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
},
{
"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
},
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
]
# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/
LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.1/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
#if not DEBUG:
# STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# Default primary key field type
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
LOGIN_REDIRECT_URL = '/'
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# ### DYNAMIC_DATATB Settings ###
DYNAMIC_DATATB = {
# SLUG -> Import_PATH
'product' : "apps.pages.models.Product",
}
########################################
# Syntax: URI -> Import_PATH
DYNAMIC_API = {
# SLUG -> Import_PATH
'product' : "apps.pages.models.Product",
}
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
],
}
########################################

26
config/urls.py Normal file
View File

@@ -0,0 +1,26 @@
"""core URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('', include('apps.pages.urls')),
path('', include('apps.dyn_dt.urls')),
path('', include('apps.dyn_api.urls')),
path('charts/', include('apps.charts.urls')),
path("admin/", admin.site.urls),
path("", include('admin_material.urls'))
]

16
config/wsgi.py Normal file
View File

@@ -0,0 +1,16 @@
"""
WSGI config for core project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
application = get_wsgi_application()

0
static/.gitkeep Normal file
View File

59
static/gulpfile.js Normal file
View File

@@ -0,0 +1,59 @@
/*
=========================================================
* AppSeed - Simple SCSS compiler via Gulp
=========================================================
*/
var autoprefixer = require('gulp-autoprefixer');
var browserSync = require('browser-sync').create();
var cleanCss = require('gulp-clean-css');
var gulp = require('gulp');
const npmDist = require('gulp-npm-dist');
var sass = require('gulp-sass')(require('node-sass'));
var wait = require('gulp-wait');
var sourcemaps = require('gulp-sourcemaps');
var rename = require("gulp-rename");
// Define COMMON paths
const paths = {
src: {
base: './',
css: './css',
scss: './scss',
node_modules: './node_modules/',
vendor: './vendor'
}
};
// Compile SCSS
gulp.task('scss', function() {
return gulp.src([paths.src.scss + '/material-dashboard.scss'])
.pipe(wait(500))
.pipe(sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(autoprefixer({
overrideBrowserslist: ['> 1%']
}))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest(paths.src.css))
.pipe(browserSync.stream());
});
// Minify CSS
gulp.task('minify:css', function() {
return gulp.src([
paths.src.css + '/material-dashboard.css'
])
.pipe(cleanCss())
.pipe(rename(function(path) {
// Updates the object in-place
path.extname = ".min.css";
}))
.pipe(gulp.dest(paths.src.css))
});
// Default Task: Compile SCSS and minify the result
gulp.task('default', gulp.series('scss', 'minify:css'));

BIN
static/img/csv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
static/img/export.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

44
static/package.json Normal file
View File

@@ -0,0 +1,44 @@
{
"name": "appseed-generic",
"version": "1.0.0",
"description": "Template",
"main": "gulpfile.js",
"author": "ApPSeed",
"keywords": [
"css",
"sass",
"gulp",
"web"
],
"homepage": "https://appseed.us",
"repository": {
"type": "git",
"url": "https://github.com/app-generator/app-generator"
},
"bugs": {
"email": "support@appseed.us"
},
"license": "MIT License",
"devDependencies": {
"browser-sync": "^2.27.4",
"del": "^6.0.0",
"gulp": "^4.0.2",
"gulp-autoprefixer": "^8.0.0",
"gulp-clean-css": "^4.3.0",
"gulp-cssbeautify": "^3.0.0",
"node-sass": "^6.0.1",
"gulp-file-include": "^2.3.0",
"gulp-header": "^2.0.9",
"gulp-htmlmin": "^5.0.1",
"gulp-npm-dist": "^1.0.3",
"gulp-plumber": "^1.2.1",
"gulp-rename": "^2.0.0",
"gulp-sass": "^5.0.0",
"gulp-sourcemaps": "^3.0.0",
"gulp-uglify": "^3.0.2",
"gulp-wait": "^0.0.2",
"merge-stream": "^2.0.0"
},
"dependencies": {
}
}

0
templates/.gitkeep Normal file
View File

View File

@@ -0,0 +1,63 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block title %}Charts{% endblock title %}
{% block content %}
<div class="container-fluid py-2">
<div class="row">
<!-- [ Bar Chart ] start -->
<div class="col-sm-12 col-md-6">
<div class="card">
<div class="card-header">
<h5>Bar Chart</h5>
</div>
<div class="card-body text-center">
<div id="bar-chart"></div>
</div>
</div>
</div>
<!-- [ Bar Chart ] end -->
<!-- [ Pie Chart ] start -->
<div class="col-sm-12 col-md-6">
<div class="card">
<div class="card-header">
<h5>Pie Chart</h5>
</div>
<div class="card-body text-center">
<div id="pie-chart"></div>
</div>
</div>
</div>
<!-- [ Pie Chart ] end -->
</div>
</div>
{% endblock content %}
{% block extra_js %}
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
var products = JSON.parse('{{ products|escapejs }}');
var names = products.map(p => p.fields.name);
var prices = products.map(p => p.fields.price);
var barOptions = {
chart: { type: 'bar', height: 350 },
series: [{ name: 'Price', data: prices }],
xaxis: { categories: names }
};
var barChart = new ApexCharts(document.querySelector("#bar-chart"), barOptions);
barChart.render();
var pieOptions = {
chart: { type: 'pie', height: 350 },
series: prices,
labels: names
};
var pieChart = new ApexCharts(document.querySelector("#pie-chart"), pieOptions);
pieChart.render();
});
</script>
{% endblock extra_js %}

View File

@@ -0,0 +1,38 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block title %} Dynamic APIs {% endblock title %}
{% block content %}
<div class="container-fluid py-2">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>
Available Routes - defined in <strong>settings.DYNAMIC_API</strong> - Read <a target="" href="https://app-generator.dev/docs/developer-tools/dynamic-api.html">Documentation</a>.
</h5>
</div>
<div class="card-body">
<ul>
{% for link in routes %}
<li>
<a href="{% url "model_api" link %}">{{ link }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}
{% block extra_js %}
<!-- ADD JS Here -->
{% endblock extra_js %}

View File

@@ -0,0 +1,36 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block title %} {% if page_title %} page_title {% else %} Dynamic DataTables {% endif %} {% endblock title %}
{% block content %}
<div class="container-fluid py-2">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-header">
<h5>
Available Routes - defined in <strong>settings.DYNAMIC_DATATB</strong> - Read <a target="" href="https://app-generator.dev/docs/developer-tools/dynamic-datatables.html">Documentation</a>.
</h5>
</div>
<div class="card-body">
<ul>
{% for link in routes %}
<li>
<a href="{% url "model_dt" link %}">{{ link }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}
{% block extra_js %}
{% endblock extra_js %}

View File

@@ -0,0 +1,22 @@
{% load get_attribute %}
<div class="dt-responsive table-responsive">
<table class="table">
<thead>
<tr>
{% for field in db_field_names %}
<th id="th_{{ field }}_export" scope="col">{{ field }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for item in items %}
<tr>
{% for field_name in db_field_names %}
<td class="td_{{ field_name }}">{{ item|getattribute:field_name }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
</div>

585
templates/dyn_dt/model.html Normal file
View File

@@ -0,0 +1,585 @@
{% extends "layouts/base.html" %}
{% load static get_attribute %}
{% block title %} {% if page_title %} {{page_title}} {% else %} Dynamic DataTables {% endif %} {% endblock title %}
{% block extrastyle %}
<style>
.hide-show-dropdown {
max-height: 350px;
overflow-y: scroll;
}
.page-size .export-csv-img {
width: 35px;
cursor: pointer;
}
.export-img {
width: 30px;
}
.modal-header {
display: block !important;
}
.height{
height: 40px !important;
}
.table-row {
position: relative;
}
.action-td {
position: absolute;
left: 50%;
right: 50%;
bottom: -5px;
}
.table-row:hover .data-td {
opacity: 0.1;
}
.table-row:hover .action-td {
display: flex !important;
gap:3px !important;
}
</style>
{% endblock extrastyle %}
{% block content %}
<div class="container-fluid py-2">
<div class="row">
<div class="col-sm-12">
<div class="card">
<div class="card-body">
<div class="d-flex justify-content-between my-4">
<form class="search">
<div class="d-flex gap-2 align-items-center">
<div class="mr-3">
<input type="text" placeholder="Search for items" name="search" id="" class="form-control border ps-2">
</div>
<button type="submit" class="btn mb-0 btn-primary">
<i class="material-symbols-rounded opacity-5">search</i>
</button>
</div>
</form>
<div class="">
<form method="post">
<div class="dropdown">
<button class="btn mb-0 btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Hide / Show Column
</button>
<div id="dropdownDefaultCheckbox">
<ul class="dropdown-menu hide-show-dropdown px-3">
{% for field_name in field_names %}
<div class="form-check mb-2 ps-0">
<input class="form-check-input" {% if field_name.value %} checked {% endif %} type="checkbox" data-bs-target="{{ field_name.key }}" value="" id="checkbox-item-{{ field_name.id }}">
<label class="form-check-label" for="checkbox-item-{{ field_name.id }}">
{{ field_name.key }}
</label>
</div>
{% endfor %}
</ul>
</div>
</div>
</form>
</div>
<div class="page-size form-group mb-2">
<div class="d-flex gap-2">
<form method="post" class="">
{% csrf_token %}
<select onchange="getPageItems(this)" name="" id="" class="form-select border ps-2">
<option {% if page_items == 5 %} selected {% endif %} value="5">5 Items</option>
<option {% if page_items == 10 %} selected {% endif %} value="10">10 Items</option>
<option {% if page_items == 15 %} selected {% endif %} value="15">15 Items</option>
<option {% if page_items == 25 %} selected {% endif %} value="25">25 Items</option>
<option {% if page_items == 50 %} selected {% endif %} value="50">50 Items</option>
<option {% if page_items == 100 %} selected {% endif %} value="100">100 Items</option>
</select>
</form>
<div class="d-flex ">
<a data-bs-toggle="modal" data-bs-target="#exportCSV">
<img class="export-csv-img" style="width: 40px" src="{% static "img/csv.png" %}" alt="img">
</a>
</div>
{% if request.user.is_authenticated %}
<div>
<button data-bs-toggle="modal" data-bs-target="#addSales" type="button" class="btn mb-0 btn-primary p-0 px-3 py-2 ">
Add
</button>
</div>
{% endif %}
</div>
</div>
</div>
<div>
<form action="{% url "create_filter" link %}" method="post">
{% csrf_token %}
<div class="d-flex align-items-center gap-3 mb-3">
<h3 class="">Filters</h3>
<button id="addButton" type="button" class="btn mb-0 btn-primary">Add</button>
</div>
<div class="mb-3" id="inputContainer">
{% if filter_instance %}
{% for filter_data in filter_instance %}
<div class="d-flex gap-3 mb-3">
<div class="d-flex gap-2">
<select name="key" id="" class="form-select border ps-2 w-50">
{% for field in db_field_names %}
<option {% if filter_data.key == field %}selected{% endif %} value="{{ field }}">{{ field }}</option>
{% endfor %}
</select>
<input type="text" value="{{ filter_data.value }}" placeholder="Enter value" name="value" id="" class="form-control border ps-2">
</div>
<a href="{% url "delete_filter" link filter_data.id %}" class="remove-button btn mb-0 btn-danger">X</a>
</div>
{% endfor %}
{% endif %}
</div>
<button id="submitButton" type="submit" {% if not filter_instance %} style="display: none;" {% endif %} class="btn mb-0 btn-success">Submit</button>
</form>
<div class="card-body">
<div class="dt-responsive table-responsive">
<table class="table">
<thead>
<tr>
{% for field in db_field_names %}
<th class="px-2" id="th_{{ field }}" scope="col">{{ field }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for item in items %}
<tr class="align-middle table-row">
{% for field_name in db_field_names %}
<td class="td_{{ field_name }} data-td">{{ item|getattribute:field_name }}</td>
{% endfor %}
{% if request.user.is_authenticated %}
<td class="d-none action-td" >
<a data-bs-toggle="modal" data-bs-target="#editSales-{{item.id}}" class="btn mb-0 btn-primary btn-sm p-0 px-3 pe-4 ps-2 py-2" href="#">
<i style="font-size: 14px;" class="material-symbols-rounded opacity-5">edit</i>
</a>
<a data-bs-toggle="modal" data-bs-target="#deleteSales-{{item.id}}" class="btn mb-0 btn-primary btn-sm p-0 px-3 pe-4 ps-2 py-2" href="#">
<i style="font-size: 14px;" class="material-symbols-rounded opacity-5">delete</i>
</a>
</td>
{% else %}
<td class="d-none action-td">
<a data-bs-toggle="modal" data-bs-target="#viewSales-{{item.id}}" class="btn mb-0 btn-primary btn-sm p-0 px-3 pe-4 ps-2 py-2" href="#">
<i style="font-size: 14px;" class="material-symbols-rounded opacity-5">visibility</i>
</a>
</td>
{% endif %}
</tr>
<!-- Edit Sales -->
<div class="modal fade" id="editSales-{{item.id}}" tabindex="-1" aria-labelledby="editSalesLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-xl">
<div class="modal-content">
<div class="modal-header">
<div class="d-flex justify-content-between">
<div>
<h1 class="modal-title fs-5" id="editSalesLabel">Edit {{ link|capfirst }}</h1>
</div>
<div>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
</div>
</div>
<div class="modal-body">
<form action="{% url "update" link item.id %}" method="post">
{% csrf_token %}
<div class="row">
<!-- FKs -->
{% for key, values in fk_fields.items %}
<div class="col-md-6">
<div class="form-group mb-2">
<label for="id_{{ key }}" class="form-label ml-0">{{ key|title }}</label>
<select class="form-control border ps-2" name="{{ key }}" id="id_{{ key }}">
{% for i in values %}
<option value="{{ i.id }}">{{ i }}</option>
{% endfor %}
</select>
</div>
</div>
{% endfor %}
{% for field_name in db_field_names %}
{% if field_name not in read_only_fields and field_name not in fk_fields_keys %}
<div class="col-md-6">
<div class="form-group mb-2">
<label for="id_{{ field_name }}" class="form-label ml-0">{{ field_name|title }}</label>
{% if field_name in choices_dict %}
<select name="{{ field_name }}" id="id_{{ field_name }}" class="form-select border ps-2">
<option value="">Select {{ field_name }}</option>
{% for key, value in choices_dict|get:field_name %}
<option {% if item|getattribute:field_name == key %} selected {% endif %} value="{{ key }}">{{ value }}</option>
{% endfor %}
</select>
{% else %}
{% if field_name in integer_fields %}
<input type="number" name="{{ field_name }}" value="{{ item|getattribute:field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% elif field_name in date_time_fields %}
<input type="datetime-local" name="{{ field_name }}" value="{{ item|getattribute:field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% elif field_name in email_fields %}
<input type="email" name="{{ field_name }}" value="{{ item|getattribute:field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% elif field_name in text_fields %}
<input type="text" name="{{ field_name }}" value="{{ item|getattribute:field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% else %}
<input type="text" name="{{ field_name }}" value="{{ item|getattribute:field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% endif %}
{% endif %}
</div>
</div>
{% endif %}
{% endfor %}
</div>
<div class="mt-3">
<button type="submit" class="btn mb-0 btn-primary">Save</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Delete Sales -->
<div class="modal fade" id="deleteSales-{{item.id}}" tabindex="-1" aria-labelledby="deleteSalesLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<div class="d-flex justify-content-between">
<div>
<h1 class="modal-title fs-5" id="deleteSalesLabel">Delete Item</h1>
</div>
<div>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
</div>
</div>
<div class="modal-body">
<h5>Are you sure you want to delete this item?</h5>
</div>
<div class="modal-footer">
<button type="button" class="btn mb-0 btn-secondary" data-bs-dismiss="modal">Close</button>
<a href="{% url "delete" link item.id %}" class="btn mb-0 btn-danger">Delete</a>
</div>
</div>
</div>
</div>
<!-- View Sales -->
<div class="modal fade" id="viewSales-{{item.id}}" tabindex="-1" aria-labelledby="viweSalesLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-xl">
<div class="modal-content">
<div class="modal-header">
<div class="d-flex justify-content-between">
<div>
<h1 class="modal-title fs-5" id="viewSalesLabel">View {{ link|capfirst }}</h1>
</div>
<div>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
</div>
</div>
<div class="modal-body">
<form action="{% url "update" link item.id %}" method="post">
{% csrf_token %}
<div class="row">
{% for field_name in db_field_names %}
<div class="col-md-6">
<div class="form-group mb-2">
<label for="{{ field_name }}" class="form-label ml-0">{{ field_name|title }}</label>
<input readonly type="text" value="{{ item|getattribute:field_name }}" name="{{ field_name }}" id="{{ field_name }}" class="form-control border ps-2">
</div>
</div>
{% endfor %}
</div>
</form>
</div>
</div>
</div>
</div>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% if items.has_other_pages %}
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
{% if items.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ items.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
<span class="sr-only">Previous</span>
</a>
</li>
{% endif %}
{% for n in items.paginator.page_range %}
{% if items.number == n %}
<li class="page-item active"><a class="page-link">{{ n }}</a></li>
{% elif n > items.number|add:'-3' and n < items.number|add:'3' %}
<li class="page-item"><a class="page-link" href="?page={{n}}">{{ n }}</a></li>
{% endif %}
{% endfor %}
{% if items.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ items.next_page_number }}" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
<span class="sr-only">Next</span>
</a>
</li>
{% endif %}
</ul>
</nav>
{% endif %}
</div>
</div>
<!-- Export as CSV -->
<div class="modal fade" id="exportCSV" tabindex="-1" aria-labelledby="exportCSVLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-xl">
<div class="modal-content">
<div class="modal-header">
<div class="d-flex justify-content-between">
<div>
<h1 class="modal-title fs-5" id="exportCSVLabel">Export as CSV</h1>
</div>
<div>
{% if request.GET.order_by or request.GET.search %}
{% with order_by=request.GET.order_by search=request.GET.search %}
<a href="{% url 'export_csv' link %}?{% if order_by %}order_by={{ order_by }}{% endif %}{% if order_by and search %}&{% endif %}{% if search %}search={{ search }}{% endif %}">
<img style="width: 30px" class="export-img" src="{% static 'img/export.png' %}" alt="">
</a>
{% endwith %}
{% else %}
<a href="{% url 'export_csv' link %}">
<img style="width: 30px" class="export-img" src="{% static 'img/export.png' %}" alt="">
</a>
{% endif %}
</div>
<div>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
</div>
</div>
<div class="modal-body">
{% include "dyn_dt/items-table.html" with items=items %}
</div>
</div>
</div>
</div>
<!-- Add Sales -->
<div class="modal fade" id="addSales" tabindex="-1" aria-labelledby="addSalesLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-xl">
<div class="modal-content">
<div class="modal-header">
<div class="d-flex justify-content-between">
<div>
<h1 class="modal-title fs-5" id="addSalesLabel">Add {{ link|capfirst }}</h1>
</div>
<div>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
</div>
</div>
<div class="modal-body">
<form method="post" action="{% url "create" link %}" class="row">
{% csrf_token %}
<!-- FKs -->
{% for key, values in fk_fields.items %}
<div class="col-md-6">
<div class="form-group mb-2">
<label for="id_{{ key }}" class="form-label ml-0">{{ key|title }}</label>
<select class="form-control border ps-2" name="{{ key }}" id="id_{{ key }}">
{% for i in values %}
<option value="{{ i.id }}">{{ i }}</option>
{% endfor %}
</select>
</div>
</div>
{% endfor %}
{% for field_name in db_field_names %}
{% if field_name not in read_only_fields and field_name not in fk_fields_keys %}
<div class="col-md-6">
<div class="form-group mb-2">
<label for="id_{{ field_name }}" class="form-label ml-0">{{ field_name|title }}</label>
{% if field_name in choices_dict %}
<select name="{{ field_name }}" id="id_{{ field_name }}" class="form-select border ps-2">
<option value="">Select {{ field_name }}</option>
{% for key, value in choices_dict|get:field_name %}
<option value="{{ key }}">{{ value }}</option>
{% endfor %}
</select>
{% else %}
{% if field_name in integer_fields %}
<input type="number" name="{{ field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% elif field_name in date_time_fields %}
<input type="datetime-local" name="{{ field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% elif field_name in email_fields %}
<input type="email" name="{{ field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% else %}
<input type="text" name="{{ field_name }}" class="form-control border ps-2" placeholder="{{ field_name }}" id="id_{{ field_name }}">
{% endif %}
{% endif %}
</div>
</div>
{% endif %}
{% endfor %}
<div class="mt-3">
<button type="submit" class="btn mb-0 btn-primary">Add</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}
{% block extra_js %}
<script>
const link = '{{ link }}';
document.addEventListener('DOMContentLoaded', function () {
var checkboxes = document.querySelectorAll('#dropdownDefaultCheckbox input[type="checkbox"]');
checkboxes.forEach(function (checkbox) {
var targetColumnId = checkbox.getAttribute('data-bs-target');
var targetColumn = document.getElementById('th_' + targetColumnId);
var exportTargetColumn = document.getElementById('th_' + targetColumnId + '_export');
var targetDataCells = document.querySelectorAll('.td_' + targetColumnId);
if (checkbox.checked) {
targetColumn.style.display = 'none';
exportTargetColumn.style.display = 'none';
targetDataCells.forEach(function (dataCell) {
dataCell.style.display = 'none';
});
}
checkbox.addEventListener('change', function () {
var targetColumnId = this.getAttribute('data-bs-target');
var targetColumn = document.getElementById('th_' + targetColumnId);
var exportTargetColumn = document.getElementById('th_' + targetColumnId + '_export');
var targetDataCells = document.querySelectorAll('.td_' + targetColumnId);
if (this.checked) {
targetColumn.style.display = 'none';
exportTargetColumn.style.display = 'none';
targetDataCells.forEach(function (dataCell) {
dataCell.style.display = 'none';
});
} else {
targetColumn.style.display = '';
exportTargetColumn.style.display = '';
targetDataCells.forEach(function (dataCell) {
dataCell.style.display = '';
});
}
fetch(`/create-hide-show-items/${link}/`, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'X-CSRFToken': '{{ csrf_token }}',
},
body: JSON.stringify({
key: targetColumnId,
value: this.checked
})
})
});
});
});
</script>
<script>
function getPageItems(selectObject) {
var value = selectObject.value;
fetch(`/create-page-items/${link}/`, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'X-CSRFToken': '{{ csrf_token }}',
},
body: `items=${value}`
})
.then(response => {
location.reload()
})
}
</script>
<script>
document.getElementById('addButton').addEventListener('click', function() {
var fieldNames = {{ db_filters|safe }};
var template = `
<div class="input-container d-flex align-items-center gap-3 mb-3">
<div class="d-flex gap-2">
<select name="key" class="form-select border ps-2 w-50">
${fieldNames.map(option => `<option value="${option}">${option}</option>`).join('')}
</select>
<input name="value" class="form-control border ps-2" type="text" placeholder="Enter value">
</div>
<button class="remove-button btn mb-0 btn-danger" onclick="removeInputContainer(this)">X</button>
</div>
`;
var tempDiv = document.createElement('div');
tempDiv.innerHTML = template;
document.getElementById('inputContainer').appendChild(tempDiv);
document.getElementById('submitButton').style.display = 'inline-block';
});
function removeInputContainer(element) {
var inputContainer = element.closest('.input-container');
inputContainer.remove();
var inputContainers = document.getElementsByClassName('input-container');
if (inputContainers.length === 0) {
document.getElementById('submitButton').style.display = 'none';
}
}
</script>
{% endblock extra_js %}

View File

@@ -0,0 +1,165 @@
{% load i18n static admin_material %}
<aside style="z-index: 1;" class="sidenav navbar navbar-vertical navbar-expand-xs border-radius-lg fixed-start ms-2 bg-white my-2" id="sidenav-main">
<div class="sidenav-header">
<i class="fas fa-times p-3 cursor-pointer text-dark opacity-5 position-absolute end-0 top-0 d-none d-xl-none" aria-hidden="true" id="iconSidenav"></i>
<a class="navbar-brand px-4 py-3 m-0" href="{% url "index" %}">
<img src="{% static "assets/img/logo-ct-dark.png" %}" class="navbar-brand-img" width="26" height="26" alt="main_logo">
<span class="ms-1 text-sm text-dark">
Django Material
</span>
</a>
</div>
<hr class="horizontal dark mt-0 mb-2">
<div class="collapse navbar-collapse w-auto " id="sidenav-collapse-main">
<ul class="navbar-nav">
{% admin_get_menu as app_list %}
{% if app_list %}
{% for app in app_list %}
{% if app.has_perms and not app.pinned %}
<li class="nav-item">
<a data-bs-toggle="collapse" href="#apps" class="nav-link text-dark" aria-controls="apps" role="button" aria-expanded="false">
<i class="material-symbols-rounded opacity-5">dashboard</i>
<span class="nav-link-text ms-2 ps-1">{{ app.label|slice:10 }}{% if app.label|length > 10 %}..{% endif %}</span>
</a>
{% if app.models %}
<div class="collapse show" id="apps">
<ul class="nav">
{% for model in app.models %}
{% if model.url %}
<li class="nav-item">
<a class="nav-link text-dark" href="{{ model.url }}">
<span class="sidenav-mini-icon"> {{ model.label|first }} </span>
<span class="sidenav-normal ms-2 ps-1"> {{ model.label }} </span>
</a>
</li>
{% else %}
<li class="nav-item">{{ model.label }}</li>
{% endif %}
{% endfor %}
</ul>
</div>
{% endif %}
</li>
{% endif %}
{% endfor %}
{% endif %}
<li class="nav-item mt-3">
<h6 class="ps-4 ms-2 text-uppercase text-xs text-dark font-weight-bolder opacity-5">Apps</h6>
</li>
<li class="nav-item">
<a class="nav-link {% if 'dashboard' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "index" %}">
<i class="material-symbols-rounded opacity-5">dashboard</i>
<span class="nav-link-text ms-1">Dashboard</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'dynamic_dt' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "dynamic_dt" %}">
<i class="material-symbols-rounded opacity-5">table_view</i>
<span class="nav-link-text ms-1">Dynamic Tables</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'dynamic_api' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "dynamic_api" %}">
<i class="material-symbols-rounded opacity-5">dns</i>
<span class="nav-link-text ms-1">Dynamic API</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'charts' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "charts" %}">
<i class="material-symbols-rounded opacity-5">bar_chart</i>
<span class="nav-link-text ms-1">Charts</span>
</a>
</li>
<li class="nav-item mt-3">
<h6 class="ps-4 ms-2 text-uppercase text-xs text-dark font-weight-bolder opacity-5">UI pages</h6>
</li>
<li class="nav-item">
<a class="nav-link {% if 'tables' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "tables" %}">
<i class="material-symbols-rounded opacity-5">table_view</i>
<span class="nav-link-text ms-1">Tables</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'billing' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "billing" %}">
<i class="material-symbols-rounded opacity-5">receipt_long</i>
<span class="nav-link-text ms-1">Billing</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'virtual_reality' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "virtual_reality" %}">
<i class="material-symbols-rounded opacity-5">view_in_ar</i>
<span class="nav-link-text ms-1">Virtual Reality</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'rtl' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "rtl" %}">
<i class="material-symbols-rounded opacity-5">format_textdirection_r_to_l</i>
<span class="nav-link-text ms-1">RTL</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'notifications' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "notifications" %}">
<i class="material-symbols-rounded opacity-5">notifications</i>
<span class="nav-link-text ms-1">Notifications</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'map' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "map" %}">
<i class="material-symbols-rounded opacity-5">map</i>
<span class="nav-link-text ms-1">Map</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'icons' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "icons" %}">
<i class="material-symbols-rounded opacity-5">flag</i>
<span class="nav-link-text ms-1">Icons</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if 'typography' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "typography" %}">
<i class="material-symbols-rounded opacity-5">title</i>
<span class="nav-link-text ms-1">Typography</span>
</a>
</li>
<li class="nav-item mt-3">
<h6 class="ps-4 ms-2 text-uppercase text-xs text-dark font-weight-bolder opacity-5">Account pages</h6>
</li>
{% if request.user.is_authenticated %}
<li class="nav-item">
<a class="nav-link {% if 'profile' == segment %} active bg-gradient-dark text-white {% else %} text-dark {% endif %}" href="{% url "profile" %}">
<i class="material-symbols-rounded opacity-5">person</i>
<span class="nav-link-text ms-1">Profile</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" href="{% url "logout" %}">
<i class="material-symbols-rounded opacity-5">login</i>
<span class="nav-link-text ms-1">Logout</span>
</a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link text-dark" href="{% url "login" %}">
<i class="material-symbols-rounded opacity-5">login</i>
<span class="nav-link-text ms-1">Sign In</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" href="{% url "register" %}">
<i class="material-symbols-rounded opacity-5">assignment</i>
<span class="nav-link-text ms-1">Sign Up</span>
</a>
</li>
{% endif %}
</ul>
</div>
<div class="sidenav-footer position-absolute w-100 bottom-0 ">
<div class="mx-3">
<a class="btn btn-outline-dark mt-4 w-100" href="https://app-generator.dev/docs/products/django/material-dashboard/index.html" type="button">Documentation</a>
<a class="btn bg-gradient-dark w-100" href="https://app-generator.dev/product/material-dashboard/django/" type="button">Download</a>
</div>
</div>
</aside>

View File

@@ -0,0 +1,321 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid py-2">
<div class="row">
<div class="col-lg-8">
<div class="row">
<div class="col-xl-6 mb-xl-0 mb-4">
<div class="card bg-transparent shadow-xl">
<div class="overflow-hidden position-relative border-radius-xl">
<img src="{% static "assets/img/illustrations/pattern-tree.svg" %}" class="position-absolute opacity-2 start-0 top-0 w-100 z-index-1 h-100" alt="pattern-tree">
<span class="mask bg-gradient-dark opacity-10"></span>
<div class="card-body position-relative z-index-1 p-3">
<i class="material-symbols-rounded text-white p-2">wifi</i>
<h5 class="text-white mt-4 mb-5 pb-2">4562&nbsp;&nbsp;&nbsp;1122&nbsp;&nbsp;&nbsp;4594&nbsp;&nbsp;&nbsp;7852</h5>
<div class="d-flex">
<div class="d-flex">
<div class="me-4">
<p class="text-white text-sm opacity-8 mb-0">Card Holder</p>
<h6 class="text-white mb-0">Jack Peterson</h6>
</div>
<div>
<p class="text-white text-sm opacity-8 mb-0">Expires</p>
<h6 class="text-white mb-0">11/22</h6>
</div>
</div>
<div class="ms-auto w-20 d-flex align-items-end justify-content-end">
<img class="w-60 mt-2" src="{% static "assets/img/logos/mastercard.png" %}" alt="logo">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-6">
<div class="row">
<div class="col-md-6 col-6">
<div class="card">
<div class="card-header mx-4 p-3 text-center">
<div class="icon icon-shape icon-lg bg-gradient-dark shadow text-center border-radius-lg">
<i class="material-symbols-rounded opacity-10">account_balance</i>
</div>
</div>
<div class="card-body pt-0 p-3 text-center">
<h6 class="text-center mb-0">Salary</h6>
<span class="text-xs">Belong Interactive</span>
<hr class="horizontal dark my-3">
<h5 class="mb-0">+$2000</h5>
</div>
</div>
</div>
<div class="col-md-6 col-6">
<div class="card">
<div class="card-header mx-4 p-3 text-center">
<div class="icon icon-shape icon-lg bg-gradient-dark shadow text-center border-radius-lg">
<i class="material-symbols-rounded opacity-10">account_balance_wallet</i>
</div>
</div>
<div class="card-body pt-0 p-3 text-center">
<h6 class="text-center mb-0">Paypal</h6>
<span class="text-xs">Freelance Payment</span>
<hr class="horizontal dark my-3">
<h5 class="mb-0">$455.00</h5>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-12 mb-lg-0 mb-4">
<div class="card mt-4">
<div class="card-header pb-0 p-3">
<div class="row">
<div class="col-6 d-flex align-items-center">
<h6 class="mb-0">Payment Method</h6>
</div>
<div class="col-6 text-end">
<a class="btn bg-gradient-dark mb-0" href="javascript:;"><i class="material-symbols-rounded text-sm">add</i>&nbsp;&nbsp;Add New Card</a>
</div>
</div>
</div>
<div class="card-body p-3">
<div class="row">
<div class="col-md-6 mb-md-0 mb-4">
<div class="card card-body border card-plain border-radius-lg d-flex align-items-center flex-row">
<img class="w-10 me-3 mb-0" src="{% static "assets/img/logos/mastercard.png" %}" alt="logo">
<h6 class="mb-0">****&nbsp;&nbsp;&nbsp;****&nbsp;&nbsp;&nbsp;****&nbsp;&nbsp;&nbsp;7852</h6>
<i class="material-symbols-rounded ms-auto text-dark cursor-pointer" data-bs-toggle="tooltip" data-bs-placement="top" title="Edit Card">edit</i>
</div>
</div>
<div class="col-md-6">
<div class="card card-body border card-plain border-radius-lg d-flex align-items-center flex-row">
<img class="w-10 me-3 mb-0" src="{% static "assets/img/logos/visa.png" %}" alt="logo">
<h6 class="mb-0">****&nbsp;&nbsp;&nbsp;****&nbsp;&nbsp;&nbsp;****&nbsp;&nbsp;&nbsp;5248</h6>
<i class="material-symbols-rounded ms-auto text-dark cursor-pointer" data-bs-toggle="tooltip" data-bs-placement="top" title="Edit Card">edit</i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="card h-100">
<div class="card-header pb-0 p-3">
<div class="row">
<div class="col-6 d-flex align-items-center">
<h6 class="mb-0">Invoices</h6>
</div>
<div class="col-6 text-end">
<button class="btn btn-outline-primary btn-sm mb-0">View All</button>
</div>
</div>
</div>
<div class="card-body p-3 pb-0">
<ul class="list-group">
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex flex-column">
<h6 class="mb-1 text-dark font-weight-bold text-sm">March, 01, 2020</h6>
<span class="text-xs">#MS-415646</span>
</div>
<div class="d-flex align-items-center text-sm">
$180
<button class="btn btn-link text-dark text-sm mb-0 px-0 ms-4"><i class="material-symbols-rounded text-lg position-relative me-1">picture_as_pdf</i> PDF</button>
</div>
</li>
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex flex-column">
<h6 class="text-dark mb-1 font-weight-bold text-sm">February, 10, 2021</h6>
<span class="text-xs">#RV-126749</span>
</div>
<div class="d-flex align-items-center text-sm">
$250
<button class="btn btn-link text-dark text-sm mb-0 px-0 ms-4"><i class="material-symbols-rounded text-lg position-relative me-1">picture_as_pdf</i> PDF</button>
</div>
</li>
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex flex-column">
<h6 class="text-dark mb-1 font-weight-bold text-sm">April, 05, 2020</h6>
<span class="text-xs">#FB-212562</span>
</div>
<div class="d-flex align-items-center text-sm">
$560
<button class="btn btn-link text-dark text-sm mb-0 px-0 ms-4"><i class="material-symbols-rounded text-lg position-relative me-1">picture_as_pdf</i> PDF</button>
</div>
</li>
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex flex-column">
<h6 class="text-dark mb-1 font-weight-bold text-sm">June, 25, 2019</h6>
<span class="text-xs">#QW-103578</span>
</div>
<div class="d-flex align-items-center text-sm">
$120
<button class="btn btn-link text-dark text-sm mb-0 px-0 ms-4"><i class="material-symbols-rounded text-lg position-relative me-1">picture_as_pdf</i> PDF</button>
</div>
</li>
<li class="list-group-item border-0 d-flex justify-content-between ps-0 border-radius-lg">
<div class="d-flex flex-column">
<h6 class="text-dark mb-1 font-weight-bold text-sm">March, 01, 2019</h6>
<span class="text-xs">#AR-803481</span>
</div>
<div class="d-flex align-items-center text-sm">
$300
<button class="btn btn-link text-dark text-sm mb-0 px-0 ms-4"><i class="material-symbols-rounded text-lg position-relative me-1">picture_as_pdf</i> PDF</button>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-7 mt-4">
<div class="card">
<div class="card-header pb-0 px-3">
<h6 class="mb-0">Billing Information</h6>
</div>
<div class="card-body pt-4 p-3">
<ul class="list-group">
<li class="list-group-item border-0 d-flex p-4 mb-2 bg-gray-100 border-radius-lg">
<div class="d-flex flex-column">
<h6 class="mb-3 text-sm">Oliver Liam</h6>
<span class="mb-2 text-xs">Company Name: <span class="text-dark font-weight-bold ms-sm-2">Viking Burrito</span></span>
<span class="mb-2 text-xs">Email Address: <span class="text-dark ms-sm-2 font-weight-bold">oliver@burrito.com</span></span>
<span class="text-xs">VAT Number: <span class="text-dark ms-sm-2 font-weight-bold">FRB1235476</span></span>
</div>
<div class="ms-auto text-end">
<a class="btn btn-link text-danger text-gradient px-3 mb-0" href="javascript:;"><i class="material-symbols-rounded text-sm me-2">delete</i>Delete</a>
<a class="btn btn-link text-dark px-3 mb-0" href="javascript:;"><i class="material-symbols-rounded text-sm me-2">edit</i>Edit</a>
</div>
</li>
<li class="list-group-item border-0 d-flex p-4 mb-2 mt-3 bg-gray-100 border-radius-lg">
<div class="d-flex flex-column">
<h6 class="mb-3 text-sm">Lucas Harper</h6>
<span class="mb-2 text-xs">Company Name: <span class="text-dark font-weight-bold ms-sm-2">Stone Tech Zone</span></span>
<span class="mb-2 text-xs">Email Address: <span class="text-dark ms-sm-2 font-weight-bold">lucas@stone-tech.com</span></span>
<span class="text-xs">VAT Number: <span class="text-dark ms-sm-2 font-weight-bold">FRB1235476</span></span>
</div>
<div class="ms-auto text-end">
<a class="btn btn-link text-danger text-gradient px-3 mb-0" href="javascript:;"><i class="material-symbols-rounded text-sm me-2">delete</i>Delete</a>
<a class="btn btn-link text-dark px-3 mb-0" href="javascript:;"><i class="material-symbols-rounded text-sm me-2">edit</i>Edit</a>
</div>
</li>
<li class="list-group-item border-0 d-flex p-4 mb-2 mt-3 bg-gray-100 border-radius-lg">
<div class="d-flex flex-column">
<h6 class="mb-3 text-sm">Ethan James</h6>
<span class="mb-2 text-xs">Company Name: <span class="text-dark font-weight-bold ms-sm-2">Fiber Notion</span></span>
<span class="mb-2 text-xs">Email Address: <span class="text-dark ms-sm-2 font-weight-bold">ethan@fiber.com</span></span>
<span class="text-xs">VAT Number: <span class="text-dark ms-sm-2 font-weight-bold">FRB1235476</span></span>
</div>
<div class="ms-auto text-end">
<a class="btn btn-link text-danger text-gradient px-3 mb-0" href="javascript:;"><i class="material-symbols-rounded text-sm me-2">delete</i>Delete</a>
<a class="btn btn-link text-dark px-3 mb-0" href="javascript:;"><i class="material-symbols-rounded text-sm me-2">edit</i>Edit</a>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="col-md-5 mt-4">
<div class="card h-100 mb-4">
<div class="card-header pb-0 px-3">
<div class="row">
<div class="col-md-6">
<h6 class="mb-0">Your Transaction's</h6>
</div>
<div class="col-md-6 d-flex justify-content-start justify-content-md-end align-items-center">
<i class="material-symbols-rounded me-2 text-lg">date_range</i>
<small>23 - 30 March 2020</small>
</div>
</div>
</div>
<div class="card-body pt-4 p-3">
<h6 class="text-uppercase text-body text-xs font-weight-bolder mb-3">Newest</h6>
<ul class="list-group">
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex align-items-center">
<button class="btn btn-icon-only btn-rounded btn-outline-danger mb-0 me-3 p-3 btn-sm d-flex align-items-center justify-content-center"><i class="material-symbols-rounded text-lg">expand_more</i></button>
<div class="d-flex flex-column">
<h6 class="mb-1 text-dark text-sm">Netflix</h6>
<span class="text-xs">27 March 2020, at 12:30 PM</span>
</div>
</div>
<div class="d-flex align-items-center text-danger text-gradient text-sm font-weight-bold">
- $ 2,500
</div>
</li>
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex align-items-center">
<button class="btn btn-icon-only btn-rounded btn-outline-success mb-0 me-3 p-3 btn-sm d-flex align-items-center justify-content-center"><i class="material-symbols-rounded text-lg">expand_less</i></button>
<div class="d-flex flex-column">
<h6 class="mb-1 text-dark text-sm">Apple</h6>
<span class="text-xs">27 March 2020, at 04:30 AM</span>
</div>
</div>
<div class="d-flex align-items-center text-success text-gradient text-sm font-weight-bold">
+ $ 2,000
</div>
</li>
</ul>
<h6 class="text-uppercase text-body text-xs font-weight-bolder my-3">Yesterday</h6>
<ul class="list-group">
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex align-items-center">
<button class="btn btn-icon-only btn-rounded btn-outline-success mb-0 me-3 p-3 btn-sm d-flex align-items-center justify-content-center"><i class="material-symbols-rounded text-lg">expand_less</i></button>
<div class="d-flex flex-column">
<h6 class="mb-1 text-dark text-sm">Stripe</h6>
<span class="text-xs">26 March 2020, at 13:45 PM</span>
</div>
</div>
<div class="d-flex align-items-center text-success text-gradient text-sm font-weight-bold">
+ $ 750
</div>
</li>
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex align-items-center">
<button class="btn btn-icon-only btn-rounded btn-outline-success mb-0 me-3 p-3 btn-sm d-flex align-items-center justify-content-center"><i class="material-symbols-rounded text-lg">expand_less</i></button>
<div class="d-flex flex-column">
<h6 class="mb-1 text-dark text-sm">HubSpot</h6>
<span class="text-xs">26 March 2020, at 12:30 PM</span>
</div>
</div>
<div class="d-flex align-items-center text-success text-gradient text-sm font-weight-bold">
+ $ 1,000
</div>
</li>
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex align-items-center">
<button class="btn btn-icon-only btn-rounded btn-outline-success mb-0 me-3 p-3 btn-sm d-flex align-items-center justify-content-center"><i class="material-symbols-rounded text-lg">expand_less</i></button>
<div class="d-flex flex-column">
<h6 class="mb-1 text-dark text-sm">Creative Tim</h6>
<span class="text-xs">26 March 2020, at 08:30 AM</span>
</div>
</div>
<div class="d-flex align-items-center text-success text-gradient text-sm font-weight-bold">
+ $ 2,500
</div>
</li>
<li class="list-group-item border-0 d-flex justify-content-between ps-0 mb-2 border-radius-lg">
<div class="d-flex align-items-center">
<button class="btn btn-icon-only btn-rounded btn-outline-dark mb-0 me-3 p-3 btn-sm d-flex align-items-center justify-content-center"><i class="material-symbols-rounded text-lg">priority_high</i></button>
<div class="d-flex flex-column">
<h6 class="mb-1 text-dark text-sm">Webflow</h6>
<span class="text-xs">26 March 2020, at 05:00 AM</span>
</div>
</div>
<div class="d-flex align-items-center text-dark text-sm font-weight-bold">
Pending
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
{% include "includes/footer.html" %}
</div>
{% endblock content %}

View File

@@ -0,0 +1,28 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid py-2">
<div class="row min-vh-80">
<div class="col-6 mx-auto">
<div class="card mt-4">
<div class="card-header p-0 position-relative mt-n4 mx-3 z-index-2">
<div class="bg-gradient-primary shadow-primary border-radius-lg pt-4 pb-3">
<h6 class="text-white text-capitalize ps-3">Material Design Icons</h6>
<p class="mb-0 text-white ps-3">Handcrafted by our friends from
<a class="text-white font-weight-bold" target="_blank" href="https://fonts.google.com/icons">Google</a>
</p>
</div>
</div>
<div class="card-body">
<p>Through most of the examples in this dashboard, we have used the default <a href="https://fonts.google.com/icons">Icons for the Material Design</a> provided by Google.</p>
<i class="material-symbols-rounded text-2xl">face</i>
</div>
</div>
</div>
</div>
{% include "includes/footer.html" %}
</div>
{% endblock content %}

735
templates/pages/index.html Normal file
View File

@@ -0,0 +1,735 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid py-2">
<div class="row">
<div class="ms-3">
<h3 class="mb-0 h4 font-weight-bolder">Dashboard</h3>
<p class="mb-4">
Check the sales, value and bounce rate by country.
</p>
</div>
<div class="col-xl-3 col-sm-6 mb-xl-0 mb-4">
<div class="card">
<div class="card-header p-2 ps-3">
<div class="d-flex justify-content-between">
<div>
<p class="text-sm mb-0 text-capitalize">Today's Money</p>
<h4 class="mb-0">$53k</h4>
</div>
<div class="icon icon-md icon-shape bg-gradient-dark shadow-dark shadow text-center border-radius-lg">
<i class="material-symbols-rounded opacity-10">weekend</i>
</div>
</div>
</div>
<hr class="dark horizontal my-0">
<div class="card-footer p-2 ps-3">
<p class="mb-0 text-sm"><span class="text-success font-weight-bolder">+55% </span>than last week</p>
</div>
</div>
</div>
<div class="col-xl-3 col-sm-6 mb-xl-0 mb-4">
<div class="card">
<div class="card-header p-2 ps-3">
<div class="d-flex justify-content-between">
<div>
<p class="text-sm mb-0 text-capitalize">Today's Users</p>
<h4 class="mb-0">2300</h4>
</div>
<div class="icon icon-md icon-shape bg-gradient-dark shadow-dark shadow text-center border-radius-lg">
<i class="material-symbols-rounded opacity-10">person</i>
</div>
</div>
</div>
<hr class="dark horizontal my-0">
<div class="card-footer p-2 ps-3">
<p class="mb-0 text-sm"><span class="text-success font-weight-bolder">+3% </span>than last month</p>
</div>
</div>
</div>
<div class="col-xl-3 col-sm-6 mb-xl-0 mb-4">
<div class="card">
<div class="card-header p-2 ps-3">
<div class="d-flex justify-content-between">
<div>
<p class="text-sm mb-0 text-capitalize">Ads Views</p>
<h4 class="mb-0">3,462</h4>
</div>
<div class="icon icon-md icon-shape bg-gradient-dark shadow-dark shadow text-center border-radius-lg">
<i class="material-symbols-rounded opacity-10">leaderboard</i>
</div>
</div>
</div>
<hr class="dark horizontal my-0">
<div class="card-footer p-2 ps-3">
<p class="mb-0 text-sm"><span class="text-danger font-weight-bolder">-2% </span>than yesterday</p>
</div>
</div>
</div>
<div class="col-xl-3 col-sm-6">
<div class="card">
<div class="card-header p-2 ps-3">
<div class="d-flex justify-content-between">
<div>
<p class="text-sm mb-0 text-capitalize">Sales</p>
<h4 class="mb-0">$103,430</h4>
</div>
<div class="icon icon-md icon-shape bg-gradient-dark shadow-dark shadow text-center border-radius-lg">
<i class="material-symbols-rounded opacity-10">weekend</i>
</div>
</div>
</div>
<hr class="dark horizontal my-0">
<div class="card-footer p-2 ps-3">
<p class="mb-0 text-sm"><span class="text-success font-weight-bolder">+5% </span>than yesterday</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-4 col-md-6 mt-4 mb-4">
<div class="card">
<div class="card-body">
<h6 class="mb-0 ">Website Views</h6>
<p class="text-sm ">Last Campaign Performance</p>
<div class="pe-2">
<div class="chart">
<canvas id="chart-bars" class="chart-canvas" height="170"></canvas>
</div>
</div>
<hr class="dark horizontal">
<div class="d-flex ">
<i class="material-symbols-rounded text-sm my-auto me-1">schedule</i>
<p class="mb-0 text-sm"> campaign sent 2 days ago </p>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6 mt-4 mb-4">
<div class="card ">
<div class="card-body">
<h6 class="mb-0 "> Daily Sales </h6>
<p class="text-sm "> (<span class="font-weight-bolder">+15%</span>) increase in today sales. </p>
<div class="pe-2">
<div class="chart">
<canvas id="chart-line" class="chart-canvas" height="170"></canvas>
</div>
</div>
<hr class="dark horizontal">
<div class="d-flex ">
<i class="material-symbols-rounded text-sm my-auto me-1">schedule</i>
<p class="mb-0 text-sm"> updated 4 min ago </p>
</div>
</div>
</div>
</div>
<div class="col-lg-4 mt-4 mb-3">
<div class="card">
<div class="card-body">
<h6 class="mb-0 ">Completed Tasks</h6>
<p class="text-sm ">Last Campaign Performance</p>
<div class="pe-2">
<div class="chart">
<canvas id="chart-line-tasks" class="chart-canvas" height="170"></canvas>
</div>
</div>
<hr class="dark horizontal">
<div class="d-flex ">
<i class="material-symbols-rounded text-sm my-auto me-1">schedule</i>
<p class="mb-0 text-sm">just updated</p>
</div>
</div>
</div>
</div>
</div>
<div class="row mb-4">
<div class="col-lg-8 col-md-6 mb-md-0 mb-4">
<div class="card">
<div class="card-header pb-0">
<div class="row">
<div class="col-lg-6 col-7">
<h6>Projects</h6>
<p class="text-sm mb-0">
<i class="fa fa-check text-info" aria-hidden="true"></i>
<span class="font-weight-bold ms-1">30 done</span> this month
</p>
</div>
<div class="col-lg-6 col-5 my-auto text-end">
<div class="dropdown float-lg-end pe-4">
<a class="cursor-pointer" id="dropdownTable" data-bs-toggle="dropdown" aria-expanded="false">
<i class="fa fa-ellipsis-v text-secondary"></i>
</a>
<ul class="dropdown-menu px-2 py-3 ms-sm-n4 ms-n5" aria-labelledby="dropdownTable">
<li><a class="dropdown-item border-radius-md" href="javascript:;">Action</a></li>
<li><a class="dropdown-item border-radius-md" href="javascript:;">Another action</a></li>
<li><a class="dropdown-item border-radius-md" href="javascript:;">Something else here</a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="card-body px-0 pb-2">
<div class="table-responsive">
<table class="table align-items-center mb-0">
<thead>
<tr>
<th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">Companies</th>
<th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7 ps-2">Members</th>
<th class="text-center text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">Budget</th>
<th class="text-center text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">Completion</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/small-logos/logo-xd.svg" %}" class="avatar avatar-sm me-3" alt="xd">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Material XD Version</h6>
</div>
</div>
</td>
<td>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Ryan Tompson">
<img src="{% static "assets/img/team-1.jpg" %}" alt="team1">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Romina Hadid">
<img src="{% static "assets/img/team-2.jpg" %}" alt="team2">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Alexander Smith">
<img src="{% static "assets/img/team-3.jpg" %}" alt="team3">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Jessica Doe">
<img src="{% static "assets/img/team-4.jpg" %}" alt="team4">
</a>
</div>
</td>
<td class="align-middle text-center text-sm">
<span class="text-xs font-weight-bold"> $14,000 </span>
</td>
<td class="align-middle">
<div class="progress-wrapper w-75 mx-auto">
<div class="progress-info">
<div class="progress-percentage">
<span class="text-xs font-weight-bold">60%</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-gradient-info w-60" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/small-logos/logo-atlassian.svg" %}" class="avatar avatar-sm me-3" alt="atlassian">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Add Progress Track</h6>
</div>
</div>
</td>
<td>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Romina Hadid">
<img src="{% static "assets/img/team-2.jpg" %}" alt="team5">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Jessica Doe">
<img src="{% static "assets/img/team-4.jpg" %}" alt="team6">
</a>
</div>
</td>
<td class="align-middle text-center text-sm">
<span class="text-xs font-weight-bold"> $3,000 </span>
</td>
<td class="align-middle">
<div class="progress-wrapper w-75 mx-auto">
<div class="progress-info">
<div class="progress-percentage">
<span class="text-xs font-weight-bold">10%</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-gradient-info w-10" role="progressbar" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/small-logos/logo-slack.svg" %}" class="avatar avatar-sm me-3" alt="team7">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Fix Platform Errors</h6>
</div>
</div>
</td>
<td>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Romina Hadid">
<img src="{% static "assets/img/team-3.jpg" %}" alt="team8">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Jessica Doe">
<img src="{% static "assets/img/team-1.jpg" %}" alt="team9">
</a>
</div>
</td>
<td class="align-middle text-center text-sm">
<span class="text-xs font-weight-bold"> Not set </span>
</td>
<td class="align-middle">
<div class="progress-wrapper w-75 mx-auto">
<div class="progress-info">
<div class="progress-percentage">
<span class="text-xs font-weight-bold">100%</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-gradient-success w-100" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/small-logos/logo-spotify.svg" %}" class="avatar avatar-sm me-3" alt="spotify">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Launch our Mobile App</h6>
</div>
</div>
</td>
<td>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Ryan Tompson">
<img src="{% static "assets/img/team-4.jpg" %}" alt="user1">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Romina Hadid">
<img src="{% static "assets/img/team-3.jpg" %}" alt="user2">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Alexander Smith">
<img src="{% static "assets/img/team-4.jpg" %}" alt="user3">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Jessica Doe">
<img src="{% static "assets/img/team-1.jpg" %}" alt="user4">
</a>
</div>
</td>
<td class="align-middle text-center text-sm">
<span class="text-xs font-weight-bold"> $20,500 </span>
</td>
<td class="align-middle">
<div class="progress-wrapper w-75 mx-auto">
<div class="progress-info">
<div class="progress-percentage">
<span class="text-xs font-weight-bold">100%</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-gradient-success w-100" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/small-logos/logo-jira.svg" %}" class="avatar avatar-sm me-3" alt="jira">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Add the New Pricing Page</h6>
</div>
</div>
</td>
<td>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Ryan Tompson">
<img src="{% static "assets/img/team-4.jpg" %}" alt="user5">
</a>
</div>
</td>
<td class="align-middle text-center text-sm">
<span class="text-xs font-weight-bold"> $500 </span>
</td>
<td class="align-middle">
<div class="progress-wrapper w-75 mx-auto">
<div class="progress-info">
<div class="progress-percentage">
<span class="text-xs font-weight-bold">25%</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-gradient-info w-25" role="progressbar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="25"></div>
</div>
</div>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/small-logos/logo-invision.svg" %}" class="avatar avatar-sm me-3" alt="invision">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Redesign New Online Shop</h6>
</div>
</div>
</td>
<td>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Ryan Tompson">
<img src="{% static "assets/img/team-1.jpg" %}" alt="user6">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Jessica Doe">
<img src="{% static "assets/img/team-4.jpg" %}" alt="user7">
</a>
</div>
</td>
<td class="align-middle text-center text-sm">
<span class="text-xs font-weight-bold"> $2,000 </span>
</td>
<td class="align-middle">
<div class="progress-wrapper w-75 mx-auto">
<div class="progress-info">
<div class="progress-percentage">
<span class="text-xs font-weight-bold">40%</span>
</div>
</div>
<div class="progress">
<div class="progress-bar bg-gradient-info w-40" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="40"></div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-6">
<div class="card h-100">
<div class="card-header pb-0">
<h6>Orders overview</h6>
<p class="text-sm">
<i class="fa fa-arrow-up text-success" aria-hidden="true"></i>
<span class="font-weight-bold">24%</span> this month
</p>
</div>
<div class="card-body p-3">
<div class="timeline timeline-one-side">
<div class="timeline-block mb-3">
<span class="timeline-step">
<i class="material-symbols-rounded text-success text-gradient">notifications</i>
</span>
<div class="timeline-content">
<h6 class="text-dark text-sm font-weight-bold mb-0">$2400, Design changes</h6>
<p class="text-secondary font-weight-bold text-xs mt-1 mb-0">22 DEC 7:20 PM</p>
</div>
</div>
<div class="timeline-block mb-3">
<span class="timeline-step">
<i class="material-symbols-rounded text-danger text-gradient">code</i>
</span>
<div class="timeline-content">
<h6 class="text-dark text-sm font-weight-bold mb-0">New order #1832412</h6>
<p class="text-secondary font-weight-bold text-xs mt-1 mb-0">21 DEC 11 PM</p>
</div>
</div>
<div class="timeline-block mb-3">
<span class="timeline-step">
<i class="material-symbols-rounded text-info text-gradient">shopping_cart</i>
</span>
<div class="timeline-content">
<h6 class="text-dark text-sm font-weight-bold mb-0">Server payments for April</h6>
<p class="text-secondary font-weight-bold text-xs mt-1 mb-0">21 DEC 9:34 PM</p>
</div>
</div>
<div class="timeline-block mb-3">
<span class="timeline-step">
<i class="material-symbols-rounded text-warning text-gradient">credit_card</i>
</span>
<div class="timeline-content">
<h6 class="text-dark text-sm font-weight-bold mb-0">New card added for order #4395133</h6>
<p class="text-secondary font-weight-bold text-xs mt-1 mb-0">20 DEC 2:20 AM</p>
</div>
</div>
<div class="timeline-block mb-3">
<span class="timeline-step">
<i class="material-symbols-rounded text-primary text-gradient">key</i>
</span>
<div class="timeline-content">
<h6 class="text-dark text-sm font-weight-bold mb-0">Unlock packages for development</h6>
<p class="text-secondary font-weight-bold text-xs mt-1 mb-0">18 DEC 4:54 AM</p>
</div>
</div>
<div class="timeline-block">
<span class="timeline-step">
<i class="material-symbols-rounded text-dark text-gradient">payments</i>
</span>
<div class="timeline-content">
<h6 class="text-dark text-sm font-weight-bold mb-0">New order #9583120</h6>
<p class="text-secondary font-weight-bold text-xs mt-1 mb-0">17 DEC</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% include "includes/footer.html" %}
</div>
{% endblock content %}
{% block extra_js %}
<script src="{% static "assets/js/plugins/chartjs.min.js" %}"></script>
<script>
var ctx = document.getElementById("chart-bars").getContext("2d");
new Chart(ctx, {
type: "bar",
data: {
labels: ["M", "T", "W", "T", "F", "S", "S"],
datasets: [{
label: "Views",
tension: 0.4,
borderWidth: 0,
borderRadius: 4,
borderSkipped: false,
backgroundColor: "#43A047",
data: [50, 45, 22, 28, 50, 60, 76],
barThickness: 'flex'
}, ],
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
display: false,
}
},
interaction: {
intersect: false,
mode: 'index',
},
scales: {
y: {
grid: {
drawBorder: false,
display: true,
drawOnChartArea: true,
drawTicks: false,
borderDash: [5, 5],
color: '#e5e5e5'
},
ticks: {
suggestedMin: 0,
suggestedMax: 500,
beginAtZero: true,
padding: 10,
font: {
size: 14,
lineHeight: 2
},
color: "#737373"
},
},
x: {
grid: {
drawBorder: false,
display: false,
drawOnChartArea: false,
drawTicks: false,
borderDash: [5, 5]
},
ticks: {
display: true,
color: '#737373',
padding: 10,
font: {
size: 14,
lineHeight: 2
},
}
},
},
},
});
var ctx2 = document.getElementById("chart-line").getContext("2d");
new Chart(ctx2, {
type: "line",
data: {
labels: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
datasets: [{
label: "Sales",
tension: 0,
borderWidth: 2,
pointRadius: 3,
pointBackgroundColor: "#43A047",
pointBorderColor: "transparent",
borderColor: "#43A047",
backgroundColor: "transparent",
fill: true,
data: [120, 230, 130, 440, 250, 360, 270, 180, 90, 300, 310, 220],
maxBarThickness: 6
}],
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
display: false,
},
tooltip: {
callbacks: {
title: function(context) {
const fullMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
return fullMonths[context[0].dataIndex];
}
}
}
},
interaction: {
intersect: false,
mode: 'index',
},
scales: {
y: {
grid: {
drawBorder: false,
display: true,
drawOnChartArea: true,
drawTicks: false,
borderDash: [4, 4],
color: '#e5e5e5'
},
ticks: {
display: true,
color: '#737373',
padding: 10,
font: {
size: 12,
lineHeight: 2
},
}
},
x: {
grid: {
drawBorder: false,
display: false,
drawOnChartArea: false,
drawTicks: false,
borderDash: [5, 5]
},
ticks: {
display: true,
color: '#737373',
padding: 10,
font: {
size: 12,
lineHeight: 2
},
}
},
},
},
});
var ctx3 = document.getElementById("chart-line-tasks").getContext("2d");
new Chart(ctx3, {
type: "line",
data: {
labels: ["Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
datasets: [{
label: "Tasks",
tension: 0,
borderWidth: 2,
pointRadius: 3,
pointBackgroundColor: "#43A047",
pointBorderColor: "transparent",
borderColor: "#43A047",
backgroundColor: "transparent",
fill: true,
data: [50, 40, 300, 220, 500, 250, 400, 230, 500],
maxBarThickness: 6
}],
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
display: false,
}
},
interaction: {
intersect: false,
mode: 'index',
},
scales: {
y: {
grid: {
drawBorder: false,
display: true,
drawOnChartArea: true,
drawTicks: false,
borderDash: [4, 4],
color: '#e5e5e5'
},
ticks: {
display: true,
padding: 10,
color: '#737373',
font: {
size: 14,
lineHeight: 2
},
}
},
x: {
grid: {
drawBorder: false,
display: false,
drawOnChartArea: false,
drawTicks: false,
borderDash: [4, 4]
},
ticks: {
display: true,
color: '#737373',
padding: 10,
font: {
size: 14,
lineHeight: 2
},
}
},
},
},
});
</script>
{% endblock extra_js %}

79
templates/pages/map.html Normal file
View File

@@ -0,0 +1,79 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid py-2">
<div class="row min-vh-80">
<div class="col-12">
<div class="card h-100">
<div class="card-header p-0 position-relative mt-n4 mx-3 z-index-2">
<div class="bg-gradient-primary shadow-primary border-radius-lg pt-4 pb-3">
<h5 class="text-white text-capitalize ps-3">Vector Map</h5>
</div>
</div>
<div class="card-body">
<div id="vector-map" class="mt-5 min-height-500"></div>
</div>
</div>
</div>
</div>
{% include "includes/footer.html" %}
</div>
{% endblock content %}
{% block extra_js %}
<script src="{% static "assets/js/plugins/world.js" %}"></script>
<script>
// Initialize the vector map
var map = new jsVectorMap({
selector: "#vector-map",
map: "world_merc",
zoomOnScroll: false,
zoomButtons: false,
selectedMarkers: [1, 3],
markersSelectable: true,
markers: [{
name: "USA",
coords: [40.71296415909766, -74.00437720027804]
},
{
name: "Germany",
coords: [51.17661451970939, 10.97947735117339]
},
{
name: "Brazil",
coords: [-7.596735421549542, -54.781694323779185]
},
{
name: "Russia",
coords: [62.318222797104276, 89.81564777631716]
},
{
name: "China",
coords: [22.320178999475512, 114.17161225541399],
style: {
fill: '#E91E63'
}
}
],
markerStyle: {
initial: {
fill: "#e91e63"
},
hover: {
fill: "E91E63"
},
selected: {
fill: "E91E63"
}
},
});
</script>
{% endblock extra_js %}

View File

@@ -0,0 +1,152 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid py-2">
<div class="row">
<div class="col-lg-8 col-md-10 mx-auto">
<div class="card mt-4">
<div class="card-header p-3">
<h5 class="mb-0">Alerts</h5>
</div>
<div class="card-body p-3 pb-0">
<div class="alert alert-primary alert-dismissible text-white" role="alert">
<span class="text-sm">A simple primary alert with <a href="javascript:;" class="alert-link text-white">an example link</a>. Give it a click if you like.</span>
<button type="button" class="btn-close text-lg py-3 opacity-10" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="alert alert-secondary alert-dismissible text-white" role="alert">
<span class="text-sm">A simple secondary alert with <a href="javascript:;" class="alert-link text-white">an example link</a>. Give it a click if you like.</span>
<button type="button" class="btn-close text-lg py-3 opacity-10" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="alert alert-success alert-dismissible text-white" role="alert">
<span class="text-sm">A simple success alert with <a href="javascript:;" class="alert-link text-white">an example link</a>. Give it a click if you like.</span>
<button type="button" class="btn-close text-lg py-3 opacity-10" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="alert alert-danger alert-dismissible text-white" role="alert">
<span class="text-sm">A simple danger alert with <a href="javascript:;" class="alert-link text-white">an example link</a>. Give it a click if you like.</span>
<button type="button" class="btn-close text-lg py-3 opacity-10" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="alert alert-warning alert-dismissible text-white" role="alert">
<span class="text-sm">A simple warning alert with <a href="javascript:;" class="alert-link text-white">an example link</a>. Give it a click if you like.</span>
<button type="button" class="btn-close text-lg py-3 opacity-10" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="alert alert-info alert-dismissible text-white" role="alert">
<span class="text-sm">A simple info alert with <a href="javascript:;" class="alert-link text-white">an example link</a>. Give it a click if you like.</span>
<button type="button" class="btn-close text-lg py-3 opacity-10" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="alert alert-light alert-dismissible text-white" role="alert">
<span class="text-sm">A simple light alert with <a href="javascript:;" class="alert-link text-white">an example link</a>. Give it a click if you like.</span>
<button type="button" class="btn-close text-lg py-3 opacity-10" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="alert alert-dark alert-dismissible text-white" role="alert">
<span class="text-sm">A simple dark alert with <a href="javascript:;" class="alert-link text-white">an example link</a>. Give it a click if you like.</span>
<button type="button" class="btn-close text-lg py-3 opacity-10" data-bs-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
</div>
</div>
<div class="card mt-4">
<div class="card-header p-3">
<h5 class="mb-0">Notifications</h5>
<p class="text-sm mb-0">
Notifications on this page use Toasts from Bootstrap. Read more details <a href="https://getbootstrap.com/docs/5.0/components/toasts/" target="
">here</a>.
</p>
</div>
<div class="card-body p-3">
<div class="row">
<div class="col-lg-3 col-sm-6 col-12">
<button class="btn bg-gradient-success w-100 mb-0 toast-btn" type="button" data-target="successToast">Success</button>
</div>
<div class="col-lg-3 col-sm-6 col-12 mt-sm-0 mt-2">
<button class="btn bg-gradient-info w-100 mb-0 toast-btn" type="button" data-target="infoToast">Info</button>
</div>
<div class="col-lg-3 col-sm-6 col-12 mt-lg-0 mt-2">
<button class="btn bg-gradient-warning w-100 mb-0 toast-btn" type="button" data-target="warningToast">Warning</button>
</div>
<div class="col-lg-3 col-sm-6 col-12 mt-lg-0 mt-2">
<button class="btn bg-gradient-danger w-100 mb-0 toast-btn" type="button" data-target="dangerToast">Danger</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="position-fixed bottom-1 end-1 z-index-2">
<div class="toast fade hide p-2 bg-white" role="alert" aria-live="assertive" id="successToast" aria-atomic="true">
<div class="toast-header border-0">
<i class="material-symbols-rounded text-success me-2">
check
</i>
<span class="me-auto font-weight-bold">Material Dashboard </span>
<small class="text-body">11 mins ago</small>
<i class="fas fa-times text-md ms-3 cursor-pointer" data-bs-dismiss="toast" aria-label="Close"></i>
</div>
<hr class="horizontal dark m-0">
<div class="toast-body">
Hello, world! This is a notification message.
</div>
</div>
<div class="toast fade hide p-2 mt-2 bg-gradient-info" role="alert" aria-live="assertive" id="infoToast" aria-atomic="true">
<div class="toast-header bg-transparent border-0">
<i class="material-symbols-rounded text-white me-2">
notifications
</i>
<span class="me-auto text-white font-weight-bold">Material Dashboard </span>
<small class="text-white">11 mins ago</small>
<i class="fas fa-times text-md text-white ms-3 cursor-pointer" data-bs-dismiss="toast" aria-label="Close"></i>
</div>
<hr class="horizontal light m-0">
<div class="toast-body text-white">
Hello, world! This is a notification message.
</div>
</div>
<div class="toast fade hide p-2 mt-2 bg-white" role="alert" aria-live="assertive" id="warningToast" aria-atomic="true">
<div class="toast-header border-0">
<i class="material-symbols-rounded text-warning me-2">
travel_explore
</i>
<span class="me-auto font-weight-bold">Material Dashboard </span>
<small class="text-body">11 mins ago</small>
<i class="fas fa-times text-md ms-3 cursor-pointer" data-bs-dismiss="toast" aria-label="Close"></i>
</div>
<hr class="horizontal dark m-0">
<div class="toast-body">
Hello, world! This is a notification message.
</div>
</div>
<div class="toast fade hide p-2 mt-2 bg-white" role="alert" aria-live="assertive" id="dangerToast" aria-atomic="true">
<div class="toast-header border-0">
<i class="material-symbols-rounded text-danger me-2">
campaign
</i>
<span class="me-auto text-gradient text-danger font-weight-bold">Material Dashboard </span>
<small class="text-body">11 mins ago</small>
<i class="fas fa-times text-md ms-3 cursor-pointer" data-bs-dismiss="toast" aria-label="Close"></i>
</div>
<hr class="horizontal dark m-0">
<div class="toast-body">
Hello, world! This is a notification message.
</div>
</div>
</div>
{% include "includes/footer.html" %}
</div>
{% endblock content %}

View File

@@ -0,0 +1,370 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid px-2 px-md-4">
<div class="page-header min-height-300 border-radius-xl mt-4" style="background-image: url('https://images.unsplash.com/photo-1531512073830-ba890ca4eba2?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=1920&q=80');">
<span class="mask bg-gradient-dark opacity-6"></span>
</div>
<div class="card card-body mx-2 mx-md-2 mt-n6">
<div class="row gx-4 mb-2">
<div class="col-auto">
<div class="avatar avatar-xl position-relative">
<img src="{% static "assets/img/bruce-mars.jpg" %}" alt="profile_image" class="w-100 border-radius-lg shadow-sm">
</div>
</div>
<div class="col-auto my-auto">
<div class="h-100">
<h5 class="mb-1">
Richard Davis
</h5>
<p class="mb-0 font-weight-normal text-sm">
CEO / Co-Founder
</p>
</div>
</div>
<div class="col-lg-4 col-md-6 my-sm-auto ms-sm-auto me-sm-0 mx-auto mt-3">
<div class="nav-wrapper position-relative end-0">
<ul class="nav nav-pills nav-fill p-1" role="tablist">
<li class="nav-item">
<a class="nav-link mb-0 px-0 py-1 active " data-bs-toggle="tab" href="javascript:;" role="tab" aria-selected="true">
<i class="material-symbols-rounded text-lg position-relative">home</i>
<span class="ms-1">App</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link mb-0 px-0 py-1 " data-bs-toggle="tab" href="javascript:;" role="tab" aria-selected="false">
<i class="material-symbols-rounded text-lg position-relative">email</i>
<span class="ms-1">Messages</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link mb-0 px-0 py-1 " data-bs-toggle="tab" href="javascript:;" role="tab" aria-selected="false">
<i class="material-symbols-rounded text-lg position-relative">settings</i>
<span class="ms-1">Settings</span>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="row">
<div class="row">
<div class="col-12 col-xl-4">
<div class="card card-plain h-100">
<div class="card-header pb-0 p-3">
<h6 class="mb-0">Platform Settings</h6>
</div>
<div class="card-body p-3">
<h6 class="text-uppercase text-body text-xs font-weight-bolder">Account</h6>
<ul class="list-group">
<li class="list-group-item border-0 px-0">
<div class="form-check form-switch ps-0">
<input class="form-check-input ms-auto" type="checkbox" id="flexSwitchCheckDefault" checked>
<label class="form-check-label text-body ms-3 text-truncate w-80 mb-0" for="flexSwitchCheckDefault">Email me when someone follows me</label>
</div>
</li>
<li class="list-group-item border-0 px-0">
<div class="form-check form-switch ps-0">
<input class="form-check-input ms-auto" type="checkbox" id="flexSwitchCheckDefault1">
<label class="form-check-label text-body ms-3 text-truncate w-80 mb-0" for="flexSwitchCheckDefault1">Email me when someone answers on my post</label>
</div>
</li>
<li class="list-group-item border-0 px-0">
<div class="form-check form-switch ps-0">
<input class="form-check-input ms-auto" type="checkbox" id="flexSwitchCheckDefault2" checked>
<label class="form-check-label text-body ms-3 text-truncate w-80 mb-0" for="flexSwitchCheckDefault2">Email me when someone mentions me</label>
</div>
</li>
</ul>
<h6 class="text-uppercase text-body text-xs font-weight-bolder mt-4">Application</h6>
<ul class="list-group">
<li class="list-group-item border-0 px-0">
<div class="form-check form-switch ps-0">
<input class="form-check-input ms-auto" type="checkbox" id="flexSwitchCheckDefault3">
<label class="form-check-label text-body ms-3 text-truncate w-80 mb-0" for="flexSwitchCheckDefault3">New launches and projects</label>
</div>
</li>
<li class="list-group-item border-0 px-0">
<div class="form-check form-switch ps-0">
<input class="form-check-input ms-auto" type="checkbox" id="flexSwitchCheckDefault4" checked>
<label class="form-check-label text-body ms-3 text-truncate w-80 mb-0" for="flexSwitchCheckDefault4">Monthly product updates</label>
</div>
</li>
<li class="list-group-item border-0 px-0 pb-0">
<div class="form-check form-switch ps-0">
<input class="form-check-input ms-auto" type="checkbox" id="flexSwitchCheckDefault5">
<label class="form-check-label text-body ms-3 text-truncate w-80 mb-0" for="flexSwitchCheckDefault5">Subscribe to newsletter</label>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="col-12 col-xl-4">
<div class="card card-plain h-100">
<div class="card-header pb-0 p-3">
<div class="row">
<div class="col-md-8 d-flex align-items-center">
<h6 class="mb-0">Profile Information</h6>
</div>
<div class="col-md-4 text-end">
<a href="javascript:;">
<i class="fas fa-user-edit text-secondary text-sm" data-bs-toggle="tooltip" data-bs-placement="top" title="Edit Profile"></i>
</a>
</div>
</div>
</div>
<div class="card-body p-3">
<p class="text-sm">
Hi, Im Alec Thompson, Decisions: If you cant decide, the answer is no. If two equally difficult paths, choose the one more painful in the short term (pain avoidance is creating an illusion of equality).
</p>
<hr class="horizontal gray-light my-4">
<ul class="list-group">
<li class="list-group-item border-0 ps-0 pt-0 text-sm"><strong class="text-dark">Full Name:</strong> &nbsp; Alec M. Thompson</li>
<li class="list-group-item border-0 ps-0 text-sm"><strong class="text-dark">Mobile:</strong> &nbsp; (44) 123 1234 123</li>
<li class="list-group-item border-0 ps-0 text-sm"><strong class="text-dark">Email:</strong> &nbsp; alecthompson@mail.com</li>
<li class="list-group-item border-0 ps-0 text-sm"><strong class="text-dark">Location:</strong> &nbsp; USA</li>
<li class="list-group-item border-0 ps-0 pb-0">
<strong class="text-dark text-sm">Social:</strong> &nbsp;
<a class="btn btn-facebook btn-simple mb-0 ps-1 pe-2 py-0" href="javascript:;">
<i class="fab fa-facebook fa-lg"></i>
</a>
<a class="btn btn-twitter btn-simple mb-0 ps-1 pe-2 py-0" href="javascript:;">
<i class="fab fa-twitter fa-lg"></i>
</a>
<a class="btn btn-instagram btn-simple mb-0 ps-1 pe-2 py-0" href="javascript:;">
<i class="fab fa-instagram fa-lg"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="col-12 col-xl-4">
<div class="card card-plain h-100">
<div class="card-header pb-0 p-3">
<h6 class="mb-0">Conversations</h6>
</div>
<div class="card-body p-3">
<ul class="list-group">
<li class="list-group-item border-0 d-flex align-items-center px-0 mb-2 pt-0">
<div class="avatar me-3">
<img src="{% static "assets/img/kal-visuals-square.jpg" %}" alt="kal" class="border-radius-lg shadow">
</div>
<div class="d-flex align-items-start flex-column justify-content-center">
<h6 class="mb-0 text-sm">Sophie B.</h6>
<p class="mb-0 text-xs">Hi! I need more information..</p>
</div>
<a class="btn btn-link pe-3 ps-0 mb-0 ms-auto w-25 w-md-auto" href="javascript:;">Reply</a>
</li>
<li class="list-group-item border-0 d-flex align-items-center px-0 mb-2">
<div class="avatar me-3">
<img src="{% static "assets/img/marie.jpg" %}" alt="kal" class="border-radius-lg shadow">
</div>
<div class="d-flex align-items-start flex-column justify-content-center">
<h6 class="mb-0 text-sm">Anne Marie</h6>
<p class="mb-0 text-xs">Awesome work, can you..</p>
</div>
<a class="btn btn-link pe-3 ps-0 mb-0 ms-auto w-25 w-md-auto" href="javascript:;">Reply</a>
</li>
<li class="list-group-item border-0 d-flex align-items-center px-0 mb-2">
<div class="avatar me-3">
<img src="{% static "assets/img/ivana-square.jpg" %}" alt="kal" class="border-radius-lg shadow">
</div>
<div class="d-flex align-items-start flex-column justify-content-center">
<h6 class="mb-0 text-sm">Ivanna</h6>
<p class="mb-0 text-xs">About files I can..</p>
</div>
<a class="btn btn-link pe-3 ps-0 mb-0 ms-auto w-25 w-md-auto" href="javascript:;">Reply</a>
</li>
<li class="list-group-item border-0 d-flex align-items-center px-0 mb-2">
<div class="avatar me-3">
<img src="{% static "assets/img/team-4.jpg" %}" alt="kal" class="border-radius-lg shadow">
</div>
<div class="d-flex align-items-start flex-column justify-content-center">
<h6 class="mb-0 text-sm">Peterson</h6>
<p class="mb-0 text-xs">Have a great afternoon..</p>
</div>
<a class="btn btn-link pe-3 ps-0 mb-0 ms-auto w-25 w-md-auto" href="javascript:;">Reply</a>
</li>
<li class="list-group-item border-0 d-flex align-items-center px-0">
<div class="avatar me-3">
<img src="{% static "assets/img/team-3.jpg" %}" alt="kal" class="border-radius-lg shadow">
</div>
<div class="d-flex align-items-start flex-column justify-content-center">
<h6 class="mb-0 text-sm">Nick Daniel</h6>
<p class="mb-0 text-xs">Hi! I need more information..</p>
</div>
<a class="btn btn-link pe-3 ps-0 mb-0 ms-auto w-25 w-md-auto" href="javascript:;">Reply</a>
</li>
</ul>
</div>
</div>
</div>
<div class="col-12 mt-4">
<div class="mb-5 ps-3">
<h6 class="mb-1">Projects</h6>
<p class="text-sm">Architects design houses</p>
</div>
<div class="row">
<div class="col-xl-3 col-md-6 mb-xl-0 mb-4">
<div class="card card-blog card-plain">
<div class="card-header p-0 m-2">
<a class="d-block shadow-xl border-radius-xl">
<img src="{% static "assets/img/home-decor-1.jpg" %}" alt="img-blur-shadow" class="img-fluid shadow border-radius-lg">
</a>
</div>
<div class="card-body p-3">
<p class="mb-0 text-sm">Project #2</p>
<a href="javascript:;">
<h5>
Modern
</h5>
</a>
<p class="mb-4 text-sm">
As Uber works through a huge amount of internal management turmoil.
</p>
<div class="d-flex align-items-center justify-content-between">
<button type="button" class="btn btn-outline-primary btn-sm mb-0">View Project</button>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Elena Morison">
<img alt="Image placeholder" src="{% static "assets/img/team-1.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Ryan Milly">
<img alt="Image placeholder" src="{% static "assets/img/team-2.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Nick Daniel">
<img alt="Image placeholder" src="{% static "assets/img/team-3.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Peterson">
<img alt="Image placeholder" src="{% static "assets/img/team-4.jpg" %}">
</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-xl-0 mb-4">
<div class="card card-blog card-plain">
<div class="card-header p-0 m-2">
<a class="d-block shadow-xl border-radius-xl">
<img src="{% static "assets/img/home-decor-2.jpg" %}" alt="img-blur-shadow" class="img-fluid shadow border-radius-lg">
</a>
</div>
<div class="card-body p-3">
<p class="mb-0 text-sm">Project #1</p>
<a href="javascript:;">
<h5>
Scandinavian
</h5>
</a>
<p class="mb-4 text-sm">
Music is something that every person has his or her own specific opinion about.
</p>
<div class="d-flex align-items-center justify-content-between">
<button type="button" class="btn btn-outline-primary btn-sm mb-0">View Project</button>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Nick Daniel">
<img alt="Image placeholder" src="{% static "assets/img/team-3.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Peterson">
<img alt="Image placeholder" src="{% static "assets/img/team-4.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Elena Morison">
<img alt="Image placeholder" src="{% static "assets/img/team-1.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Ryan Milly">
<img alt="Image placeholder" src="{% static "assets/img/team-2.jpg" %}">
</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-xl-0 mb-4">
<div class="card card-blog card-plain">
<div class="card-header p-0 m-2">
<a class="d-block shadow-xl border-radius-xl">
<img src="{% static "assets/img/home-decor-3.jpg" %}" alt="img-blur-shadow" class="img-fluid shadow border-radius-lg">
</a>
</div>
<div class="card-body p-3">
<p class="mb-0 text-sm">Project #3</p>
<a href="javascript:;">
<h5>
Minimalist
</h5>
</a>
<p class="mb-4 text-sm">
Different people have different taste, and various types of music. Music is life.
</p>
<div class="d-flex align-items-center justify-content-between">
<button type="button" class="btn btn-outline-primary btn-sm mb-0">View Project</button>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Peterson">
<img alt="Image placeholder" src="{% static "assets/img/team-4.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Nick Daniel">
<img alt="Image placeholder" src="{% static "assets/img/team-3.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Ryan Milly">
<img alt="Image placeholder" src="{% static "assets/img/team-2.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Elena Morison">
<img alt="Image placeholder" src="{% static "assets/img/team-1.jpg" %}">
</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 mb-xl-0 mb-4">
<div class="card card-blog card-plain">
<div class="card-header p-0 m-2">
<a class="d-block shadow-xl border-radius-xl">
<img src="https://images.unsplash.com/photo-1606744824163-985d376605aa?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80" alt="img-blur-shadow" class="img-fluid shadow border-radius-lg">
</a>
</div>
<div class="card-body p-3">
<p class="mb-0 text-sm">Project #4</p>
<a href="javascript:;">
<h5>
Gothic
</h5>
</a>
<p class="mb-4 text-sm">
Why would anyone pick blue over pink? Pink is obviously a better color.
</p>
<div class="d-flex align-items-center justify-content-between">
<button type="button" class="btn btn-outline-primary btn-sm mb-0">View Project</button>
<div class="avatar-group mt-2">
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Peterson">
<img alt="Image placeholder" src="{% static "assets/img/team-4.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Nick Daniel">
<img alt="Image placeholder" src="{% static "assets/img/team-3.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Ryan Milly">
<img alt="Image placeholder" src="{% static "assets/img/team-2.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-xs rounded-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" title="Elena Morison">
<img alt="Image placeholder" src="{% static "assets/img/team-1.jpg" %}">
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% include "includes/footer.html" %}
</div>
{% endblock content %}

1009
templates/pages/rtl.html Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,96 @@
{% extends "layouts/base-auth.html" %}
{% load static %}
{% block body %} bg-gray-200 {% endblock body %}
{% block content %}
<main class="main-content mt-0">
<div class="page-header align-items-start min-vh-100" style="background-image: url('https://images.unsplash.com/photo-1497294815431-9365093b7331?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1950&q=80');">
<span class="mask bg-gradient-dark opacity-6"></span>
<div class="container my-auto">
<div class="row">
<div class="col-lg-4 col-md-8 col-12 mx-auto">
<div class="card z-index-0 fadeIn3 fadeInBottom">
<div class="card-header p-0 position-relative mt-n4 mx-3 z-index-2">
<div class="bg-gradient-dark shadow-dark border-radius-lg py-3 pe-1">
<h4 class="text-white font-weight-bolder text-center mt-2 mb-0">Sign in</h4>
<div class="row mt-3">
<div class="col-2 text-center ms-auto">
<a class="btn btn-link px-3" href="javascript:;">
<i class="fab fa-facebook text-white text-lg"></i>
</a>
</div>
<div class="col-2 text-center px-1">
<a class="btn btn-link px-3" href="javascript:;">
<i class="fab fa-github text-white text-lg"></i>
</a>
</div>
<div class="col-2 text-center me-auto">
<a class="btn btn-link px-3" href="javascript:;">
<i class="fab fa-google text-white text-lg"></i>
</a>
</div>
</div>
</div>
</div>
<div class="card-body">
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
<small class="text-danger mb-3">{{ error }}</small>
{% endfor %}
{% endif %}
<form method="post" role="form" class="text-start">
{% csrf_token %}
{% for field in form %}
<div class="input-group input-group-outline my-3">
<label class="form-label">{{ field.label }}</label>
{{ field }}
</div>
{% endfor %}
<div class="form-check form-switch d-flex align-items-center mb-3">
<input class="form-check-input" type="checkbox" id="rememberMe" checked>
<label class="form-check-label mb-0 ms-3" for="rememberMe">Remember me</label>
</div>
<div class="text-center">
<button type="submit" class="btn bg-gradient-dark w-100 my-4 mb-2">Sign in</button>
</div>
<p class="mt-4 text-sm text-center">
Don't have an account?
<a href="{% url "register" %}" class="text-primary text-gradient font-weight-bold">Sign up</a>
</p>
</form>
</div>
</div>
</div>
</div>
</div>
<footer class="footer position-absolute bottom-2 py-2 w-100">
<div class="container">
<div class="row align-items-center justify-content-lg-between">
<div class="col-12 col-md-6 my-auto">
<div class="copyright text-center text-sm text-white text-lg-start">
&copy; Creative-Tim coded by <a href="https://app-generator.dev" class="font-weight-bold">App Generator</a>.
</div>
</div>
<div class="col-12 col-md-6">
<ul class="nav nav-footer justify-content-center justify-content-lg-end">
<li class="nav-item">
<a href="https://app-generator.dev/product/material-dashboard/django/" class="nav-link text-white">Download</a>
</li>
<li class="nav-item">
<a href="https://app-generator.dev/docs/products/django/material-dashboard/index.html" class="nav-link text-white">Documentation</a>
</li>
<li class="nav-item">
<a href="https://app-generator.dev/product/material-dashboard-pro/django/" class="nav-link text-white">PRO Version</a>
</li>
</ul>
</div>
</div>
</div>
</footer>
</div>
</main>
{% endblock content %}

View File

@@ -0,0 +1,56 @@
{% extends "layouts/base-auth.html" %}
{% load static %}
{% block content %}
<main class="main-content mt-0">
<section>
<div class="page-header min-vh-100">
<div class="container">
<div class="row">
<div class="col-6 d-lg-flex d-none h-100 my-auto pe-0 position-absolute top-0 start-0 text-center justify-content-center flex-column">
<div class="position-relative bg-gradient-primary h-100 m-3 px-7 border-radius-lg d-flex flex-column justify-content-center" style="background-image: url('{% static "assets/img/illustrations/illustration-signup.jpg" %}'); background-size: cover;">
</div>
</div>
<div class="col-xl-4 col-lg-5 col-md-7 d-flex flex-column ms-auto me-auto ms-lg-auto me-lg-5">
<div class="card card-plain">
<div class="card-header">
<h4 class="font-weight-bolder">Sign Up</h4>
<p class="mb-0">Enter your email and password to register</p>
</div>
<div class="card-body">
<form method="post" role="form">
{% csrf_token %}
{% for field in form %}
<div class="input-group input-group-outline mb-3">
<label class="form-label">{{ field.label }}</label>
{{ field }}
</div>
{% endfor %}
<div class="form-check form-check-info text-start ps-0">
<input class="form-check-input" type="checkbox" value="" id="flexCheckDefault" checked>
<label class="form-check-label" for="flexCheckDefault">
I agree the <a href="javascript:;" class="text-dark font-weight-bolder">Terms and Conditions</a>
</label>
</div>
<div class="text-center">
<button type="submit" class="btn btn-lg bg-gradient-dark btn-lg w-100 mt-4 mb-0">Sign Up</button>
</div>
</form>
</div>
<div class="card-footer text-center pt-0 px-lg-2 px-1">
<p class="mb-2 text-sm mx-auto">
Already have an account?
<a href="{% url "login" %}" class="text-primary text-gradient font-weight-bold">Sign in</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</main>
{% endblock content %}

432
templates/pages/tables.html Normal file
View File

@@ -0,0 +1,432 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid py-2">
<div class="row">
<div class="col-12">
<div class="card my-4">
<div class="card-header p-0 position-relative mt-n4 mx-3 z-index-2">
<div class="bg-gradient-dark shadow-dark border-radius-lg pt-4 pb-3">
<h6 class="text-white text-capitalize ps-3">Authors table</h6>
</div>
</div>
<div class="card-body px-0 pb-2">
<div class="table-responsive p-0">
<table class="table align-items-center mb-0">
<thead>
<tr>
<th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">Author</th>
<th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7 ps-2">Function</th>
<th class="text-center text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">Status</th>
<th class="text-center text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">Employed</th>
<th class="text-secondary opacity-7"></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/team-2.jpg" %}" class="avatar avatar-sm me-3 border-radius-lg" alt="user1">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">John Michael</h6>
<p class="text-xs text-secondary mb-0">john@creative-tim.com</p>
</div>
</div>
</td>
<td>
<p class="text-xs font-weight-bold mb-0">Manager</p>
<p class="text-xs text-secondary mb-0">Organization</p>
</td>
<td class="align-middle text-center text-sm">
<span class="badge badge-sm bg-gradient-success">Online</span>
</td>
<td class="align-middle text-center">
<span class="text-secondary text-xs font-weight-bold">23/04/18</span>
</td>
<td class="align-middle">
<a href="javascript:;" class="text-secondary font-weight-bold text-xs" data-toggle="tooltip" data-original-title="Edit user">
Edit
</a>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/team-3.jpg" %}" class="avatar avatar-sm me-3 border-radius-lg" alt="user2">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Alexa Liras</h6>
<p class="text-xs text-secondary mb-0">alexa@creative-tim.com</p>
</div>
</div>
</td>
<td>
<p class="text-xs font-weight-bold mb-0">Programator</p>
<p class="text-xs text-secondary mb-0">Developer</p>
</td>
<td class="align-middle text-center text-sm">
<span class="badge badge-sm bg-gradient-secondary">Offline</span>
</td>
<td class="align-middle text-center">
<span class="text-secondary text-xs font-weight-bold">11/01/19</span>
</td>
<td class="align-middle">
<a href="javascript:;" class="text-secondary font-weight-bold text-xs" data-toggle="tooltip" data-original-title="Edit user">
Edit
</a>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/team-4.jpg" %}" class="avatar avatar-sm me-3 border-radius-lg" alt="user3">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Laurent Perrier</h6>
<p class="text-xs text-secondary mb-0">laurent@creative-tim.com</p>
</div>
</div>
</td>
<td>
<p class="text-xs font-weight-bold mb-0">Executive</p>
<p class="text-xs text-secondary mb-0">Projects</p>
</td>
<td class="align-middle text-center text-sm">
<span class="badge badge-sm bg-gradient-success">Online</span>
</td>
<td class="align-middle text-center">
<span class="text-secondary text-xs font-weight-bold">19/09/17</span>
</td>
<td class="align-middle">
<a href="javascript:;" class="text-secondary font-weight-bold text-xs" data-toggle="tooltip" data-original-title="Edit user">
Edit
</a>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/team-3.jpg" %}" class="avatar avatar-sm me-3 border-radius-lg" alt="user4">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Michael Levi</h6>
<p class="text-xs text-secondary mb-0">michael@creative-tim.com</p>
</div>
</div>
</td>
<td>
<p class="text-xs font-weight-bold mb-0">Programator</p>
<p class="text-xs text-secondary mb-0">Developer</p>
</td>
<td class="align-middle text-center text-sm">
<span class="badge badge-sm bg-gradient-success">Online</span>
</td>
<td class="align-middle text-center">
<span class="text-secondary text-xs font-weight-bold">24/12/08</span>
</td>
<td class="align-middle">
<a href="javascript:;" class="text-secondary font-weight-bold text-xs" data-toggle="tooltip" data-original-title="Edit user">
Edit
</a>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/team-2.jpg" %}" class="avatar avatar-sm me-3 border-radius-lg" alt="user5">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Richard Gran</h6>
<p class="text-xs text-secondary mb-0">richard@creative-tim.com</p>
</div>
</div>
</td>
<td>
<p class="text-xs font-weight-bold mb-0">Manager</p>
<p class="text-xs text-secondary mb-0">Executive</p>
</td>
<td class="align-middle text-center text-sm">
<span class="badge badge-sm bg-gradient-secondary">Offline</span>
</td>
<td class="align-middle text-center">
<span class="text-secondary text-xs font-weight-bold">04/10/21</span>
</td>
<td class="align-middle">
<a href="javascript:;" class="text-secondary font-weight-bold text-xs" data-toggle="tooltip" data-original-title="Edit user">
Edit
</a>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2 py-1">
<div>
<img src="{% static "assets/img/team-4.jpg" %}" class="avatar avatar-sm me-3 border-radius-lg" alt="user6">
</div>
<div class="d-flex flex-column justify-content-center">
<h6 class="mb-0 text-sm">Miriam Eric</h6>
<p class="text-xs text-secondary mb-0">miriam@creative-tim.com</p>
</div>
</div>
</td>
<td>
<p class="text-xs font-weight-bold mb-0">Programator</p>
<p class="text-xs text-secondary mb-0">Developer</p>
</td>
<td class="align-middle text-center text-sm">
<span class="badge badge-sm bg-gradient-secondary">Offline</span>
</td>
<td class="align-middle text-center">
<span class="text-secondary text-xs font-weight-bold">14/09/20</span>
</td>
<td class="align-middle">
<a href="javascript:;" class="text-secondary font-weight-bold text-xs" data-toggle="tooltip" data-original-title="Edit user">
Edit
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card my-4">
<div class="card-header p-0 position-relative mt-n4 mx-3 z-index-2">
<div class="bg-gradient-dark shadow-dark border-radius-lg pt-4 pb-3">
<h6 class="text-white text-capitalize ps-3">Projects table</h6>
</div>
</div>
<div class="card-body px-0 pb-2">
<div class="table-responsive p-0">
<table class="table align-items-center justify-content-center mb-0">
<thead>
<tr>
<th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7">Project</th>
<th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7 ps-2">Budget</th>
<th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7 ps-2">Status</th>
<th class="text-uppercase text-secondary text-xxs font-weight-bolder text-center opacity-7 ps-2">Completion</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<div class="d-flex px-2">
<div>
<img src="{% static "assets/img/small-logos/logo-asana.svg" %}" class="avatar avatar-sm rounded-circle me-2" alt="spotify">
</div>
<div class="my-auto">
<h6 class="mb-0 text-sm">Asana</h6>
</div>
</div>
</td>
<td>
<p class="text-sm font-weight-bold mb-0">$2,500</p>
</td>
<td>
<span class="text-xs font-weight-bold">working</span>
</td>
<td class="align-middle text-center">
<div class="d-flex align-items-center justify-content-center">
<span class="me-2 text-xs font-weight-bold">60%</span>
<div>
<div class="progress">
<div class="progress-bar bg-gradient-info" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;"></div>
</div>
</div>
</div>
</td>
<td class="align-middle">
<button class="btn btn-link text-secondary mb-0">
<i class="fa fa-ellipsis-v text-xs"></i>
</button>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2">
<div>
<img src="{% static "assets/img/small-logos/github.svg" %}" class="avatar avatar-sm rounded-circle me-2" alt="invision">
</div>
<div class="my-auto">
<h6 class="mb-0 text-sm">Github</h6>
</div>
</div>
</td>
<td>
<p class="text-sm font-weight-bold mb-0">$5,000</p>
</td>
<td>
<span class="text-xs font-weight-bold">done</span>
</td>
<td class="align-middle text-center">
<div class="d-flex align-items-center justify-content-center">
<span class="me-2 text-xs font-weight-bold">100%</span>
<div>
<div class="progress">
<div class="progress-bar bg-gradient-success" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%;"></div>
</div>
</div>
</div>
</td>
<td class="align-middle">
<button class="btn btn-link text-secondary mb-0" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-ellipsis-v text-xs"></i>
</button>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2">
<div>
<img src="{% static "assets/img/small-logos/logo-atlassian.svg" %}" class="avatar avatar-sm rounded-circle me-2" alt="jira">
</div>
<div class="my-auto">
<h6 class="mb-0 text-sm">Atlassian</h6>
</div>
</div>
</td>
<td>
<p class="text-sm font-weight-bold mb-0">$3,400</p>
</td>
<td>
<span class="text-xs font-weight-bold">canceled</span>
</td>
<td class="align-middle text-center">
<div class="d-flex align-items-center justify-content-center">
<span class="me-2 text-xs font-weight-bold">30%</span>
<div>
<div class="progress">
<div class="progress-bar bg-gradient-danger" role="progressbar" aria-valuenow="30" aria-valuemin="0" aria-valuemax="30" style="width: 30%;"></div>
</div>
</div>
</div>
</td>
<td class="align-middle">
<button class="btn btn-link text-secondary mb-0" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-ellipsis-v text-xs"></i>
</button>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2">
<div>
<img src="{% static "assets/img/small-logos/bootstrap.svg" %}" class="avatar avatar-sm rounded-circle me-2" alt="webdev">
</div>
<div class="my-auto">
<h6 class="mb-0 text-sm">Bootstrap</h6>
</div>
</div>
</td>
<td>
<p class="text-sm font-weight-bold mb-0">$14,000</p>
</td>
<td>
<span class="text-xs font-weight-bold">working</span>
</td>
<td class="align-middle text-center">
<div class="d-flex align-items-center justify-content-center">
<span class="me-2 text-xs font-weight-bold">80%</span>
<div>
<div class="progress">
<div class="progress-bar bg-gradient-info" role="progressbar" aria-valuenow="80" aria-valuemin="0" aria-valuemax="80" style="width: 80%;"></div>
</div>
</div>
</div>
</td>
<td class="align-middle">
<button class="btn btn-link text-secondary mb-0" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-ellipsis-v text-xs"></i>
</button>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2">
<div>
<img src="{% static "assets/img/small-logos/logo-slack.svg" %}" class="avatar avatar-sm rounded-circle me-2" alt="slack">
</div>
<div class="my-auto">
<h6 class="mb-0 text-sm">Slack</h6>
</div>
</div>
</td>
<td>
<p class="text-sm font-weight-bold mb-0">$1,000</p>
</td>
<td>
<span class="text-xs font-weight-bold">canceled</span>
</td>
<td class="align-middle text-center">
<div class="d-flex align-items-center justify-content-center">
<span class="me-2 text-xs font-weight-bold">0%</span>
<div>
<div class="progress">
<div class="progress-bar bg-gradient-success" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="0" style="width: 0%;"></div>
</div>
</div>
</div>
</td>
<td class="align-middle">
<button class="btn btn-link text-secondary mb-0" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-ellipsis-v text-xs"></i>
</button>
</td>
</tr>
<tr>
<td>
<div class="d-flex px-2">
<div>
<img src="{% static "assets/img/small-logos/devto.svg" %}" class="avatar avatar-sm rounded-circle me-2" alt="xd">
</div>
<div class="my-auto">
<h6 class="mb-0 text-sm">Devto</h6>
</div>
</div>
</td>
<td>
<p class="text-sm font-weight-bold mb-0">$2,300</p>
</td>
<td>
<span class="text-xs font-weight-bold">done</span>
</td>
<td class="align-middle text-center">
<div class="d-flex align-items-center justify-content-center">
<span class="me-2 text-xs font-weight-bold">100%</span>
<div>
<div class="progress">
<div class="progress-bar bg-gradient-success" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%;"></div>
</div>
</div>
</div>
</td>
<td class="align-middle">
<button class="btn btn-link text-secondary mb-0" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-ellipsis-v text-xs"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{% include "includes/footer.html" %}
</div>
{% endblock content %}

View File

@@ -0,0 +1,10 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid py-2">
{% include "includes/footer.html" %}
</div>
{% endblock content %}

View File

@@ -0,0 +1,47 @@
{% extends "layouts/base.html" %}
{% load static %}
{% block content %}
<div class="container-fluid py-2">
<div class="row min-vh-80">
<div class="col-12">
<div class="card mt-4">
<div class="card-header p-0 position-relative mt-n4 mx-3 z-index-2">
<div class="bg-gradient-primary shadow-primary border-radius-lg pt-4 pb-3">
<h6 class="text-white text-capitalize ps-3">Material Dashboard Heading</h6>
<p class="mb-0 text-white ps-3">Created using Roboto Slab Font Family
</p>
</div>
</div>
<div class="card-body px-5">
<h1>h1. Bootstrap heading</h1>
<h2>h2. Bootstrap heading</h2>
<h3>h3. Bootstrap heading</h3>
<h4>h4. Bootstrap heading</h4>
<h5>h5. Bootstrap heading</h5>
<h6>h6. Bootstrap heading</h6>
<p>You can use the mark tag to <mark>highlight</mark> text.</p>
<p><del>This line of text is meant to be treated as deleted text.</del></p>
<p><s>This line of text is meant to be treated as no longer accurate.</s></p>
<p><ins>This line of text is meant to be treated as an addition to the document.</ins></p>
<p><u>This line of text will render as underlined</u></p>
<p><small>This line of text is meant to be treated as fine print.</small></p>
<p><strong>This line rendered as bold text.</strong></p>
<p><em>This line rendered as italicized text.</em></p>
<figure>
<blockquote class="blockquote">
<p class="ps-2">Because Im here to follow my dreams and inspire other people to follow their dreams, too.</p>
</blockquote>
<figcaption class="blockquote-footer ps-3">
Someone famous in <cite title="Source Title">Source Title</cite>
</figcaption>
</figure>
</div>
</div>
</div>
</div>
{% include "includes/footer.html" %}
</div>
{% endblock content %}

View File

@@ -0,0 +1,165 @@
<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
{% include "includes/head.html" %}
</head>
<body class="g-sidenav-show bg-gray-100 virtual-reality">
<div class="mt-n3">
<!-- Navbar -->
{% include "includes/navigation.html" %}
<!-- End Navbar -->
</div>
<div class="border-radius-xl mx-2 mx-md-3 position-relative" style="background-image: url('{% static "assets/img/vr-bg.jpg" %}'); background-size: cover;">
{% include "includes/sidebar.html" %}
<main class="main-content border-radius-lg h-100">
<div class="section min-vh-85 position-relative transform-scale-0 transform-scale-md-7">
<div class="container-fluid">
<div class="row pt-10">
<div class="col-lg-1 col-md-1 pt-5 pt-lg-0 ms-lg-5 text-center">
<a href="javascript:;" class="avatar avatar-lg border-0 p-1" data-bs-toggle="tooltip" data-bs-placement="right" title="My Profile">
<img class="border-radius-lg" alt="Image placeholder" src="{% static "assets/img/team-1.jpg" %}">
</a>
<button class="btn btn-white border-radius-lg p-2 mt-n4 mt-md-2" type="button" data-bs-toggle="tooltip" data-bs-placement="right" title="Home">
<i class="material-symbols-rounded p-2">home</i>
</button>
<button class="btn btn-white border-radius-lg p-2 mt-n4 mt-md-0" type="button" data-bs-toggle="tooltip" data-bs-placement="right" title="Search">
<i class="material-symbols-rounded p-2">search</i>
</button>
<button class="btn btn-white border-radius-lg p-2 mt-n4 mt-md-0" type="button" data-bs-toggle="tooltip" data-bs-placement="right" title="Minimize">
<i class="material-symbols-rounded p-2">more_horiz</i>
</button>
</div>
<div class="col-lg-8 col-md-11 ps-md-5 mb-5 mb-md-0">
<div class="d-flex">
<div class="me-auto">
<h1 class="display-1 font-weight-bold mt-n3 mb-0 text-white">28°C</h1>
<h6 class="text-uppercase mb-0 ms-1 text-white">Cloudy</h6>
</div>
<div class="ms-auto">
<img class="w-50 float-end mt-n6 mt-lg-n4" src="{% static "assets/img/small-logos/icon-sun-cloud.png" %}" alt="image sun">
</div>
</div>
<div class="row mt-4">
<div class="col-lg-4 col-md-6">
<div class="card move-on-hover overflow-hidden">
<div class="card-body">
<div class="d-flex">
<h6 class="mb-0 me-3">08:00</h6>
<h6 class="mb-0">Synk up with Mark
<small class="text-secondary font-weight-normal">Hangouts</small>
</h6>
</div>
<hr class="horizontal dark">
<div class="d-flex">
<h6 class="mb-0 me-3">09:30</h6>
<h6 class="mb-0">Gym <br />
<small class="text-secondary font-weight-normal">World Class</small>
</h6>
</div>
<hr class="horizontal dark">
<div class="d-flex">
<h6 class="mb-0 me-3">11:00</h6>
<h6 class="mb-0">Design Review<br />
<small class="text-secondary font-weight-normal">Zoom</small>
</h6>
</div>
</div>
<a href="javascript:;" class="bg-gray-100 w-100 text-center py-1" data-bs-toggle="tooltip" data-bs-placement="top" title="Show More">
<i class="material-symbols-rounded text-primary">expand_more</i>
</a>
</div>
</div>
<div class="col-lg-4 col-md-6 mt-4 mt-sm-0">
<div class="card bg-gradient-dark move-on-hover">
<div class="card-body">
<div class="d-flex">
<h5 class="mb-0 text-white">To Do</h5>
<div class="ms-auto">
<h1 class="text-white text-end mb-0 mt-n2">7</h1>
<p class="text-sm mb-0 text-white">items</p>
</div>
</div>
<p class="text-white mb-0">Shopping</p>
<p class="mb-0 text-white">Meeting</p>
</div>
<a href="javascript:;" class="w-100 text-center py-1" data-bs-toggle="tooltip" data-bs-placement="top" title="Show More">
<i class="material-symbols-rounded text-white">expand_more</i>
</a>
</div>
<div class="card move-on-hover mt-4">
<div class="card-body">
<div class="d-flex">
<p class="mb-0">Emails (21)</p>
<a href="javascript:;" class="ms-auto" data-bs-toggle="tooltip" data-bs-placement="top" title="Check your emails">
Check
</a>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-12 mt-4 mt-lg-0">
<div class="card card-background card-background-mask-dark move-on-hover align-items-start">
<div class="cursor-pointer">
<div class="full-background" style="background-image: url('https://images.unsplash.com/photo-1470813740244-df37b8c1edcb?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=600&q=80')"></div>
<div class="card-body">
<h5 class="text-white mb-0">Night Jazz</h5>
<p class="text-white text-sm">Gary Coleman</p>
<div class="d-flex mt-5">
<button class="btn btn-outline-white rounded-circle p-2 mb-0" type="button" data-bs-toggle="tooltip" data-bs-placement="top" title="Prev">
<i class="material-symbols-rounded p-2 mt-0">skip_previous</i>
</button>
<button class="btn btn-outline-white rounded-circle p-2 mx-2 mb-0" type="button" data-bs-toggle="tooltip" data-bs-placement="top" title="Pause">
<i class="material-symbols-rounded p-2 mt-0">play_arrow</i>
</button>
<button class="btn btn-outline-white rounded-circle p-2 mb-0" type="button" data-bs-toggle="tooltip" data-bs-placement="top" title="Next">
<i class="material-symbols-rounded p-2 mt-0">skip_next</i>
</button>
</div>
</div>
</div>
</div>
<div class="card move-on-hover mt-4">
<div class="card-body">
<div class="d-flex">
<p class="my-auto">Messages</p>
<div class="ms-auto">
<div class="avatar-group">
<a href="javascript:;" class="avatar avatar-sm border-0 rounded-circle" data-bs-toggle="tooltip" data-bs-placement="top" title="2 New Messages">
<img alt="Image placeholder" src="{% static "assets/img/team-1.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-sm border-0 rounded-circle" data-bs-toggle="tooltip" data-bs-placement="top" title="1 New Message">
<img alt="Image placeholder" src="{% static "assets/img/team-2.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-sm border-0 rounded-circle" data-bs-toggle="tooltip" data-bs-placement="top" title="13 New Messages">
<img alt="Image placeholder" src="{% static "assets/img/team-3.jpg" %}">
</a>
<a href="javascript:;" class="avatar avatar-sm border-0 rounded-circle" data-bs-toggle="tooltip" data-bs-placement="top" title="7 New Messages">
<img alt="Image placeholder" src="{% static "assets/img/team-4.jpg" %}">
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
{% include "includes/footer.html" %}
{% include "includes/configurator.html" %}
{% include "includes/scripts.html" %}
</body>
</html>