From ed47441f67897e54ae6623e70f33c5cd22b87656 Mon Sep 17 00:00:00 2001
From: Jonathan Kolyer
Date: Wed, 4 Feb 2015 06:22:11 +0000
Subject: [PATCH 01/10] VRFS-2698 refactoring website_validate to url_validate
---
...ator.js.coffee => url_validator.js.coffee} | 2 +-
...idator.css.scss => url_validator.css.scss} | 2 +-
web/app/controllers/api_users_controller.rb | 36 +++++++++----------
web/app/controllers/spikes_controller.rb | 4 +++
...tor.html.slim => _url_validator.html.slim} | 2 +-
web/app/views/spikes/site_validate.html.slim | 10 +++---
web/config/routes.rb | 1 +
.../fixtures/url_validator_spec.html.slim | 4 +++
.../fixtures/website_validator_spec.html.slim | 4 ---
.../stylesheets/url_validator.css.scss | 1 +
.../javascripts/url_validator_spec.js.coffee | 19 ++++++++++
.../website_validator_spec.js.coffee | 19 ----------
12 files changed, 55 insertions(+), 49 deletions(-)
rename web/app/assets/javascripts/{website_validator.js.coffee => url_validator.js.coffee} (97%)
rename web/app/assets/stylesheets/client/{website_validator.css.scss => url_validator.css.scss} (96%)
rename web/app/views/clients/{_website_validator.html.slim => _url_validator.html.slim} (77%)
create mode 100644 web/spec/javascripts/fixtures/url_validator_spec.html.slim
delete mode 100644 web/spec/javascripts/fixtures/website_validator_spec.html.slim
create mode 100644 web/spec/javascripts/stylesheets/url_validator.css.scss
create mode 100644 web/spec/javascripts/url_validator_spec.js.coffee
delete mode 100644 web/spec/javascripts/website_validator_spec.js.coffee
diff --git a/web/app/assets/javascripts/website_validator.js.coffee b/web/app/assets/javascripts/url_validator.js.coffee
similarity index 97%
rename from web/app/assets/javascripts/website_validator.js.coffee
rename to web/app/assets/javascripts/url_validator.js.coffee
index f13a2c0fe..de2759236 100644
--- a/web/app/assets/javascripts/website_validator.js.coffee
+++ b/web/app/assets/javascripts/url_validator.js.coffee
@@ -2,7 +2,7 @@ $ = jQuery
context = window
context.JK ||= {};
-context.JK.WebsiteValidator = class WebsiteValidator
+context.JK.UrlValidator = class UrlValidator
constructor: (input_div) ->
@EVENTS = context.JK.EVENTS
diff --git a/web/app/assets/stylesheets/client/website_validator.css.scss b/web/app/assets/stylesheets/client/url_validator.css.scss
similarity index 96%
rename from web/app/assets/stylesheets/client/website_validator.css.scss
rename to web/app/assets/stylesheets/client/url_validator.css.scss
index f6d7349ba..6ce18ea57 100644
--- a/web/app/assets/stylesheets/client/website_validator.css.scss
+++ b/web/app/assets/stylesheets/client/url_validator.css.scss
@@ -1,6 +1,6 @@
@import "client/common";
-.website_validator {
+.url_validator {
input {
width: 100%;
padding: 5px;
diff --git a/web/app/controllers/api_users_controller.rb b/web/app/controllers/api_users_controller.rb
index b9a1b6d42..d30b0e5e9 100644
--- a/web/app/controllers/api_users_controller.rb
+++ b/web/app/controllers/api_users_controller.rb
@@ -700,25 +700,25 @@ class ApiUsersController < ApiController
end
def validate_data
- data = params[:data]
- vtype = data =~ /^http/ ? 'url' : 'username'
- if 'url' == vtype
- if data.present?
- result = `curl --output /dev/null --silent --head --fail --show-error '#{data}' 2>&1`.chomp
- if $?.success?
- render json: { message: 'Valid Site' }, status: 200
- else
- result =~ /curl: \(\d+\) (.*)/
- render json: { message: 'Invalid Site', errors: { site: [$1] } }, status: 200
- end
- else
- render json: { message: "blank data #{data}" }, status: :unprocessable_entity
- end
- return
- elsif 'username' == vtype
+ unless (data = params[:data]).present?
+ render(json: { message: "blank data #{data}" }, status: :unprocessable_entity) && return
+ end
+ url = nil
+ site = params[:site]
+ unless site.present?
+ url = data
+ else
+ url = Utils.username_url(data, site)
+ end
+ unless url.blank?
+ if errmsg = Utils.url_validator(url)
+ render json: { message: 'Invalid Site', errors: { site: [errmsg] } }, status: 200
+ else
+ render json: { message: 'Valid Site' }, status: 200
+ end
+ else
+ render json: { message: "unknown validation for data '#{params[:data]}', site '#{params[:site]}'" }, status: :unprocessable_entity
end
-
- render json: { message: "unknown validation type #{params[:validation_type]}" }, status: :unprocessable_entity
end
###################### RECORDINGS #######################
diff --git a/web/app/controllers/spikes_controller.rb b/web/app/controllers/spikes_controller.rb
index 1c3c39e6e..40dbeda9e 100644
--- a/web/app/controllers/spikes_controller.rb
+++ b/web/app/controllers/spikes_controller.rb
@@ -42,4 +42,8 @@ class SpikesController < ApplicationController
render :layout => 'web'
end
+ def username_validate
+ render :layout => 'web'
+ end
+
end
diff --git a/web/app/views/clients/_website_validator.html.slim b/web/app/views/clients/_url_validator.html.slim
similarity index 77%
rename from web/app/views/clients/_website_validator.html.slim
rename to web/app/views/clients/_url_validator.html.slim
index 0fa8ef718..dd5d4b74a 100644
--- a/web/app/views/clients/_website_validator.html.slim
+++ b/web/app/views/clients/_url_validator.html.slim
@@ -1,4 +1,4 @@
-div class="website_validator" id="#{siteid}_url"
+div class="url_validator" id="#{siteid}_url"
span class="validate-checkmark"
span class="spinner-small upload-spinner"
input type='text' id="url_input_#{siteid}" maxlength="2000"
diff --git a/web/app/views/spikes/site_validate.html.slim b/web/app/views/spikes/site_validate.html.slim
index cd8a57ce5..d55e8d336 100644
--- a/web/app/views/spikes/site_validate.html.slim
+++ b/web/app/views/spikes/site_validate.html.slim
@@ -1,14 +1,14 @@
-= javascript_include_tag "website_validator"
+= javascript_include_tag "url_validator"
div style="width:50%"
- = render "clients/website_validator", siteid: 'foobar'
-= stylesheet_link_tag "client/website_validator"
+ = render "clients/url_validator", siteid: 'foobar'
+= stylesheet_link_tag "client/url_validator"
javascript:
var initialized = false;
$(document).on('JAMKAZAM_READY', function(e, data) {
setTimeout(function() {
- window.website_validator = new JK.WebsiteValidator($(".website_validator#foobar_url"))
- website_validator.init()
+ window.url_validator = new JK.UrlValidator($(".url_validator#foobar_url"))
+ url_validator.init()
$('#url_input_foobar').val('http://www.jamkazam.com')
}, 1)
})
diff --git a/web/config/routes.rb b/web/config/routes.rb
index 653ecfe1b..98419b5c0 100644
--- a/web/config/routes.rb
+++ b/web/config/routes.rb
@@ -93,6 +93,7 @@ SampleApp::Application.routes.draw do
match '/websocket', to: 'spikes#websocket'
match '/test_subscription', to: 'spikes#subscription'
match '/site_validate', to: 'spikes#site_validate'
+ match '/username_validate', to: 'spikes#username_validate'
# junk pages
match '/help', to: 'static_pages#help'
diff --git a/web/spec/javascripts/fixtures/url_validator_spec.html.slim b/web/spec/javascripts/fixtures/url_validator_spec.html.slim
new file mode 100644
index 000000000..4ca796476
--- /dev/null
+++ b/web/spec/javascripts/fixtures/url_validator_spec.html.slim
@@ -0,0 +1,4 @@
+= stylesheet_link_tag "client/url_validator"
+= javascript_include_tag "url_validator"
+div style="width:50%"
+ = render "clients/url_validator", siteid: 'teaspoon'
diff --git a/web/spec/javascripts/fixtures/website_validator_spec.html.slim b/web/spec/javascripts/fixtures/website_validator_spec.html.slim
deleted file mode 100644
index e9d0d8d2e..000000000
--- a/web/spec/javascripts/fixtures/website_validator_spec.html.slim
+++ /dev/null
@@ -1,4 +0,0 @@
-= stylesheet_link_tag "client/website_validator"
-= javascript_include_tag "website_validator"
-div style="width:50%"
- = render "clients/website_validator", siteid: 'teaspoon'
diff --git a/web/spec/javascripts/stylesheets/url_validator.css.scss b/web/spec/javascripts/stylesheets/url_validator.css.scss
new file mode 100644
index 000000000..1b6f223bb
--- /dev/null
+++ b/web/spec/javascripts/stylesheets/url_validator.css.scss
@@ -0,0 +1 @@
+//= require client/url_validator
diff --git a/web/spec/javascripts/url_validator_spec.js.coffee b/web/spec/javascripts/url_validator_spec.js.coffee
new file mode 100644
index 000000000..dc35b8aaf
--- /dev/null
+++ b/web/spec/javascripts/url_validator_spec.js.coffee
@@ -0,0 +1,19 @@
+describe "UrlValidator", ->
+
+ beforeEach ->
+ this.fixtures = fixture.load("url_validator_spec.html", append=false)
+ this.server = sinon.fakeServer.create();
+ window.jamClient = sinon.stub()
+ this.url_validator = new JK.UrlValidator($(".url_validator#teaspoon_url"))
+ this.url_validator.init()
+ $('body').append(this.url_validator.input_div)
+ this.url_validator.url_input.val('http://www.jamkazam.com')
+ window.gon = {}
+ window.gon.isNativeClient = true
+
+ afterEach ->
+ this.server.restore();
+
+ it "displays validator widget", ->
+ # this.url_validator.url_input.focus()
+ # expect(this.url_validator.checkmark).toBeVisible()
diff --git a/web/spec/javascripts/website_validator_spec.js.coffee b/web/spec/javascripts/website_validator_spec.js.coffee
deleted file mode 100644
index d3661ea6c..000000000
--- a/web/spec/javascripts/website_validator_spec.js.coffee
+++ /dev/null
@@ -1,19 +0,0 @@
-describe "WebsiteValidator", ->
-
- beforeEach ->
- this.fixtures = fixture.load("website_validator_spec.html", append=false)
- this.server = sinon.fakeServer.create();
- window.jamClient = sinon.stub()
- this.website_validator = new JK.WebsiteValidator($(".website_validator#teaspoon_url"))
- this.website_validator.init()
- $('body').append(this.website_validator.input_div)
- this.website_validator.url_input.val('http://www.jamkazam.com')
- window.gon = {}
- window.gon.isNativeClient = true
-
- afterEach ->
- this.server.restore();
-
- it "displays validator widget", ->
- # this.website_validator.url_input.focus()
- # expect(this.website_validator.checkmark).toBeVisible()
From d52f5b23729427a812280dbe6db30d1dc5e2db45 Mon Sep 17 00:00:00 2001
From: Jonathan Kolyer
Date: Wed, 4 Feb 2015 07:32:07 +0000
Subject: [PATCH 02/10] VRFS-2698 repurposed urls into usernames
---
web/app/assets/javascripts/jam_rest.js | 4 +--
.../javascripts/url_validator.js.coffee | 30 ++++++++--------
web/app/controllers/api_users_controller.rb | 4 +--
web/app/views/spikes/site_validate.html.slim | 2 +-
web/lib/utils.rb | 34 +++++++++++++++++++
5 files changed, 53 insertions(+), 21 deletions(-)
create mode 100644 web/lib/utils.rb
diff --git a/web/app/assets/javascripts/jam_rest.js b/web/app/assets/javascripts/jam_rest.js
index 6fdb20c50..0a5d20c95 100644
--- a/web/app/assets/javascripts/jam_rest.js
+++ b/web/app/assets/javascripts/jam_rest.js
@@ -1478,10 +1478,10 @@
});
}
- function validateUrlSite(url) {
+ function validateUrlSite(url, sitetype) {
return $.ajax({
type: "GET",
- url: '/api/data_validation?data=' + encodeURIComponent(url),
+ url: '/api/data_validation?sitetype='+sitetype+'&data=' + encodeURIComponent(url),
contentType: 'application/json'
});
}
diff --git a/web/app/assets/javascripts/url_validator.js.coffee b/web/app/assets/javascripts/url_validator.js.coffee
index de2759236..6e3ece018 100644
--- a/web/app/assets/javascripts/url_validator.js.coffee
+++ b/web/app/assets/javascripts/url_validator.js.coffee
@@ -4,11 +4,12 @@ context.JK ||= {};
context.JK.UrlValidator = class UrlValidator
- constructor: (input_div) ->
+ constructor: (input_div, site_type) ->
@EVENTS = context.JK.EVENTS
@rest = context.JK.Rest()
+ @site_type = site_type
@input_div = input_div
- @url_input = @input_div.find('input')
+ @data_input = @input_div.find('input')
this.show_format_status()
@logger = context.JK.logger
@site_status = null
@@ -19,39 +20,36 @@ context.JK.UrlValidator = class UrlValidator
this.renderErrors({})
@spinner.hide()
validator = this
- @url_input.bind 'blur', ->
+ @data_input.bind 'blur', ->
if validator.show_format_status()
- validator.validate_url_site()
- @url_input.bind 'focus', ->
+ validator.validate_site()
+ @data_input.bind 'focus', ->
validator.show_format_status()
- url_to_validate: () =>
- url = @url_input.val()
+ data_to_validate: () =>
+ url = @data_input.val()
if 0 < url.length
url.substring(0,2000)
else
null
- validate_url_format: () =>
- regexp = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
- regexp.test(this.url_to_validate())
-
show_format_status: () =>
- url = this.url_to_validate()
+ data = this.data_to_validate()
yn = true
- if url
- yn = this.validate_url_format()
+ if data && 'url' == @site_type
+ regexp = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
+ yn = regexp.test(this.data_to_validate())
if yn
@checkmark.show()
else
@checkmark.hide()
yn
- validate_url_site: () =>
+ validate_site: () =>
@site_status = null
@spinner.show()
@checkmark.hide()
- @rest.validateUrlSite(this.url_to_validate())
+ @rest.validateUrlSite(this.data_to_validate(), @site_type)
.done(this.processSiteCheck)
.fail(this.processSiteCheckFail)
diff --git a/web/app/controllers/api_users_controller.rb b/web/app/controllers/api_users_controller.rb
index d30b0e5e9..f206037f2 100644
--- a/web/app/controllers/api_users_controller.rb
+++ b/web/app/controllers/api_users_controller.rb
@@ -704,8 +704,8 @@ class ApiUsersController < ApiController
render(json: { message: "blank data #{data}" }, status: :unprocessable_entity) && return
end
url = nil
- site = params[:site]
- unless site.present?
+ site = params[:sitetype]
+ if site.blank? || 'url'==site
url = data
else
url = Utils.username_url(data, site)
diff --git a/web/app/views/spikes/site_validate.html.slim b/web/app/views/spikes/site_validate.html.slim
index d55e8d336..2402e560a 100644
--- a/web/app/views/spikes/site_validate.html.slim
+++ b/web/app/views/spikes/site_validate.html.slim
@@ -7,7 +7,7 @@ javascript:
var initialized = false;
$(document).on('JAMKAZAM_READY', function(e, data) {
setTimeout(function() {
- window.url_validator = new JK.UrlValidator($(".url_validator#foobar_url"))
+ window.url_validator = new JK.UrlValidator($(".url_validator#foobar_url"), 'url')
url_validator.init()
$('#url_input_foobar').val('http://www.jamkazam.com')
}, 1)
diff --git a/web/lib/utils.rb b/web/lib/utils.rb
new file mode 100644
index 000000000..b4e570ee5
--- /dev/null
+++ b/web/lib/utils.rb
@@ -0,0 +1,34 @@
+class Utils
+
+ def self.username_url(username, site)
+ case site
+ when 'youtube'
+ "https://www.youtube.com/c/#{username}"
+ when 'facebook'
+ "https://www.facebook.com/#{username}"
+ when 'soundcloud'
+ "https://soundcloud.com/#{username}"
+ when 'bandcamp'
+ "http://#{username}.bandcamp.com"
+ when 'fandalism'
+ "http://fandalism.com/#{username}"
+ when 'twitter'
+ "https://twitter.com/#{username}"
+ when 'reverbnation'
+ "http://www.reverbnation.com/#{username}"
+ else
+ nil
+ end
+ end
+
+ def self.url_validator(url)
+ result = `curl --output /dev/null --silent --head --fail --show-error '#{url}' 2>&1`.chomp
+ if $?.success?
+ return nil
+ else
+ result =~ /curl: \(\d+\) (.*)/
+ return "#{$1} (#{url})"
+ end
+ end
+
+end
From 1d42b7b66245368497d69136e7b138c9294471f0 Mon Sep 17 00:00:00 2001
From: Jonathan Kolyer
Date: Fri, 6 Feb 2015 05:46:17 +0000
Subject: [PATCH 03/10] VRFS-2698 refactoring validator interface
---
web/app/assets/javascripts/url_validator.js.coffee | 4 ++--
web/app/views/clients/_url_validator.html.slim | 4 ++--
web/app/views/spikes/site_validate.html.slim | 6 +++---
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/web/app/assets/javascripts/url_validator.js.coffee b/web/app/assets/javascripts/url_validator.js.coffee
index 6e3ece018..08546ac31 100644
--- a/web/app/assets/javascripts/url_validator.js.coffee
+++ b/web/app/assets/javascripts/url_validator.js.coffee
@@ -4,11 +4,11 @@ context.JK ||= {};
context.JK.UrlValidator = class UrlValidator
- constructor: (input_div, site_type) ->
+ constructor: (site_type) ->
@EVENTS = context.JK.EVENTS
@rest = context.JK.Rest()
@site_type = site_type
- @input_div = input_div
+ @input_div = $(".url_validator#"+site_type+"_url")
@data_input = @input_div.find('input')
this.show_format_status()
@logger = context.JK.logger
diff --git a/web/app/views/clients/_url_validator.html.slim b/web/app/views/clients/_url_validator.html.slim
index dd5d4b74a..bd4d3d422 100644
--- a/web/app/views/clients/_url_validator.html.slim
+++ b/web/app/views/clients/_url_validator.html.slim
@@ -1,7 +1,7 @@
-div class="url_validator" id="#{siteid}_url"
+div class="url_validator" id="#{site_type}_url"
span class="validate-checkmark"
span class="spinner-small upload-spinner"
- input type='text' id="url_input_#{siteid}" maxlength="2000"
+ input type='text' id="validate_input_#{site_type}" maxlength="2000"
br
div class="error"
diff --git a/web/app/views/spikes/site_validate.html.slim b/web/app/views/spikes/site_validate.html.slim
index 2402e560a..b2f58273b 100644
--- a/web/app/views/spikes/site_validate.html.slim
+++ b/web/app/views/spikes/site_validate.html.slim
@@ -1,14 +1,14 @@
= javascript_include_tag "url_validator"
div style="width:50%"
- = render "clients/url_validator", siteid: 'foobar'
+ = render "clients/url_validator", site_type: 'url'
= stylesheet_link_tag "client/url_validator"
javascript:
var initialized = false;
$(document).on('JAMKAZAM_READY', function(e, data) {
setTimeout(function() {
- window.url_validator = new JK.UrlValidator($(".url_validator#foobar_url"), 'url')
+ window.url_validator = new JK.UrlValidator('url')
url_validator.init()
- $('#url_input_foobar').val('http://www.jamkazam.com')
+ $('#validate_input_url').val('http://www.jamkazam.com')
}, 1)
})
From 9f27ef84299764a7a8941a36eaf2b4a0db509f66 Mon Sep 17 00:00:00 2001
From: Jonathan Kolyer
Date: Fri, 6 Feb 2015 06:00:07 +0000
Subject: [PATCH 04/10] VRFS-2698 renamed url_validator to site_validator
---
...alidator.js.coffee => site_validator.js.coffee} | 4 ++--
..._validator.css.scss => site_validator.css.scss} | 2 +-
web/app/controllers/api_users_controller.rb | 2 +-
...lidator.html.slim => _site_validator.html.slim} | 3 +--
web/app/views/spikes/site_validate.html.slim | 10 +++++-----
web/app/views/spikes/username_validate.html.slim | 14 ++++++++++++++
6 files changed, 24 insertions(+), 11 deletions(-)
rename web/app/assets/javascripts/{url_validator.js.coffee => site_validator.js.coffee} (94%)
rename web/app/assets/stylesheets/client/{url_validator.css.scss => site_validator.css.scss} (97%)
rename web/app/views/clients/{_url_validator.html.slim => _site_validator.html.slim} (75%)
create mode 100644 web/app/views/spikes/username_validate.html.slim
diff --git a/web/app/assets/javascripts/url_validator.js.coffee b/web/app/assets/javascripts/site_validator.js.coffee
similarity index 94%
rename from web/app/assets/javascripts/url_validator.js.coffee
rename to web/app/assets/javascripts/site_validator.js.coffee
index 08546ac31..dfa89b1c4 100644
--- a/web/app/assets/javascripts/url_validator.js.coffee
+++ b/web/app/assets/javascripts/site_validator.js.coffee
@@ -2,13 +2,13 @@ $ = jQuery
context = window
context.JK ||= {};
-context.JK.UrlValidator = class UrlValidator
+context.JK.SiteValidator = class SiteValidator
constructor: (site_type) ->
@EVENTS = context.JK.EVENTS
@rest = context.JK.Rest()
@site_type = site_type
- @input_div = $(".url_validator#"+site_type+"_url")
+ @input_div = $(".site_validator#"+site_type+"_validator")
@data_input = @input_div.find('input')
this.show_format_status()
@logger = context.JK.logger
diff --git a/web/app/assets/stylesheets/client/url_validator.css.scss b/web/app/assets/stylesheets/client/site_validator.css.scss
similarity index 97%
rename from web/app/assets/stylesheets/client/url_validator.css.scss
rename to web/app/assets/stylesheets/client/site_validator.css.scss
index 6ce18ea57..549d58594 100644
--- a/web/app/assets/stylesheets/client/url_validator.css.scss
+++ b/web/app/assets/stylesheets/client/site_validator.css.scss
@@ -1,6 +1,6 @@
@import "client/common";
-.url_validator {
+.site_validator {
input {
width: 100%;
padding: 5px;
diff --git a/web/app/controllers/api_users_controller.rb b/web/app/controllers/api_users_controller.rb
index f206037f2..f31dd0ea0 100644
--- a/web/app/controllers/api_users_controller.rb
+++ b/web/app/controllers/api_users_controller.rb
@@ -711,7 +711,7 @@ class ApiUsersController < ApiController
url = Utils.username_url(data, site)
end
unless url.blank?
- if errmsg = Utils.url_validator(url)
+ if errmsg = Utils.site_validator(url)
render json: { message: 'Invalid Site', errors: { site: [errmsg] } }, status: 200
else
render json: { message: 'Valid Site' }, status: 200
diff --git a/web/app/views/clients/_url_validator.html.slim b/web/app/views/clients/_site_validator.html.slim
similarity index 75%
rename from web/app/views/clients/_url_validator.html.slim
rename to web/app/views/clients/_site_validator.html.slim
index bd4d3d422..d66dcf917 100644
--- a/web/app/views/clients/_url_validator.html.slim
+++ b/web/app/views/clients/_site_validator.html.slim
@@ -1,7 +1,6 @@
-div class="url_validator" id="#{site_type}_url"
+div class="site_validator" id="#{site_type}_validator"
span class="validate-checkmark"
span class="spinner-small upload-spinner"
input type='text' id="validate_input_#{site_type}" maxlength="2000"
br
div class="error"
-
diff --git a/web/app/views/spikes/site_validate.html.slim b/web/app/views/spikes/site_validate.html.slim
index b2f58273b..cd0a475e7 100644
--- a/web/app/views/spikes/site_validate.html.slim
+++ b/web/app/views/spikes/site_validate.html.slim
@@ -1,14 +1,14 @@
-= javascript_include_tag "url_validator"
+= javascript_include_tag "site_validator"
div style="width:50%"
- = render "clients/url_validator", site_type: 'url'
-= stylesheet_link_tag "client/url_validator"
+ = render "clients/site_validator", site_type: 'url'
+= stylesheet_link_tag "client/site_validator"
javascript:
var initialized = false;
$(document).on('JAMKAZAM_READY', function(e, data) {
setTimeout(function() {
- window.url_validator = new JK.UrlValidator('url')
- url_validator.init()
+ window.site_validator = new JK.SiteValidator('url')
+ site_validator.init()
$('#validate_input_url').val('http://www.jamkazam.com')
}, 1)
})
diff --git a/web/app/views/spikes/username_validate.html.slim b/web/app/views/spikes/username_validate.html.slim
new file mode 100644
index 000000000..2af35bb8a
--- /dev/null
+++ b/web/app/views/spikes/username_validate.html.slim
@@ -0,0 +1,14 @@
+= javascript_include_tag "site_validator"
+div style="width:50%"
+ = render "clients/site_validator", site_type: 'youtube'
+= stylesheet_link_tag "client/site_validator"
+
+javascript:
+ var initialized = false;
+ $(document).on('JAMKAZAM_READY', function(e, data) {
+ setTimeout(function() {
+ window.site_validator = new JK.SiteValidator('youtube')
+ site_validator.init()
+ $('#validate_input_youtube').val('jonathankolyer')
+ }, 1)
+ })
From 90f3d9efe18716459dcf7c5a0f75f77a5e8e172c Mon Sep 17 00:00:00 2001
From: Jonathan Kolyer
Date: Fri, 6 Feb 2015 07:42:46 +0000
Subject: [PATCH 05/10] VRFS-2698 refactoring
---
web/app/controllers/spikes_controller.rb | 4 ----
web/app/views/spikes/site_validate.html.slim | 15 ++++++++++-----
web/app/views/spikes/username_validate.html.slim | 14 --------------
web/lib/utils.rb | 11 +++++++----
...ec.html.slim => site_validator_spec.html.slim} | 0
...ec.js.coffee => site_validator_spec.js.coffee} | 0
...validator.css.scss => site_validator.css.scss} | 0
7 files changed, 17 insertions(+), 27 deletions(-)
delete mode 100644 web/app/views/spikes/username_validate.html.slim
rename web/spec/javascripts/fixtures/{url_validator_spec.html.slim => site_validator_spec.html.slim} (100%)
rename web/spec/javascripts/{url_validator_spec.js.coffee => site_validator_spec.js.coffee} (100%)
rename web/spec/javascripts/stylesheets/{url_validator.css.scss => site_validator.css.scss} (100%)
diff --git a/web/app/controllers/spikes_controller.rb b/web/app/controllers/spikes_controller.rb
index 40dbeda9e..1c3c39e6e 100644
--- a/web/app/controllers/spikes_controller.rb
+++ b/web/app/controllers/spikes_controller.rb
@@ -42,8 +42,4 @@ class SpikesController < ApplicationController
render :layout => 'web'
end
- def username_validate
- render :layout => 'web'
- end
-
end
diff --git a/web/app/views/spikes/site_validate.html.slim b/web/app/views/spikes/site_validate.html.slim
index cd0a475e7..ccd9d8749 100644
--- a/web/app/views/spikes/site_validate.html.slim
+++ b/web/app/views/spikes/site_validate.html.slim
@@ -1,14 +1,19 @@
= javascript_include_tag "site_validator"
div style="width:50%"
- = render "clients/site_validator", site_type: 'url'
+ = render "clients/site_validator", site_type: params[:site_type] || 'url'
= stylesheet_link_tag "client/site_validator"
+
+= select_tag "site_type", options_for_select(Utils::SITE_TYPES, params[:site_type] || 'url')
javascript:
var initialized = false;
$(document).on('JAMKAZAM_READY', function(e, data) {
setTimeout(function() {
- window.site_validator = new JK.SiteValidator('url')
- site_validator.init()
- $('#validate_input_url').val('http://www.jamkazam.com')
+ window.site_validator = new JK.SiteValidator('#{params[:site_type] || 'url'}');
+ site_validator.init();
+ $('#validate_input_'+'#{params[:site_type] || 'url'}').val('jonathankolyer');
}, 1)
- })
+ });
+ $('#site_type').change(function(){
+ location.href = 'site_validate?site_type='+$(this).val();
+ });
diff --git a/web/app/views/spikes/username_validate.html.slim b/web/app/views/spikes/username_validate.html.slim
deleted file mode 100644
index 2af35bb8a..000000000
--- a/web/app/views/spikes/username_validate.html.slim
+++ /dev/null
@@ -1,14 +0,0 @@
-= javascript_include_tag "site_validator"
-div style="width:50%"
- = render "clients/site_validator", site_type: 'youtube'
-= stylesheet_link_tag "client/site_validator"
-
-javascript:
- var initialized = false;
- $(document).on('JAMKAZAM_READY', function(e, data) {
- setTimeout(function() {
- window.site_validator = new JK.SiteValidator('youtube')
- site_validator.init()
- $('#validate_input_youtube').val('jonathankolyer')
- }, 1)
- })
diff --git a/web/lib/utils.rb b/web/lib/utils.rb
index b4e570ee5..941294be4 100644
--- a/web/lib/utils.rb
+++ b/web/lib/utils.rb
@@ -1,14 +1,17 @@
class Utils
+ USERNAME_SITES = %W{youtube facebook soundcloud bandcamp fandalism twitter reverbnation}
+ SITE_TYPES = ['url'].concat(USERNAME_SITES)
+
def self.username_url(username, site)
case site
when 'youtube'
"https://www.youtube.com/c/#{username}"
- when 'facebook'
+ when 'facebook' #
"https://www.facebook.com/#{username}"
- when 'soundcloud'
+ when 'soundcloud' #
"https://soundcloud.com/#{username}"
- when 'bandcamp'
+ when 'bandcamp' #
"http://#{username}.bandcamp.com"
when 'fandalism'
"http://fandalism.com/#{username}"
@@ -21,7 +24,7 @@ class Utils
end
end
- def self.url_validator(url)
+ def self.site_validator(url)
result = `curl --output /dev/null --silent --head --fail --show-error '#{url}' 2>&1`.chomp
if $?.success?
return nil
diff --git a/web/spec/javascripts/fixtures/url_validator_spec.html.slim b/web/spec/javascripts/fixtures/site_validator_spec.html.slim
similarity index 100%
rename from web/spec/javascripts/fixtures/url_validator_spec.html.slim
rename to web/spec/javascripts/fixtures/site_validator_spec.html.slim
diff --git a/web/spec/javascripts/url_validator_spec.js.coffee b/web/spec/javascripts/site_validator_spec.js.coffee
similarity index 100%
rename from web/spec/javascripts/url_validator_spec.js.coffee
rename to web/spec/javascripts/site_validator_spec.js.coffee
diff --git a/web/spec/javascripts/stylesheets/url_validator.css.scss b/web/spec/javascripts/stylesheets/site_validator.css.scss
similarity index 100%
rename from web/spec/javascripts/stylesheets/url_validator.css.scss
rename to web/spec/javascripts/stylesheets/site_validator.css.scss
From 3563e6e08a7dec3d6f9994eba7289f7bc2720b0a Mon Sep 17 00:00:00 2001
From: Seth Call
Date: Fri, 6 Feb 2015 17:07:18 -0600
Subject: [PATCH 06/10] * VRFS-2747 - incorporating welcome message from David;
made headers white
---
ruby/Gemfile | 2 +-
.../user_mailer/welcome_message.html.erb | 87 +++++++++++--------
.../user_mailer/welcome_message.text.erb | 52 +++++++----
3 files changed, 88 insertions(+), 53 deletions(-)
diff --git a/ruby/Gemfile b/ruby/Gemfile
index f38b2de02..7a31165d1 100644
--- a/ruby/Gemfile
+++ b/ruby/Gemfile
@@ -28,7 +28,7 @@ gem 'amqp', '1.0.2'
gem 'will_paginate'
gem 'actionmailer', '3.2.13'
gem 'sendgrid', '1.2.0'
-gem 'aws-sdk' #, '1.29.1'
+gem 'aws-sdk', '~> 1'
gem 'carrierwave', '0.9.0'
gem 'aasm', '3.0.16'
gem 'devise', '3.3.0' # 3.4.0 causes: uninitialized constant ActionController::Metal (NameError)
diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb
index 439aefe3a..35e380618 100644
--- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb
+++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.html.erb
@@ -1,45 +1,64 @@
<% provide(:title, 'Welcome to JamKazam!') %>
+
Hello <%= EmailBatchProgression::VAR_FIRST_NAME %> --
+
We're delighted that you have decided to try the JamKazam service,
- and we hope that you will enjoy using JamKazam to play music with others.
- Following are links to some resources that can help to get you up and running quickly.
+ and we hope that you will enjoy using JamKazam to play
+ music with others.
+ Following are some resources that can help you get oriented and get the most out of JamKazam.
+
+
+
+
+
+
Getting Started
+ There are basically three kinds of setups you can use to play on JamKazam.
+
+ - Built-In Audio on Your Computer - You can use a Windows or Mac computer, and just use the built-in mic and headphone jack to
+ handle your audio. This is cheap and easy, but your audio quality will suffer, and it will also process audio very slowly,
+ creating problems with latency, or lag, in your sessions. Still, you can at least start experimenting with JamKazam in this way.
+ - Computer with External Audio Interface - You can use a Windows or Mac computer with an external audio interface that you
+ already own and use for recording, if you happen to have one already. If you are going to do this, or use the built-in mic/headphones on your computer, please refer
+ to our Minimum System Requirements
+ to make sure your computer will work. These requirements were on the download page for the app, but you may have sped by them. Also, we'd recommend watching our
+ Getting Started Video to learn more about your options here.
+ - The JamBlaster - JamKazam has designed a new product from the ground up to be the best way to play music online in real time. It's called the JamBlaster.
+ It processes audio faster than any of the thousands of combinations of computers and interfaces in use on JamKazam today, which means you can play with musicians
+ who are farther away from you, and closer sessions will feel/sound tighter. The JamBlaster is both a computer and an audio interface, so it also eliminates the
+ system requirements worries, and it "just works" so you don't have to be an audio and computer genius to get it working. This is a great product - available only
+ through a Kickstarter program running during a 30-day window during parts of February and March 2015. You can watch the
+ JamBlaster Video to learn more about this amazing new product.
+
+
+
+JamKazam Features
+ JamKazam offers a very robust and exciting set of features for playing online and sharing your performances with others. Here are some videos you can watch
+ to easily get up to speed on some of the things you can do with JamKazam:
+
+
+
+Getting Help
+ If you run into trouble and need help, please reach out to us. We will be glad to do everything we can to answer your questions and get you up and running.
+ You can visit our
+ Support Portal
+ to find knowledge base articles and post questions that have
+ not already been answered. You can email us at support@jamkazam.com. And if you just want to chat, share tips and war stories, and hang out with fellow JamKazamers,
+ you can visit our Community Forum
+ .
-Getting Started Video
-We recommend watching this video before you jump into the service just to get oriented. It will really help you hit the ground running:
-https://www.youtube.com/watch?v=DBo--aj_P1w
+ Again, welcome to JamKazam, and we look forward to seeing – and hearing – you online soon!
-
-Other Great Tutorial Videos
-There are several other very great videos that will help you understand how to find and connect with other musicians on the service, create your own sessions or find and join other musicians’ sessions, play in sessions, record and share your performances, and even live broadcast your sessions to family, friends, and fans. Check these helpful videos out here:
-https://jamkazam.desk.com/customer/portal/topics/673198-tutorials-on-major-features/articles
-
-
-
-Knowledge Base Articles
-You can find Getting Started knowledge base articles on things like frequently asked questions (FAQ), minimum system requirements for your Windows or Mac computer, how to troubleshoot audio problems in sessions, and more here:
-https://jamkazam.desk.com/customer/portal/topics/564807-getting-started/articles
-
-
-
-JamKazam Support Portal
-If you run into trouble and need help, please reach out to us. We will be glad to do everything we can to get you up and running. You can find our support portal here:
-https://jamkazam.desk.com/
-
-
-
-JamKazam Community Forum
-And if you just want to chat, share tips and war stories, and hang out with fellow JamKazamers, you can visit our community forum here:
-http://forums.jamkazam.com/
-
-
-
-Please take a moment to like or follow us by clicking the icons below, and we look forward to seeing – and hearing – you online soon!
-
-
- -- Team JamKazam
+Best Regards,
+ Team JamKazam
\ No newline at end of file
diff --git a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.text.erb b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.text.erb
index 90efc88ef..a9f2ed06b 100644
--- a/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.text.erb
+++ b/ruby/lib/jam_ruby/app/views/jam_ruby/user_mailer/welcome_message.text.erb
@@ -1,27 +1,43 @@
Hello <%= EmailBatchProgression::VAR_FIRST_NAME %> --
-We're delighted that you have decided to try the JamKazam service, and we hope that you will enjoy using JamKazam to play music with others. Following are links to some resources that can help to get you up and running quickly.
+We're delighted that you have decided to try the JamKazam service, and we hope that you will enjoy using JamKazam to play music with others. Following are some resources that can help you get oriented and get the most out of JamKazam.
-Getting Started Video
-We recommend watching this video before you jump into the service just to get oriented. It will really help you hit the ground running:
-https://www.youtube.com/watch?v=DBo--aj_P1w
-Other Great Tutorial Videos
-There are several other very great videos that will help you understand how to find and connect with other musicians on the service, create your own sessions or find and join other musicians’ sessions, play in sessions, record and share your performances, and even live broadcast your sessions to family, friends, and fans. Check these helpful videos out here:
-https://jamkazam.desk.com/customer/portal/topics/673198-tutorials-on-major-features/articles
+Getting Started
+---------------
-Knowledge Base Articles
-You can find Getting Started knowledge base articles on things like frequently asked questions (FAQ), minimum system requirements for your Windows or Mac computer, how to troubleshoot audio problems in sessions, and more here:
-https://jamkazam.desk.com/customer/portal/topics/564807-getting-started/articles
+There are basically three kinds of setups you can use to play on JamKazam.
-JamKazam Support Portal
-If you run into trouble and need help, please reach out to us. We will be glad to do everything we can to get you up and running. You can find our support portal here:
-https://jamkazam.desk.com
+* Built-In Audio on Your Computer - You can use a Windows or Mac computer, and just use the built-in mic and headphone jack to handle your audio. This is cheap and easy, but your audio quality will suffer, and it will also process audio very slowly, creating problems with latency, or lag, in your sessions. Still, you can at least start experimenting with JamKazam in this way.
-JamKazam Community Forum
-And if you just want to chat, share tips and war stories, and hang out with fellow JamKazamers, you can visit our community forum here:
-http://forums.jamkazam.com
+* Computer with External Audio Interface - - You can use a Windows or Mac computer with an external audio interface that you already own and use for recording, if you happen to have one already. If you are going to do this, or use the built-in mic/headphones on your computer, please refer to our Minimum System Requirements at https://jamkazam.desk.com/customer/portal/articles/1288274-minimum-system-requirements to make sure your computer will work. These requirements were on the download page for the app, but you may have sped by them. Also, we'd recommend watching our Getting Started Video at https://www.youtube.com/watch?v=DBo--aj_P1w to learn more about your options here.
-Please take a moment to like or follow us by clicking the icons below, and we look forward to seeing – and hearing – you online soon!
+* The JamBlaster - JamKazam has designed a new product from the ground up to be the best way to play music online in real time. It's called the JamBlaster. It processes audio faster than any of the thousands of combinations of computers and interfaces in use on JamKazam today, which means you can play with musicians who are farther away from you, and closer sessions will feel/sound tighter. The JamBlaster is both a computer and an audio interface, so it also eliminates the system requirements worries, and it "just works" so you don't have to be an audio and computer genius to get it working. This is a great product - available only through a Kickstarter program running during a 30-day window during parts of February and March 2015. You can watch the JamBlaster Video at https://www.youtube.com/watch?v=gAJAIHMyois to learn more about this amazing new product.
+
+
+JamKazam Features
+-----------------
+
+JamKazam offers a very robust and exciting set of features for playing online and sharing your performances with others. Here are some videos you can watch to easily get up to speed on some of the things you can do with JamKazam:
+
+* Creating a Session - https://www.youtube.com/watch?v=EZZuGcDUoWk
+
+* Finding a Session - https://www.youtube.com/watch?v=xWponSJo-GU
+
+* Playing in a Session - https://www.youtube.com/watch?v=zJ68hA8-fLA
+
+* Connecting with Other Musicians - https://www.youtube.com/watch?v=4KWklSZZxRc
+
+* Working with Recordings - https://www.youtube.com/watch?v=Gn-dOqnNLoY
+
+
+Getting Help
+------------
+
+If you run into trouble and need help, please reach out to us. We will be glad to do everything we can to answer your questions and get you up and running. You can visit our Support Portal at https://jamkazam.desk.com/ to find knowledge base articles and post questions that have not already been answered. You can email us at support@jamkazam.com. And if you just want to chat, share tips and war stories, and hang out with fellow JamKazamers, you can visit our Community Forum at http://forums.jamkazam.com/.
+
+Again, welcome to JamKazam, and we look forward to seeing – and hearing – you online soon!
+
+Best Regards,
+Team JamKazam
--- Team JamKazam
From b89e6e94750035d9a495465b17e27b060dc2a0cb Mon Sep 17 00:00:00 2001
From: Seth Call
Date: Fri, 6 Feb 2015 22:04:37 -0600
Subject: [PATCH 07/10] * VRFS-2748, VRFS-2749 - update styling for / page and
home page
---
admin/Gemfile | 2 +-
web/Gemfile | 2 +-
.../assets/images/web/carousel_community.png | Bin 0 -> 202229 bytes
.../assets/images/web/carousel_jamblaster.png | Bin 0 -> 129472 bytes
.../assets/images/web/carousel_overview.png | Bin 0 -> 209745 bytes
web/app/assets/javascripts/layout.js | 8 ++++++++
.../stylesheets/client/jamkazam.css.scss | 10 ++++++++++
web/app/assets/stylesheets/web/main.css.scss | 8 +++++++-
web/app/controllers/users_controller.rb | 16 ++++++++--------
web/app/views/clients/_home.html.slim | 8 ++++++--
web/app/views/users/welcome.html.haml | 12 ++++++++----
web/config/application.rb | 3 +++
websocket-gateway/Gemfile | 2 +-
13 files changed, 53 insertions(+), 18 deletions(-)
create mode 100644 web/app/assets/images/web/carousel_community.png
create mode 100644 web/app/assets/images/web/carousel_jamblaster.png
create mode 100644 web/app/assets/images/web/carousel_overview.png
diff --git a/admin/Gemfile b/admin/Gemfile
index b5e4ca236..7502a288e 100644
--- a/admin/Gemfile
+++ b/admin/Gemfile
@@ -49,7 +49,7 @@ gem 'unf', '0.1.3' #optional fog dependency
gem 'country-select'
gem 'aasm', '3.0.16'
gem 'postgres-copy', '0.6.0'
-gem 'aws-sdk' #, '1.29.1'
+gem 'aws-sdk', '~> 1'
gem 'bugsnag'
gem 'gon'
gem 'cocoon'
diff --git a/web/Gemfile b/web/Gemfile
index e5c3f1583..5c8370e30 100644
--- a/web/Gemfile
+++ b/web/Gemfile
@@ -51,7 +51,7 @@ gem 'twitter'
gem 'fb_graph', '2.5.9'
gem 'sendgrid', '1.2.0'
gem 'filepicker-rails', '0.1.0'
-gem 'aws-sdk' #, '1.29.1'
+gem 'aws-sdk', '~> 1'
gem 'aasm', '3.0.16'
gem 'carrierwave', '0.9.0'
gem 'carrierwave_direct'
diff --git a/web/app/assets/images/web/carousel_community.png b/web/app/assets/images/web/carousel_community.png
new file mode 100644
index 0000000000000000000000000000000000000000..ace54546b5a46c533daf6ef9d359d519fe4436ed
GIT binary patch
literal 202229
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