diff --git a/addons/admin/ui/_site/script.js b/addons/admin/ui/_site/script.js index 222f366..b4bc5bc 100644 --- a/addons/admin/ui/_site/script.js +++ b/addons/admin/ui/_site/script.js @@ -49,7 +49,7 @@ function requestPlayerData() { event: "REQUEST::PLAYER::DATA", data: {} }; - + // Send request to the game engine A3API.SendAlert(JSON.stringify(message)); } @@ -63,14 +63,14 @@ function requestPaygradeData() { event: "REQUEST::PAYGRADE::DATA", data: {} }; - + // Send request to the game engine A3API.SendAlert(JSON.stringify(message)); } /** * Set up a timer to periodically refresh player data - * Ensures the admin panel shows up-to-date information + * Ensures the UI is updated with the latest information */ function setupRefreshTimer() { setInterval(requestPlayerData, 30000); // Refresh every 30 seconds @@ -95,14 +95,14 @@ function handlePaygradeDataRequest(paygradeList) { paygradeList.forEach(item => { paygradeMap[item.paygrade] = item.bonus; }); - + adminData.paydayAmounts = paygradeMap; // Update the player list if we already have player data if (adminData.players.length > 0) { updatePlayerList(); } - + console.log("Paygrade data updated successfully"); } catch (error) { console.error("Error updating paygrade data:", error); @@ -134,7 +134,7 @@ function handlePlayerDataRequest(playerList) { function updateStats() { const onlinePlayers = adminData.players.length; const onlineStaff = adminData.players.filter(p => p.paygrade !== "E1").length; - + document.getElementById('playerCount').textContent = onlinePlayers; document.getElementById('staffCount').textContent = onlineStaff; } @@ -145,7 +145,7 @@ function updateStats() { */ function setupFilterListeners() { const filterButtons = document.querySelectorAll('.filter-btn'); - + // Set up filter button click handlers filterButtons.forEach(button => { button.addEventListener('click', () => { @@ -171,7 +171,7 @@ function setupFilterListeners() { */ function filterPlayers(filter, searchTerm = '') { let filteredPlayers = adminData.players; - + // Apply category filter if (filter === 'staff') { filteredPlayers = filteredPlayers.filter(p => p.paygrade !== "E1"); @@ -184,15 +184,15 @@ function filterPlayers(filter, searchTerm = '') { } else if (filter === 'civilian') { filteredPlayers = filteredPlayers.filter(p => p.side === "CIV"); } - + // Apply search filter if (searchTerm) { const term = searchTerm.toLowerCase(); - filteredPlayers = filteredPlayers.filter(p => + filteredPlayers = filteredPlayers.filter(p => p.name.toLowerCase().includes(term) ); } - + updatePlayerList(filteredPlayers); } @@ -207,7 +207,7 @@ function updatePlayerList(players = adminData.players) { playerList.innerHTML = players.map(player => { const paydayAmount = adminData.paydayAmounts[player.paygrade] || 1000; const rankClass = getRankClass(player.paygrade); - + return `
@@ -243,11 +243,11 @@ function getRankClass(paygrade) { return 'enlisted'; } else if (paygrade.startsWith('WO')) { return 'warrant'; - } else if (paygrade.startsWith('O') || - paygrade.startsWith('1') || - paygrade.startsWith('2') || - paygrade.startsWith('C') || - paygrade.startsWith('M')) { + } else if (paygrade.startsWith('O') || + paygrade.startsWith('1') || + paygrade.startsWith('2') || + paygrade.startsWith('C') || + paygrade.startsWith('M')) { return 'officer'; } else { return 'enlisted'; // Default @@ -269,13 +269,13 @@ function getRankClass(paygrade) { function updatePaygrade(uid, isPromotion) { const player = adminData.players.find(p => p.uid === uid); if (!player) return; - + // Use the paygrades from the configuration const paygrades = Object.keys(adminData.paydayAmounts); paygrades.sort((a, b) => adminData.paydayAmounts[a] - adminData.paydayAmounts[b]); // Sort by payment amount - + const currentIndex = paygrades.indexOf(player.paygrade); - + let newPaygrade; if (isPromotion && currentIndex < paygrades.length - 1) { newPaygrade = paygrades[currentIndex + 1]; @@ -284,14 +284,14 @@ function updatePaygrade(uid, isPromotion) { } else { return; // Can't promote/demote further } - + const message = { event: "UPDATE::PAYGRADE", data: [uid, newPaygrade] }; - + A3API.SendAlert(JSON.stringify(message)); - + // Optimistic update player.paygrade = newPaygrade; updatePlayerList(); @@ -346,7 +346,7 @@ function giveAllMoney() { } A3API.SendAlert(JSON.stringify(message)); - + // Request updated player data after giving money to all players setTimeout(requestPlayerData, 500); // Short delay to allow server processing } @@ -374,7 +374,7 @@ function handleTransferFunds(condition, amount, uid) { event: "HANDLE::TRANSFER", data: [condition, amount, uid] }; - + A3API.SendAlert(JSON.stringify(message)); // Optimistic update @@ -428,7 +428,7 @@ function sendPlayerMessage() { event: "SEND::MESSAGE", data: [selectedPlayerId, message] }; - + A3API.SendAlert(JSON.stringify(messageData)); closeMessageModal(); } @@ -444,7 +444,7 @@ function broadcastMessage() { event: "BROADCAST::MESSAGE", data: ["", message] }; - + A3API.SendAlert(JSON.stringify(messageData)); document.getElementById('broadcastMessage').value = ''; } @@ -466,7 +466,7 @@ function Payday() { }; A3API.SendAlert(JSON.stringify(message)); - + // Request updated player data after payday setTimeout(requestPlayerData, 500); // Short delay to allow server processing } diff --git a/addons/bank/XEH_postInit.sqf b/addons/bank/XEH_postInit.sqf index ce7c0a8..42d51ce 100644 --- a/addons/bank/XEH_postInit.sqf +++ b/addons/bank/XEH_postInit.sqf @@ -5,7 +5,8 @@ }, { private _bank = GETVAR(player,FORGE_Bank,0); private _cash = GETVAR(player,FORGE_Cash,0); + private _rating = GETVAR(player,FORGE_Rating,0); private _uid = getPlayerUID player; - ["forge_server_bank_handleEvents", ["BANK::HANDLE::PLAYER::LOAD", [_uid, _bank, _cash]]] call CFUNC(serverEvent); + ["forge_server_bank_handleEvents", ["BANK::HANDLE::PLAYER::LOAD", [_uid, _bank, _cash, _rating]]] call CFUNC(serverEvent); }] call CFUNC(waitUntilAndExecute); \ No newline at end of file diff --git a/addons/bank/XEH_postInit_client.sqf b/addons/bank/XEH_postInit_client.sqf index 6986511..c985178 100644 --- a/addons/bank/XEH_postInit_client.sqf +++ b/addons/bank/XEH_postInit_client.sqf @@ -3,7 +3,7 @@ [QGVAR(handleEvents), { params ["_control", "_isConfirmDialog", "_message"]; - diag_log text format ["[FORGE::Client::Bank::XEH_postInit] Received event: '%1'", _message]; + diag_log text format ["[FORGE::Client::Bank::XEH_postInit::handleEvents] Received event: '%1'", _message]; _message = fromJSON _message; private _event = _message get "event"; @@ -15,11 +15,11 @@ private _playerList = []; { - private _player = _x; - private _uid = getPlayerUID _player; - private _name = name _player; - private _funds = GETVAR(_player,FORGE_Bank,0); //TODO: Implement funds from server - private _cash = GETVAR(_player,FORGE_Cash,0); //TODO: Implement cash from server + private _uid = getPlayerUID _x; + private _name = name _x; + private _funds = GETVAR(_x,FORGE_Bank,0); //TODO: Implement funds from server + private _cash = GETVAR(_x,FORGE_Cash,0); //TODO: Implement cash from server + private _playerInfo = createHashMapFromArray [ ["uid", _uid], ["name", _name], @@ -35,52 +35,63 @@ }; case "REQUEST::PLAYER::FUNDS": { private _playerData = createHashMap; - private _uid = getPlayerUID player; - private _balance = GETVAR(_player,FORGE_Bank,0); //TODO: Implement balance from server - private _cash = GETVAR(_player,FORGE_Cash,0); //TODO: Implement cash from server + private _balance = GETVAR(player,FORGE_Bank,0); //TODO: Implement balance from server + private _cash = GETVAR(player,FORGE_Cash,0); //TODO: Implement cash from server + + private _payMultiplier = "MULTIPLYR" call BFUNC(getParamValue); + private _rating = rating player; //TODO: Implement rating from server + private _pending = _rating * _payMultiplier; //TODO: Implement pending from server + private _playerData = createHashMapFromArray [ ["balance", _balance], - ["cash", _cash] + ["cash", _cash], + ["pending", _pending] ]; _control ctrlWebBrowserAction ["ExecJS", format ["handlePlayerFundsRequest(%1)", (toJSON _playerData)]]; }; case "REQUEST::TRANSACTION::HISTORY": { - private _uid = getPlayerUID player; private _history = []; //TODO: Implement history from server private _historyData = createHashMapFromArray [["history", _history]]; _control ctrlWebBrowserAction ["ExecJS", format ["handleTransactionHistoryRequest(%1)", (toJSON _historyData)]]; }; case "DEPOSIT::FUNDS": { - _data params ["_amount"]; + _data params [["_amount", 0, [0]]]; if (_amount <= 0) exitWith { systemChat "Invalid amount, must be greater than 0!"; false }; - ["forge_server_bank_handleEvents", ["BANK::DEPOSIT", [getPlayerUID player, _amount]]] call CFUNC(serverEvent); true }; - case "WITHDRAW::FUNDS": { - _data params ["_amount"]; + case "SUBMIT::TIMESHEET": { + private _rating = rating player; + private _uid = getPlayerUID player; - if (_amount <= 0) exitWith { systemChat "Invalid amount, must be greater than 0!"; false }; + ["forge_server_bank_handleEvents", ["BANK::SUBMIT::TIMESHEET", [_uid, _rating]]] call CFUNC(serverEvent); - ["forge_server_bank_handleEvents", ["BANK::WITHDRAW", [getPlayerUID player, _amount]]] call CFUNC(serverEvent); + player addRating -_rating; true }; case "TRANSFER::FUNDS": { - _data params ["_amount", "_toUid"]; + _data params [["_uid", "", [""]], ["_amount", 0, [0]]]; - if ((_amount <= 0) || {_toUid isEqualTo ""}) exitWith { systemChat "Invalid UID or amount, UID cannot be empty and amount must be greater than 0!"; false }; + if ({_uid isEqualTo ""} || _amount <= 0) exitWith { systemChat "Invalid UID or amount, UID cannot be empty and amount must be greater than 0!"; false }; + ["forge_server_bank_handleEvents", ["BANK::TRANSFER", [getPlayerUID player, _uid, _amount]]] call CFUNC(serverEvent); - ["forge_server_bank_handleEvents", ["BANK::TRANSFER", [getPlayerUID player, _toUid, _amount]]] call CFUNC(serverEvent); + true + }; + case "WITHDRAW::FUNDS": { + _data params [["_amount", 0, [0]]]; + + if (_amount <= 0) exitWith { systemChat "Invalid amount, amount must be greater than 0!"; false }; + ["forge_server_bank_handleEvents", ["BANK::WITHDRAW", [getPlayerUID player, _amount]]] call CFUNC(serverEvent); true }; default { - diag_log format ["[FORGE::Client::Bank::XEH_postInit] Unhandled event: %1", _event]; + diag_log format ["[FORGE::Client::Bank::XEH_postInit::handleEvents] Unhandled event: %1", _event]; }; }; }] call CFUNC(addEventHandler); \ No newline at end of file diff --git a/addons/bank/functions/fnc_deposit.sqf b/addons/bank/functions/fnc_deposit.sqf index 43bc4bb..d311687 100644 --- a/addons/bank/functions/fnc_deposit.sqf +++ b/addons/bank/functions/fnc_deposit.sqf @@ -17,13 +17,11 @@ */ private _amount = parseNumber (ctrlText IDC_AMOUNTINPUT); -private _uid = getPlayerUID player; private _messageData = createHashMapFromArray [ ["event", "DEPOSIT::FUNDS"], ["data", createHashMapFromArray [ - ["amount", _amount], - ["uid", _uid] + ["amount", _amount] ]] ]; diff --git a/addons/bank/functions/fnc_submit.sqf b/addons/bank/functions/fnc_submit.sqf index 07bcd79..d9d44c7 100644 --- a/addons/bank/functions/fnc_submit.sqf +++ b/addons/bank/functions/fnc_submit.sqf @@ -19,19 +19,24 @@ * Public: Yes */ -private _bank = GETVAR(player,FORGE_Bank,0); //TODO: Implement balance from server private _payMultiplyer = "MULTIPLYR" call BFUNC(getParamValue); private _plyscore = rating player; //TODO: Implement rating from server private _multiplyer = _plyscore * _payMultiplyer; _bank = _bank + _multiplyer; -player addRating - _plyscore; -SETPVAR(player,FORGE_Bank,_bank); -SETPVAR(player,FORGE_Rating,0); - -[] call FUNC(refresh); - private _formattedRating = _bank call EFUNC(misc,formatNumber); +private _messageData = createHashMapFromArray [ + ["event", "SUBMIT::TIMESHEET"], + ["data", []] +]; -[format ["Timesheet submitted! Received $%1 based on rating of %2", _formattedRating, _plyscore], "info", 3, "right"] call EFUNC(misc,notify); \ No newline at end of file +private _response = ["forge_client_bank_handleEvents", (toJSON _messageData)] call CFUNC(localEvent); + +if (_response) then { + [format ["Submitted timesheet! Received $%1 based on rating of %2", _formattedRating, _plyscore], "info", 3, "right"] call EFUNC(misc,notify); +} else { + [format ["Timesheet submission failed"], "warning", 3, "right"] call EFUNC(misc,notify); +}; + +[] call FUNC(refresh); \ No newline at end of file diff --git a/addons/bank/functions/fnc_transfer.sqf b/addons/bank/functions/fnc_transfer.sqf index 4a5218d..6147b35 100644 --- a/addons/bank/functions/fnc_transfer.sqf +++ b/addons/bank/functions/fnc_transfer.sqf @@ -24,15 +24,12 @@ private _amount = parseNumber (ctrlText _input); private _selectedTarget = lbCurSel _dropdown; private _selectedTargetData = _dropdown lbData _selectedTarget; private _target = objectFromNetId _selectedTargetData; - -private _fromUid = getPlayerUID player; -private _toUid = getPlayerUID _target; +private _uid = getPlayerUID _target; private _messageData = createHashMapFromArray [ ["event", "TRANSFER::FUNDS"], ["data", createHashMapFromArray [ - ["fromUid", _fromUid], - ["toUid", _toUid], + ["uid", _uid], ["amount", _amount] ]] ]; diff --git a/addons/bank/ui/_site/index.html b/addons/bank/ui/_site/index.html index a598662..bf22de0 100644 --- a/addons/bank/ui/_site/index.html +++ b/addons/bank/ui/_site/index.html @@ -1,5 +1,6 @@ +

Submit Timesheet

-
- - -
-
- - +
+
Pending Payment
+
$0
@@ -109,4 +107,5 @@ - + + \ No newline at end of file diff --git a/addons/bank/ui/_site/script.js b/addons/bank/ui/_site/script.js index 84d92e5..68c6ef2 100644 --- a/addons/bank/ui/_site/script.js +++ b/addons/bank/ui/_site/script.js @@ -14,10 +14,13 @@ let bankState = { wallet: 0, account: 0, + pending: 0, players: [], transactions: [] }; +// #endregion + //============================================================================= // #region INITIALIZATION AND DATA REQUESTS //============================================================================= @@ -41,7 +44,7 @@ function requestPlayerFunds() { event: "REQUEST::PLAYER::FUNDS", data: {} }; - + A3API.SendAlert(JSON.stringify(message)); } @@ -53,7 +56,7 @@ function requestPlayerData() { event: "REQUEST::PLAYER::DATA", data: {} }; - + A3API.SendAlert(JSON.stringify(message)); } @@ -65,10 +68,20 @@ function requestTransactionHistory() { event: "REQUEST::TRANSACTION::HISTORY", data: {} }; - + A3API.SendAlert(JSON.stringify(message)); } +/** + * Set up a timer to refresh player data every 30 seconds + * Ensures the UI is updated with the latest information + */ +function setupRefreshTimer() { + setInterval(requestPlayerData, 30000); // Refresh every 30 seconds +} + +// #endregion + //============================================================================= // #region DATA HANDLERS //============================================================================= @@ -88,7 +101,7 @@ function handlePlayerDataRequest(data) { */ function handlePlayerFundsRequest(data) { console.log('Received funds data:', data); - + // Parse the data if it's a string if (typeof data === 'string') { try { @@ -98,10 +111,11 @@ function handlePlayerFundsRequest(data) { return; } } - + // Ensure we have valid numbers, default to 0 if null bankState.wallet = data.cash !== null ? Number(data.cash) : 0; bankState.account = data.balance !== null ? Number(data.balance) : 0; + bankState.pending = data.pending !== null ? Number(data.pending) : 0; updateBalanceDisplays(); } @@ -111,7 +125,7 @@ function handlePlayerFundsRequest(data) { */ function handleTransactionHistoryRequest(data) { console.log('Received transaction history:', data); - + // Parse the data if it's a string if (typeof data === 'string') { try { @@ -121,12 +135,14 @@ function handleTransactionHistoryRequest(data) { return; } } - + // Initialize empty array if history is null bankState.transactions = []; updateTransactionHistory(); } +// #endregion + //============================================================================= // #region UI UPDATES AND DISPLAY //============================================================================= @@ -137,10 +153,12 @@ function handleTransactionHistoryRequest(data) { function updateBalanceDisplays() { const walletElement = document.getElementById('walletBalance'); const accountElement = document.getElementById('accountBalance'); - - if (walletElement && accountElement) { + const pendingElement = document.getElementById('pending'); + + if (walletElement && accountElement && pendingElement) { walletElement.textContent = `$${(bankState.wallet || 0).toLocaleString()}`; accountElement.textContent = `$${(bankState.account || 0).toLocaleString()}`; + pendingElement.textContent = `$${(bankState.pending || 0).toLocaleString()}`; } } @@ -150,7 +168,7 @@ function updateBalanceDisplays() { function populatePlayerList() { const playerSelect = document.getElementById('playerSelect'); playerSelect.innerHTML = ''; - + bankState.players.forEach(player => { const option = document.createElement('option'); option.value = player.uid; @@ -165,7 +183,7 @@ function populatePlayerList() { function updateTransactionHistory() { const historyList = document.getElementById('transactionHistory'); if (!historyList) return; - + historyList.innerHTML = ''; if (!Array.isArray(bankState.transactions)) { @@ -183,21 +201,21 @@ function updateTransactionHistory() { bankState.transactions.forEach(transaction => { if (!transaction) return; - + const li = document.createElement('li'); li.className = 'history-item'; - + const isNegative = ['transfer_out', 'to_wallet'].includes(transaction.type); const amountClass = isNegative ? 'amount-negative' : 'amount-positive'; const amountPrefix = isNegative ? '-' : '+'; const amount = Math.abs(Number(transaction.amount) || 0); - + li.innerHTML = ` ${formatTransactionType(transaction.type)} ${transaction.details || ''} ${amountPrefix}$${amount.toLocaleString()} `; - + historyList.appendChild(li); }); } @@ -218,6 +236,8 @@ function formatTransactionType(type) { return types[type] || type; } +// #endregion + //============================================================================= // #region ACTION HANDLERS //============================================================================= @@ -228,23 +248,15 @@ function formatTransactionType(type) { function handleTransfer() { const amount = parseInt(document.getElementById('transferAmount').value); const transferType = document.getElementById('transferType').value; - - if (amount <= 0) { - alert('Amount must be greater than 0'); - return; - } - const event = transferType === 'to_wallet' ? 'WITHDRAW::FUNDS' : 'DEPOSIT::FUNDS'; - const message = { event: event, - data: { - amount: amount - } + data: [amount] }; - + A3API.SendAlert(JSON.stringify(message)); document.getElementById('transferAmount').value = ''; + setTimeout(requestPlayerFunds, 500); } /** @@ -253,54 +265,31 @@ function handleTransfer() { function handlePlayerTransfer() { const amount = parseInt(document.getElementById('playerTransferAmount').value); const playerUid = document.getElementById('playerSelect').value; - - if (amount <= 0) { - alert('Amount must be greater than 0'); - return; - } - - if (!playerUid) { - alert('Please select a player'); - return; - } - const message = { event: 'TRANSFER::FUNDS', - data: { - amount: amount, - uid: playerUid - } + data: [amount, playerUid] }; - + A3API.SendAlert(JSON.stringify(message)); document.getElementById('playerTransferAmount').value = ''; + setTimeout(requestPlayerFunds, 500); } /** * Handle timesheet submission */ function handleTimesheet() { - const hours = parseFloat(document.getElementById('hoursWorked').value); - const rate = parseInt(document.getElementById('hourlyRate').value); - const amount = Math.floor(hours * rate); - - if (amount <= 0) { - alert('Invalid timesheet amount'); - return; - } - const message = { - event: 'DEPOSIT::FUNDS', - data: { - amount: amount - } + event: 'SUBMIT::TIMESHEET', + data: {} }; - + A3API.SendAlert(JSON.stringify(message)); - document.getElementById('hoursWorked').value = ''; - document.getElementById('hourlyRate').value = ''; + setTimeout(requestPlayerFunds, 500); } +// #endregion + //============================================================================= // #region INITIALIZATION //============================================================================= @@ -308,4 +297,9 @@ function handleTimesheet() { /** * Initialize when DOM is loaded */ -document.addEventListener('DOMContentLoaded', initializeBank); +document.addEventListener('DOMContentLoaded', () => { + initializeBank() + setupRefreshTimer(); +}); + +// #endregion \ No newline at end of file diff --git a/addons/bank/ui/_site/styles.css b/addons/bank/ui/_site/styles.css index 5386e8c..9f19d0b 100644 --- a/addons/bank/ui/_site/styles.css +++ b/addons/bank/ui/_site/styles.css @@ -30,187 +30,198 @@ body { color: var(--text-primary); } -.container { - max-width: 1280px; - margin: 0 auto; - padding: 0 1rem; -} - header { background-color: var(--header-bg); color: var(--header-text); padding: 1rem 0; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + + h1 { + font-size: 1.75rem; + font-weight: 600; + letter-spacing: -0.025em; + } + + .header-content { + display: flex; + justify-content: space-between; + align-items: center; + max-width: 1280px; + margin: 0 auto; + padding: 0 1rem; + + .balance-display { + display: flex; + align-items: center; + margin-left: auto; + background: rgba(255, 255, 255, 0.05); + border-radius: 8px; + border: 1px solid rgba(255, 255, 255, 0.1); + + .balance-divider { + width: 1px; + height: 24px; + background: rgba(255, 255, 255, 0.1); + margin: 0 0.25rem; + } + + .balance-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.5rem 0.75rem; + border-radius: 6px; + transition: all 0.2s ease-in-out; + min-width: 140px; + + &:hover { + background: rgba(255, 255, 255, 0.1); + } + + .balance-info { + display: flex; + flex-direction: column; + gap: 0.125rem; + + .balance-label { + font-size: 0.75rem; + color: rgba(255, 255, 255, 0.7); + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.025em; + } + + .balance-amount { + font-size: 0.875rem; + font-weight: 600; + color: var(--header-text); + } + } + } + } + } } -.header-content { - display: flex; - justify-content: space-between; - align-items: center; +.container { max-width: 1280px; margin: 0 auto; padding: 0 1rem; } -header h1 { - font-size: 1.75rem; - font-weight: 600; - letter-spacing: -0.025em; -} - -.balance-display { - display: flex; - align-items: center; - margin-left: auto; - background: rgba(255, 255, 255, 0.05); - border-radius: 8px; - border: 1px solid rgba(255, 255, 255, 0.1); -} - -.balance-item { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 0.5rem 0.75rem; - border-radius: 6px; - transition: all 0.2s ease-in-out; - min-width: 140px; -} - -.balance-item:hover { - background: rgba(255, 255, 255, 0.1); -} - -.balance-icon { - display: flex; - align-items: center; - justify-content: center; - width: 24px; - height: 24px; - font-size: 1rem; -} - -.balance-info { - display: flex; - flex-direction: column; - gap: 0.125rem; -} - -.balance-label { - font-size: 0.75rem; - color: rgba(255, 255, 255, 0.7); - font-weight: 500; - text-transform: uppercase; - letter-spacing: 0.025em; -} - -.balance-amount { - font-size: 0.875rem; - font-weight: 600; - color: var(--header-text); -} - -.balance-divider { - width: 1px; - height: 24px; - background: rgba(255, 255, 255, 0.1); - margin: 0 0.25rem; -} - .actions-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 1.5rem; margin-top: 1.5rem; -} -.action-tile { - background-color: var(--card-background); - border-radius: 12px; - overflow: hidden; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); - transition: all 0.3s ease-in-out; - border: none; - padding: 1.5rem; - display: flex; - flex-direction: column; - gap: 1.5rem; - aspect-ratio: 1 / 1; -} + .action-tile { + background-color: var(--card-background); + border-radius: 12px; + overflow: hidden; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + transition: all 0.3s ease-in-out; + border: none; + padding: 1.5rem; + display: flex; + flex-direction: column; + gap: 1.5rem; + aspect-ratio: 1 / 1; -.action-tile:hover { - box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); - transform: translateY(-4px); -} + &:hover { + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); + transform: translateY(-4px); + } -.action-tile:active { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); -} + &:active { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + } -.action-tile h2 { - font-size: 1.25rem; - color: var(--text-primary); - font-weight: 600; -} + h2 { + font-size: 1.25rem; + color: var(--text-primary); + font-weight: 600; + } -.form-group { - display: flex; - flex-direction: column; - gap: 0.5rem; - margin-bottom: 1rem; -} + .form-group { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: 1rem; -.form-group label { - font-weight: 500; - color: var(--text-secondary); - font-size: 0.875rem; -} + label { + font-weight: 500; + color: var(--text-secondary); + font-size: 0.875rem; + } -.form-group input, .form-group select { - padding: 0.75rem 1rem; - border: 1px solid var(--border-color); - border-radius: 8px; - font-size: 1rem; - color: var(--text-primary); - background-color: var(--card-background); - transition: all 0.2s ease-in-out; -} + input, + select { + padding: 0.75rem 1rem; + border: 1px solid var(--border-color); + border-radius: 8px; + font-size: 1rem; + color: var(--text-primary); + background-color: var(--card-background); + transition: all 0.2s ease-in-out; -.form-group input:focus, .form-group select:focus { - outline: none; - border-color: var(--primary-color); - box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); -} + &:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); + } -.form-group input:hover, .form-group select:hover { - border-color: var(--primary-color); -} + &:hover { + border-color: var(--primary-color); + } + } + } -.submit-btn { - background-color: var(--primary-color); - color: white; - border: none; - border-radius: 8px; - padding: 0.75rem 1.5rem; - font-size: 1rem; - font-weight: 500; - cursor: pointer; - transition: all 0.2s ease-in-out; - opacity: 0.9; - margin-top: auto; -} + .pending-amount { + background: rgba(59, 130, 246, 0.1); + padding: 1rem; + border-radius: 8px; + text-align: center; -.submit-btn:hover { - background-color: var(--primary-hover); - opacity: 1; - transform: translateY(-2px); - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); -} + .amount-label { + font-size: 0.875rem; + color: var(--text-secondary); + margin-bottom: 0.5rem; + } -.submit-btn:active { - transform: translateY(0); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + .amount-value { + font-size: 2rem; + font-weight: 600; + color: var(--primary-color); + } + } + + .submit-btn { + background-color: var(--primary-color); + color: white; + border: none; + border-radius: 8px; + padding: 0.75rem 1.5rem; + font-size: 1rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease-in-out; + opacity: 0.9; + margin-top: auto; + + &:hover { + background-color: var(--primary-hover); + opacity: 1; + transform: translateY(-2px); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + } + + &:active { + transform: translateY(0); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + } + } + } } .history-section { @@ -227,110 +238,99 @@ header h1 { height: auto; max-height: calc(100vw / 3); margin-top: 1.5rem; -} -.history-section:hover { - box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); - transform: translateY(-4px); -} + &:hover { + box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); + transform: translateY(-4px); + } -.history-section:active { - transform: translateY(-2px); - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); -} + &:active { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + } -.history-section h2 { - font-size: 1.25rem; - color: var(--text-primary); - font-weight: 600; - margin-bottom: 0.5rem; -} + h2 { + font-size: 1.25rem; + color: var(--text-primary); + font-weight: 600; + margin-bottom: 0.5rem; + } -.history-list { - list-style: none; - overflow-y: auto; - flex: 1; - padding-right: 0.5rem; - margin-right: -0.5rem; - display: flex; - flex-direction: column; - gap: 0.5rem; -} + .history-list { + list-style: none; + overflow-y: auto; + flex: 1; + padding-right: 0.5rem; + margin-right: -0.5rem; + display: flex; + flex-direction: column; + gap: 0.5rem; -/* Customize scrollbar for webkit browsers */ -.history-list::-webkit-scrollbar { - width: 6px; -} + &::-webkit-scrollbar { + width: 6px; + } -.history-list::-webkit-scrollbar-track { - background: transparent; - margin: 0.5rem; -} + &::-webkit-scrollbar-track { + background: transparent; + margin: 0.5rem; + } -.history-list::-webkit-scrollbar-thumb { - background-color: rgba(0, 0, 0, 0.1); - border-radius: 3px; -} + &::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.1); + border-radius: 3px; -.history-list::-webkit-scrollbar-thumb:hover { - background-color: rgba(0, 0, 0, 0.2); -} + &:hover { + background-color: rgba(0, 0, 0, 0.2); + } + } -.history-item { - display: flex; - justify-content: space-between; - align-items: center; - padding: 1rem; - background-color: var(--card-background); - border-radius: 8px; - transition: all 0.2s ease-in-out; - border: none; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); -} + .history-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem; + background-color: var(--card-background); + border-radius: 8px; + transition: all 0.2s ease-in-out; + border: none; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); -.history-item:last-child { - margin-bottom: 0; -} + .transaction-type { + font-weight: 500; + color: var(--text-primary); + } -.history-item:hover { - background-color: var(--tile-hover); - box-shadow: 0 4px 6px var(--shadow-color); - transform: translateY(-2px); -} + .transaction-details { + color: var(--text-secondary); + font-size: 0.875rem; + } -.history-item:active { - transform: translateY(0); - box-shadow: 0 2px 4px var(--shadow-color); -} + .amount { + &.amount-positive { + color: var(--success-color); + font-weight: 500; + } -.transaction-type { - font-weight: 500; - color: var(--text-primary); -} + &.amount-negative { + color: var(--error-color); + font-weight: 500; + } + } -.transaction-details { - color: var(--text-secondary); - font-size: 0.875rem; -} + &:last-child { + margin-bottom: 0; + } -.amount-positive { - color: var(--success-color); - font-weight: 500; -} + &:hover { + background-color: var(--tile-hover); + box-shadow: 0 4px 6px var(--shadow-color); + transform: translateY(-2px); + } -.amount-negative { - color: var(--error-color); - font-weight: 500; -} - -.error-message { - color: var(--error-color); - font-size: 0.875rem; - margin-top: 0.25rem; -} - -.success-message { - color: var(--success-color); - font-size: 0.875rem; - margin-top: 0.25rem; -} + &:active { + transform: translateY(0); + box-shadow: 0 2px 4px var(--shadow-color); + } + } + } +} \ No newline at end of file diff --git a/addons/init/functions/fnc_handlePlayerLoad.sqf b/addons/init/functions/fnc_handlePlayerLoad.sqf index ec05cf3..b403986 100644 --- a/addons/init/functions/fnc_handlePlayerLoad.sqf +++ b/addons/init/functions/fnc_handlePlayerLoad.sqf @@ -37,7 +37,7 @@ if (_data isEqualTo [""]) then { switch (_key) do { case "reputation": { - SETPVAR(player,Reputation,_value); + SETPVAR(player,FORGE_Rating,_value); player addRating _value; }; case "loadout": {