From 57267b79b6bf9f50113831075bff0d33baf908be Mon Sep 17 00:00:00 2001 From: Jacob Schmidt Date: Sun, 8 Mar 2026 10:17:32 -0500 Subject: [PATCH] feat: Rework org data and UI --- arma/client/addons/org/XEH_PREP.hpp | 1 - arma/client/addons/org/XEH_postInitClient.sqf | 2 +- .../org/functions/fnc_buildPortalPayload.sqf | 129 ------------------ .../org/functions/fnc_handleUIEvents.sqf | 2 +- .../addons/org/functions/fnc_initOrgClass.sqf | 84 ++++++++++++ .../ui/_site/components/portal/futureCard.js | 9 +- .../client/addons/org/ui/_site/portal/data.js | 34 +++-- .../addons/org/functions/fnc_initOrgStore.sqf | 16 ++- arma/ui/apps/components/portal/futureCard.js | 9 +- arma/ui/apps/portal/data.js | 34 +++-- 10 files changed, 159 insertions(+), 161 deletions(-) delete mode 100644 arma/client/addons/org/functions/fnc_buildPortalPayload.sqf diff --git a/arma/client/addons/org/XEH_PREP.hpp b/arma/client/addons/org/XEH_PREP.hpp index 438a579..d83118a 100644 --- a/arma/client/addons/org/XEH_PREP.hpp +++ b/arma/client/addons/org/XEH_PREP.hpp @@ -1,4 +1,3 @@ -PREP(buildPortalPayload); PREP(handleUIEvents); PREP(initOrgClass); PREP(openUI); diff --git a/arma/client/addons/org/XEH_postInitClient.sqf b/arma/client/addons/org/XEH_postInitClient.sqf index 515ba5e..9ad22af 100644 --- a/arma/client/addons/org/XEH_postInitClient.sqf +++ b/arma/client/addons/org/XEH_postInitClient.sqf @@ -39,7 +39,7 @@ if (isNil QGVAR(OrgClass)) then { call FUNC(initOrgClass); }; GVAR(OrgClass) call ["sync", [_orgData, true]]; if (_control isNotEqualTo controlNull) then { - private _json = toJSON (call FUNC(buildPortalPayload)); + private _json = toJSON (GVAR(OrgClass) call ["buildPortalPayload", []]); _control ctrlWebBrowserAction ["ExecJS", format ["OrgUIBridge.receiveCreateSuccess(%1)", _json]]; }; }] call CFUNC(addEventHandler); diff --git a/arma/client/addons/org/functions/fnc_buildPortalPayload.sqf b/arma/client/addons/org/functions/fnc_buildPortalPayload.sqf deleted file mode 100644 index 1fb17bf..0000000 --- a/arma/client/addons/org/functions/fnc_buildPortalPayload.sqf +++ /dev/null @@ -1,129 +0,0 @@ -#include "..\script_component.hpp" - -/* - * Author: IDSolutions - * Builds the web portal payload from the synced org class. - * - * Arguments: - * None - * - * Return Value: - * Portal payload - * - * Example: - * call forge_client_org_fnc_buildPortalPayload; - * - * Public: No - */ - -private _orgData = GVAR(OrgClass) get "org"; - -private _name = _orgData getOrDefault ["name", "Unknown Organization"]; -private _id = _orgData getOrDefault ["id", ""]; -private _ownerUid = _orgData getOrDefault ["owner", ""]; -private _funds = _orgData getOrDefault ["funds", 0]; -private _reputation = _orgData getOrDefault ["reputation", 0]; -private _assetsRaw = _orgData getOrDefault ["assets", createHashMap]; -private _membersRaw = _orgData getOrDefault ["members", createHashMap]; -private _fleetRaw = _orgData getOrDefault ["fleet", createHashMap]; -private _headquarters = _orgData getOrDefault ["headquarters", "ArmA Verse"]; -private _type = _orgData getOrDefault ["type", "Organization"]; -private _status = _orgData getOrDefault ["status", "Operational"]; -private _isDefaultOrg = (_orgData getOrDefault ["default", false]) - || {toLower _id isEqualTo "default"} - || {toLower _ownerUid isEqualTo "server"}; - -private _playerName = name player; -private _playerUid = getPlayerUID player; -private _playerVar = vehicleVarName player; -private _sessionRole = "Member"; -private _sessionIsCeo = _isDefaultOrg && {_playerVar isEqualTo "ceo"}; -private _ownerName = ["", "Server"] select (toLower _ownerUid isEqualTo "server"); - -private _membersList = []; -{ - private _memberData = _y; - private _memberName = _memberData getOrDefault ["name", "Unknown"]; - private _memberUid = _memberData getOrDefault ["uid", ""]; - - if (_memberUid isEqualTo _ownerUid && {_ownerName isEqualTo ""}) then { _ownerName = _memberName; }; - if (_memberUid isEqualTo _playerUid) then { _sessionRole = "Member"; }; - - _membersList pushBack (createHashMapFromArray [["name", _memberName]]); -} forEach _membersRaw; - -if (_ownerName isEqualTo "" && { _ownerUid isEqualTo _playerUid }) then { _ownerName = _playerName; }; -if (_ownerName isEqualTo "" && { _ownerUid isNotEqualTo "" }) then { _ownerName = "Unknown Owner"; }; -if (_ownerUid isEqualTo _playerUid) then { _sessionRole = "Leader"; }; - -private _assetsList = []; -{ - private _assetData = _y; - _assetsList pushBack (createHashMapFromArray [ - ["name", _assetData getOrDefault ["name", "Unknown Asset"]], - ["type", _assetData getOrDefault ["type", "items"]], - ["quantity", str (_assetData getOrDefault ["quantity", 0])] - ]); -} forEach _assetsRaw; - -private _fleetList = []; -{ - private _vehicleData = _y; - _fleetList pushBack (createHashMapFromArray [ - ["name", _vehicleData getOrDefault ["name", "Unknown Vehicle"]], - ["type", _vehicleData getOrDefault ["type", "other"]], - ["status", _vehicleData getOrDefault ["status", "Unknown"]], - ["damage", _vehicleData getOrDefault ["damage", "0%"]] - ]); -} forEach _fleetRaw; - -private _roadmap = [ - createHashMapFromArray [ - ["name", "Contracts Board"], - ["status", "Planned"], - ["detail", "Track payouts, assignments, and claim approvals."] - ], - createHashMapFromArray [ - ["name", "Diplomacy"], - ["status", "Future Review"], - ["detail", "Possible future module pending a full design and scope review."] - ], - createHashMapFromArray [ - ["name", "Logistics Queue"], - ["status", "Future Review"], - ["detail", "Possible future module pending a full design and scope review."] - ], - createHashMapFromArray [ - ["name", "Permissions"], - ["status", "Future Review"], - ["detail", "Possible future module pending a full design and scope review."] - ] -]; - -createHashMapFromArray [ - ["session", createHashMapFromArray [ - ["actorName", _playerName], - ["actorUid", _playerUid], - ["role", _sessionRole], - ["ceo", _sessionIsCeo] - ]], - ["portalData", createHashMapFromArray [ - ["org", createHashMapFromArray [ - ["name", _name], - ["tag", _id], - ["type", _type], - ["status", _status], - ["headquarters", _headquarters], - ["owner", _ownerName], - ["ownerUid", _ownerUid], - ["isDefault", _isDefaultOrg] - ]], - ["funds", _funds], - ["reputation", _reputation], - ["members", _membersList], - ["fleet", _fleetList], - ["assets", _assetsList], - ["activity", []], - ["roadmap", _roadmap] - ]] -] diff --git a/arma/client/addons/org/functions/fnc_handleUIEvents.sqf b/arma/client/addons/org/functions/fnc_handleUIEvents.sqf index 94e713c..7769bc5 100644 --- a/arma/client/addons/org/functions/fnc_handleUIEvents.sqf +++ b/arma/client/addons/org/functions/fnc_handleUIEvents.sqf @@ -45,7 +45,7 @@ switch (_event) do { ]] call _fnc_execBridge; }; - private _payload = call FUNC(buildPortalPayload); + private _payload = GVAR(OrgClass) call ["buildPortalPayload", []]; [_control, "receiveLoginSuccess", _payload] call _fnc_execBridge; }; case "org::create::request": { diff --git a/arma/client/addons/org/functions/fnc_initOrgClass.sqf b/arma/client/addons/org/functions/fnc_initOrgClass.sqf index 5a8791f..0e9fcf8 100644 --- a/arma/client/addons/org/functions/fnc_initOrgClass.sqf +++ b/arma/client/addons/org/functions/fnc_initOrgClass.sqf @@ -36,6 +36,7 @@ GVAR(OrgBaseClass) = compileFinal createHashMapFromArray [ _org set ["funds", 0]; _org set ["reputation", 0]; _org set ["assets", createHashMap]; + _org set ["fleet", createHashMap]; _org set ["members", createHashMap]; _self set ["org", _org]; @@ -69,6 +70,89 @@ GVAR(OrgBaseClass) = compileFinal createHashMapFromArray [ if !(_isLoaded) then { _self set ["isLoaded", true]; }; diag_log "[FORGE:Client:Org] Sync completed"; }], + ["buildPortalPayload", compileFinal { + private _orgData = _self get "org"; + + private _name = _orgData get "name"; + private _id = _orgData get "id"; + private _ownerUid = _orgData get "owner"; + private _funds = _orgData get "funds"; + private _reputation = _orgData get "reputation"; + private _assetsRaw = _orgData get "assets"; + private _fleetRaw = _orgData get "fleet"; + private _membersRaw = _orgData get "members"; + private _isDefaultOrg = (_orgData getOrDefault ["default", false]) + || {toLower _id isEqualTo "default"} + || {toLower _ownerUid isEqualTo "server"}; + + private _playerName = name player; + private _playerUid = getPlayerUID player; + private _playerVar = vehicleVarName player; + private _sessionRole = "Member"; + private _sessionIsCeo = _isDefaultOrg && {_playerVar isEqualTo "ceo"}; + private _ownerName = ["", "Server"] select (toLower _ownerUid isEqualTo "server"); + + private _membersList = []; + { + private _memberData = _y; + private _memberName = _memberData getOrDefault ["name", "Unknown"]; + private _memberUid = _memberData getOrDefault ["uid", ""]; + + if (_memberUid isEqualTo _ownerUid && {_ownerName isEqualTo ""}) then { _ownerName = _memberName; }; + if (_memberUid isEqualTo _playerUid) then { _sessionRole = "Member"; }; + + _membersList pushBack (createHashMapFromArray [["name", _memberName]]); + } forEach _membersRaw; + + if (_ownerName isEqualTo "" && { _ownerUid isEqualTo _playerUid }) then { _ownerName = _playerName; }; + if (_ownerName isEqualTo "" && { _ownerUid isNotEqualTo "" }) then { _ownerName = "Unknown Owner"; }; + if (_ownerUid isEqualTo _playerUid) then { _sessionRole = "Leader"; }; + + private _assetsList = []; + { + private _assetData = _y; + _assetsList pushBack (createHashMapFromArray [ + ["name", _assetData getOrDefault ["name", "Unknown Asset"]], + ["type", _assetData getOrDefault ["type", "items"]], + ["quantity", str (_assetData getOrDefault ["quantity", 0])] + ]); + } forEach _assetsRaw; + + private _fleetList = []; + { + private _vehicleData = _y; + _fleetList pushBack (createHashMapFromArray [ + ["name", _vehicleData getOrDefault ["name", "Unknown Vehicle"]], + ["type", _vehicleData getOrDefault ["type", "other"]], + ["status", _vehicleData getOrDefault ["status", "Unknown"]], + ["damage", _vehicleData getOrDefault ["damage", "0%"]] + ]); + } forEach _fleetRaw; + + createHashMapFromArray [ + ["session", createHashMapFromArray [ + ["actorName", _playerName], + ["actorUid", _playerUid], + ["role", _sessionRole], + ["ceo", _sessionIsCeo] + ]], + ["portalData", createHashMapFromArray [ + ["org", createHashMapFromArray [ + ["name", _name], + ["tag", _id], + ["owner", _ownerName], + ["ownerUid", _ownerUid], + ["isDefault", _isDefaultOrg] + ]], + ["funds", _funds], + ["reputation", _reputation], + ["members", _membersList], + ["fleet", _fleetList], + ["assets", _assetsList], + ["activity", []] + ]] + ] + }], ["get", compileFinal { params [["_key", "", [""]], ["_default", nil, [[], "", 0, false, createHashMap]]]; diff --git a/arma/client/addons/org/ui/_site/components/portal/futureCard.js b/arma/client/addons/org/ui/_site/components/portal/futureCard.js index d69077d..a922043 100644 --- a/arma/client/addons/org/ui/_site/components/portal/futureCard.js +++ b/arma/client/addons/org/ui/_site/components/portal/futureCard.js @@ -1,8 +1,13 @@ (function () { const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); const { h, ensureScopedStyle } = OrgPortal.runtime; - const { portalData } = OrgPortal.data; const scopeAttr = "data-ui-future-card"; + const ROADMAP = [ + { name: "Contracts Board", status: "Planned", detail: "Track payouts, assignments, and claim approvals." }, + { name: "Diplomacy", status: "Future Review", detail: "Possible future module pending a full design and scope review." }, + { name: "Logistics Queue", status: "Future Review", detail: "Possible future module pending a full design and scope review." }, + { name: "Permissions", status: "Future Review", detail: "Possible future module pending a full design and scope review." }, + ]; const scopeSelector = `[${scopeAttr}]`; const futureCardCss = ` ${scopeSelector} .org-roadmap-grid { @@ -90,7 +95,7 @@ ${scopeSelector} .org-roadmap-card:nth-child(4n + 3) .org-list-tag { body: h( "div", { className: "org-roadmap-grid" }, - ...portalData.roadmap.map((item) => + ...ROADMAP.map((item) => h( "article", { className: "org-roadmap-card" }, diff --git a/arma/client/addons/org/ui/_site/portal/data.js b/arma/client/addons/org/ui/_site/portal/data.js index 10d4ad1..b3a57d1 100644 --- a/arma/client/addons/org/ui/_site/portal/data.js +++ b/arma/client/addons/org/ui/_site/portal/data.js @@ -1,5 +1,10 @@ (function () { const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const staticOrgProfile = { + type: "Organization", + status: "Operational", + headquarters: "ArmA Verse", + }; function cloneValue(value) { return JSON.parse(JSON.stringify(value)); @@ -16,16 +21,16 @@ OrgPortal.data = { portalData: { - org: { - name: "", - tag: "", - type: "Organization", - status: "Operational", - headquarters: "ArmA Verse", - owner: "", - ownerUid: "", - isDefault: false, - }, + org: Object.assign( + { + name: "", + tag: "", + owner: "", + ownerUid: "", + isDefault: false, + }, + staticOrgProfile, + ), funds: 0, reputation: 0, members: [], @@ -62,7 +67,14 @@ ceo: false, }, applyLoginPayload(payload) { - replaceObject(this.portalData.org, payload.portalData.org || {}); + replaceObject( + this.portalData.org, + Object.assign( + {}, + payload.portalData.org || {}, + staticOrgProfile, + ), + ); this.portalData.funds = payload.portalData.funds || 0; this.portalData.reputation = payload.portalData.reputation || 0; diff --git a/arma/server/addons/org/functions/fnc_initOrgStore.sqf b/arma/server/addons/org/functions/fnc_initOrgStore.sqf index a178e67..e6bbb8a 100644 --- a/arma/server/addons/org/functions/fnc_initOrgStore.sqf +++ b/arma/server/addons/org/functions/fnc_initOrgStore.sqf @@ -32,6 +32,9 @@ GVAR(OrgModel) = compileFinal createHashMapObject [[ _org set ["name", ""]; _org set ["funds", 0]; _org set ["reputation", 0]; + _org set ["assets", createHashMap]; + _org set ["fleet", createHashMap]; + _org set ["members", createHashMap]; _org }], @@ -88,6 +91,8 @@ GVAR(OrgBaseStore) = compileFinal createHashMapFromArray [ ["name", "Forge Dynamics"], ["funds", 200000], ["reputation", 0], + ["assets", createHashMap], + ["fleet", createHashMap], ["members", createHashMap] ]; GVAR(Registry) set ["default", _defaultOrg]; @@ -181,6 +186,8 @@ GVAR(OrgBaseStore) = compileFinal createHashMapFromArray [ ["name", _orgName], ["funds", 0], ["reputation", 0], + ["assets", createHashMap], + ["fleet", createHashMap], ["members", createHashMap] ]; @@ -251,8 +258,9 @@ GVAR(OrgBaseStore) = compileFinal createHashMapFromArray [ }; private _finalOrg = createHashMap; + private _finalAssets = createHashMap; + private _finalFleet = createHashMap; private _finalMembers = createHashMap; - // private _finalAssets = createHashMap; if (_result == "true") then { _finalOrg = _self call ["fetch", ["org:get", _orgID]]; @@ -266,8 +274,9 @@ GVAR(OrgBaseStore) = compileFinal createHashMapFromArray [ private _entry = createHashMapFromArray [["orgID", _orgID]]; GVAR(IndexRegistry) set [_uid, _entry]; - private _members = _self call ["fetch", ["org:members:get", _orgID]]; // private _assets = _self call ["fetch", ["org:assets:get", _orgID]]; + // private _fleet = _self call ["fetch", ["org:fleet:get", _orgID]]; + private _members = _self call ["fetch", ["org:members:get", _orgID]]; { private _key = _x get "uid"; @@ -281,8 +290,9 @@ GVAR(OrgBaseStore) = compileFinal createHashMapFromArray [ // _finalAssets set [_key, _value]; // } forEach _assets; + _finalOrg set ["assets", _finalAssets]; + _finalOrg set ["fleet", _finalFleet]; _finalOrg set ["members", _finalMembers]; - // _finalOrg set ["assets", _finalAssets]; private _finalOwner = _finalOrg getOrDefault ["owner", ""]; if (_orgID isEqualTo "default" || { _finalOwner isEqualTo _uid }) then { diff --git a/arma/ui/apps/components/portal/futureCard.js b/arma/ui/apps/components/portal/futureCard.js index d69077d..a922043 100644 --- a/arma/ui/apps/components/portal/futureCard.js +++ b/arma/ui/apps/components/portal/futureCard.js @@ -1,8 +1,13 @@ (function () { const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); const { h, ensureScopedStyle } = OrgPortal.runtime; - const { portalData } = OrgPortal.data; const scopeAttr = "data-ui-future-card"; + const ROADMAP = [ + { name: "Contracts Board", status: "Planned", detail: "Track payouts, assignments, and claim approvals." }, + { name: "Diplomacy", status: "Future Review", detail: "Possible future module pending a full design and scope review." }, + { name: "Logistics Queue", status: "Future Review", detail: "Possible future module pending a full design and scope review." }, + { name: "Permissions", status: "Future Review", detail: "Possible future module pending a full design and scope review." }, + ]; const scopeSelector = `[${scopeAttr}]`; const futureCardCss = ` ${scopeSelector} .org-roadmap-grid { @@ -90,7 +95,7 @@ ${scopeSelector} .org-roadmap-card:nth-child(4n + 3) .org-list-tag { body: h( "div", { className: "org-roadmap-grid" }, - ...portalData.roadmap.map((item) => + ...ROADMAP.map((item) => h( "article", { className: "org-roadmap-card" }, diff --git a/arma/ui/apps/portal/data.js b/arma/ui/apps/portal/data.js index 4da8f27..66208f0 100644 --- a/arma/ui/apps/portal/data.js +++ b/arma/ui/apps/portal/data.js @@ -1,5 +1,10 @@ (function () { const OrgPortal = (window.OrgPortal = window.OrgPortal || {}); + const staticOrgProfile = { + type: "Organization", + status: "Operational", + headquarters: "ArmA Verse", + }; function cloneValue(value) { return JSON.parse(JSON.stringify(value)); @@ -16,16 +21,16 @@ OrgPortal.data = { portalData: { - org: { - name: "Black Rifle Company", - tag: "BRC-0160566824", - type: "Private Military Company", - status: "Operational", - headquarters: "Georgetown Command Annex", - owner: "Jacob Schmidt", - ownerUid: "uid-jacob-schmidt", - isDefault: false, - }, + org: Object.assign( + { + name: "Black Rifle Company", + tag: "BRC-0160566824", + owner: "Jacob Schmidt", + ownerUid: "uid-jacob-schmidt", + isDefault: false, + }, + staticOrgProfile, + ), funds: 482750, reputation: 72, members: [ @@ -132,7 +137,14 @@ ceo: false, }, applyLoginPayload(payload) { - replaceObject(this.portalData.org, payload.portalData.org || {}); + replaceObject( + this.portalData.org, + Object.assign( + {}, + payload.portalData.org || {}, + staticOrgProfile, + ), + ); this.portalData.funds = payload.portalData.funds || 0; this.portalData.reputation = payload.portalData.reputation || 0;