payments
parent
f6c78a20a3
commit
0ffd79cee9
@ -1,9 +1,13 @@
|
||||
from django.urls import path
|
||||
from django.urls import path, include
|
||||
from django.contrib.auth import views as auth_views
|
||||
from accounts import views
|
||||
|
||||
urlpatterns = [
|
||||
path('login/', views.DepotLoginView.as_view(), name='login'),
|
||||
path('relogin/', auth_views.logout_then_login, name='relogin'),
|
||||
path('register/', views.RegisterView.as_view(), name='register'),
|
||||
path('user/', include([
|
||||
path('', views.UserListView.as_view(), name='user_list'),
|
||||
path('register/', views.RegisterView.as_view(), name='user_register'),
|
||||
path('<int:pk>/update/', views.UserUpdateView.as_view(), name='user_update'),
|
||||
])),
|
||||
]
|
||||
@ -0,0 +1,17 @@
|
||||
from django.forms import ModelForm
|
||||
|
||||
from common.models import CompanyModel
|
||||
|
||||
|
||||
class CompanyBaseForm(ModelForm):
|
||||
class Meta:
|
||||
model = CompanyModel
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class CompanyCreateForm(CompanyBaseForm):
|
||||
...
|
||||
|
||||
|
||||
class CompanyUpdateForm(CompanyBaseForm):
|
||||
...
|
||||
@ -0,0 +1,17 @@
|
||||
from django.forms import ModelForm
|
||||
|
||||
from common.models import LinesModel
|
||||
|
||||
|
||||
class LineBaseForm(ModelForm):
|
||||
class Meta:
|
||||
model = LinesModel
|
||||
fields = '__all__'
|
||||
|
||||
|
||||
class LineCreateForm(LineBaseForm):
|
||||
...
|
||||
|
||||
|
||||
class LineUpdateForm(LineBaseForm):
|
||||
...
|
||||
@ -1,13 +1,52 @@
|
||||
from django.views.generic import ListView
|
||||
|
||||
from common.models import CompanyModel
|
||||
from containers.models import Container
|
||||
|
||||
|
||||
class ContainersListView(ListView):
|
||||
template_name = 'employee/containers-list.html'
|
||||
model = Container
|
||||
context_object_name = 'containers'
|
||||
context_object_name = 'objects'
|
||||
paginate_by = 30 # Number of containers per page
|
||||
base_template = 'employee-base.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['base_template'] = self.base_template
|
||||
return context
|
||||
|
||||
def get_queryset(self):
|
||||
return Container.objects.filter(expedited=False).order_by('-received_on')
|
||||
|
||||
|
||||
class ReportContainersUnpaidListView(ListView):
|
||||
template_name = 'employee/payment-list.html'
|
||||
model = Container
|
||||
context_object_name = 'objects'
|
||||
paginate_by = 30 # Number of payments per page
|
||||
base_template = 'employee-base.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['base_template'] = self.base_template
|
||||
context['companies'] = CompanyModel.objects.all().order_by('name')
|
||||
return context
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = self.model.objects.filter(expedited=True)
|
||||
|
||||
# Get date from request parameters
|
||||
date = self.request.GET.get('date')
|
||||
if date:
|
||||
queryset = queryset.filter(expedited_on__date__lte=date)
|
||||
|
||||
# Get company from request parameters
|
||||
company = self.request.GET.get('company')
|
||||
if company:
|
||||
queryset = queryset.filter(line__company_id=company)
|
||||
|
||||
# Add payment filter to show only unpaid containers
|
||||
queryset = queryset.filter(payment_containers__isnull=True)
|
||||
|
||||
return queryset.order_by('-expedited_on')
|
||||
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class DamagesApiConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "damages_api"
|
||||
@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
@ -0,0 +1,7 @@
|
||||
from django.urls import path
|
||||
|
||||
from damages_api.views import Damages
|
||||
|
||||
urlpatterns = [
|
||||
path('<int:depot_id>', Damages.as_view(), name='damages_list'),
|
||||
]
|
||||
@ -0,0 +1,43 @@
|
||||
import base64
|
||||
import os
|
||||
import tempfile
|
||||
from datetime import datetime
|
||||
|
||||
from django.core.exceptions import BadRequest
|
||||
from rest_framework import status
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
|
||||
from common.utils.owncloud_utls import Owncloud
|
||||
from containers.models import ContainerPhotos
|
||||
|
||||
|
||||
class Damages(APIView):
|
||||
def post(self, request, depot_id):
|
||||
data = request.get_json()
|
||||
photo = data.pop("photo")
|
||||
extension = data.pop("photo_extension")
|
||||
|
||||
with tempfile.NamedTemporaryFile(suffix=f'.{extension}', delete=False) as temp_file:
|
||||
try:
|
||||
temp_file.write(base64.b64decode(photo.encode("utf-8")))
|
||||
temp_file.flush()
|
||||
|
||||
own_filename = Owncloud.upload_damage_photo(temp_file.name, depot_id)
|
||||
|
||||
container_photo = ContainerPhotos()
|
||||
container_photo.container.pk = depot_id
|
||||
container_photo.photo = own_filename
|
||||
container_photo.uploaded_on = datetime.now()
|
||||
container_photo.uploaded_by = request.user
|
||||
container_photo.save()
|
||||
except Exception as ex:
|
||||
raise BadRequest("Invalid photo encoding")
|
||||
finally:
|
||||
os.unlink(temp_file.name)
|
||||
return Response(status=status.HTTP_201_CREATED)
|
||||
|
||||
def get(self, request, depot_id):
|
||||
return Owncloud.get_damages(depot_id)
|
||||
|
||||
|
||||
@ -0,0 +1,19 @@
|
||||
from django.forms import ModelForm, CheckboxSelectMultiple
|
||||
|
||||
from containers.models import Container
|
||||
from payments.models import Payment
|
||||
|
||||
|
||||
class PaymentCreateForm(ModelForm):
|
||||
class Meta:
|
||||
model = Payment
|
||||
fields = ['total_amount', 'company', 'description']
|
||||
widgets = {
|
||||
'containers': CheckboxSelectMultiple(),
|
||||
}
|
||||
|
||||
|
||||
# def __init__(self, *args, **kwargs):
|
||||
# super().__init__(*args, **kwargs)
|
||||
# self.fields['containers'].queryset = Container.objects.all()
|
||||
# self.fields['containers'].label_from_instance = lambda obj: f"{obj.name} ({obj.company.name})"
|
||||
@ -0,0 +1,7 @@
|
||||
from django.urls import path
|
||||
|
||||
from payments.views import PaymentCreateView
|
||||
|
||||
urlpatterns = [
|
||||
path("create/", PaymentCreateView.as_view(), name="payments_create"),
|
||||
]
|
||||
@ -1,3 +1,47 @@
|
||||
from django.shortcuts import render
|
||||
from django.urls import reverse_lazy
|
||||
from django.views.generic import ListView, CreateView
|
||||
|
||||
from common.models import CompanyModel
|
||||
from containers.models import Container
|
||||
from payments.forms import PaymentCreateForm
|
||||
from payments.models import Payment
|
||||
|
||||
|
||||
# Create your views here.
|
||||
class PaymentCreateView(CreateView):
|
||||
model = Payment
|
||||
form_class = PaymentCreateForm
|
||||
template_name = 'employee/payment-create.html'
|
||||
success_url = reverse_lazy('payment-list')
|
||||
|
||||
def form_valid(self, form):
|
||||
container_ids = self.request.POST.getlist('containers')
|
||||
payment = form.save(commit=False)
|
||||
payment.save()
|
||||
payment.containers.set(container_ids)
|
||||
return super().form_valid(form)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
container_ids = self.request.GET.get('containers', '').split(',')
|
||||
# Filter only valid IDs (non-empty strings that can be converted to int)
|
||||
container_ids = [int(id) for id in container_ids if id.strip().isdigit()]
|
||||
|
||||
if container_ids:
|
||||
# Get selected containers
|
||||
context['containers'] = Container.objects.filter(
|
||||
id__in=container_ids,
|
||||
expedited=True,
|
||||
payment_containers__isnull=True
|
||||
).order_by('-expedited_on')
|
||||
return context
|
||||
|
||||
def get_form(self, form_class=None):
|
||||
form = super().get_form(form_class)
|
||||
company_pk = self.request.GET.get('company', '')
|
||||
form.fields['company'].initial = company_pk
|
||||
|
||||
# container_ids = [int(id) for id in container_ids if id.strip().isdigit()]
|
||||
# form.fields['containers'].initial = container_ids
|
||||
return form
|
||||
@ -1,36 +1,73 @@
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const editBtn = document.getElementById('editBtn');
|
||||
const deleteBtn = document.getElementById('deleteBtn');
|
||||
const objectIdInput = document.getElementById('objectIdInput');
|
||||
const rows = document.querySelectorAll('.selectable-row');
|
||||
const table = document.getElementById('objectTable');
|
||||
if (!table) return;
|
||||
|
||||
if (editBtn) {
|
||||
editBtn.setAttribute('disabled', '');
|
||||
const selectionMode = table.dataset.selectionMode || 'single';
|
||||
const toggleSelectAllBtn = document.getElementById('toggleSelectAllBtn');
|
||||
|
||||
if (table.dataset.selectionMode === 'multiple') {
|
||||
toggleSelectAllBtn.style.display = 'inline-block';
|
||||
}
|
||||
if (deleteBtn) {
|
||||
deleteBtn.setAttribute('disabled', '');
|
||||
|
||||
table.addEventListener('click', function(e) {
|
||||
const row = e.target.closest('.selectable-row');
|
||||
if (!row) return;
|
||||
|
||||
const checkbox = row.querySelector('input[type="checkbox"]');
|
||||
if (!checkbox) return;
|
||||
|
||||
if (selectionMode === 'single') {
|
||||
// Deselect all other rows
|
||||
table.querySelectorAll('.selected-row').forEach(selectedRow => {
|
||||
if (selectedRow !== row) {
|
||||
selectedRow.classList.remove('selected-row');
|
||||
selectedRow.querySelector('input[type="checkbox"]').checked = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
rows.forEach(row => {
|
||||
row.addEventListener('click', function() {
|
||||
// Remove previous selection
|
||||
document.querySelector('.selected-row')?.classList.remove('selected-row');
|
||||
// Toggle current row
|
||||
row.classList.toggle('selected-row');
|
||||
checkbox.checked = !checkbox.checked;
|
||||
|
||||
// Select current row
|
||||
this.classList.add('selected-row');
|
||||
// Update buttons state
|
||||
const selectedRows = table.querySelectorAll('.selected-row');
|
||||
document.querySelectorAll('[data-requires-selection]').forEach(button => {
|
||||
button.disabled = selectedRows.length === 0;
|
||||
});
|
||||
|
||||
// Handle edit/delete buttons from original crud-list.js
|
||||
const objectId = row.dataset.id;
|
||||
const editBtn = document.getElementById('editBtn');
|
||||
const deleteBtn = document.getElementById('deleteBtn');
|
||||
|
||||
const objectId = this.dataset.id;
|
||||
if (editBtn) {
|
||||
editBtn.removeAttribute('disabled'); // Remove disabled attribute completely
|
||||
editBtn.href = editBtn.dataset.url.replace('0', objectId);
|
||||
editBtn.removeAttribute('disabled');
|
||||
editBtn.href = editBtn.dataset.url?.replace('0', objectId);
|
||||
}
|
||||
if (deleteBtn) {
|
||||
deleteBtn.removeAttribute('disabled');
|
||||
}
|
||||
});
|
||||
|
||||
let allSelected = false;
|
||||
toggleSelectAllBtn.addEventListener('click', function() {
|
||||
const rows = table.querySelectorAll('.selectable-row');
|
||||
allSelected = !allSelected;
|
||||
|
||||
// Check the hidden radio button
|
||||
const radio = this.querySelector('input[type="radio"]');
|
||||
radio.checked = true;
|
||||
rows.forEach(row => {
|
||||
const checkbox = row.querySelector('input[type="checkbox"]');
|
||||
checkbox.checked = allSelected;
|
||||
row.classList.toggle('selected-row', allSelected);
|
||||
});
|
||||
|
||||
// Update other buttons state
|
||||
document.querySelectorAll('[data-requires-selection]').forEach(button => {
|
||||
button.disabled = !allSelected;
|
||||
});
|
||||
|
||||
// Update button text
|
||||
this.textContent = allSelected ? 'Unselect All' : 'Select All';
|
||||
});
|
||||
|
||||
});
|
||||
@ -1,162 +1,111 @@
|
||||
{% extends 'employee-base.html' %}
|
||||
{% block content %}
|
||||
|
||||
<div id="dashboardContent" class="tab-content active">
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-6">
|
||||
<div class="card bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center">
|
||||
<div class="p-3 rounded-full bg-blue-100 text-blue-600">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<div class="dashboard-wrapper">
|
||||
<div class="stats-grid">
|
||||
<div class="dashboard-card">
|
||||
<div class="card-content">
|
||||
<div class="icon-circle">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="dashboard-icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10" />
|
||||
</svg>
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<h3 class="text-lg font-semibold text-gray-700">Active Containers</h3>
|
||||
<p class="text-3xl font-bold text-gray-900">{{ containers }}</p>
|
||||
<p class="text-sm text-green-600">+3 since last week</p>
|
||||
<div class="stat-info">
|
||||
<h3>Active Containers</h3>
|
||||
<p class="stat-number">{{ containers }}</p>
|
||||
<p class="stat-change">+3 since last week</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center">
|
||||
<div class="p-3 rounded-full bg-green-100 text-green-600">
|
||||
<div class="dashboard-card">
|
||||
<div class="card-content">
|
||||
<div class="icon-circle">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />
|
||||
</svg>
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<h3 class="text-lg font-semibold text-gray-700">Preinfo Sent</h3>
|
||||
<p class="text-3xl font-bold text-gray-900">{{ preinfos }}</p>
|
||||
<p class="text-sm text-green-600">+5 since last week</p>
|
||||
<div class="stat-info">
|
||||
<h3>Active preinfos</h3>
|
||||
<p class="stat-number">{{ preinfos }}</p>
|
||||
<p class="stat-change">+7 since last week</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card bg-white rounded-lg shadow p-6">
|
||||
<div class="flex items-center">
|
||||
<div class="p-3 rounded-full bg-orange-100 text-orange-600">
|
||||
<div class="dashboard-card">
|
||||
<div class="card-content">
|
||||
<div class="icon-circle">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4" />
|
||||
</svg>
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<h3 class="text-lg font-semibold text-gray-700">Bookings</h3>
|
||||
<p class="text-3xl font-bold text-gray-900">{{ bookings }}</p>
|
||||
<p class="text-sm text-orange-600">2 require attention</p>
|
||||
<div class="stat-info">
|
||||
<h3>Active bookings</h3>
|
||||
<p class="stat-number">{{ bookings }}</p>
|
||||
<p class="stat-change">+8 since last week</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Other two cards similar structure -->
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
<div class="bg-white rounded-lg shadow">
|
||||
<div class="px-6 py-4 border-b border-gray-200">
|
||||
<h3 class="text-lg font-semibold text-gray-800">Recent Container Activity</h3>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<div class="overflow-x-auto">
|
||||
<table class="min-w-full divide-y divide-gray-200">
|
||||
<div class="tables-grid">
|
||||
<div class="dashboard-card">
|
||||
<div class="card-header">
|
||||
<h3>Recent Container Activity</h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Container</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Type</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date</th>
|
||||
<th>Container</th>
|
||||
<th>Type</th>
|
||||
<th>Status</th>
|
||||
<th>Date</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200">
|
||||
<tr>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">MSCU1234567</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">40HC</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap">
|
||||
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-green-100 text-green-800">Received</span>
|
||||
</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">2023-06-15</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">MSCU7654321</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">20DV</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap">
|
||||
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-blue-100 text-blue-800">Preinfo</span>
|
||||
</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">2023-06-14</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">MSCU2468135</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">40DV</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap">
|
||||
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-orange-100 text-orange-800">Order</span>
|
||||
</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">2023-06-13</td>
|
||||
</tr>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">MSCU1357924</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">20RF</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap">
|
||||
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-red-100 text-red-800">Expedited</span>
|
||||
</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">2023-06-12</td>
|
||||
<td>MSCU1234567</td>
|
||||
<td>40HC</td>
|
||||
<td><span class="status-tag status-received">Received</span></td>
|
||||
<td>2023-06-15</td>
|
||||
</tr>
|
||||
<!-- Other rows similar structure -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="bg-white rounded-lg shadow">
|
||||
<div class="px-6 py-4 border-b border-gray-200">
|
||||
<h3 class="text-lg font-semibold text-gray-800">Payment Status</h3>
|
||||
<div class="dashboard-card">
|
||||
<div class="card-header">
|
||||
<h3>Recent payments</h3>
|
||||
</div>
|
||||
<div class="p-6">
|
||||
<div class="overflow-x-auto">
|
||||
<table class="min-w-full divide-y divide-gray-200">
|
||||
<div class="card-body">
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Invoice</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Amount</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
|
||||
<th class="px-4 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Due Date</th>
|
||||
<th>Container</th>
|
||||
<th>Type</th>
|
||||
<th>Status</th>
|
||||
<th>Date</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-gray-200">
|
||||
<tr>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">INV-2023-0042</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">$1,250.00</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap">
|
||||
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-green-100 text-green-800">Paid</span>
|
||||
</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">2023-06-10</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">INV-2023-0041</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">$875.50</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap">
|
||||
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-yellow-100 text-yellow-800">Pending</span>
|
||||
</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">2023-06-20</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">INV-2023-0040</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">$2,100.00</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap">
|
||||
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-red-100 text-red-800">Overdue</span>
|
||||
</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">2023-06-05</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm font-medium text-gray-900">INV-2023-0039</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">$950.25</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap">
|
||||
<span class="px-2 py-1 text-xs font-semibold rounded-full bg-green-100 text-green-800">Paid</span>
|
||||
</td>
|
||||
<td class="px-4 py-3 whitespace-nowrap text-sm text-gray-700">2023-05-28</td>
|
||||
</tr>
|
||||
<tbody>
|
||||
{# {% for container in containers %}#}
|
||||
{# <tr>#}
|
||||
{# <td>{{ container.number }}</td>#}
|
||||
{# <td>container.container_type</td>#}
|
||||
{# <td><span class="status-tag status-received">Received</span></td>#}
|
||||
{# <td>{{ container.received_date }}</td>#}
|
||||
{# </tr>#}
|
||||
{# {% endfor %}#}
|
||||
<!-- Other rows similar structure -->
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@ -1,83 +1,93 @@
|
||||
{% load static %}
|
||||
<aside class="sidebar w-64 h-full text-white flex flex-col">
|
||||
<div class="p-5 border-b border-blue-700">
|
||||
<h1 class="text-xl font-bold">Container Depot</h1>
|
||||
<p class="text-sm text-blue-200">Employee Portal</p>
|
||||
<aside class="sidebar">
|
||||
<div class="header">
|
||||
<h1>Container Depot</h1>
|
||||
<p class="subtitle">Line Operator Portal</p>
|
||||
</div>
|
||||
{% url 'employee_dashboard' as dashboard_url %}
|
||||
{% url 'employee_containers' as employee_containers_url %}
|
||||
{% url 'employee_bookings' as employee_bookings_url %}
|
||||
{% url 'employee_preinfo' as employee_preinfo_url %}
|
||||
{% url 'register' as register_url %}
|
||||
{% url 'employee_company' as employee_company_url %}
|
||||
{% url 'employee_line' as employee_line_url %}
|
||||
{% url 'user_list' as user_list_url %}
|
||||
{% url 'not_paid' as not_paid_list_url %}
|
||||
|
||||
<nav class="flex-grow py-4">
|
||||
<div class="px-4 py-2 text-xs text-blue-300 uppercase tracking-wider">Main</div>
|
||||
<a href="{% url 'dashboard' %}" class="nav-item active flex items-center px-6 py-3 text-white">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<nav class="nav-menu">
|
||||
<div class="section-title">Main</div>
|
||||
<a href="{{ dashboard_url }}" class="nav-item {% if request.path == dashboard_url %}active{% endif %}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
|
||||
</svg>
|
||||
Dashboard
|
||||
</a>
|
||||
<a href="{% url 'employee_containers' %}" id="preinfoNav" class="nav-item flex items-center px-6 py-3 text-white">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<a href="{{ employee_containers_url }}" class="nav-item {% if request.path == employee_containers_url %}active{% endif %}" id="preinfoNav">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
|
||||
</svg>
|
||||
Available Containers
|
||||
Containers
|
||||
</a>
|
||||
<a href="{% url 'employee_bookings' %}" id="ordersNav" class="nav-item flex items-center px-6 py-3 text-white">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<a href="{{ employee_preinfo_url }}" class="nav-item {% if request.path == employee_preinfo_url %}active{% endif %}" id="preinfoNav">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
|
||||
</svg>
|
||||
Container Preinfo
|
||||
</a>
|
||||
<a href="{{ employee_bookings_url }}" class="nav-item {% if request.path == employee_bookings_url %}active{% endif %}" id="ordersNav">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4" />
|
||||
</svg>
|
||||
Bookings
|
||||
</a>
|
||||
<a href="{% url 'employee_preinfo' %}" class="nav-item flex items-center px-6 py-3 text-white">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
||||
<div class="section-title account">Reports</div>
|
||||
<a href="{{ not_paid_list_url }}" class="nav-item {% if request.path == not_paid_list_url %}active{% endif %}" id="ordersNav">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<g>
|
||||
<path fill="none" d="M0 0h24v24H0z"/>
|
||||
<path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zm-1.95-9H15v2h-4.95a2.5 2.5 0 0 0 4.064 1.41l1.7 1.133A4.5 4.5 0 0 1 8.028 13H7v-2h1.027a4.5 4.5 0 0 1 7.788-2.543L14.114 9.59A2.5 2.5 0 0 0 10.05 11z"/>
|
||||
</g>
|
||||
</svg>
|
||||
Preinfos
|
||||
Reports
|
||||
</a>
|
||||
|
||||
{% if request.user.UserType.ADMIN %}
|
||||
|
||||
<div class="px-4 py-2 mt-6 text-xs text-blue-300 uppercase tracking-wider">Account</div>
|
||||
<a href="{% url 'register' %}" class="nav-item flex items-center px-6 py-3 text-white">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
{% if request.user.UserType == 'CA' or 1 == 1 %}
|
||||
<div class="section-title account">Nomenclatures</div>
|
||||
<a href="{{ user_list_url }}" class="nav-item {% if request.path == user_list_url %}active{% endif %}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
||||
</svg>
|
||||
Accounts
|
||||
</a>
|
||||
|
||||
{# <div class="px-4 py-2 mt-6 text-xs text-blue-300 uppercase tracking-wider">Account</div>#}
|
||||
<a href="{% url 'register' %}" class="nav-item flex items-center px-6 py-3 text-white">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<a href="{{ employee_company_url }}" class="nav-item {% if request.path == employee_company_url %}active{% endif %}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
||||
</svg>
|
||||
Companies
|
||||
</a>
|
||||
|
||||
<a href="{% url 'register' %}" class="nav-item flex items-center px-6 py-3 text-white">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5 mr-3" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<a href="{{ employee_line_url }}" class="nav-item {% if request.path == employee_line_url %}active{% endif %}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
|
||||
</svg>
|
||||
Lines
|
||||
</a>
|
||||
|
||||
|
||||
{% endif %}
|
||||
</nav>
|
||||
|
||||
<div class="p-4 border-t border-blue-700">
|
||||
<div class="flex items-center">
|
||||
<div class="w-10 h-10 rounded-full bg-blue-500 flex items-center justify-center text-white font-bold">
|
||||
LO
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<p class="text-sm font-medium">{{ request.user }}</p>
|
||||
<p class="text-xs text-blue-300">{{ request.user.company }}</p>
|
||||
<div class="user-profile">
|
||||
<div class="avatar">LO</div>
|
||||
<div class="user-info">
|
||||
<p class="username">{{ request.user }}</p>
|
||||
</div>
|
||||
<a href="{% url 'login' %}" class="ml-auto text-white" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<a href="{% url 'login' %}" class="logout">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1" />
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
|
||||
@ -1,40 +1,43 @@
|
||||
{% extends 'employee-base.html' %}
|
||||
{% extends 'list-crud.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block content %}
|
||||
<table>
|
||||
<tr>
|
||||
<th>Status</th>
|
||||
{% block table_header %}
|
||||
<th style="display: none;">Select</th>
|
||||
<th>Line</th>
|
||||
<th>Booking №</th>
|
||||
<th>Vehicles</th>
|
||||
<th>Container number</th>
|
||||
<th>Container type</th>
|
||||
<th>Container count</th>
|
||||
<th>Line</th>
|
||||
<th>Carrier</th>
|
||||
<th>Containers expedited</th>
|
||||
<th>Container №</th>
|
||||
<th>Containers count</th>
|
||||
<th>Containers left</th>
|
||||
<th>Vehicles</th>
|
||||
<th>Vehicles left</th>
|
||||
</tr>
|
||||
<th>Created on</th>
|
||||
<th>Created by</th>
|
||||
{% endblock table_header %}
|
||||
|
||||
{% block table_data %}
|
||||
<td>{{ object.line.short_name }}</td>
|
||||
<td>{{ object.number }}</td>
|
||||
<td>{{ object.container_type }}</td>
|
||||
<td>{{ object.container_number }}</td>
|
||||
<td>{{ object.container_count }}</td>
|
||||
<td>{{ object.containers_left }}</td>
|
||||
<td>{{ object.vehicles }}</td>
|
||||
<td>{{ object.vehicles_left }}</td>
|
||||
<td>{{ object.created_on }}</td>
|
||||
<td>{{ object.created_by.username }}</td>
|
||||
{% endblock %}
|
||||
|
||||
{% for booking in bookings %}
|
||||
<tr>
|
||||
<td>{{ booking.status }}</td>
|
||||
<td>{{ booking.number }}</td>
|
||||
<td>{{ booking.vehicles }}</td>
|
||||
<td>{{ booking.container_number }}</td>
|
||||
<td>{{ booking.container_type }}</td>
|
||||
<td>{{ booking.container_count }}</td>
|
||||
<td>{{ booking.line.short_name }}</td>
|
||||
<td>{{ booking.carrier }}</td>
|
||||
<td>{{ booking.container_expedited_count }}</td>
|
||||
<td>{{ booking.vehicles_left }}</td>
|
||||
<td>
|
||||
{# <a href="{% url 'employee:preinfo_edit' preinfo.id %}">Edit</a> |#}
|
||||
{# <a href="{% url 'employee:preinfo_delete' preinfo.id %}">Delete</a>#}
|
||||
</td>
|
||||
</tr>
|
||||
{% block buttons %}
|
||||
{# <a href="{% url 'employee_booking_create' %}" class="btn btn-primary">Create booking</a>#}
|
||||
{# <a href="#" id="editBtn" data-url="{% url 'client_booking_update' pk=0 %}" class="btn btn-primary" disabled>Edit Preinfo</a>#}
|
||||
{# <button id="deleteButton" class="btn btn-danger">Delete Preinfo</button>#}
|
||||
{% endblock buttons %}
|
||||
|
||||
{% endfor %}
|
||||
{% block create_modal_header %}
|
||||
<h2>Create Booking</h2>
|
||||
{% endblock %}
|
||||
|
||||
</table>
|
||||
{% endblock content %}
|
||||
{% block modal_header %}
|
||||
<h2>Edit Booking</h2>
|
||||
{% endblock modal_header %}
|
||||
|
||||
@ -1,10 +1,34 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
{% extends "employee-base.html" %}
|
||||
|
||||
{% block content %}
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
|
||||
|
||||
<div class="selected-containers">
|
||||
<h3>Selected Containers</h3>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Container Number</th>
|
||||
<th>Type</th>
|
||||
<th>Company</th>
|
||||
<th>Received Date</th>
|
||||
<th>Expedited Date</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for container in containers %}
|
||||
<tr>
|
||||
<td>{{ container.number }}</td>
|
||||
<td>{{ container.container_type }}</td>
|
||||
<td>{{ container.line.company.short_name }}</td>
|
||||
<td>{{ container.received_on|date:"Y-m-d" }}</td>
|
||||
<td>{{ container.expedited_on|date:"Y-m-d" }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@ -1,10 +1,78 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>$Title$</title>
|
||||
</head>
|
||||
<body>
|
||||
$END$
|
||||
</body>
|
||||
</html>
|
||||
{% extends 'list-crud.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block filter %}
|
||||
<div class="filter-form">
|
||||
<form method="GET">
|
||||
<span style="display: flex; align-items: center; width: 100%;">
|
||||
<label for="date" style="margin-right: 8px;">Date:</label>
|
||||
<input type="date" id="date" name="date" value="{{ request.GET.date }}" style="margin-right: 20px;">
|
||||
|
||||
<label for="company" style="margin-right: 8px;">Company:</label>
|
||||
<select id="company" name="company" style="margin-right: 20px;">
|
||||
<option value="">Select company</option>
|
||||
{% for company in companies %}
|
||||
<option value="{{ company.id }}" {% if request.GET.company|add:'0' == company.id %}selected{% endif %}>
|
||||
{{ company.name }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
||||
<button type="submit">Search</button>
|
||||
</span>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block selection %}
|
||||
"multiple"
|
||||
{% endblock selection %}
|
||||
|
||||
{% block table_header %}
|
||||
<th>Container Number</th>
|
||||
<th>Type</th>
|
||||
<th>Company</th>
|
||||
<th>Expedited Date</th>
|
||||
{% endblock table_header %}
|
||||
|
||||
{% block table_data %}
|
||||
<td class="td-left">{{ object.number }}</td>
|
||||
<td>{{ object.container_type }}</td>
|
||||
<td class="td-left">{{ object.line.company.short_name }}</td>
|
||||
<td>{{ object.expedited_on|date:"Y-m-d h:m:s" }}</td>
|
||||
{% endblock table_data %}
|
||||
|
||||
{% block buttons %}
|
||||
<button id="createPaymentBtn" class="btn btn-primary" data-requires-selection disabled>Create Payment</button>
|
||||
{% endblock buttons %}
|
||||
|
||||
{% block create_modal_header %}
|
||||
<h2>Create Container</h2>
|
||||
{% endblock %}
|
||||
|
||||
{% block modal_header %}
|
||||
<h2>Edit Container</h2>
|
||||
{% endblock modal_header %}
|
||||
|
||||
{% block custom_js %}
|
||||
<script>
|
||||
document.getElementById('createPaymentBtn').addEventListener('click', function() {
|
||||
const selectedIds = Array.from(document.querySelectorAll('.selected-row'))
|
||||
.map(row => row.dataset.id);
|
||||
|
||||
const dateInput = document.getElementById('date').value;
|
||||
const companySelect = document.getElementById('company').value;
|
||||
|
||||
|
||||
if (selectedIds.length > 0) {
|
||||
const params = new URLSearchParams({
|
||||
containers: selectedIds.join(','),
|
||||
date: dateInput,
|
||||
company: companySelect
|
||||
});
|
||||
|
||||
window.location.href = '{% url "payments_create" %}?' + params.toString();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endblock custom_js %}
|
||||
@ -1,10 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>$Title$</title>
|
||||
</head>
|
||||
<body>
|
||||
$END$
|
||||
</body>
|
||||
</html>
|
||||
{% extends 'list-crud.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block table_header %}
|
||||
<th>Username</th>
|
||||
<th>User Type</th>
|
||||
<th>First Name</th>
|
||||
<th>Last Name</th>
|
||||
<th>Email</th>
|
||||
<th>Phone</th>
|
||||
<th>Company</th>
|
||||
<th>Line</th>
|
||||
{% endblock table_header %}
|
||||
|
||||
{% block table_data %}
|
||||
<td class="td-left">{{ object.username }}</td>
|
||||
<td class="td-left">{{ object.get_user_type_display }}</td>
|
||||
<td class="td-left">{{ object.first_name }}</td>
|
||||
<td class="td-left">{{ object.last_name }}</td>
|
||||
<td class="td-left">{{ object.email }}</td>
|
||||
<td class="td-left">{{ object.phone }}</td>
|
||||
<td class="td-left">{{ object.company }}</td>
|
||||
<td class="td-left">{{ object.line }}</td>
|
||||
{% endblock %}
|
||||
|
||||
{% block buttons %}
|
||||
<a href="{% url 'user_register' %}" class="btn btn-primary" type="button">Create user</a>
|
||||
<a href="#" id="editBtn" data-url="{% url 'user_update' pk=0 %}" class="btn btn-primary" type="button" disabled>Edit user</a>
|
||||
<button id="deleteButton" class="btn btn-danger">Delete user</button>
|
||||
{% endblock buttons %}
|
||||
|
||||
{% block create_modal_header %}
|
||||
<h2>Create User</h2>
|
||||
{% endblock %}
|
||||
|
||||
{% block modal_header %}
|
||||
<h2>Edit Container</h2>
|
||||
{% endblock modal_header %}
|
||||
Loading…
Reference in New Issue