forge/arma/ui/apps/portal/actions.js
2026-03-07 15:23:01 -06:00

293 lines
8.3 KiB
JavaScript

(function () {
const OrgPortal = (window.OrgPortal = window.OrgPortal || {});
const { portalData } = OrgPortal.data;
const store = OrgPortal.store;
const permissions = OrgPortal.permissions;
const registryStore = window.RegistryApp.store;
class OrgPortalActions {
constructor() {
this.treasuryNoticeTimer = null;
}
formatCurrency(value) {
return "$" + value.toLocaleString();
}
formatVehicleType(type) {
if (!type) {
return "";
}
return type.charAt(0).toUpperCase() + type.slice(1);
}
formatAssetType(type) {
if (!type) {
return "";
}
return type.charAt(0).toUpperCase() + type.slice(1);
}
formatDisplayName(value) {
if (!value) {
return "";
}
return String(value)
.trim()
.split(/\s+/)
.map((part) => {
if (!part) {
return "";
}
return (
part.charAt(0).toUpperCase() +
part.slice(1).toLowerCase()
);
})
.join(" ");
}
getAssetReadiness() {
if (portalData.fleet.length === 0) {
return null;
}
const total = portalData.fleet.reduce(
(sum, unit) => sum + (100 - parseInt(unit.damage, 10)),
0,
);
return Math.round(total / portalData.fleet.length);
}
showTreasuryNotice(type, text) {
store.setTreasuryNotice({ type, text });
if (this.treasuryNoticeTimer) {
clearTimeout(this.treasuryNoticeTimer);
}
this.treasuryNoticeTimer = setTimeout(() => {
store.setTreasuryNotice({ type: "", text: "" });
this.treasuryNoticeTimer = null;
}, 3500);
}
parseAmount(value) {
const amount = Number(value);
return Number.isFinite(amount) ? Math.round(amount) : 0;
}
getInputValue(id) {
const el = document.getElementById(id);
return el ? el.value : "";
}
closePortal() {
if (
typeof A3API !== "undefined" &&
typeof A3API.SendAlert === "function"
) {
A3API.SendAlert(
JSON.stringify({
event: "org::close",
data: {},
}),
);
return;
}
if (registryStore) {
registryStore.setView("home");
}
}
openModal(type) {
if (
(type === "payroll" ||
type === "transfer" ||
type === "credit") &&
!permissions.canManageTreasury()
) {
this.showTreasuryNotice(
"error",
"Only the organization leader or CEO can manage treasury actions.",
);
return;
}
if (type === "disband" && !permissions.canDisbandOrg()) {
return;
}
store.setModal({ type });
}
closeModal() {
store.setModal(null);
}
removeMember(memberName) {
if (!permissions.canManageMembers()) {
return false;
}
store.setMembers((currentMembers) =>
currentMembers.filter((member) => member.name !== memberName),
);
store.setCreditLines((currentLines) =>
currentLines.filter((line) => line.member !== memberName),
);
return true;
}
disbandOrganization() {
if (!permissions.canDisbandOrg()) {
return false;
}
store.setOrgDisbanded(true);
this.closeModal();
return true;
}
runPayroll(amountPerMember) {
if (!permissions.canManageTreasury()) {
this.showTreasuryNotice(
"error",
"Only the organization leader or CEO can manage treasury actions.",
);
return false;
}
const members = store.getMembers();
const funds = store.getFunds();
if (members.length === 0) {
this.showTreasuryNotice(
"error",
"No members available for payroll.",
);
return false;
}
if (amountPerMember <= 0) {
this.showTreasuryNotice(
"error",
"Enter a valid payroll amount.",
);
return false;
}
const total = amountPerMember * members.length;
if (total > funds) {
this.showTreasuryNotice(
"error",
"Insufficient org funds for payroll.",
);
return false;
}
store.setFunds(funds - total);
this.showTreasuryNotice(
"success",
`Payroll sent to ${members.length} members for ${this.formatCurrency(total)}.`,
);
return true;
}
sendFundsToMember(memberName, amount) {
if (!permissions.canManageTreasury()) {
this.showTreasuryNotice(
"error",
"Only the organization leader or CEO can manage treasury actions.",
);
return false;
}
const funds = store.getFunds();
if (!memberName) {
this.showTreasuryNotice(
"error",
"Select a member to receive funds.",
);
return false;
}
if (amount <= 0) {
this.showTreasuryNotice(
"error",
"Enter a valid transfer amount.",
);
return false;
}
if (amount > funds) {
this.showTreasuryNotice(
"error",
"Insufficient org funds for this transfer.",
);
return false;
}
store.setFunds(funds - amount);
this.showTreasuryNotice(
"success",
`${this.formatCurrency(amount)} sent to ${memberName}.`,
);
return true;
}
grantCreditLine(memberName, amount) {
if (!permissions.canManageTreasury()) {
this.showTreasuryNotice(
"error",
"Only the organization leader or CEO can manage treasury actions.",
);
return false;
}
if (!memberName) {
this.showTreasuryNotice(
"error",
"Select a member for the credit line.",
);
return false;
}
if (amount <= 0) {
this.showTreasuryNotice(
"error",
"Enter a valid credit line amount.",
);
return false;
}
store.setCreditLines((currentLines) => {
const existingIndex = currentLines.findIndex(
(line) => line.member === memberName,
);
if (existingIndex === -1) {
return [...currentLines, { member: memberName, amount }];
}
const updatedLines = [...currentLines];
updatedLines[existingIndex] = { member: memberName, amount };
return updatedLines;
});
this.showTreasuryNotice(
"success",
`Credit line of ${this.formatCurrency(amount)} assigned to ${memberName}.`,
);
return true;
}
}
OrgPortal.actions = new OrgPortalActions();
})();