ContributionsMost RecentMost LikesSolutionsRe: restBuilder with search endpoint to return messages with admin privileges? Thanks for the help,Akenefick! I created a ticket with support to check on the issue. I tried many different ways to make this work, but all efforts were unsuccessful. Having something wrong with the platform is probably what's causing it. restBuilder with search endpoint to return messages with admin privileges? Hi, When I call <#assign comments = restBuilder().method("POST").path("/search").body(query).admin(true).call()> where <#assign query = { "messages": { "fields": [ "id", "subject", "author.id", "author.first_name", "author.last_name" ], "sorts": [ "post_time DESC" ], "constraints": [ { "parent.id": '${messageId}', "board.id": "${nodeId}" } ], "limit": 20 } }> I'm not getting author.first and last name even while making the call as an admin. The first and last name are only visible if user is an admin or has elevated access, all other users will not see the names. Does anyone know why? Is the admin(boolean) method broken in general or just for the search endpoint? Thanks! Re: Emojis in email subject? Hivk-9! Thanks for the tips! HTML entity works inside email body, but not in the subject. Copied emojis doesn't work anywhere, but I guess that's fine. Thanks again! 🙂 Re: Possible? Display 30-day FRT on a Board Component? Looks like you need this: ${restadmin("boards/id/${coreNode.id}/metrics/name/avg_thread_response_time?date_start=2023-01-01&date_end=2023-02-01").value} I might picked the wrong metric, but you can find the name of each by grabbing the value from url like /t5/bizapps/page/tab/community%3Aadmin%3Aanalytics-main%3Aadvanced-metrics?board_selection=freelancers&date_range=3-12-2023%2C4-12-2023&granularity=Daily&metrics=avg_thread_response_time&metrics_scope=board&user_selection=Empty Dates can get weird, but you should be able to use the datesupport method datesupport.addMonth(-1) Re: Wrap multiple component in a div with class in Quilt / page xml view Try with wrapper! <quilt layout="two-column.main-side" nestable="false"> <add to="main-content"> <component id="theme-lib.tiled-node-navigation" wrapper="my-class"/> <component id="custom_content_2" wrapper="my-class"/> <component id="theme-lib.community-activity"/> </add> </quilt> Re: BS Session: Architect a "Department" field (bonus: weekly batch update) My ideas: 1. Create a component to write to user profile, all data in json, make pagination out of it, connect with javascript, click "Begin", go on vacation. Or do daily batches. 2. Or, make JS when user opens a page, lets say a forum article page, to take all users from page and write to their profiles so you don't have to do it (doing it only when user logs in is very slow process). 3. No matter what route you go, you still need to have title update once user logs in. You can achieve thatactivity.results.name.UserSignedOn. Bonus: be careful making too many db calls otherwise Khoros will go into your production instance and comment out the code if in custom content xD Re: Lab / Idea / Unconference Meetup? The idea sounds just lovely! Count me in 😊 Re: http.client.request post() issue HiAbhishekGu We went with protocol, host and url because that's how the help article is telling us we can dohttps://developer.khoros.com/khoroscommunitydevdocs/reference/httpclientrequestprotocol-host-url But we tried both ways, even removing variables and using hard coded values, didn't help. We spent so so many hours to make this work, but none seem to work. I am doubting post requests are even possible. http.client.request post() issue Hi, I'm trying to connect to graphql and trying to do the authorization first. However, I keep on getting error like "html found in response" and if I try to get the content of such a response, getting "302 found". This is what I'm using: <#assign response = http.client.request(protocol, host, url).body("{ 'grant_type':'refresh_token', 'refresh_token':'${upAuth.refreshToken}', 'client_id':'${upAuth.clientId}', 'client_secret':'${upAuth.clientSecret}' }", "application/x-www-form-urlencoded").post()> refresh_token is value from the cookie --oauth2v2_bunch_of_characters_here that was set up by a javascript function. Tried adding parameters, headers, change body content type to application/json, basically anything that I can come up with, but none seem to work. Domain is whitelisted as well. I'm able to do everything with jquery and ajax, just not with the http.client.request with the same parameters. Would opt out doing it that way, but need to protect client id and client secret values. What am I doing wrong here? Any help is appreciated. Re: Join and leave grouphub through API Hi, We have a bunch of functions so I can't edit them to make more user friendly, but should give you enough. We separated all the functions to do separate tasks (join open node, send request to join closed node, accept invite, decline invite + leave group (there isn't functionality to reject an invite to groups so we went to accept invite and leave group immediately). function joinOpenNode(id, div, href, title) { $("#" + div).html("<span id='" + div + "' class='df df-justify-center'><img src='${settings.paths.bucket}/Assets/others/spinner.svg' class='group-button-loading'></span>"); $.ajax({ url: "/api/2.0/nodes/grouphub:"+div+"/membership_requests", headers: { accept: 'application/json', 'content-type': 'application/json' }, type: "POST", data: '{"data":{"type":"membership_request"}}', success: function(result) { $("#" + div).remove(); window.location.href = href; }, error: function(result) { if(result.responseText.split('"message":"')[1].split('","data"')[0].indexOf("The specified node is not a membership node") == 0) { createAndOpenModal(id, "${text.format('groups.modals-open-error-join-hidden')}"); $("#" + div).remove(); } else if(result.responseText.split('"message":"')[1].split('","data"')[0].indexOf("error.api.membership.join.user_not_found_id") == 0) { createAndOpenModal(id, "${text.format('groups.modals-open-error-join-anonymous')}"); $("#" + div).remove(); } else { createAndOpenModal(id, "${text.format('groups.modals-open-error-join-default')}"); } }, async: true, cache: false }); } function joinClosedNode(id, div, href, title) { $("#" + div).html("<span id='" + div + "' class='df df-justify-center'><img src='${settings.paths.bucket}/Assets/others/spinner.svg' class='group-button-loading'></span>"); $.ajax({ url: '/api/2.0/nodes/grouphub:' + div + '/membership_requests', method: "POST", headers: { accept: 'application/json', 'content-type': 'application/json' }, data: '{"data":{"type":"membership_request"}}', success: function(request) { createAndOpenModal(id, "${text.format('groups.modals-closed-success', '"+ title +"')}"); $("#" + div).html('<span class="cg-group-info-join-requested">${text.format("groups.tile-buttons-join-closed-node-requested")}</span>'); }, error: function(request) { if(request.responseText.split('"message":"')[1].split('","data"')[0].indexOf("User has already requested to join node") == 0) { createAndOpenModal(id, "${text.format('groups.modals-closed-error-already-requested')}"); $("#" + div).remove(); } else if(request.responseText.split('"message":"')[1].split('","data"')[0].indexOf("The specified node is not a membership node") == 0) { createAndOpenModal(id, "${text.format('groups.modals-open-error-join-hidden')}"); $("#" + div).remove(); } else if(request.responseText.split('"message":"')[1].split('","data"')[0].indexOf("error.api.membership.join.user_not_found_id") == 0) { createAndOpenModal(id, "${text.format('groups.modals-closed-error-anonymous')}"); $("#" + div).remove(); } else { createAndOpenModal(id, "${text.format('groups.modals-closed-error-default', '"+ title +"')}"); $("#" + div).html("<span onclick=\"joinClosedNode('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-up-black'>${text.format('groups.tile-buttons-join-closed-node')}</span>"); } }, async: true, cache: false }); } function acceptInvite(id, div, href, title) { $("#" + div).html("<span id='" + div + "' class='df df-justify-center'><img src='${settings.paths.bucket}/Assets/others/spinner.svg' class='group-button-loading'></span>"); $.ajax({ url: '/api/2.0/nodes/grouphub:' + div + '/invites', method: "PUT", headers: { accept: 'application/json', 'content-type': 'application/json' }, data: '{"invite":{"accept":true}}', success: function(request) { window.location.href = href; $("#" + div).remove(); }, error: function(request) { if(request.responseText.split('"message":"')[1].split('","data"')[0].indexOf("Invite not found for the specified user and node") == 0) { createAndOpenModal(id, "${text.format('groups.modals-accept-invite-no-invite')}"); $("#" + div).html("<span onclick=\"declineInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-link'>${text.format('groups.tile-buttons-invite-decline')}</span><span onclick=\"acceptInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-up-black'>${text.format('groups.tile-buttons-invite-accept')}</span>"); } else { createAndOpenModal(id, "${text.format('groups.modals-accept-invite-error-default')}"); $("#" + div).html("<span onclick=\"declineInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-link'>${text.format('groups.tile-buttons-invite-decline')}</span><span onclick=\"acceptInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-up-black'>${text.format('groups.tile-buttons-invite-accept')}</span>"); } }, async: true, cache: false }); } function declineInvite(id, div, href, title) { $("#" + div).html("<span id='" + div + "' class='df df-justify-center'><img src='${settings.paths.bucket}/Assets/others/spinner.svg' class='group-button-loading'></span>"); $.ajax({ url: '/api/2.0/nodes/grouphub:' + div + '/invites', method: "PUT", headers: { accept: 'application/json', 'content-type': 'application/json' }, data: '{"invite":{"accept":true}}', success: function(request) { leaveGroup(id, div, href, title); }, error: function(request) { if(request.responseText.split('"message":"')[1].split('","data"')[0].indexOf("Invite not found for the specified user and node") == 0) { createAndOpenModal(id, "${text.format('groups.modals-decline-invite-no-invite')}"); $("#" + div).html("<span onclick=\"declineInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-link'>${text.format('groups.tile-buttons-invite-decline')}</span><span onclick=\"acceptInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-up-black'>${text.format('groups.tile-buttons-invite-accept')}</span>"); } else { createAndOpenModal(id, "${text.format('groups.modals-decline-invite-error-default')}"); $("#" + div).html("<span onclick=\"declineInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-link'>${text.format('groups.tile-buttons-invite-decline')}</span><span onclick=\"acceptInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-up-black'>${text.format('groups.tile-buttons-invite-accept')}</span>"); } }, async: true, cache: false }); } function leaveGroup(id, div, href, title) { $.ajax({ url: "/api/2.0/nodes/grouphub:"+div+"/membership_requests", headers: { accept: 'application/json', 'content-type': 'application/json' }, type: "DELETE", data: '{"data":{"type":"membership_request"}}', success: function(result) { if($("#" + div).parent().parent().parent().find(".custom-groups-group").length == 1) { $("#" + div).parent().parent().parent().parent().remove(); } else { $("#" + div).parent().parent().remove(); } createAndOpenModal(id, "${text.format('groups.modals-decline-invite-success')}"); }, error: function(result) { createAndOpenModal(id, "${text.format('groups.modals-decline-invite-error-default')}"); $("#" + div).html("<span onclick=\"declineInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-link'>${text.format('groups.tile-buttons-invite-decline')}</span><span onclick=\"acceptInvite('" + id + "', '" + div + "', '" + href + "', '" + title.replace("'","").replace('"','') + "')\" class='community-button community-button-up-black'>${text.format('groups.tile-buttons-invite-accept')}</span>"); }, async: true, cache: false }); } Hope it helps. It does look extremely chaotic xD