diff --git a/indra/llui/fsregistrarutils.h b/indra/llui/fsregistrarutils.h
index 0b8d55f247..3c5d26fa98 100644
--- a/indra/llui/fsregistrarutils.h
+++ b/indra/llui/fsregistrarutils.h
@@ -44,7 +44,12 @@ enum EFSRegistrarFunctionActionType
FS_RGSTR_ACT_REQUEST_TELEPORT,
FS_RGSTR_CHK_AVATAR_BLOCKED,
FS_RGSTR_CHK_IS_SELF,
- FS_RGSTR_CHK_IS_NOT_SELF
+ FS_RGSTR_CHK_IS_NOT_SELF,
+ FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA,
+ FS_RGSTR_CHK_HAVE_GROUP_DATA,
+ FS_RGSTR_CHK_CAN_LEAVE_GROUP,
+ FS_RGSTR_CHK_CAN_JOIN_GROUP,
+ FS_RGSTR_CHK_GROUP_NOT_ACTIVE
};
class FSRegistrarUtils
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index cb83eda373..9cec673674 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -2114,6 +2114,20 @@ BOOL LLScrollListCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
enable_registrar.add("FS.EnableViewLog", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_ACT_VIEW_TRANSCRIPT));
//
+ // FIRE-30725 - Add more group functions to group URL context menu
+ std::string uuid_str = uuid.asString();
+
+ registrar.add("FS.JoinGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupjoin", true));
+ registrar.add("FS.LeaveGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupleave", true));
+ registrar.add("FS.ActivateGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + uuid_str + "/groupactivate", true));
+
+ enable_registrar.add("FS.WaitingForGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA));
+ enable_registrar.add("FS.HaveGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_HAVE_GROUP_DATA));
+ enable_registrar.add("FS.EnableJoinGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_CAN_JOIN_GROUP));
+ enable_registrar.add("FS.EnableLeaveGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_CAN_LEAVE_GROUP));
+ enable_registrar.add("FS.EnableActivateGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, uuid, FS_RGSTR_CHK_GROUP_NOT_ACTIVE));
+ //
+
// create the context menu from the XUI file and display it
std::string menu_name = is_group ? "menu_url_group.xml" : "menu_url_agent.xml";
delete mPopupMenu;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index ab40ecc0c9..2eabf5eb54 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2144,6 +2144,18 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
enable_registrar.add("FS.EnableViewLog", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_ACT_VIEW_TRANSCRIPT));
//
+ // FIRE-30725 - Add more group functions to group URL context menu
+ registrar.add("FS.JoinGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupjoin", true));
+ registrar.add("FS.LeaveGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupleave", true));
+ registrar.add("FS.ActivateGroup", boost::bind(&LLUrlAction::executeSLURL, "secondlife:///app/firestorm/" + target_id_str + "/groupactivate", true));
+
+ enable_registrar.add("FS.WaitingForGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA));
+ enable_registrar.add("FS.HaveGroupData", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_HAVE_GROUP_DATA));
+ enable_registrar.add("FS.EnableJoinGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_CAN_JOIN_GROUP));
+ enable_registrar.add("FS.EnableLeaveGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_CAN_LEAVE_GROUP));
+ enable_registrar.add("FS.EnableActivateGroup", boost::bind(&FSRegistrarUtils::checkIsEnabled, gFSRegistrarUtils, target_id, FS_RGSTR_CHK_GROUP_NOT_ACTIVE));
+ //
+
// create and return the context menu from the XUI file
LLContextMenu* menu = static_cast(mPopupMenuHandle.get());
diff --git a/indra/newview/fscommon.cpp b/indra/newview/fscommon.cpp
index a1bba035e0..b87fd79ef6 100644
--- a/indra/newview/fscommon.cpp
+++ b/indra/newview/fscommon.cpp
@@ -34,6 +34,8 @@
#include "llavataractions.h"
#include "llavatarnamecache.h"
#include "llfloaterperms.h"
+#include "llgroupactions.h"
+#include "llgroupmgr.h"
#include "llinventorymodel.h"
#include "lllogchat.h"
#include "llmutelist.h"
@@ -316,6 +318,16 @@ bool FSCommon::isLinden(const LLUUID& av_id)
last_name == LL_TESTER);
}
+// request group data from the server if it's not already cached
+bool FSCommon::requestGroupData(const LLUUID& groupID)
+{
+ if (LLGroupMgr::getInstance()->getGroupData(groupID) == nullptr)
+ {
+ LLGroupMgr::getInstance()->sendGroupPropertiesRequest(groupID);
+ return false;
+ }
+ return true;
+}
bool FSCommon::checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionActionType action)
{
@@ -373,6 +385,52 @@ bool FSCommon::checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionAct
{
return !isSelf;
}
+ else if (action == FS_RGSTR_CHK_WAITING_FOR_GROUP_DATA)
+ {
+ return !requestGroupData(av_id);
+ }
+ else if (action == FS_RGSTR_CHK_HAVE_GROUP_DATA)
+ {
+ return requestGroupData(av_id);
+ }
+ else if (action == FS_RGSTR_CHK_CAN_LEAVE_GROUP)
+ {
+ if (gAgent.getGroupID() == av_id && !RlvActions::canChangeActiveGroup())
+ {
+ return false;
+ }
+
+ return gAgent.isInGroup(av_id);
+ }
+ else if (action == FS_RGSTR_CHK_CAN_JOIN_GROUP)
+ {
+ if (!gAgent.canJoinGroups())
+ {
+ return false;
+ }
+
+ if (!RlvActions::canChangeActiveGroup())
+ {
+ return false;
+ }
+
+ LLGroupMgrGroupData* groupData = LLGroupMgr::getInstance()->getGroupData(av_id);
+ if (!groupData || !groupData->mOpenEnrollment)
+ {
+ return false;
+ }
+
+ return !gAgent.isInGroup(av_id);
+ }
+ else if (action == FS_RGSTR_CHK_GROUP_NOT_ACTIVE)
+ {
+ if (!RlvActions::canChangeActiveGroup())
+ {
+ return false;
+ }
+
+ return (gAgent.isInGroup(av_id) && gAgent.getGroupID() != av_id);
+ }
return false;
}
diff --git a/indra/newview/fscommon.h b/indra/newview/fscommon.h
index be33ef6790..a7d8d350d6 100644
--- a/indra/newview/fscommon.h
+++ b/indra/newview/fscommon.h
@@ -78,6 +78,9 @@ namespace FSCommon
*/
extern S32 sObjectAddMsg;
+ // request group data from the server if it's not already cached
+ bool requestGroupData(const LLUUID& groupID);
+
bool checkIsActionEnabled(const LLUUID& av_id, EFSRegistrarFunctionActionType);
LLSD populateGroupCount();
diff --git a/indra/newview/fsslurlcommand.cpp b/indra/newview/fsslurlcommand.cpp
index d0307b98d8..b53041d829 100644
--- a/indra/newview/fsslurlcommand.cpp
+++ b/indra/newview/fsslurlcommand.cpp
@@ -31,6 +31,7 @@
#include "llavataractions.h"
#include "llcommandhandler.h"
#include "llfloatersettingsdebug.h"
+#include "llgroupactions.h"
#include "lllogchat.h"
#include "llnotificationsutil.h"
@@ -135,6 +136,24 @@ public:
return true;
}
+ if (verb == "groupjoin")
+ {
+ LLGroupActions::join(LLUUID(target_id));
+ return true;
+ }
+
+ if (verb == "groupleave")
+ {
+ LLGroupActions::leave(LLUUID(target_id));
+ return true;
+ }
+
+ if (verb == "groupactivate")
+ {
+ LLGroupActions::activate(LLUUID(target_id));
+ return true;
+ }
+
return false;
}
};
diff --git a/indra/newview/skins/default/xui/en/menu_url_group.xml b/indra/newview/skins/default/xui/en/menu_url_group.xml
index 2cb125ce09..24da0313e5 100644
--- a/indra/newview/skins/default/xui/en/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_group.xml
@@ -11,6 +11,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+