mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
191 files reformatted across views, components, widgets, hybrid, contexts. New components: CCreateSchemaDialog, CAddFieldDialog, CAdminContentPanel. JS helpers: connBadgeStatus/Text, adminStats, exampleLabels, onLevelClicked. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
136 lines
3.5 KiB
QML
136 lines
3.5 KiB
QML
pragma Singleton
|
|
import QtQuick
|
|
|
|
/**
|
|
* AjaxQueueContext - Global AJAX request tracking
|
|
* Mirrors React's AjaxQueueContext.jsx
|
|
*/
|
|
QtObject {
|
|
id: ajaxQueue
|
|
|
|
// Request queue
|
|
property var queue: []
|
|
|
|
// Statistics
|
|
property int pending: 0
|
|
property int completed: 0
|
|
property int failed: 0
|
|
|
|
// Visibility
|
|
property bool isVisible: false
|
|
|
|
// Request ID counter
|
|
property int _requestIdCounter: 0
|
|
|
|
// Generate unique ID
|
|
function _generateId() {
|
|
_requestIdCounter++
|
|
return "req_" + _requestIdCounter + "_" + Date.now()
|
|
}
|
|
|
|
/**
|
|
* Add a new request to the queue
|
|
* @param label - Display name for the request
|
|
* @param options - Optional: { progress: { current, total }, group:
|
|
// string }
|
|
* @returns request ID
|
|
*/
|
|
function addRequest(label, options) {
|
|
options = options || {}
|
|
const id = _generateId()
|
|
const request = {
|
|
id: id,
|
|
label: label,
|
|
status: "pending", // pending, success, error
|
|
startTime: Date.now(),
|
|
endTime: null,
|
|
error: null,
|
|
progress: options.progress || null,
|
|
group: options.group || null
|
|
}
|
|
|
|
queue = [...queue, request]
|
|
pending = _countByStatus("pending")
|
|
isVisible = true
|
|
|
|
return id
|
|
}
|
|
|
|
/**
|
|
* Update a request's status
|
|
* @param id - Request ID
|
|
* @param updates - { status, error, progress }
|
|
*/
|
|
function updateRequest(id, updates) {
|
|
queue = queue.map(function(req) {
|
|
if (req.id !== id) return req
|
|
|
|
const updated = Object.assign({}, req, updates)
|
|
if (updates.status === "success" || updates.status === "error") {
|
|
updated.endTime = Date.now()
|
|
}
|
|
return updated
|
|
})
|
|
|
|
pending = _countByStatus("pending")
|
|
completed = _countByStatus("success")
|
|
failed = _countByStatus("error")
|
|
|
|
// Auto-hide after 3 seconds if no pending
|
|
if (pending === 0) {
|
|
_autoHideTimer.restart()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Clear all completed/failed requests
|
|
*/
|
|
function clearQueue() {
|
|
queue = queue.filter(function(r) {
|
|
return r.status === "pending"
|
|
})
|
|
|
|
completed = 0
|
|
failed = 0
|
|
|
|
if (queue.length === 0) {
|
|
isVisible = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get elapsed time string
|
|
*/
|
|
function getElapsedTime(startTime, endTime) {
|
|
const elapsed = (endTime || Date.now()) - startTime
|
|
if (elapsed < 1000) return elapsed + "ms"
|
|
return (elapsed / 1000).toFixed(1) + "s"
|
|
}
|
|
|
|
// Internal: count by status
|
|
function _countByStatus(status) {
|
|
return queue.filter(function(r) {
|
|
return r.status === status
|
|
}).length
|
|
}
|
|
|
|
// Auto-hide timer
|
|
property Timer _autoHideTimer: Timer {
|
|
interval: 3000
|
|
onTriggered: {
|
|
if (ajaxQueue.pending === 0) {
|
|
// Clear old completed requests
|
|
const cutoff = Date.now() - 2000
|
|
ajaxQueue.queue = ajaxQueue.queue.filter(function(r) {
|
|
return r.status === "pending" || (r.endTime &&
|
|
r.endTime > cutoff)
|
|
})
|
|
|
|
if (ajaxQueue.queue.length === 0) {
|
|
ajaxQueue.isVisible = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|