Add company management module with registration and entity switching

This commit is contained in:
timurgordon
2025-05-05 13:58:51 +03:00
parent 2760f00a30
commit 9468595395
20 changed files with 2538 additions and 76 deletions

View File

@@ -64,7 +64,7 @@
<button class="navbar-toggler d-md-none me-2" type="button" id="sidebarToggle" aria-label="Toggle navigation">
<i class="bi bi-list text-white"></i>
</button>
<h5 class="mb-0">Zanzibar Digital Freezone</h5>
<h5 class="mb-0">Zanzibar Digital Freezone {% if entity_name %}| <span class="text-info">{{ entity_name }}</span>{% endif %}</h5>
</div>
<div class="d-none d-md-flex">
<ul class="navbar-nav flex-row">
@@ -155,6 +155,11 @@
<i class="bi bi-bank me-2"></i> DeFi Platform
</a>
</li>
<li class="nav-item">
<a class="nav-link d-flex align-items-center ps-3 py-2 {% if active_page == 'company' %}active fw-bold border-start border-4 border-primary bg-light{% endif %}" href="/company">
<i class="bi bi-building me-2"></i> Companies
</a>
</li>
<li class="nav-item">
<a class="nav-link d-flex align-items-center ps-3 py-2 {% if active_page == 'marketplace' %}active fw-bold border-start border-4 border-primary bg-light{% endif %}" href="/marketplace">
<i class="bi bi-shop me-2"></i> Marketplace
@@ -206,6 +211,33 @@
</footer>
</div>
<!-- Toast container for notifications -->
<div class="toast-container position-fixed bottom-0 end-0 p-3">
{% if success %}
<div class="toast show" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-header bg-success text-white">
<strong class="me-auto">Success</strong>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
<div class="toast-body">
{{ success }}
</div>
</div>
{% endif %}
{% if error %}
<div class="toast show" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-header bg-danger text-white">
<strong class="me-auto">Error</strong>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
<div class="toast-body">
{{ error }}
</div>
</div>
{% endif %}
</div>
<script src="/static/js/bootstrap.bundle.min.js"></script>
<script src="https://unpkg.com/unpoly@3.7.2/unpoly.min.js"></script>
<script src="https://unpkg.com/unpoly@3.7.2/unpoly-bootstrap5.min.js"></script>
@@ -214,6 +246,17 @@
document.getElementById('sidebarToggle').addEventListener('click', function() {
document.getElementById('sidebar').classList.toggle('show');
});
// Auto-hide toasts after 5 seconds
document.addEventListener('DOMContentLoaded', function() {
const toasts = document.querySelectorAll('.toast.show');
toasts.forEach(toast => {
setTimeout(() => {
const bsToast = new bootstrap.Toast(toast);
bsToast.hide();
}, 5000);
});
});
</script>
{% block extra_js %}{% endblock %}
</body>

View File

@@ -0,0 +1,111 @@
{% extends "base.html" %}
{% block title %}Company Management{% endblock %}
{% block head %}
{{ super() }}
<style>
.toast {
position: fixed;
top: 20px;
right: 20px;
z-index: 9999;
}
</style>
{% endblock %}
{% block content %}
<!-- Toast notification for success messages -->
{% if success_message %}
<div class="position-fixed bottom-0 end-0 p-3" style="z-index: 11">
<div class="toast show" role="alert" aria-live="assertive" aria-atomic="true" data-bs-autohide="true" data-bs-delay="5000">
<div class="toast-header bg-success text-white">
<i class="bi bi-check-circle me-2"></i>
<strong class="me-auto">Success</strong>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
<div class="toast-body">
{{ success_message }}
</div>
</div>
</div>
{% endif %}
<div class="container-fluid py-4">
<h2 class="mb-4">Company & Legal Entity Management (Freezone)</h2>
<!-- Company Management Tabs -->
<div class="mb-4">
<div class="card-body">
<ul class="nav nav-tabs" id="companyTabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="manage-tab" data-bs-toggle="tab" data-bs-target="#manage" type="button" role="tab" aria-controls="manage" aria-selected="true">
<i class="bi bi-building me-1"></i> Manage Companies
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="register-tab" data-bs-toggle="tab" data-bs-target="#register" type="button" role="tab" aria-controls="register" aria-selected="false">
<i class="bi bi-file-earmark-plus me-1"></i> Register New Company
</button>
</li>
</ul>
<div class="tab-content mt-3" id="companyTabsContent">
<div class="tab-pane fade show active" id="manage" role="tabpanel" aria-labelledby="manage-tab">
{% include "company/manage.html" %}
</div>
<div class="tab-pane fade" id="register" role="tabpanel" aria-labelledby="register-tab">
{% include "company/register.html" %}
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
{{ super() }}
<script src="/static/js/company.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Show toast if success message exists
const urlParams = new URLSearchParams(window.location.search);
const successMessage = urlParams.get('success');
if (successMessage) {
const toastEl = document.querySelector('.toast');
if (toastEl) {
const toastBody = toastEl.querySelector('.toast-body');
toastBody.textContent = decodeURIComponent(successMessage);
const toast = new bootstrap.Toast(toastEl);
toast.show();
// Auto-hide after 5 seconds
setTimeout(function() {
toast.hide();
}, 5000);
}
}
// Handle tab tracking in URL
const tabParam = urlParams.get('tab');
if (tabParam) {
const tabButton = document.querySelector(`button[data-bs-target="#${tabParam}"]`);
if (tabButton) {
const tab = new bootstrap.Tab(tabButton);
tab.show();
}
}
// Update URL when tab changes
const tabButtons = document.querySelectorAll('button[data-bs-toggle="tab"]');
tabButtons.forEach(function(button) {
button.addEventListener('shown.bs.tab', function(event) {
const targetId = event.target.getAttribute('data-bs-target').substring(1);
const url = new URL(window.location);
url.searchParams.set('tab', targetId);
window.history.replaceState({}, '', url);
});
});
});
</script>
{% endblock %}

View File

@@ -0,0 +1,193 @@
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<i class="bi bi-building me-1"></i> Your Companies
</div>
<div class="card-body">
<!-- Company list table -->
<table class="table table-hover align-middle">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Status</th>
<th>Date Registered</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<!-- Example rows -->
<tr>
<td>Zanzibar Digital Solutions</td>
<td>Startup FZC</td>
<td><span class="badge bg-success">Active</span></td>
<td>2025-04-01</td>
<td>
<div class="btn-group">
<a href="/company/view/company1" class="btn btn-sm btn-outline-primary"><i class="bi bi-eye"></i> View</a>
<a href="/company/switch/company1" class="btn btn-sm btn-primary"><i class="bi bi-box-arrow-in-right"></i> Switch to Entity</a>
</div>
</td>
</tr>
<tr>
<td>Blockchain Innovations Ltd</td>
<td>Growth FZC</td>
<td><span class="badge bg-success">Active</span></td>
<td>2025-03-15</td>
<td>
<div class="btn-group">
<a href="/company/view/company2" class="btn btn-sm btn-outline-primary"><i class="bi bi-eye"></i> View</a>
<a href="/company/switch/company2" class="btn btn-sm btn-primary"><i class="bi bi-box-arrow-in-right"></i> Switch to Entity</a>
</div>
</td>
</tr>
<tr>
<td>Sustainable Energy Cooperative</td>
<td>Cooperative FZC</td>
<td><span class="badge bg-warning text-dark">Pending</span></td>
<td>2025-05-01</td>
<td>
<div class="btn-group">
<a href="/company/view/company3" class="btn btn-sm btn-outline-primary"><i class="bi bi-eye"></i> View</a>
<a href="/company/switch/company3" class="btn btn-sm btn-primary"><i class="bi bi-box-arrow-in-right"></i> Switch to Entity</a>
</div>
</td>
</tr>
<!-- More rows dynamically rendered here -->
</tbody>
</table>
</div>
</div>
<!-- Company Details Modal -->
<div class="modal fade" id="companyDetailsModal" tabindex="-1" aria-labelledby="companyDetailsModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header bg-light">
<h5 class="modal-title" id="companyDetailsModalLabel"><i class="bi bi-building me-2"></i>Company Details</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div id="companyDetailsContent">
<!-- Company details will be loaded here -->
<div class="row mb-4">
<div class="col-md-6">
<div class="card h-100">
<div class="card-header">General Information</div>
<div class="card-body">
<table class="table table-borderless">
<tr>
<th>Company Name:</th>
<td id="modal-company-name">Zanzibar Digital Solutions</td>
</tr>
<tr>
<th>Type:</th>
<td id="modal-company-type">Startup FZC</td>
</tr>
<tr>
<th>Registration Date:</th>
<td id="modal-registration-date">2025-04-01</td>
</tr>
<tr>
<th>Status:</th>
<td id="modal-status"><span class="badge bg-success">Active</span></td>
</tr>
<tr>
<th>Purpose:</th>
<td id="modal-purpose">Digital solutions and blockchain development</td>
</tr>
</table>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-header">Billing Information</div>
<div class="card-body">
<table class="table table-borderless">
<tr>
<th>Plan:</th>
<td id="modal-plan">Startup FZC - $50/month</td>
</tr>
<tr>
<th>Next Billing:</th>
<td id="modal-next-billing">2025-06-01</td>
</tr>
<tr>
<th>Payment Method:</th>
<td id="modal-payment-method">Credit Card (****4582)</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="row mb-4">
<div class="col-md-6">
<div class="card h-100">
<div class="card-header">Shareholders</div>
<div class="card-body">
<table class="table table-sm">
<thead>
<tr>
<th>Name</th>
<th>Percentage</th>
</tr>
</thead>
<tbody id="modal-shareholders">
<tr>
<td>John Smith</td>
<td>60%</td>
</tr>
<tr>
<td>Sarah Johnson</td>
<td>40%</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-header">Contracts</div>
<div class="card-body">
<table class="table table-sm">
<thead>
<tr>
<th>Contract</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
<tbody id="modal-contracts">
<tr>
<td>Articles of Incorporation</td>
<td><span class="badge bg-success">Signed</span></td>
<td><button class="btn btn-sm btn-outline-primary">View</button></td>
</tr>
<tr>
<td>Terms & Conditions</td>
<td><span class="badge bg-success">Signed</span></td>
<td><button class="btn btn-sm btn-outline-primary">View</button></td>
</tr>
<tr>
<td>Digital Asset Issuance</td>
<td><span class="badge bg-success">Signed</span></td>
<td><button class="btn btn-sm btn-outline-primary">View</button></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" onclick="switchToEntityFromModal()"><i class="bi bi-box-arrow-in-right me-1"></i>Switch to Entity</button>
</div>
</div>
</div>
</div>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,21 @@
<ul class="nav nav-tabs" id="companyTabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="manage-tab" data-bs-toggle="tab" data-bs-target="#manage" type="button" role="tab" aria-controls="manage" aria-selected="true">
<i class="bi bi-building me-1"></i> Manage Companies
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="register-tab" data-bs-toggle="tab" data-bs-target="#register" type="button" role="tab" aria-controls="register" aria-selected="false">
<i class="bi bi-file-earmark-plus me-1"></i> Register New Company
</button>
</li>
</ul>
<div class="tab-content mt-4" id="companyTabsContent">
<div class="tab-pane fade show active" id="manage" role="tabpanel" aria-labelledby="manage-tab">
{% include "company/manage.html" %}
</div>
<div class="tab-pane fade" id="register" role="tabpanel" aria-labelledby="register-tab">
{% include "company/register.html" %}
</div>
</div>

View File

@@ -0,0 +1,177 @@
{% extends "base.html" %}
{% block title %}{{ company_name }} - Company Details{% endblock %}
{% block head %}
{{ super() }}
<style>
.badge-signed {
background-color: #198754;
color: white;
}
.badge-pending {
background-color: #ffc107;
color: #212529;
}
</style>
{% endblock %}
{% block content %}
<div class="container-fluid py-4">
<div class="d-flex justify-content-between align-items-center mb-4">
<h2><i class="bi bi-building me-2"></i>{{ company_name }}</h2>
<div>
<a href="/company" class="btn btn-outline-secondary me-2"><i class="bi bi-arrow-left me-1"></i>Back to Companies</a>
<a href="/company/switch/{{ company_id }}" class="btn btn-primary"><i class="bi bi-box-arrow-in-right me-1"></i>Switch to Entity</a>
</div>
</div>
<div class="row mb-4">
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="bi bi-info-circle me-2"></i>General Information</h5>
</div>
<div class="card-body">
<table class="table table-borderless">
<tr>
<th style="width: 30%">Company Name:</th>
<td>{{ company_name }}</td>
</tr>
<tr>
<th>Type:</th>
<td>{{ company_type }}</td>
</tr>
<tr>
<th>Registration Date:</th>
<td>{{ registration_date }}</td>
</tr>
<tr>
<th>Status:</th>
<td>
{% if status == "Active" %}
<span class="badge bg-success">{{ status }}</span>
{% else %}
<span class="badge bg-warning text-dark">{{ status }}</span>
{% endif %}
</td>
</tr>
<tr>
<th>Purpose:</th>
<td>{{ purpose }}</td>
</tr>
</table>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="bi bi-credit-card me-2"></i>Billing Information</h5>
</div>
<div class="card-body">
<table class="table table-borderless">
<tr>
<th style="width: 30%">Plan:</th>
<td>{{ plan }}</td>
</tr>
<tr>
<th>Next Billing:</th>
<td>{{ next_billing }}</td>
</tr>
<tr>
<th>Payment Method:</th>
<td>{{ payment_method }}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="row mb-4">
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="bi bi-people me-2"></i>Shareholders</h5>
</div>
<div class="card-body">
<table class="table table-striped">
<thead>
<tr>
<th>Name</th>
<th>Percentage</th>
</tr>
</thead>
<tbody>
{% for shareholder in shareholders %}
<tr>
<td>{{ shareholder.0 }}</td>
<td>{{ shareholder.1 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="bi bi-file-earmark-text me-2"></i>Contracts</h5>
</div>
<div class="card-body">
<table class="table table-striped">
<thead>
<tr>
<th>Contract</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{% for contract in contracts %}
<tr>
<td>{{ contract.0 }}</td>
<td>
{% if contract.1 == "Signed" %}
<span class="badge bg-success">{{ contract.1 }}</span>
{% else %}
<span class="badge bg-warning text-dark">{{ contract.1 }}</span>
{% endif %}
</td>
<td>
<a href="/contracts/view/{{ contract.0 | lower | replace(from=' ', to='-') }}" class="btn btn-sm btn-outline-primary">View</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="card mb-4">
<div class="card-header bg-light">
<h5 class="mb-0"><i class="bi bi-gear me-2"></i>Actions</h5>
</div>
<div class="card-body">
<div class="d-flex gap-2">
<a href="/company/edit/{{ company_id }}" class="btn btn-outline-primary"><i class="bi bi-pencil me-1"></i>Edit Company</a>
<a href="/company/documents/{{ company_id }}" class="btn btn-outline-secondary"><i class="bi bi-file-earmark me-1"></i>Manage Documents</a>
<a href="/company/switch/{{ company_id }}" class="btn btn-primary"><i class="bi bi-box-arrow-in-right me-1"></i>Switch to Entity</a>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
{{ super() }}
<script>
document.addEventListener('DOMContentLoaded', function() {
console.log('Company view page loaded');
});
</script>
{% endblock %}

View File

@@ -24,11 +24,11 @@
<option value="" selected disabled>Choose an asset</option>
<!-- Tokens -->
<optgroup label="Tokens">
<option value="TFT" data-type="token" data-value="5000" data-amount="10000" data-unit="TFT" data-img="/static/img/tokens/tft.png">
ThreeFold Token (TFT) - 10,000 TFT ($5,000)
<option value="TFT" data-type="token" data-value="5000" data-amount="10000" data-unit="TFT">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i> ThreeFold Token (TFT) - 10,000 TFT ($5,000)
</option>
<option value="ZDFZ" data-type="token" data-value="2500" data-amount="5000" data-unit="ZDFZ" data-img="/static/img/tokens/zdfz.png">
Zanzibar Token (ZDFZ) - 5,000 ZDFZ ($2,500)
<option value="ZDFZ" data-type="token" data-value="2500" data-amount="5000" data-unit="ZDFZ">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i> Zanzibar Token (ZDFZ) - 5,000 ZDFZ ($2,500)
</option>
</optgroup>
<!-- Digital Assets -->
@@ -180,7 +180,7 @@
<tr>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/tft.png" alt="TFT" width="20" height="20" class="rounded-circle me-1">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
2,000 TFT
</div>
</td>
@@ -232,7 +232,7 @@
<tr>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="20" height="20" class="rounded-circle me-1">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
1,000 ZDFZ
</div>
</td>

View File

@@ -179,7 +179,7 @@
<tr>
<td>
<div class="d-flex align-items-center">
<div class="token-icon me-2"></div>
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
{{ position.base.asset_name }}
</div>
</td>
@@ -232,14 +232,14 @@
<tr>
<td>
<div class="d-flex align-items-center">
<div class="token-icon me-2"></div>
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
{{ position.base.asset_name }}
</div>
</td>
<td>{{ position.base.amount }} {{ position.base.asset_symbol }}</td>
<td>
<div class="d-flex align-items-center">
<div class="token-icon me-2"></div>
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
{{ position.collateral_amount }} {{ position.collateral_asset_symbol }}
</div>
</td>

View File

@@ -34,8 +34,8 @@
<td>
<div class="d-flex align-items-center">
<div class="position-relative me-2">
<img src="/static/img/tokens/tft.png" alt="TFT" width="24" height="24" class="rounded-circle">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle position-absolute" style="left: 15px; top: 0;">
</div>
TFT-ZDFZ
</div>
@@ -56,8 +56,8 @@
<td>
<div class="d-flex align-items-center">
<div class="position-relative me-2">
<img src="/static/img/tokens/tft.png" alt="TFT" width="24" height="24" class="rounded-circle">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="24" height="24" class="rounded-circle position-absolute" style="left: 15px; top: 0;">
</div>
TFT-USDT
</div>
@@ -76,13 +76,7 @@
</tr>
<tr>
<td>
<div class="d-flex align-items-center">
<div class="position-relative me-2">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="24" height="24" class="rounded-circle position-absolute" style="left: 15px; top: 0;">
</div>
ZDFZ-USDT
</div>
ZDFZ-USDT
</td>
<td>$850,000</td>
<td>$32,000</td>
@@ -117,13 +111,7 @@
<div class="col-md-6 col-lg-4 mb-4">
<div class="card h-100">
<div class="card-header bg-light">
<div class="d-flex align-items-center">
<div class="position-relative me-2">
<img src="/static/img/tokens/tft.png" alt="TFT" width="24" height="24" class="rounded-circle">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle position-absolute" style="left: 15px; top: 0;">
</div>
TFT-ZDFZ
</div>
TFT-ZDFZ
</div>
<div class="card-body">
<div class="d-flex justify-content-between mb-2">
@@ -163,13 +151,7 @@
<div class="col-md-6 col-lg-4 mb-4">
<div class="card h-100">
<div class="card-header bg-light">
<div class="d-flex align-items-center">
<div class="position-relative me-2">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="24" height="24" class="rounded-circle position-absolute" style="left: 15px; top: 0;">
</div>
ZDFZ-USDT
</div>
ZDFZ-USDT
</div>
<div class="card-body">
<div class="d-flex justify-content-between mb-2">

View File

@@ -156,7 +156,7 @@ This is a compliant version of the previous lending_borrowing.html tab. All term
<tr>
<td>
<div class="d-flex align-items-center">
<div class="token-icon me-2"></div>
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
{{ position.base.asset_name }}
</div>
</td>
@@ -211,16 +211,13 @@ This is a compliant version of the previous lending_borrowing.html tab. All term
<tr>
<td>
<div class="d-flex align-items-center">
<div class="token-icon me-2"></div>
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
{{ position.base.asset_name }}
</div>
</td>
<td>{{ position.base.amount }} {{ position.base.asset_symbol }}</td>
<td>
<div class="d-flex align-items-center">
<div class="token-icon me-2"></div>
{{ position.collateral_amount }} {{ position.collateral_asset_symbol }}
</div>
{{ position.collateral_amount }} {{ position.collateral_asset_symbol }}
</td>
<td>
<div class="d-flex align-items-center">

View File

@@ -22,7 +22,6 @@
<div class="card h-100">
<div class="card-header bg-primary text-white">
<div class="d-flex align-items-center">
<img src="/static/img/tokens/tft.png" alt="TFT" width="24" height="24" class="rounded-circle me-2">
<h6 class="mb-0">ThreeFold Token (TFT)</h6>
</div>
</div>
@@ -80,7 +79,6 @@
<div class="card h-100">
<div class="card-header bg-success text-white">
<div class="d-flex align-items-center">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle me-2">
<h6 class="mb-0">Zanzibar Token (ZDFZ)</h6>
</div>
</div>
@@ -221,7 +219,7 @@
<tr>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/tft.png" alt="TFT" width="24" height="24" class="rounded-circle me-2">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
ThreeFold Token (TFT)
</div>
</td>
@@ -239,7 +237,7 @@
<tr>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle me-2">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
Zanzibar Token (ZDFZ)
</div>
</td>

View File

@@ -29,27 +29,26 @@
</div>
<div class="dropdown">
<button class="btn btn-outline-primary dropdown-toggle d-flex align-items-center" type="button" id="fromTokenDropdown" data-bs-toggle="dropdown" aria-expanded="false">
<img src="/static/img/tokens/tft.png" alt="TFT" width="24" height="24" class="rounded-circle me-2" id="fromTokenImg">
<span id="fromTokenSymbol">TFT</span>
</button>
<input type="hidden" name="from_token" id="fromTokenInput" value="TFT">
<ul class="dropdown-menu" aria-labelledby="fromTokenDropdown">
<li><a class="dropdown-item d-flex align-items-center" href="#" data-token="TFT" data-img="/static/img/tokens/tft.png" data-balance="10000">
<img src="/static/img/tokens/tft.png" alt="TFT" width="24" height="24" class="rounded-circle me-2">
<li><a class="dropdown-item d-flex align-items-center" href="#" data-token="TFT" data-balance="10000">
<div>
<div>ThreeFold Token</div>
<small class="text-muted">Balance: 10,000 TFT</small>
</div>
</a></li>
<li><a class="dropdown-item d-flex align-items-center" href="#" data-token="ZDFZ" data-img="/static/img/tokens/zdfz.png" data-balance="5000">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle me-2">
<div>
<div>Zanzibar Token</div>
<small class="text-muted">Balance: 5,000 ZDFZ</small>
</div>
</a></li>
<li><a class="dropdown-item d-flex align-items-center" href="#" data-token="USDT" data-img="/static/img/tokens/usdt.png" data-balance="2500">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="24" height="24" class="rounded-circle me-2">
<div>
<div>Tether USD</div>
<small class="text-muted">Balance: 2,500 USDT</small>
@@ -82,21 +81,21 @@
<input type="number" class="form-control form-control-lg border-0" id="swapToAmount" name="to_amount" placeholder="0.0" readonly>
<div class="dropdown">
<button class="btn btn-outline-primary dropdown-toggle d-flex align-items-center" type="button" id="toTokenDropdown" data-bs-toggle="dropdown" aria-expanded="false">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle me-2" id="toTokenImg">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
<span id="toTokenSymbol">ZDFZ</span>
</button>
<input type="hidden" name="to_token" id="toTokenInput" value="ZDFZ">
<ul class="dropdown-menu" aria-labelledby="toTokenDropdown">
<li><a class="dropdown-item d-flex align-items-center" href="#" data-token="TFT" data-img="/static/img/tokens/tft.png">
<img src="/static/img/tokens/tft.png" alt="TFT" width="24" height="24" class="rounded-circle me-2">
<div>ThreeFold Token</div>
</a></li>
<li><a class="dropdown-item d-flex align-items-center" href="#" data-token="ZDFZ" data-img="/static/img/tokens/zdfz.png">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="24" height="24" class="rounded-circle me-2">
<div>Zanzibar Token</div>
</a></li>
<li><a class="dropdown-item d-flex align-items-center" href="#" data-token="USDT" data-img="/static/img/tokens/usdt.png">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="24" height="24" class="rounded-circle me-2">
<div>Tether USD</div>
</a></li>
</ul>
@@ -163,13 +162,13 @@
<td>2025-04-15 14:32</td>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/tft.png" alt="TFT" width="20" height="20" class="rounded-circle me-1">
500 TFT
</div>
</td>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="20" height="20" class="rounded-circle me-1">
250 ZDFZ
</div>
</td>
@@ -179,13 +178,13 @@
<td>2025-04-14 09:17</td>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="20" height="20" class="rounded-circle me-1">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
1,000 USDT
</div>
</td>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/tft.png" alt="TFT" width="20" height="20" class="rounded-circle me-1">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
2,000 TFT
</div>
</td>
@@ -195,13 +194,13 @@
<td>2025-04-12 16:45</td>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="20" height="20" class="rounded-circle me-1">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
100 ZDFZ
</div>
</td>
<td>
<div class="d-flex align-items-center">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="20" height="20" class="rounded-circle me-1">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
50 USDT
</div>
</td>
@@ -234,8 +233,8 @@
<td>
<div class="d-flex align-items-center">
<div class="position-relative me-2">
<img src="/static/img/tokens/tft.png" alt="TFT" width="20" height="20" class="rounded-circle">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="20" height="20" class="rounded-circle position-absolute" style="left: 10px; top: 0;">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
</div>
TFT/ZDFZ
</div>
@@ -248,8 +247,8 @@
<td>
<div class="d-flex align-items-center">
<div class="position-relative me-2">
<img src="/static/img/tokens/tft.png" alt="TFT" width="20" height="20" class="rounded-circle">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="20" height="20" class="rounded-circle position-absolute" style="left: 10px; top: 0;">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
</div>
TFT/USDT
</div>
@@ -262,8 +261,8 @@
<td>
<div class="d-flex align-items-center">
<div class="position-relative me-2">
<img src="/static/img/tokens/zdfz.png" alt="ZDFZ" width="20" height="20" class="rounded-circle">
<img src="/static/img/tokens/usdt.png" alt="USDT" width="20" height="20" class="rounded-circle position-absolute" style="left: 10px; top: 0;">
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
<i class="bi bi-coin me-2" style="font-size: 1.5rem;"></i>
</div>
ZDFZ/USDT
</div>