oayment plan visuals in the instances page
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -580,7 +580,8 @@ def get_version_info(current_user):
|
|||||||
'git_branch': os.environ.get('GIT_BRANCH', 'unknown'),
|
'git_branch': os.environ.get('GIT_BRANCH', 'unknown'),
|
||||||
'deployed_at': os.environ.get('DEPLOYED_AT', 'unknown'),
|
'deployed_at': os.environ.get('DEPLOYED_AT', 'unknown'),
|
||||||
'ismaster': os.environ.get('ISMASTER', 'false'),
|
'ismaster': os.environ.get('ISMASTER', 'false'),
|
||||||
'port': os.environ.get('PORT', 'unknown')
|
'port': os.environ.get('PORT', 'unknown'),
|
||||||
|
'pricing_tier_name': os.environ.get('PRICING_TIER_NAME', 'unknown')
|
||||||
}
|
}
|
||||||
|
|
||||||
return jsonify(version_info)
|
return jsonify(version_info)
|
||||||
@@ -591,6 +592,7 @@ def get_version_info(current_user):
|
|||||||
'app_version': 'unknown',
|
'app_version': 'unknown',
|
||||||
'git_commit': 'unknown',
|
'git_commit': 'unknown',
|
||||||
'git_branch': 'unknown',
|
'git_branch': 'unknown',
|
||||||
'deployed_at': 'unknown'
|
'deployed_at': 'unknown',
|
||||||
|
'pricing_tier_name': 'unknown'
|
||||||
}), 500
|
}), 500
|
||||||
|
|
||||||
|
|||||||
@@ -130,6 +130,18 @@
|
|||||||
<div class="company-value" id="company-description">Loading...</div>
|
<div class="company-value" id="company-description">Loading...</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<div class="d-flex">
|
||||||
|
<div class="text-muted me-2" style="min-width: 120px;">Version:</div>
|
||||||
|
<div class="company-value" id="instance-version-value">Loading...</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<div class="d-flex">
|
||||||
|
<div class="text-muted me-2" style="min-width: 120px;">Payment Plan:</div>
|
||||||
|
<div class="company-value" id="instance-payment-plan-value">Loading...</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<h5 class="mb-3">Contact Information</h5>
|
<h5 class="mb-3">Contact Information</h5>
|
||||||
@@ -1569,5 +1581,46 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Function to fetch version and payment plan info
|
||||||
|
async function fetchInstanceVersionAndPlan() {
|
||||||
|
const versionEl = document.getElementById('instance-version-value');
|
||||||
|
const planEl = document.getElementById('instance-payment-plan-value');
|
||||||
|
versionEl.textContent = 'Loading...';
|
||||||
|
planEl.textContent = 'Loading...';
|
||||||
|
try {
|
||||||
|
// Get JWT token
|
||||||
|
const tokenResponse = await fetch(`{{ instance.main_url }}/api/admin/management-token`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'X-API-Key': '{{ instance.connection_token }}',
|
||||||
|
'Accept': 'application/json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!tokenResponse.ok) throw new Error('Failed to get management token');
|
||||||
|
const tokenData = await tokenResponse.json();
|
||||||
|
if (!tokenData.token) throw new Error('No token received');
|
||||||
|
// Fetch version info
|
||||||
|
const response = await fetch(`{{ instance.main_url }}/api/admin/version-info`, {
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Authorization': `Bearer ${tokenData.token}`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error('Failed to fetch version info');
|
||||||
|
const data = await response.json();
|
||||||
|
versionEl.textContent = data.app_version || 'Unknown';
|
||||||
|
planEl.textContent = data.pricing_tier_name || 'Unknown';
|
||||||
|
} catch (error) {
|
||||||
|
versionEl.textContent = 'Error';
|
||||||
|
planEl.textContent = 'Error';
|
||||||
|
console.error('Error fetching version/plan info:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
// ... existing code ...
|
||||||
|
fetchInstanceVersionAndPlan();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -1077,6 +1077,7 @@ function compareSemanticVersions(currentVersion, latestVersion) {
|
|||||||
async function fetchVersionInfo(instanceUrl, instanceId) {
|
async function fetchVersionInfo(instanceUrl, instanceId) {
|
||||||
const row = document.querySelector(`[data-instance-id="${instanceId}"]`).closest('tr');
|
const row = document.querySelector(`[data-instance-id="${instanceId}"]`).closest('tr');
|
||||||
const versionCell = row.querySelector('td:nth-child(9)'); // Version column (adjusted after removing branch)
|
const versionCell = row.querySelector('td:nth-child(9)'); // Version column (adjusted after removing branch)
|
||||||
|
const paymentPlanCell = row.querySelector('td:nth-child(6)'); // Payment Plan column
|
||||||
|
|
||||||
// Show loading state
|
// Show loading state
|
||||||
if (versionCell) {
|
if (versionCell) {
|
||||||
@@ -1112,6 +1113,25 @@ async function fetchVersionInfo(instanceUrl, instanceId) {
|
|||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
console.log('Received version data:', data);
|
console.log('Received version data:', data);
|
||||||
|
|
||||||
|
// Update payment plan cell with pricing tier name
|
||||||
|
if (paymentPlanCell) {
|
||||||
|
const pricingTierName = data.pricing_tier_name || 'unknown';
|
||||||
|
if (pricingTierName !== 'unknown') {
|
||||||
|
paymentPlanCell.innerHTML = `
|
||||||
|
<span class="badge bg-info" data-bs-toggle="tooltip" title="Pricing Tier: ${pricingTierName}">
|
||||||
|
<i class="fas fa-tag me-1"></i>${pricingTierName}
|
||||||
|
</span>`;
|
||||||
|
|
||||||
|
// Add tooltip for payment plan
|
||||||
|
const paymentPlanBadge = paymentPlanCell.querySelector('[data-bs-toggle="tooltip"]');
|
||||||
|
if (paymentPlanBadge) {
|
||||||
|
new bootstrap.Tooltip(paymentPlanBadge);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
paymentPlanCell.innerHTML = '<span class="badge bg-secondary">unknown</span>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Update version cell
|
// Update version cell
|
||||||
if (versionCell) {
|
if (versionCell) {
|
||||||
const appVersion = data.app_version || 'unknown';
|
const appVersion = data.app_version || 'unknown';
|
||||||
@@ -1209,11 +1229,23 @@ async function fetchVersionInfo(instanceUrl, instanceId) {
|
|||||||
</span>`;
|
</span>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (paymentPlanCell) {
|
||||||
|
paymentPlanCell.innerHTML = `
|
||||||
|
<span class="text-warning" data-bs-toggle="tooltip" title="Error: ${error.message}">
|
||||||
|
<i class="fas fa-exclamation-triangle"></i> Error
|
||||||
|
</span>`;
|
||||||
|
}
|
||||||
|
|
||||||
// Add tooltips for error states
|
// Add tooltips for error states
|
||||||
const errorBadge = versionCell?.querySelector('[data-bs-toggle="tooltip"]');
|
const errorBadge = versionCell?.querySelector('[data-bs-toggle="tooltip"]');
|
||||||
if (errorBadge) {
|
if (errorBadge) {
|
||||||
new bootstrap.Tooltip(errorBadge);
|
new bootstrap.Tooltip(errorBadge);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const paymentPlanErrorBadge = paymentPlanCell?.querySelector('[data-bs-toggle="tooltip"]');
|
||||||
|
if (paymentPlanErrorBadge) {
|
||||||
|
new bootstrap.Tooltip(paymentPlanErrorBadge);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user