feat: Rework org data and UI

This commit is contained in:
Jacob Schmidt 2026-03-08 10:17:32 -05:00
parent e0e6121a5c
commit 57267b79b6
10 changed files with 159 additions and 161 deletions

View File

@ -1,4 +1,3 @@
PREP(buildPortalPayload);
PREP(handleUIEvents);
PREP(initOrgClass);
PREP(openUI);

View File

@ -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);

View File

@ -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 <HASHMAP>
*
* 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]
]]
]

View File

@ -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": {

View File

@ -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]]];

View File

@ -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" },

View File

@ -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;

View File

@ -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 {

View File

@ -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" },

View File

@ -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;