This template manage how can participate current user in a space's team, show different alternatives in function of participation mode
Paramters: Space, ParticipationMode {"Open","ByInvitation","Private"}
// + PARAMETERS
var mPars = {
mPage: (__request.args.page ? string.deserialize(__request.args.page) : null ) ?? args.page ?? page,
sSpaceName: __request.args.space ?? args.space ?? "",
sParticipationMode: __request.args.participationMode ?? args.participationMode ?? "",
sInvitationCode: __request.args.IC ?? args.IC ?? ""
};
//Web.Pre(Json.Format(mPars));
// + INCLUDES
dekiapi();
// + CONSTANTS
var LANGUAGE_ES = {
user : "Usuario",
team : "Equipo",
name : "Nombre",
surname : "Apellidos",
email: "Correo electrónico",
participate: "Participar",
since: "Desde",
teamwelcome: "¡Bienvenido al equipo %1!",
requiredfield: "¡Introduce el campo \"%1\"!",
validfield: "¡Introduce un \"%1\" válido!",
gotospace: "Ir al espacio %1",
teamparticipate: "Participa en el equipo %1",
user_alreadyinteam_msg : 'El usuario ya es integrante del equipo.',
logintoparticip_msg : 'Para participar primero hay que identificarse.<br />Puedes iniciar la sesión utilizando tu proveedor OpenID favorito:',
logintoparticip_link: 'Clica aquí para iniciar la sesión ...'
};
var LANGUAGE_EN = {
user : "User",
team : "Team",
name : "Name",
surname : "Surname",
email: "Email",
participate: "Participate",
since: "Since",
teamwelcome: "Welcome to %1 team!",
requiredfield: "The field \"%1\" is required!",
validfield: "Enter a valid \"%1\"!",
gotospace: "Go to %1 space",
teamparticipate: "Participate in the %1 team",
user_alreadyinteam_msg : 'User is already member of the team.',
logintoparticip_msg : 'To participate you need to identificate first.<br />You can log-in using your favorite OpenID provider:',
logintoparticip_link: 'Click here to log-in ...'
};
var LANGUAGE_EU = {
user : "Erabiltzailea",
team : "Taldea",
name : "Izena",
surname : "Abizenak",
email: "Posta elektronikoa",
participate: "Parte Hartu",
since: "Noiztik",
teamwelcome: "Ongietorria %1 taldera!",
requiredfield: "Sar ezazu \"%1\" eremua!",
validfield: "Sar ezazu baliozko \"%1\"!",
gotospace: "Joan %1 espaziora",
teamparticipate: "Parte hartu %1 taldean",
user_alreadyinteam_msg : 'Erabiltzailea iadanik taldeko kidea da.',
logintoparticip_msg : 'Parte hartzeko lehenik identifikatu beharra dago.<br />Saioa hasi dezakezu gustokoen duzun OpenID hornitzaileaz:',
logintoparticip_link: 'Klikatu hemen saioa hasteko ...'
};
var TXTS = { 'es': LANGUAGE_ES, 'es-es': LANGUAGE_ES, 'en': LANGUAGE_EN, 'en-us': LANGUAGE_EN, 'eu': LANGUAGE_EU, 'es-eu': LANGUAGE_EU }; //#mod @himikel
var lg = mPars.mPage.language;
if (!TXTS[lg])
let lg = 'en';
var bUserInGroup=false;
var sTeam=mPars.sSpaceName;
var sChannel="participate";
var sTeamWelcomeMsg=String.Replace(TXTS[lg].teamwelcome,"%1",sTeam);
var sSpaceUrl=site.url.."/"..sTeam;
var sNameReqFldMsg=String.Replace(TXTS[lg].requiredfield,"%1",TXTS[lg].name);
var sEmailReqFldMsg=String.Replace(TXTS[lg].requiredfield,"%1",TXTS[lg].email);
var sEmailValFldMsg=String.Replace(TXTS[lg].validfield,"%1",TXTS[lg].email);
var sGoToSpaceMsg=String.Replace(TXTS[lg].gotospace,"%1",sTeam);
var sHeaderMsg=String.Replace(TXTS[lg].teamparticipate,"%1",sTeam);
var sMsg="<h3>"..sHeaderMsg.."</h3><br />";
//let sMsg..="atok: "..user.authtoken.."<br />";
Web.Html(sMsg);
if (user.anonymous)
{
//Anonymous Users need to log-in by OpenID first (or using native account)
var sReturnPath=mPars.mPage.path;
if (mPars.sInvitationCode!="")
let sReturnPath..="-IC-"..mPars.sInvitationCode; //To solve ReturnTotitle problem using apache rewriterule
//let sReturnPath..="&IC="..mPars.sInvitationCode;
var sLoginUrl=site.uri.."Special:OpenIdLogin?returntotitle="..Uri.Encode(Uri.Encode(sReturnPath));
let sMsg="<br />"..TXTS[lg].logintoparticip_msg;
let sMsg..="<br /><b><a href='"..sLoginUrl .."'>"..TXTS[lg].logintoparticip_link.."</a></b><br /><br />";
Web.Html(sMsg);
}//if
else
{
let sMsg=TXTS[lg].user..": "..user.name.."<br />";
Web.Html(sMsg);
var xGroupUsers=Wiki.Api(Uri.Build(site.api, ["groups", "="..mPars.sSpaceName, "users"] ));
//Web.Pre(Json.Format(xGroupUsers));
var slGroupUsers=[ Xml.Text(xUser, 'username') foreach var xUser in Xml.Select(xGroupUsers, '/users/user') ];
//var slGroupUsers=Xml.Select(xGroupUsers, '/users/user');
//Web.Pre(Json.Format(slGroupUsers));
var slData = Json.Parse(user.homepage.properties["TeamParticipate"].text ?? "") ?? [];
//Web.Pre(Json.Format(slData));
var nLastInd=#slData-1;
var sName = slData[nLastInd]["Name"];
var sSurname = slData[nLastInd]["Surname"];
var sEmail = slData[nLastInd]["Email"];
var sSinceVar= "Since-"..mPars.sSpaceName;
var sSince = slData[nLastInd][sSinceVar];
//var sName=user.homepage.properties["Name"].text;
//var sSurname=user.homepage.properties["Surname"].text;
//var sEmail=user.homepage.properties["Email"].text;
//let sMsg=TXTS[lg].name..": "..sName.."<br />";
//Web.Html(sMsg);
let bUserInGroup=(user.name in slGroupUsers);
if (bUserInGroup)
{
let sMsg=TXTS[lg].user_alreadyinteam_msg.."<br />";
let sMsg..=TXTS[lg].since..": "..sSince.."<br />";
Web.Html(sMsg);
}
var bInvited=false,bIncompleted=false;
if (!bUserInGroup)
{
if (mPars.sParticipationMode=="ByInvitation")
{
if ((sTeam=="LinkedHitz")&&(mPars.sInvitationCode=="12345678"))
let bInvited=true;
else if (sTeam=="OpenKoop")
{
var slIUsers=["trebea","diegopoloroman","albarte"];
if (user.name in slIUsers)
let bInvited=true;
}
}
}
else
{
if ((sName==null)||(sEmail==null))
let bIncompleted=true;
}
var sButton="-";
if ((bInvited)||(bIncompleted))
let sButton=TXTS[lg].participate;
//let sButton=TXTS[lg].participatein.." "..mPars.sSpaceName;
Wiki.Template("Template:@neilw/ShowForm", {
fields: [
{ type: 'text', label: TXTS[lg].name..': ', field: 'name', default: sName },
{ type: 'text', label: TXTS[lg].surname..': ', field: 'surname', default: sSurname },
{ type: 'text', label: TXTS[lg].email..': ', field: 'email', default: sEmail },
{ field: sSinceVar, hidden: true, value: date.now }
],
button: sButton,
publish: sChannel
});
Wiki.Template("Template:@steveb/UpdateStore", {
id: "TeamParticipate",
subscribe: sChannel,
spage: user.homepage,
msg: 10
});
if (bUserInGroup)
Web.Link(sSpaceUrl,sGoToSpaceMsg);
}
var sOperAT=String.Trim(Wiki.Template("Template:@himikel/GetOperAT"));
<script type="text/jem">"
var ingroup="..bUserInGroup..";
var siteapi='"..site.api.."';
var userid='"..user.id.."';
var user='"..user.name.."';
var useratok='"..user.authtoken.."';
var group='"..sTeam.."';
var msgmode=10;
var channel='"..sChannel.."';
var teamwelcome='"..sTeamWelcomeMsg.."';
var spaceurl='"..sSpaceUrl.."';
var namereqfld='"..sNameReqFldMsg.."';
var emailreqfld='"..sEmailReqFldMsg.."';
var emailvalfld='"..sEmailValFldMsg.."';
var operatok='"..sOperAT.."';
var name='';
var email='';
Deki.subscribe('Msg_UpdateStore', null, function(c, m, d) {
//alert('event::@Msg_UpdateStore');
var rsl=m.msgrsl;
var msg=m.msgtxt;
var data=m.msgdata;
//var data=YAHOO.lang.JSON.parse(m.msgdata);
//alert('rsl: '+rsl+' msg: '+msg+' data: '+data);
//Field Validations
name=data[data.length-1]['name'];
if (name.length<=0)
{
alert(namereqfld);
return;
}
email=data[data.length-1]['email'];
//alert('email: '+email);
if (email.length<=0)
{
alert(emailreqfld);
return;
}
/*
//Not the best email validation pattern but works for the most part.
var pattern = new RegExp(/^([a-zA-Z0-9_.\-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/);
if (pattern.test(email)==0)
{
alert(emailvalfld);
return;
}
*/
/*
var props='';
for (var prop in data)
{
props+=' '+prop+'(#'+data[prop].length+'): '+data[prop]['email'];
//props+=' '+prop+'<'+typeof(prop)+'>';
}//fo
alert('props: '+props);
*/
if ((rsl>0)&&(!ingroup))
SetUserGroup(siteapi, userid, user, group, operatok, msgmode);
//SetUserGroup(siteapi, userid, user, group, useratok, msgmode);
}, null);
Deki.subscribe('Msg_SetUserGroup', null, function(c, m, d) {
//alert('event::@Msg_SetUserGroup');
var rsl=m.msgrsl;
var msg=m.msgtxt;
var data=m.msgdata;
//alert('rsl: '+rsl+' msg: '+msg+' data: '+data);
if (rsl>0)
{
SetUserEmail(siteapi, userid, user, email, msgmode);
}
}, null);
Deki.subscribe('Msg_UpdateProperty_email', null, function(c, m, d) {
//alert('event::@Msg_UpdateProperty_email');
var rsl=m.msgrsl;
var msg=m.msgtxt;
var data=m.msgdata;
//alert('rsl: '+rsl+' msg: '+msg+' data: '+data);
if (rsl>0)
{
alert(teamwelcome);
window.location=spaceurl;
}//if
}, null);
/*
when (@msg_updatestore)
{
alert('event::@msg_updatestore2');
//@msg_updatestore({msgrsl: msgrsl, msgtxt: msgtxt});
});//wh
*/
function SetUserGroup(siteapi, userid, user, group, atok, msgmode) {
var msg='user: '+user+' group: '+group;
//alert(msg);
//POST:groups/{groupid}/users
var postdata='<users><user id=\"'+userid+'\"/></users>';
//alert('postdata: '+postdata);
MindTouch.Web.Post(siteapi+'/groups/='+group+'/users'+'?authtoken='+atok, postdata, 'text/xml; charset=utf-8', null, function(res) {
if (MindTouch.Web.IsSuccessful(res)) {
PostMessage('SetUserGroup',msgmode,1,'SetUserGroup() > Ok\\n'+msg,postdata);
} else {
PostMessage('SetUserGroup',msgmode,-1,'SetUserGroup() > Res:'+res.status+'!\\n'+msg,null);
};
});
};
function SetUserEmail(siteapi, userid, user, email, msgmode) {
var msginfo='user: '+user+' email: '+email;
//alert(msginfo);
//PUT:users/{userid}
var prop='email';
var propapi=siteapi+'/users/'+userid; // '/properties/'+encodeURIComponent(encodeURIComponent(prop))
var postdata='<user><email>'+email+'</email></user>';
var datatype='text/xml; charset=utf-8';
//var propapi=siteapi+'/groups/='+group+'/users'+'?authtoken='+atok;
//var postdata='<users><user id=\"'+userid+'\"/></users>';
//alert('postdata: '+postdata);
UpdateProperty(propapi, prop, postdata, datatype, msginfo, msgmode);
};
//Update Property
function UpdateProperty(propapi, prop, data, datatype, msginfo, msgmode) {
var msgproc='UpdateProperty'+'_'+prop;
//alert('UpdateProperty: '+msgproc);
var msgtxt='';
MindTouch.Web.Get(propapi, null, function(result) {
//alert('UpdateProperty::Get ');
if(MindTouch.Web.IsSuccessful(result)) {
//alert('UpdateProperty::Put');
MindTouch.Web.Put(propapi, data, datatype, { ETag: result.etag}, function(xhr) {
//YAHOO.lang.JSON.stringify(
if(MindTouch.Web.IsSuccessful(xhr)) {
PostMessage(msgproc,msgmode,1,'Put Ok',data);
}
else {
msgtxt='Error with Put: (status: ' + xhr.status + ' - ' + MindTouch.Web.GetStatusText(xhr.status) + ')'+'\\r\\nProc: '+msgproc+'\\r\\nInfo: '+msginfo;
PostMessage(msgproc,msgmode,-2,msgtxt,null);
}
});
}//if
else {
//alert('UpdateProperty::Post');
var propurn = 'urn:custom.mindtouch.com#' + prop;
/*
MindTouch.Web.Post(propapi, YAHOO.lang.JSON.stringify(data), datatype, { Slug: propurn }, function(xhr) {
if(MindTouch.Web.IsSuccessful(xhr)) {
PostMessage(msgproc,msgmode,1,'Post Ok',data);
}
else {
msgtxt='Error with Post: (status: ' + xhr.status + ' - ' + MindTouch.Web.GetStatusText(xhr.status) + ')'+'\\r\\nProc: '+msgproc+'\\r\\nInfo: '+msginfo;
PostMessage(msgproc,msgmode,-3,msgtxt,null);
}
});
*/
}//el
});
};
//@himikel #add 2010-07-05
function PostMessage(msgproc, msgmode, msgrsl, msgtxt, msgdata) {
msgproc='Msg_'+msgproc;
if (msgmode==1)
alert(msgtxt+' ('+msgrsl+')');
else if (msgmode==10)
Deki.publish(msgproc, {msgrsl: msgrsl, msgtxt: msgtxt, msgdata: msgdata});
//@msg_updatestore({msgrsl: msgrsl, msgtxt: msgtxt});
};
"</script>