ä»æ¥ã¯ãMeteorã¢ããªã±ãŒã·ã§ã³çšã®ã·ã³ãã«ã§ãããªããéåžžã«æ©èœããã¡ãŒã«æåŸ ã·ã¹ãã ã®äœææ¹æ³ã説æããŸãã
ãªããããå¿ èŠãªã®ã§ããããïŒ ããšãã°ããããžã§ã¯ãã®åãã°ã«ãŒãå ã§æ°äººãäœæ¥ããå¿ èŠãããã¢ããªã±ãŒã·ã§ã³ãéçºããŠããå Žåã ããã¯ãããšãã°ãè€æ°ã®äººãç·šéã§ãããã¬ãŒãã³ã°ã¹ã±ãžã¥ãŒã«ããäŒç€Ÿã®ãªã³ã©ã€ã³ã¹ãã¢ã®è£œåã«ã¿ãã°ã«ããããšãã§ããŸãã
ãããã¯ãŒã¯ã«ã¯ãã§ã«è±èªãšCoffeScriptã®ããã¥ã¢ã«ã1ã€ãããŸãããããã«èšèŒãããŠããã¢ãããŒãã¯ç§ã«ãšã£ãŠäžäŸ¿ã§ããããã«æãããããèªåã®ãããžã§ã¯ãã«æåŸ ã·ã¹ãã ãå®è£ ãããããããŒã«ãŒãšå ±æããããšã«ããŸããã
ãããã£ãŠããã®äŸã§ã¯æ¬¡ã®ããšãå¯èœã«ãªããŸãã
1ïŒæ¢åã®æåŸ ã®ãªã¹ããšæ°ããæåŸ ãéä¿¡ããããã®ãã©ãŒã ãå«ãæåŸ ã€ã³ã¿ãŒãã§ãŒã¹ã衚瀺ããŸãã
2ïŒãã¹ãŠã®æåŸ ç¶ãããŒã¿ããŒã¹ã«ä¿åããŸãã
3ïŒæåŸ ã®ã¹ããŒã¿ã¹ãç£èŠããŸãã
4ïŒæåŸ ç¶ãã¡ãŒã«ã§éä¿¡ããŸãã
5ïŒãŠãŒã¶ãŒã®åœ¹å²ãç£èŠããŸãã
6ïŒæ°ãããŠãŒã¶ãŒã®æåŸ ãã¢ã¯ãã£ãã«ããŸãã
7ïŒå€æ°ã®ãµãŒãããŒãã£ã¢ãžã¥ãŒã«ã䜿çšããŸãã
泚æïŒãã®äŸã¯ãçããŠãããããžã§ã¯ãã«åºã¥ããŠæ€èšããããããã³ããŒããŠèªåã«è²Œãä»ããã ãã§ã¯ããããåäœããŸãã...
äœãå¿ èŠã§ããïŒ ãŸãã次ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
accounts-base - accounts-google - accounts-password - / accounts-ui - alanning:roles - aldeed:autoform - aldeed:collection2 - email - iron:router - mizzao:bootboxjs - random -
ããã«ããµã³ãã«ã€ã³ã¿ãŒãã§ã€ã¹ã¯Bootstrapã®Material Designã䜿çšããŠèšè¿°ãããŠãããããããããžã§ã¯ãã«çµ±åããå¿ èŠããããŸãã å§ããŸãããã
æåã®ã¢ãããŒã
ãŸããæåŸ ã®ã¹ããŒã¿ã¹ãæ åœããå°æ¥å¿ èŠã«ãªãããã€ãã®ç°¡åãªå®æ°ã«ã€ããŠèª¬æããŸãã
Lib / constants.jsãã¡ã€ã«
// INVITE_CREATED = 0; // Email - INVITE_EMAILED = 1; // INVITE_COMPLETED = 2;
ãŸãããã«ããŒé¢æ°ãããã€ãäœæããå¿ èŠããããŸãã
Lib / helpers.jsãã¡ã€ã«
// , if (Meteor.isClient) { // . , Template.registerHelper('userCompany', function () { var company = Company.findOne({userId: Meteor.userId()}); if (company == undefined) { if (Meteor.userId() != null) { var user = Meteor.users.findOne({_id: Meteor.userId()}, {fields: {'companyId': 1}}); company = Company.findOne({_id: user.companyId}); } } return company; }); // Email Template.registerHelper('validateEmail', function (email) { var re = /\S+@\S+\.\S+/; return re.test(email); }); }
ããŒã¿ãå ±åã§ç·šéããå¿ èŠãããã¢ããªã±ãŒã·ã§ã³ããããšããŸãïŒãããã¯é¢ä¿ãããŸããïŒã ãããè¡ãã«ã¯ãæåã®ãŠãŒã¶ãŒãäœæãããšãã«ãäŒç€Ÿã®ç¹å®ã®ã«ãŒãïŒãŸãã¯èª°ã«ãšã£ãŠã䟿å©ãªã°ã«ãŒãïŒãäœæããä»ã®ãŠãŒã¶ãŒã®æåŸ æã«ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã
ããŒã¿æ§é ãšãµãŒããŒããžãã¯
ãšã³ãã£ãã£ã®ããŒã¿ã¹ããŒãã説æããŸãããã ãããè¡ãã«ã¯ãSimple Schemaã®æ©èœãšãaldeedããã±ãŒãžã§ããcollection2ã䜿çšããŸãã
äŒç€Ÿã®ããŒã¿ã¹ããŒã ã説æããæåã®ã ããšãã°ãäŒç€Ÿåãç°¡åãªèª¬æãäŒç€ŸãäœæãããŠãŒã¶ãŒã®IDãã¬ã³ãŒããäœæãããæ¥ä»ãæåŸã«æŽæ°ãããæ¥ä»ãå«ãŸããŸãã
ã¹ããŒã ã®èª¬æã§ã¯ã次ã®ãããªå€ãèšå®ã§ããããšã«æ³šæããŠãã ããã
- type-ãã©ãŒã ãçæãããšãã«å°æ¥äœ¿çšãããæ¡ä»¶ä»ããã£ãŒã«ãã¿ã€ã
- minãmax-æå°ããã³æ倧æåæ°
- autoValue-ãã£ãŒã«ãã®èªåå€
- denyInsertãdenyUpdate-ã¬ã³ãŒãã®æ¿å ¥/æŽæ°æã«ãã£ãŒã«ããžã®æžã蟌ã¿ãçŠæ¢
- ãªãã·ã§ã³-ããã©ã«ãã®ãã£ãŒã«ãã¯å¿ é ã§ãããä¿®æ£ã§ããŸã
Lib / collections / company.jsãã¡ã€ã«
Company = new Mongo.Collection('company'); // if (Meteor.isServer) { Meteor.methods({ // . registerAdminUser: function(companyId, userId) { check(companyId, String); check(userId, String); Roles.addUsersToRoles(Meteor.userId(), ["CompanyAdmin"]); } }); } //SimpleSchema.debug = true; // Company.attachSchema(new SimpleSchema({ // title: { type: String, label: "", min: 3, max: 200 }, // description: { type: String, label: " ", min: 20, max: 1000, autoform: { rows: 5 } }, //id . . userId: { type: String, autoValue: function() { if (this.isInsert) { return Meteor.userId(); } else { this.unset(); } }, label: "", //denyInsert: true, denyUpdate: true, optional: true }, // . createdAt: { type: Date, autoValue: function() { if (this.isInsert) { return new Date; } else if (this.isUpsert) { return {$setOnInsert: new Date}; } else { this.unset(); } }, denyUpdate: true, optional: true }, // . updatedAt: { type: Date, autoValue: function() { if (this.isUpdate) { return new Date(); } }, denyInsert: true, optional: true }, }));
åæ§ã«ãæåŸ ã®ã¹ããŒã ã説æããŸãã ã³ã¬ã¯ã·ã§ã³ãã¡ã€ã«ã«ã¯ãæ°ããæåŸ ã®éä¿¡ãæ¢åã®æåŸ ã®åé€ãããã³ãŠãŒã¶ãŒã«ããæåŸ ã®ã¢ã¯ãã£ãåã®3ã€ã®ãµãŒããŒã¡ãœãããå«ãŸããŸãã ã³ã¬ã¯ã·ã§ã³ã«ã¯ãæåŸ è ã®ã¡ãŒã«ãã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒããæåŸ ã¹ããŒã¿ã¹ãæåŸ ãã¢ã¯ãã£ãã«ãããŠãŒã¶ãŒãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãã£ãŒã«ããæåŸ ãéä¿¡ãããŠãŒã¶ãŒãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãæåŸ ã®äœæ/æŽæ°æ¥ãä¿åãããŸãã ããã«ããã£ãŒã«ããæŽæ°æ¥ãã®æåŸã®å€ã¯ãæåŸ ã®ã¢ã¯ãã£ãåã®æ¥ä»ãšæå»ã«çãããªãããã£ãŒã«ããäœææ¥ã-éä¿¡ã®æ¥ä»ãšæå»ã«çãããªããŸãã
ãã¡ã€ã«lib / collections / invite.js
Invite = new Mongo.Collection('invite'); //SimpleSchema.debug = true; // if (Meteor.isServer) { Meteor.methods({ // email invationSender: function (email) { check(this.userId, String); check(email, String); // . Email var token = Random.hexString(10); // . var company = Company.findOne({userId: this.userId}); var companyName = company.title; // // - , var inviteId = Invite.insert({email:email,token:token,status:INVITE_CREATED}); // , this.unblock(); // // , Email.send({ to: email, from: 'info@forsk.ru', subject: ' '+companyName+' Kellot.ru', html: '! Kellot.Ru '+Meteor.user().profile.name+' ' + ' "'+companyName+'". ' + '<br/><br/> : '+token+ '<br/><br/> , ' + '<a href="http://p.kellot.ru/company/invite/'+token+'">http://p.kellot.ru/company/invite/'+token+'</a> ' + ' . .'+ '<br/><br/> , Kellot.Ru' }); // "" "" Invite.update({_id:inviteId}, {$set: {status: INVITE_EMAILED}}, {}, function(error, count) { console.log('update error', error, count); }); return true; }, // deleteInvite: function(inviteId) { check(inviteId, String); var invite = Invite.findOne({_id: inviteId}); // "" . // , if (invite.status != INVITE_COMPLETED) { Invite.remove({_id: inviteId}); return true; } else { return false; } }, // activateInviteToken: function (activationToken, userId) { check(this.userId, String); check(activationToken, String); check(userId, String); // - , var user = Meteor.users.findOne({_id:userId}); var invite = Invite.findOne({token:activationToken}); var company = Company.findOne({_id:invite.companyId}); // - if (invite.status == INVITE_COMPLETED) { return false; } // Meteor.users.update({_id:userId}, { $set: {companyId: company._id } }); // Invite.update({_id:invite._id}, { $set: {invitedUserId: userId, status: 2 } }); // Roles.addUsersToRoles(Meteor.userId(), ["CompanyMember"]); return true; } }); } // Invite.attachSchema(new SimpleSchema({ //Email , email: { type: String, label: " / Email", min: 3, max: 30 }, // . token: { type: String, label: " ", min: 10, max: 10 }, // status: { type: Number, label: " " }, // invitedUserId: { type: String, label: " ", optional: true }, // ? creator: { type: String, label: "", autoValue: function() { if (this.isInsert) { return Meteor.userId(); } else { this.unset(); } }, denyUpdate: true, optional: true }, // companyId: { type: String, autoValue: function() { if (this.isInsert) { return Company.findOne({userId:Meteor.userId()})._id; } else { this.unset(); } }, label: "", denyUpdate: true, optional: true }, // createdAt: { type: Date, autoValue: function() { if (this.isInsert) { return new Date; } else if (this.isUpsert) { return {$setOnInsert: new Date}; } else { this.unset(); } }, denyUpdate: true, optional: true }, // . // updatedAt: { type: Date, autoValue: function() { if (this.isUpdate) { return new Date(); } }, denyInsert: true, optional: true } }));
åºæ¬çã«ãµãŒããŒã§å¿ èŠãªã®ã¯ããã ãã§ãã ã芧ã®ãšãããããžãã¯ã¯2åã®ã·ã³ãã«ãªãã®ã§ãããŠãŒã¶ãŒã¯äŒç€ŸïŒã°ã«ãŒãïŒãäœæããŸãã èªåçã«ææè ã«ãªããä»ã®ãŠãŒã¶ãŒã«æåŸ ç¶ãéä¿¡ããŸãã æåŸ ã®éä¿¡ã«ã€ããŠèããå€ããå Žåãåä¿¡è ãæåŸ ãé©çšããªãã£ããã管çè ã¯æåŸ ãåé€ããæš©å©ããããåä¿¡è ã¯æåããŸããã æåŸ ãã¢ã¯ãã£ãã§ãåä¿¡è ãã¬ã¿ãŒå ã®ãªã³ã¯ãã¯ãªãã¯ãããšããç»é²ããã¿ã³ãã¯ãªãã¯ããã ãã§ããã«æåŸ ãã¢ã¯ãã£ãã«ã§ããŸãã ãããããããæ©èœããããã«ã¯ãã«ãŒã¿ãŒã«äœããæããå¿ èŠããããŸã...
ããã«ã¡ãŒã«éä¿¡ã®èšå®ãæ°ã«ããå¿ èŠããªãããšã«æ³šæããŠãã ããã ããã«äœ¿ããMeteorã¯MailgunãµãŒãã¹ã䜿çšããããã«æ§æãããŠããã1æ¥ã«æ倧200æåããŸãã¯1ãæã«æ倧10,000æåãéä¿¡ã§ããŸãã ãã ããç¬èªã®ã¡ãŒã«ãµãŒããŒãŸãã¯ãµãŒãããŒãã£ã®ã¡ãŒã«ãµãŒããŒã§åäœããããã«èšå®ããããšã劚ãããã®ã¯ãããŸããã ãããè¡ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãã«ãç°å¢å€æ°MAIL_URLãå®çŸ©ããã ãã§ãã
次ã®ãããªãã®ïŒ "MAIL_URL"ïŒ "smtpïŒ// userïŒpassword@domain.ruïŒ587 /"ã ãã®åŸãã¬ã¿ãŒã®éä¿¡ã¯ãæå®ãããµãŒããŒã§ã®æ¿èªãéããŠè¡ãããŸãã
éèŠïŒ meteor-upã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããããã€ããç°å¢å€æ°ãèšè¿°ããmup.jsonãã¡ã€ã«ããããžã§ã¯ãã«ä¿åããå Žåã¯æ³šæããŠãã ãããGitHubãªã©ã®ãªãŒãã³ãªããžããªã«ã³ãŒããæçš¿ããªãã§ãã ããã ããããªããšãå šå¡ãã¡ãŒã«ãèªãããšãã§ããŸãã
ã«ãŒã¿ãŒãšåºçç©
Iron Routerã¯ãæ°èŠåå ¥è ãã¬ã¿ãŒãã移åãããªã³ã¯ãåŠçããã¿ã¹ã¯ãå®è¡ãã2ã€ã®æ¡ä»¶ã«åºã¥ããŠã¢ã¯ãã£ããŒã·ã§ã³ãæåŸ ãããµãŒããŒåŽã®ã¡ãœãããåŒã³åºããŸãã
- çŸåšã®ãŠãŒã¶ãŒã¯ããããã®äŒæ¥ã«é¢é£ä»ããããŠããŸããïŒ
- çŸåšã®ã»ãã·ã§ã³ã«ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒãã¯ãããŸããïŒ
Lib / router.jsãã¡ã€ã«
Router.map(function () { ... // this.route('activateInviteToCompany', { trackPageView: true, path: '/company/invite/:activationToken', waitOn: function () { // , , Meteor.subscribe("inviteToken", Router.current().params.activationToken); Meteor.subscribe('companyToken', Router.current().params.activationToken); return Meteor.subscribe('userToken', Router.current().params.activationToken); } }); ... Router.onBeforeAction(function (pause) { Alerts.removeSeen(); // if (Meteor.userId() == null) { if (pause.url != '/index' && pause.url != '/' && pause.url != '/reviews' && pause.url != '/company/invite/'+Router.current().params.activationToken) { Router.go('index'); } } // , , // // , // if (Meteor.isClient && Meteor.userId() != null) { // ... if (UI._globalHelpers.userCompany() == undefined && (pause.url != '/firstLogin' && pause.url != '/company/register' )) { //... , ... if (Session.get('activationToken') != undefined) { // var activationToken = Session.get('activationToken'); Session.set('activationToken', undefined); // var invite = Invite.findOne({ token: activationToken }); // Meteor.call('activateInviteToken', activationToken, Meteor.userId(), function (error, result) { // if (error) { // ... console.log(error); bootbox.alert(" . , ! : " + error.reason); } else { // ! Meteor.subscribe('company'); Meteor.subscribe('invite'); bootbox.alert(" !"); } }); } else { // - // ( ) Router.go('firstLoginForm'); } } } this.next(); }); });
ã³ãŒããããããããã«ããŠãŒã¶ãŒããªã³ã¯ '/ company / invit / <activation code>'ãã¯ãªãã¯ãããšãactivateInviteToCompanyãã³ãã¬ãŒããèªåçã«ã¬ã³ããªã³ã°ãããã¯ã©ã€ã¢ã³ãã«ã¯æåŸ èªäœãäŒç€Ÿãããã³æ°ããã¡ã³ããŒãæåŸ ãããŠãŒã¶ãŒã«é¢ããæ å ±ã衚瀺ãããŸãã ãããã®ããŒã¿ã¯å°ãåŸã§å¿ èŠã«ãªããŸãã
onBeforeActioné¢æ°ã§ã¯ãããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
ãŸããèš±å¯ãããŠããªããŠãŒã¶ãŒã®ã¿ãã¡ã€ã³ããŒãžã«ã¢ã¯ã»ã¹ããŠã¢ããªã±ãŒã·ã§ã³ã®æ©èœã確èªãããã£ãŒãããã¯ããŒãžã衚瀺ããã¢ã¯ãã£ããŒã·ã§ã³ã®æåŸ ããŒãžã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã ãã以å€ã®å Žå-ã©ãã§ååŸããããšããŠããåžžã«ã¡ã€ã³ããŒãžã«éä¿¡ããŸãã
次ã«ããŠãŒã¶ãŒããŸã èš±å¯ãããŠããå Žåã管çè ãŸãã¯åå è ãšããŠãæ¢åã®äŒç€Ÿãžã®æ·»ä»ãã¡ã€ã«ã確èªããŸãã ãã®ãã§ãã¯ãæåããå ŽåããŠãŒã¶ãŒã«ç¶è¡ãããŸãã
第äžã«ããŠãŒã¶ãŒããŸã ã©ã®äŒç€Ÿã«ãå²ãåœãŠãããŠããªãå Žåãã»ãã·ã§ã³ã§æåŸ ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒããæ¢ããŸãã ããå Žåã¯ããŠãŒã¶ãŒãã¢ã¯ãã£ãã«ããŸãã ããã§ãªãå Žåã¯ãç¹å¥ãªããŒãžã«éä¿¡ããŠãæ°ããäŒç€Ÿã®äœæãææ¡ããŸãã
ãšãŠãç°¡åã§ãã ãã ããã»ãã·ã§ã³ã§æåŸ ã³ãŒããä¿åããå Žæã¯è¡šç€ºãããŸããã ã©ãããŠïŒ ããã«ã€ããŠã¯åŸã»ã©èª¬æããŸãã
åºçç©ã¯æ®ããŸãã ã¯ã©ã€ã¢ã³ãã®ã«ãŒã¿ãŒã®ã³ãŒãããå€æãããšãæåŸ ãäŒç€ŸãæåŸ ãéä¿¡ãããŠãŒã¶ãŒã«é¢ããæ å ±ãå¿ èŠã§ãã 次ã®ã»ã¯ã·ã§ã³ã§ã¯ããã®çç±ãæããã«ãªããŸãã
ãããè¡ãã«ã¯ããããªã±ãŒã·ã§ã³ãã¡ã€ã«ã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
ãã¡ã€ã«ãµãŒããŒ/ publications.js
// function getCompanyByInviteToken(tokenId) { var invite = Invite.findOne({ token: tokenId }); var company = Company.findOne({ _id: invite.companyId }); //console.log('getCompanyByInviteToken', tokenId, invite.companyId, company._id); return company; } ... Meteor.publish('inviteToken', function (tokenId) { check(tokenId, Match.Any); return Invite.find({ token: tokenId }); }); Meteor.publish('companyToken', function (tokenId) { check(tokenId, Match.Any); var company = getCompanyByInviteToken(tokenId); return Company.find({_id:company._id}); }); Meteor.publish('userToken', function (tokenId) { check(tokenId, Match.Any); var company = getCompanyByInviteToken(tokenId); return Meteor.users.find({ _id: company.userId }, {fields: {'services':0, 'roles':0, createdAt:0}}); });
ãããã£ãŠãäžã«ç€ºããããã«ãæå°éã®å¿ èŠãªæ å ±ãã¯ã©ã€ã¢ã³ãã«è»¢éã§ããŸãã ãã¹ãŠã®ãã£ãŒã«ããã¯ã©ã€ã¢ã³ãã«è»¢éããããšã¯ã§ããŸããããéžæãããã£ãŒã«ãã®ã¿ã転éããããšã¯ã§ããŸããã§ããããããã¯äžèŠã ãšæããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹
ç§ãã¡ã®ããžãã¯ã¯ãã¹ãŠãã€ã³ã¿ãŒãã§ãŒã¹ãªãã§ã¯äœããããŸããã ã€ã³ã¿ãŒãã§ãŒã¹å šäœã¯ãããã€ãã®ãã³ãã¬ãŒãã§æ§æãããŸãã
- æåŸ ãªã¹ã-æåŸ ã®ãªã¹ããšæ°ããæåŸ ãéä¿¡ããããã®ãã©ãŒã ãåããããã«ã
- inviteSendãšinviteSend-èªåçã«çæãããäžé£ã®ãã£ãŒã«ããå«ãæåŸ ãã©ãŒã ïŒ1ã€ã®ã¿ïŒã
- activateInviteToCompany-ãã®ãŠãŒã¶ãŒã«ãã£ãŠã¢ã¯ãã£ãã«ãããæåŸ ã«é¢ããæ å ±ãæåŸ ããããŠãŒã¶ãŒã«è¡šç€ºããããã®ããã€ãã®ãªãã·ã§ã³ã
ãã¡ã€ã«ã¯ã©ã€ã¢ã³ã/ãã¥ãŒ/æåŸ /invite.html
<template name="inviteList"> <div class="panel panel-success" style="float: left; margin-right: 20px;"> <div class="panel-heading"> <h3 class="panel-title"> !</h3> </div> <div class="panel-body"> {{#if invitedUsers.count}} <div class="list-group"> {{#each invitedUsers}} <div class="list-group-item"> <div class="row-content"> <div class="least-content">{{inviteTextStatus}} {{#if isInRole 'CompanyAdmin'}} {{#if inviteIsComplete}} {{else}} <a class="deleteInviteBtn" data-id="{{_id}}" href="#">x</a> {{/if}} {{/if}} </div> <p class="list-group-item-text">{{email}}</p> </div> </div> <div class="list-group-separator"></div> {{/each}} </div> {{else}} ! {{/if}} </div> {{#if isInRole 'CompanyAdmin'}} <div class="panel-footer"> {{> inviteSend}} </div> {{/if}} </div> </template> <template name="inviteSend"> {{#autoForm collection="Invite" id="inviteSend" type="insert"}} {{> inviteFieldset}} <button id="sendInviteBtn" class="btn btn-primary" style="width:100%"></button> {{/autoForm}} </template> <template name="inviteFieldset"> <fieldset> {{> afQuickField name='email'}} </fieldset> </template> <template name="activateInviteToCompany"> {{#if currentUser}} . . {{ else }} {{#if inviteIsActivated}} , <b>{{userActivationCode}}</b> . . {{ else }} ! <br/><br/> , - <b>{{companyNameByInviteCode}}</b> <b>{{companyUserNameByInviteCode}}</b>. <br/><br/> <b>{{userActivationCode}}</b> !<br/><br/> , " / " , <b>{{companyNameByInviteCode}}</b>! {{/if}} {{/if}} </template>
ããã«ããã
InviteListãã³ãã¬ãŒãã«ã¯ãinviteSendéä¿¡ãã©ãŒã ãšäŒç€Ÿã®æåŸ ç¶ã®ãªã¹ãã衚瀺ãããŸãã ãŠãŒã¶ãŒã®åœ¹å²ãšæåŸ ç¶ã®ç¶æ ã«åºã¥ããŠãæåŸ ç¶ãéä¿¡ããããã®ãã©ãŒã ãšãåé€ããã¿ã³ã衚瀺ãŸãã¯é衚瀺ã«ãªããŸãã
activateInviteToCompanyãã³ãã¬ãŒãã¯ãæåŸ ã¹ããŒã¿ã¹ïŒéä¿¡æžã¿/ã¢ã¯ãã£ãåïŒããã³ãŠãŒã¶ãŒã¹ããŒã¿ã¹ïŒæ¿èªæžã¿/æªæ¿èªïŒã«åºã¥ããŠãã¢ã¯ãã£ããŒã·ã§ã³æåŸ ãŸãã¯ããããã®çç±ã§æåŸ ã䜿çšã§ããªãããšã«é¢ããæ å ±ã衚瀺ããŸãã
ããã«ããŠãŒã¶ãŒã®æåŸ ãã³ãã¬ãŒãactivateInviteToCompanyã®ããŒãžã«ã¯ããŠãŒã¶ãŒãæåŸ ãããŠãŒã¶ãŒãçç±ãå Žæã«é¢ãã詳现æ å ±ãå«ãŸããŠããŸãã ããã¯éåžžã«éèŠã§ãããªããªãããŠãŒã¶ãŒãæçŽã®ãªã³ã¯ããã©ãã®ã¯ãç解ã§ããªããµãŒãã¹ã®èª°ãããã®æåŸ ãåãå ¥ããããšããäºå®ã§ã¯ãªãããã§ãã
ãããæåŸ ãŠã£ãžã§ããã®å€èŠ³ã§ãã
![](https://habrastorage.org/files/b34/a68/6ee/b34a686ee5f24f05be63d88563e3ae98.png)
ãããŠããŠãŒã¶ãŒæåŸ ããŒãžïŒ
![](https://habrastorage.org/files/b3e/35e/0d8/b3e35e0d8cf34fe0a4e1dfd632a3bd42.png)
ã¯ã©ã€ã¢ã³ãåŽã®ããžãã¯
ãµãµ...èšäºãæžã3æéç®...
å°ãæ®ã£ãŠããŸãã æåŸã«ãã€ã³ã¿ãŒãã§ã€ã¹ã«ããžãã¯ããããã·ã¹ãã ã®ãã¹ãŠã®éšåãæ¥ç¶ããå¿ èŠããããŸãã ãã®ããã«ã
ãã¡ã€ã«ã¯ã©ã€ã¢ã³ã/ãã¥ãŒ/æåŸ /invite.js
Template.inviteSend.events({ 'click #sendInviteBtn': function () { // Email var email = $('#inviteSend [name=email]').val(); $('#sendInviteBtn').attr("disabled", true); // Email var existsInvite = Invite.findOne({email:email}); if ( existsInvite == undefined ) { // - Email if (UI._globalHelpers.validateEmail( email )) { // Email - Meteor.call('invationSender', email, function (error, result) { if (error) { //- . $('#inviteSend [name=email]').val(""); $('#sendInviteBtn').removeAttr("disabled"); bootbox.alert(" . ! : " + error.reason); } else { // . , $('#inviteSend [name=email]').val(""); $('#sendInviteBtn').removeAttr("disabled"); Meteor.subscribe('invite', Meteor.userId()); bootbox.alert(" " + email); } }); } else { // Email - $('#inviteSend [name=email]').val(""); $('#sendInviteBtn').removeAttr("disabled"); bootbox.alert("Email email@example.ru!"); } } else { // Email - . $('#inviteSend [name=email]').val(""); $('#sendInviteBtn').removeAttr("disabled"); bootbox.alert(" Email !"); } } }); Template.inviteList.events({ // 'click .deleteInviteBtn': function () { // Meteor.call('deleteInvite', this._id, function (error, result) { if (error) { bootbox.alert(" . ! : " + error.reason); } else { bootbox.alert(" !"); } }); } }); // Template.inviteList.helpers({ // invitedUsers: function () { return Invite.find(); }, // inviteTextStatus: function() { var textStatus = '-'; switch(this.status) { case INVITE_CREATED: textStatus = ''; break; case INVITE_EMAILED: textStatus = ''; break; case INVITE_COMPLETED: textStatus = ''; break; } return textStatus; }, // inviteIsComplete: function () { if (this.status == INVITE_COMPLETED) { return true; } else { return false; } }, // inviteIsEmailed: function () { if (this.status == INVITE_EMAILED) { return true; } else { return false; } }, // inviteIsCreated: function () { if (this.status == INVITE_CREATED) { return true; } else { return false; } } }); if (Meteor.isClient) { // Template.activateInviteToCompany.rendered = function () { Session.set('activationToken', Router.current().params.activationToken); }; // Template.activateInviteToCompany.helpers({ // companyNameByInviteCode: function () { var invite = Invite.findOne({token:Router.current().params.activationToken}); var company = Company.findOne({_id:invite.companyId}); return company.title; }, // companyUserNameByInviteCode: function () { var invite = Invite.findOne({token:Router.current().params.activationToken}); var company = Company.findOne({_id:invite.companyId}); var user = Meteor.users.findOne({_id:company.userId}); return user.profile.name; }, // userActivationCode: function () { return Router.current().params.activationToken; }, // // inviteIsActivated: function () { var userInviteCode = Router.current().params.activationToken; var invite = Invite.findOne({token: userInviteCode}); if (invite.status == INVITE_COMPLETED) { return true; } else { return false; } } }); }
ãã®ãã¡ã€ã«ã§ã¯ãæ¬ èœããŠããããžãã¯ã®ã»ãšãã©ãã¹ãŠã説æããŸããããããèŠãŠã¿ãŸããã...
æåã«ãã€ãã³ãããæåŸ ç¶ãéä¿¡ããã¿ã³ãšãæåŸ ç¶ãåé€ããã¿ã³ã«å²ãåœãŠãŸããã
[æåŸ ç¶ãéä¿¡]ãã¿ã³ãã¯ãªãã¯ãããšãé»åã¡ãŒã«ã®è€è£œãšæ£åœæ§ãæ€èšŒããããã®åŸãšã©ãŒã¡ãã»ãŒãžã衚瀺ãããããæåŸ ç¶ãéä¿¡ãããµãŒããŒã¡ãœãããåŒã³åºãããŸãã
ãæåŸ ã®åé€ããã¿ã³ãæŒããšãæåŸ ãåé€ãããµãŒããŒã¡ãœãããåŒã³åºãããŸããäžã§åœŒãèŠãŸããã
以äžã¯ãåæåŸ ç¶ã®è¡šç€ºãå¶åŸ¡ããæåŸ ç¶ã®ãªã¹ããæã€ããã«ã®ç°¡åãªãã«ããŒã§ãã
æåŸã«ãæåŸ ã®ã¢ã¯ãã£ããŒã·ã§ã³ããŒãžã§äœ¿çšããããã«ããŒãããã€ããããŸãã
ãã®ã³ãŒãã®æãèå³æ·±ãéšåã¯ãTemplate.activateInviteToCompany.renderedã®å®çŸ©ã§ããã»ãã·ã§ã³å ã§ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒããšãšãã«å€æ°ãä¿åããã®ã¯ããã®ã³ãŒãã§ãã
ããã ã©ã€ã³ãšã©ã€ããã¢
æçµçãªããžãã¯ã¯ããŠãŒã¶ãŒãã¬ã¿ãŒããã®ãªã³ã¯ãä»ããŠåœç€Ÿã®ãµãŒãã¹ã«ã¢ã¯ã»ã¹ã§ããããšã§ããã»ãã·ã§ã³ã¯æåŸ ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒãã«é¢ããæ å ±ãä¿åããã¢ããªã±ãŒã·ã§ã³ã®å©çšå¯èœãªããŒãžãåãæ¿ããã¡ã€ã³ããŒãžã®èª¬æãèªã¿ãReformalããã¬ãã¥ãŒãèªã¿ãèå³æ·±ã-圌ã¯ããã°ã€ã³/ç»é²ããã¿ã³ãã¯ãªãã¯ããé©åãªèªèšŒæ¹æ³ãéžæããã·ã¹ãã ã«ãã°ã€ã³ããèªåçã«äŒç€ŸïŒã°ã«ãŒãïŒã®ã¡ã³ããŒã«ãªããããã«ä»äºãå§ããããšãã§ããŸãã
ãŸãã¯ããŠãŒã¶ãŒã¯åã«ãµã€ãã«ã¢ã¯ã»ã¹ããŠãèªåãè¯ãããšã確èªããç»é²ããæ°ããäŒç€Ÿãäœæããååã«ååããŠãããããšãã§ããŸãã
å®éãããããã¹ãŠã§ããéåžžã«ããŸããã£ããšæããŸãããäœãšèšããŸããïŒ
ãããžã§ã¯ãã®ã©ã€ããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã¯p.kellot.ru ã§èŠãããšãã§ããŸããèªå
ãã¹ãã®å®è¡ã§ã¯æ¬æ Œçãªãã¹ãã¯è¡ããŸããã§ããããã³ãŒããå ¬éããåã«ãã¹ãŠã®æäœãæåã§æ°åè¡ããŸããããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã«æ £ããŠããéã«çªç¶äœãããããããªã£ããããããReformalã«å ±åããŠãã ããã