From f595e562eaf1ad063d55dc66dd3653048e24031d Mon Sep 17 00:00:00 2001 From: Kane York Date: Tue, 1 Sep 2015 16:16:19 -0700 Subject: [PATCH 01/10] Signup CTA first attempt --- .../discourse/components/signup-cta.js.es6 | 56 ++++++++++++ .../discourse/initializers/signup-cta.js.es6 | 86 +++++++++++++++++++ .../discourse/lib/key-value-store.js.es6 | 8 ++ .../discourse/lib/screen-track.js.es6 | 70 ++++++++++----- .../templates/components/signup-cta.hbs | 18 ++++ .../javascripts/discourse/templates/topic.hbs | 7 +- app/assets/stylesheets/desktop/alert.scss | 7 ++ config/locales/client.en.yml | 16 ++++ config/site_settings.yml | 3 + 9 files changed, 248 insertions(+), 23 deletions(-) create mode 100644 app/assets/javascripts/discourse/components/signup-cta.js.es6 create mode 100644 app/assets/javascripts/discourse/initializers/signup-cta.js.es6 create mode 100644 app/assets/javascripts/discourse/templates/components/signup-cta.hbs diff --git a/app/assets/javascripts/discourse/components/signup-cta.js.es6 b/app/assets/javascripts/discourse/components/signup-cta.js.es6 new file mode 100644 index 00000000000..b1224306e89 --- /dev/null +++ b/app/assets/javascripts/discourse/components/signup-cta.js.es6 @@ -0,0 +1,56 @@ +export default Ember.Component.extend({ + action: "showCreateAccount", + + actions: { + neverShow() { + this.keyValueStore.setItem('anon-cta-never', 't'); + this.session.set('showSignupCta', false); + }, + hideForSession() { + this.session.set('hideSignupCta', true); + this.keyValueStore.setItem('anon-cta-hidden', new Date().getTime()); + Em.run.later(() => + this.session.set('showSignupCta', false), + 20 * 1000); + }, + showCreateAccount() { + this.sendAction(); + } + }, + + signupMethodsTranslated: function() { + const methods = Ember.get('Discourse.LoginMethod.all'); + const loginWithEmail = this.siteSettings.enable_local_logins; + if (this.siteSettings.enable_sso) { + return I18n.t('signup_cta.methods.sso'); + } else if (methods.length === 0) { + if (loginWithEmail) { + return I18n.t('signup_cta.methods.only_email'); + } else { + return I18n.t('signup_cta.methods.unknown'); + } + } else if (methods.length === 1) { + let providerName = methods[0].name.capitalize(); + if (providerName === "Google_oauth2") { + providerName = "Google"; + } + if (loginWithEmail) { + return I18n.t('signup_cta.methods.one_and_email', {provider: providerName}); + } else { + return I18n.t('signup_cta.methods.only_other', {provider: providerName}); + } + } else { + if (loginWithEmail) { + return I18n.t('signup_cta.methods.multiple', {count: methods.length}); + } else { + return I18n.t('signup_cta.methods.multiple_no_email', {count: methods.length}); + } + } + }.property(), + + _turnOffIfHidden: function() { + if (this.session.get('hideSignupCta')) { + this.session.set('showSignupCta', false); + } + }.on('willDestroyElement') +}); diff --git a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 new file mode 100644 index 00000000000..8b6011f3557 --- /dev/null +++ b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 @@ -0,0 +1,86 @@ +import ScreenTrack from 'discourse/lib/screen-track'; +import Session from 'discourse/models/session'; + +const ANON_TOPIC_IDS = 5, + ANON_PROMPT_READ_TIME = 15 * 60 * 1000, + ANON_PROMPT_VISIT_COUNT = 2, + ONE_DAY = 24 * 60 * 60 * 1000, + PROMPT_HIDE_DURATION = ONE_DAY; + +export default { + name: "signup-cta", + + initialize(container) { + const screenTrack = ScreenTrack.current(), + session = Session.current(), + siteSettings = container.lookup('site-settings:main'), + keyValueStore = container.lookup('key-value-store:main'), + user = container.lookup('current-user:main'); + + // Preconditions + + if (user) return; // must not be logged in + if (keyValueStore.get('anon-cta-never')) return; // "never show again" + if (!siteSettings.allow_new_registrations) return; + if (siteSettings.invite_only) return; + if (siteSettings.must_approve_users) return; + if (siteSettings.login_required) return; + if (!siteSettings.enable_signup_cta) return; + + screenTrack.set('keyValueStore', keyValueStore); + + function checkSignupCtaRequirements() { + if (session.get('showSignupCta')) { + return; // already shown + } + + if (session.get('hideSignupCta')) { + return; // hidden for session + } + + if (keyValueStore.get('anon-cta-never')) { + return; // hidden forever + } + + const now = new Date().getTime(); + const hiddenAt = keyValueStore.getInt('anon-cta-hidden', 0); + if (hiddenAt > (now - PROMPT_HIDE_DURATION)) { + return; // hidden in last 24 hours + } + + const visitCount = keyValueStore.getInt('anon-visit-count'); + if (visitCount < ANON_PROMPT_VISIT_COUNT) { + return; + } + + const readTime = keyValueStore.getInt('anon-topic-time'); + if (readTime < ANON_PROMPT_READ_TIME) { + return; + } + + const topicIdsString = keyValueStore.get('anon-topic-ids'); + if (!topicIdsString) { return; } + let topicIdsAry = topicIdsString.split(','); + if (topicIdsAry.length < ANON_TOPIC_IDS) { + return; + } + + // Requirements met. + session.set('showSignupCta', true); + } + + screenTrack.set('anonFlushCallback', checkSignupCtaRequirements); + + // Record a visit + const nowVisit = new Date().getTime(); + const lastVisit = keyValueStore.getInt('anon-last-visit', nowVisit); + if (nowVisit - lastVisit > ONE_DAY) { + // more than a day + const visitCount = keyValueStore.getInt('anon-visit-count', 1); + keyValueStore.setItem('anon-visit-count', visitCount + 1); + } + keyValueStore.setItem('anon-last-visit', nowVisit); + + checkSignupCtaRequirements(); + } +}; diff --git a/app/assets/javascripts/discourse/lib/key-value-store.js.es6 b/app/assets/javascripts/discourse/lib/key-value-store.js.es6 index b5f13d024ca..8c1e13515cc 100644 --- a/app/assets/javascripts/discourse/lib/key-value-store.js.es6 +++ b/app/assets/javascripts/discourse/lib/key-value-store.js.es6 @@ -43,6 +43,14 @@ KeyValueStore.prototype = { get(key) { if (!safeLocalStorage) { return null; } return safeLocalStorage[this.context + key]; + }, + + getInt(key, def) { + if (!def) { def = 0; } + if (!safeLocalStorage) { return def; } + const result = parseInt(this.get(key)); + if (!isFinite(result)) { return def; } + return result; } }; diff --git a/app/assets/javascripts/discourse/lib/screen-track.js.es6 b/app/assets/javascripts/discourse/lib/screen-track.js.es6 index 3d55418cfbf..345796ccc24 100644 --- a/app/assets/javascripts/discourse/lib/screen-track.js.es6 +++ b/app/assets/javascripts/discourse/lib/screen-track.js.es6 @@ -3,12 +3,15 @@ import Singleton from 'discourse/mixins/singleton'; const PAUSE_UNLESS_SCROLLED = 1000 * 60 * 3, - MAX_TRACKING_TIME = 1000 * 60 * 6; + MAX_TRACKING_TIME = 1000 * 60 * 6, + ANON_MAX_TOPIC_IDS = 5; const ScreenTrack = Ember.Object.extend({ init() { this.reset(); + // TODO fix this + this.set('keyValueStore', Discourse.__container__.lookup('key-value-store:main')); }, start(topicId, topicController) { @@ -82,9 +85,6 @@ const ScreenTrack = Ember.Object.extend({ flush() { if (this.get('cancelled')) { return; } - // We don't log anything unless we're logged in - if (!Discourse.User.current()) return; - const newTimings = {}, totalTimings = this.get('totalTimings'), self = this; @@ -115,26 +115,52 @@ const ScreenTrack = Ember.Object.extend({ Discourse.TopicTrackingState.current().updateSeen(topicId, highestSeen); if (!$.isEmptyObject(newTimings)) { - Discourse.ajax('/topics/timings', { - data: { - timings: newTimings, - topic_time: this.get('topicTime'), - topic_id: topicId - }, - cache: false, - type: 'POST', - headers: { - 'X-SILENCE-LOGGER': 'true' + if (Discourse.User.current()) { + Discourse.ajax('/topics/timings', { + data: { + timings: newTimings, + topic_time: this.get('topicTime'), + topic_id: topicId + }, + cache: false, + type: 'POST', + headers: { + 'X-SILENCE-LOGGER': 'true' + } + }).then(function() { + const controller = self.get('topicController'); + if (controller) { + const postNumbers = Object.keys(newTimings).map(function(v) { + return parseInt(v, 10); + }); + controller.readPosts(topicId, postNumbers); + } + }); + } else { + // Anonymous viewer - save to localStorage + const store = this.get('keyValueStore'); + + // Save total time + const existingTime = store.getInt('anon-topic-time'); + store.setItem('anon-topic-time', existingTime + this.get('topicTime')); + + // Save unique topic IDs up to a max + let topicIds = store.get('anon-topic-ids'); + if (topicIds) { + topicIds = topicIds.split(',').map(e => parseInt(e)); + } else { + topicIds = []; } - }).then(function(){ - const controller = self.get('topicController'); - if(controller){ - const postNumbers = Object.keys(newTimings).map(function(v){ - return parseInt(v,10); - }); - controller.readPosts(topicId, postNumbers); + if (topicIds.indexOf(topicId) === -1 && topicIds.length < ANON_MAX_TOPIC_IDS) { + topicIds.push(topicId); + store.setItem('anon-topic-ids', topicIds.join(',')); } - }); + + // Inform the observer + if (this.get('anonFlushCallback')) { + this.get('anonFlushCallback')(); + } + } this.set('topicTime', 0); } diff --git a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs new file mode 100644 index 00000000000..dee31249a80 --- /dev/null +++ b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs @@ -0,0 +1,18 @@ +
+ {{#if session.hideSignupCta}} +

{{i18n "signup_cta.hidden_for_session"}}

+ + {{else}} +

{{i18n "signup_cta.line_1"}}

+

{{i18n "signup_cta.line_2"}}

+

{{signupMethodsTranslated}}

+ +
+ {{d-button action="showCreateAccount" label="signup_cta.sign_up" icon="check" class="btn-primary"}} + {{d-button action="hideForSession" label="signup_cta.hide_session" class="no-icon"}} + {{i18n "signup_cta.hide_forever"}} +
+ {{/if}} +
diff --git a/app/assets/javascripts/discourse/templates/topic.hbs b/app/assets/javascripts/discourse/templates/topic.hbs index 0a38e3d5748..986b8321ad5 100644 --- a/app/assets/javascripts/discourse/templates/topic.hbs +++ b/app/assets/javascripts/discourse/templates/topic.hbs @@ -87,7 +87,12 @@ {{#if loadedAllPosts}} {{view "topic-closing" topic=model}} - {{view "topic-footer-buttons" topic=model}} + {{#if session.showSignupCta}} + {{! replace "Log In to Reply" with the infobox }} + {{signup-cta}} + {{else}} + {{view "topic-footer-buttons" topic=model}} + {{/if}} {{#if model.pending_posts_count}}
diff --git a/app/assets/stylesheets/desktop/alert.scss b/app/assets/stylesheets/desktop/alert.scss index eead66319aa..f019918a29b 100644 --- a/app/assets/stylesheets/desktop/alert.scss +++ b/app/assets/stylesheets/desktop/alert.scss @@ -1,3 +1,10 @@ .alert { margin-bottom: 15px; } +.signup-cta { + margin-top: 15px; + a { + float: right; + text-decoration: underline; + } +} diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 7fe190f1573..cd3a3b2d265 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -712,6 +712,22 @@ en: one: reply other: replies + signup_cta: + sign_up: "Sounds great!" + hide_session: "Maybe later" + hide_forever: "Never show this again" + hidden_for_session: "OK, I'll ask you tomorrow. You can always click the 'Log In' button to create an account, too." + line_1: Hey there! Looks like you're enjoying the forum, but you're not signed up for an account. + line_2: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and give likes to others' posts. + methods: + sso: "Use your account on the main site to log in." + only_email: "You just need a valid email account to sign up." + only_other: "Just use your %{provider} account to sign up." + one_and_email: "Juse use your %{provider} account or your email to sign up." + multiple_no_email: "Choose from any of the %{count} supported login providers to get started." + multiple: "Signing up couldn't be easier: use any of the %{count} available login providers, or sign up with an email and password." + unknown: "error getting supported login methods" + summary: enabled_description: "You're viewing a summary of this topic: the most interesting posts as determined by the community." description: "There are {{count}} replies." diff --git a/config/site_settings.yml b/config/site_settings.yml index 7400d216e01..950555724b1 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -199,6 +199,9 @@ login: allow_new_registrations: client: true default: true + enable_signup_cta: + client: true + default: true enable_google_oauth2_logins: client: true default: false From 65192a09a681b5dc2e149155b60f8c62c7b8b770 Mon Sep 17 00:00:00 2001 From: Kane York Date: Tue, 1 Sep 2015 16:20:24 -0700 Subject: [PATCH 02/10] copyedits --- config/locales/client.en.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index cd3a3b2d265..7c436af9eea 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -721,9 +721,9 @@ en: line_2: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and give likes to others' posts. methods: sso: "Use your account on the main site to log in." - only_email: "You just need a valid email account to sign up." - only_other: "Just use your %{provider} account to sign up." - one_and_email: "Juse use your %{provider} account or your email to sign up." + only_email: "Signing up is easy: you just need a valid email account and a password." + only_other: "Use your %{provider} account to sign up." + one_and_email: "Use your %{provider} account, or an email and password, to sign up." multiple_no_email: "Choose from any of the %{count} supported login providers to get started." multiple: "Signing up couldn't be easier: use any of the %{count} available login providers, or sign up with an email and password." unknown: "error getting supported login methods" From 118f8227f1ac1f6495459af4965f757c8cb05ebb Mon Sep 17 00:00:00 2001 From: Kane York Date: Tue, 1 Sep 2015 16:23:57 -0700 Subject: [PATCH 03/10] Fix never link after clicking maybe later --- .../discourse/templates/components/signup-cta.hbs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs index dee31249a80..71e59c4a803 100644 --- a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs +++ b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs @@ -1,9 +1,9 @@ {{/if}} +
diff --git a/app/assets/stylesheets/desktop/alert.scss b/app/assets/stylesheets/desktop/alert.scss index f019918a29b..eead66319aa 100644 --- a/app/assets/stylesheets/desktop/alert.scss +++ b/app/assets/stylesheets/desktop/alert.scss @@ -1,10 +1,3 @@ .alert { margin-bottom: 15px; } -.signup-cta { - margin-top: 15px; - a { - float: right; - text-decoration: underline; - } -} diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index 41409878ff5..df6a7d34503 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -971,6 +971,14 @@ span.highlighted { transition: opacity ease-out 1s; } +.signup-cta { + margin-top: 15px; + width: $topic-body-width; + a { + float: right; + text-decoration: underline; + } +} /* Tablet (portrait) ----------- */ diff --git a/app/assets/stylesheets/mobile/topic-post.scss b/app/assets/stylesheets/mobile/topic-post.scss index ef1bbbe8b33..9c1c6a3dd57 100644 --- a/app/assets/stylesheets/mobile/topic-post.scss +++ b/app/assets/stylesheets/mobile/topic-post.scss @@ -509,6 +509,21 @@ span.highlighted { display: none; } +.signup-cta { + margin-top: 15px; + margin-left: auto; + margin-right: auto; + width: calc(100% - 50px); + a { + float: right; + text-decoration: underline; + margin-top: 7px; + } + button { + margin-right: 7px; + } +} + .small-action .small-action-desc { p { padding-top: 0; From 8b37dadec77033c02d4f1b442481609b00a33825 Mon Sep 17 00:00:00 2001 From: Kane York Date: Tue, 1 Sep 2015 16:52:29 -0700 Subject: [PATCH 06/10] remove TODO --- .../javascripts/discourse/initializers/signup-cta.js.es6 | 4 ++-- app/assets/javascripts/discourse/lib/screen-track.js.es6 | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 index 8b6011f3557..cc25f64cb8d 100644 --- a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 +++ b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 @@ -17,6 +17,8 @@ export default { keyValueStore = container.lookup('key-value-store:main'), user = container.lookup('current-user:main'); + screenTrack.set('keyValueStore', keyValueStore); + // Preconditions if (user) return; // must not be logged in @@ -27,8 +29,6 @@ export default { if (siteSettings.login_required) return; if (!siteSettings.enable_signup_cta) return; - screenTrack.set('keyValueStore', keyValueStore); - function checkSignupCtaRequirements() { if (session.get('showSignupCta')) { return; // already shown diff --git a/app/assets/javascripts/discourse/lib/screen-track.js.es6 b/app/assets/javascripts/discourse/lib/screen-track.js.es6 index 345796ccc24..26451f433cd 100644 --- a/app/assets/javascripts/discourse/lib/screen-track.js.es6 +++ b/app/assets/javascripts/discourse/lib/screen-track.js.es6 @@ -10,8 +10,6 @@ const ScreenTrack = Ember.Object.extend({ init() { this.reset(); - // TODO fix this - this.set('keyValueStore', Discourse.__container__.lookup('key-value-store:main')); }, start(topicId, topicController) { From 62444b9a13aaa0441dc3716229786a0893147065 Mon Sep 17 00:00:00 2001 From: Kane York Date: Tue, 15 Sep 2015 12:25:12 -0700 Subject: [PATCH 07/10] Fix the visit tracking logic --- .../discourse/initializers/signup-cta.js.es6 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 index cc25f64cb8d..d83a6ecf5da 100644 --- a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 +++ b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 @@ -73,13 +73,17 @@ export default { // Record a visit const nowVisit = new Date().getTime(); - const lastVisit = keyValueStore.getInt('anon-last-visit', nowVisit); - if (nowVisit - lastVisit > ONE_DAY) { - // more than a day + const lastVisit = keyValueStore.getInt('anon-last-visit', 0); + if (!lastVisit) { + // First visit + keyValueStore.setItem('anon-visit-count', 1); + keyValueStore.setItem('anon-last-visit', nowVisit); + } else if (nowVisit - lastVisit > ONE_DAY) { + // More than a day const visitCount = keyValueStore.getInt('anon-visit-count', 1); keyValueStore.setItem('anon-visit-count', visitCount + 1); + keyValueStore.setItem('anon-last-visit', nowVisit); } - keyValueStore.setItem('anon-last-visit', nowVisit); checkSignupCtaRequirements(); } From 41721b0898c521be5f23ff4def0bf206444a67cf Mon Sep 17 00:00:00 2001 From: Kane York Date: Tue, 15 Sep 2015 12:25:29 -0700 Subject: [PATCH 08/10] Rename variables --- .../javascripts/discourse/lib/screen-track.js.es6 | 12 +++++++----- .../discourse/templates/components/signup-cta.hbs | 4 ++-- config/locales/client.en.yml | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/screen-track.js.es6 b/app/assets/javascripts/discourse/lib/screen-track.js.es6 index 26451f433cd..8fe233401b5 100644 --- a/app/assets/javascripts/discourse/lib/screen-track.js.es6 +++ b/app/assets/javascripts/discourse/lib/screen-track.js.es6 @@ -136,14 +136,14 @@ const ScreenTrack = Ember.Object.extend({ }); } else { // Anonymous viewer - save to localStorage - const store = this.get('keyValueStore'); + const storage = this.get('keyValueStore'); // Save total time - const existingTime = store.getInt('anon-topic-time'); - store.setItem('anon-topic-time', existingTime + this.get('topicTime')); + const existingTime = storage.getInt('anon-topic-time'); + storage.setItem('anon-topic-time', existingTime + this.get('topicTime')); // Save unique topic IDs up to a max - let topicIds = store.get('anon-topic-ids'); + let topicIds = storage.get('anon-topic-ids'); if (topicIds) { topicIds = topicIds.split(',').map(e => parseInt(e)); } else { @@ -151,13 +151,15 @@ const ScreenTrack = Ember.Object.extend({ } if (topicIds.indexOf(topicId) === -1 && topicIds.length < ANON_MAX_TOPIC_IDS) { topicIds.push(topicId); - store.setItem('anon-topic-ids', topicIds.join(',')); + storage.setItem('anon-topic-ids', topicIds.join(',')); } // Inform the observer if (this.get('anonFlushCallback')) { this.get('anonFlushCallback')(); } + + // No need to call controller.readPosts() } this.set('topicTime', 0); diff --git a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs index defda14fab6..818f66cd841 100644 --- a/app/assets/javascripts/discourse/templates/components/signup-cta.hbs +++ b/app/assets/javascripts/discourse/templates/components/signup-cta.hbs @@ -5,8 +5,8 @@ {{i18n "signup_cta.hide_forever"}}

{{else}} -

{{i18n "signup_cta.line_1"}}

-

{{i18n "signup_cta.line_2"}}

+

{{i18n "signup_cta.intro"}}

+

{{i18n "signup_cta.value_prop"}}

{{signupMethodsTranslated}}

diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 16940aaa2cf..283b9bdbd19 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -717,8 +717,8 @@ en: hide_session: "Remind me tomorrow" hide_forever: "Never show this again" hidden_for_session: "OK, I'll ask you tomorrow. You can always click the 'Log In' button to create an account, too." - line_1: Looks like you're enjoying the forum, but you're not signed up for an account. - line_2: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and you can give likes to others' posts. + intro: Hey there! Looks like you're enjoying the forum, but you're not signed up for an account. + value_prop: Logged-in users get their last read position in every topic saved, so you come right back where you left off. You can also "Watch" topics so that you get a notification whenever a new post is made, and you can give likes to others' posts. methods: sso: "Use your account on the main site to log in." only_email: "Signing up is easy: you just need a valid email account and a password." From 2e2fa693f501b417f307e4b11e6f1c8b67443fc6 Mon Sep 17 00:00:00 2001 From: Kane York Date: Tue, 15 Sep 2015 12:42:14 -0700 Subject: [PATCH 09/10] You need to translate the site settings, dummy --- config/locales/server.en.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 4c03b835c6f..2d48c8f5230 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -920,6 +920,7 @@ en: enable_local_logins: "Enable local username and password login based accounts. (Note: this must be enabled for invites to work)" allow_new_registrations: "Allow new user registrations. Uncheck this to prevent anyone from creating a new account." + enable_signup_cta: "Show a notice to returning anonymous users prompting them to sign up for an account." enable_yahoo_logins: "Enable Yahoo authentication" enable_google_oauth2_logins: "Enable Google Oauth2 authentication. This is the method of authentication that Google currently supports. Requires key and secret." From 53c5c17625282bea7a577bd58bc73981b05bf186 Mon Sep 17 00:00:00 2001 From: Kane York Date: Tue, 15 Sep 2015 13:14:50 -0700 Subject: [PATCH 10/10] Add ember-addons to eslintignore --- .eslintignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintignore b/.eslintignore index 1ecda00738c..5b61bf6c51f 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,6 +7,7 @@ app/assets/javascripts/vendor.js app/assets/javascripts/locales/i18n.js app/assets/javascripts/defer/html-sanitizer-bundle.js app/assets/javascripts/discourse/lib/Markdown.Editor.js +app/assets/javascripts/ember-addons/ jsapp/lib/Markdown.Editor.js lib/javascripts/locale/ lib/javascripts/messageformat.js