From b3f4539b423fdca58cb5965c8cbcdb3efc5bf1e4 Mon Sep 17 00:00:00 2001 From: Seth Call Date: Sun, 14 Feb 2021 22:32:27 -0600 Subject: [PATCH] Working on Affiliate Changes -- have updated account and links page --- admin/Gemfile | 1 + admin/Gemfile.lock | 5 ++ admin/app/admin/affiliates.rb | 41 +++++++++--- admin/app/admin/jam_ruby_users.rb | 6 ++ admin/app/assets/javascripts/active_admin.js | 1 + .../assets/stylesheets/active_admin.css.scss | 1 + .../app/views/admin/affiliates/_form.html.erb | 1 + .../20210202183522_create_init_structure.rb | 3 +- ruby/lib/jam_ruby.rb | 1 + ruby/lib/jam_ruby/models/affiliate_partner.rb | 2 + ruby/lib/jam_ruby/tasks/db/migrate.rake | 11 +++- .../assets/javascripts/accounts_affiliate.js | 61 ++++++------------ .../react-components/SupportPage.js.jsx | 2 +- .../stylesheets/client/account_affiliate.scss | 4 ++ web/app/controllers/api_controller.rb | 6 +- web/app/controllers/api_links_controller.rb | 27 +++++++- web/app/controllers/api_users_controller.rb | 4 +- web/app/controllers/supports_controller.rb | 2 +- .../_account_affiliate_partner.html.slim | 62 +++++++------------ web/config/routes.rb | 13 ++-- 20 files changed, 147 insertions(+), 107 deletions(-) diff --git a/admin/Gemfile b/admin/Gemfile index 91f5e0643..b9099a250 100644 --- a/admin/Gemfile +++ b/admin/Gemfile @@ -72,6 +72,7 @@ gem 'jquery-ui-rails'# , '5.0.5' #, '4.2.1' gem 'jquery-rails'# , '4.1.1' # both this and jquery-ui-rails are pinned; if you unpin, jquery/autocomplete is missing during precomplie gem 'rails-jquery-autocomplete' # This is the maintained version of rails3-jquery-autocomplete gem 'activeadmin' #, '1.0.0.pre4'# github: 'activeadmin', branch: 'master' +gem 'activeadmin-searchable_select' gem 'mime-types', '1.25' #gem 'meta_search' gem 'fog' diff --git a/admin/Gemfile.lock b/admin/Gemfile.lock index 141ff9ea3..1c873df9e 100644 --- a/admin/Gemfile.lock +++ b/admin/Gemfile.lock @@ -47,6 +47,10 @@ GEM ransack (>= 1.8.7) sass (~> 3.1) sprockets (< 4.1) + activeadmin-searchable_select (1.4.0) + activeadmin (>= 1.x, < 3) + jquery-rails (>= 3.0, < 5) + select2-rails (~> 4.0) activeadmin_addons (1.7.1) active_material railties @@ -695,6 +699,7 @@ PLATFORMS DEPENDENCIES aasm activeadmin + activeadmin-searchable_select activeadmin_addons amqp (= 0.9.8) auto_strip_attributes (= 2.6.0) diff --git a/admin/app/admin/affiliates.rb b/admin/app/admin/affiliates.rb index 2ff8813e3..0dcfb1d8d 100644 --- a/admin/app/admin/affiliates.rb +++ b/admin/app/admin/affiliates.rb @@ -9,22 +9,46 @@ ActiveAdmin.register JamRuby::AffiliatePartner, :as => 'Affiliates' do config.per_page = 50 config.paginate = true - form :partial => 'form' + #form :partial => 'form' scope("Active", default: true) { |scope| scope.where('partner_user_id IS NOT NULL').order('referral_user_count desc') } scope("Unpaid") { |partner| partner.unpaid } + form do |f| + f.inputs 'Fields' do + f.input(:partner_name, :input_html => { :maxlength => 128 }) + f.input(:partner_user, as: :searchable_select, hint: 'This person is the owner of the affiliate. Has access to reporting info in account section of www.jamkazam.com') + f.input(:entity_type, :as => :select, :collection => AffiliatePartner::ENTITY_TYPES) + f.input(:rate) + end + f.actions + end + index do # actions # use this for all view/edit/delete links - column 'User' do |oo| link_to(oo.partner_user.name, admin_user_path(oo.partner_user.id), {:title => oo.partner_user.name}) end - column 'Name' do |oo| oo.partner_name end - column 'Type' do |oo| oo.entity_type end - column 'Code' do |oo| oo.id end - column 'Referral Count' do |oo| oo.referral_user_count end - column 'Earnings' do |oo| sprintf("$%.2f", oo.cumulative_earnings_in_dollars) end - column 'Amount Owed' do |oo| sprintf("$%.2f", oo.due_amount_in_cents.to_f / 100.to_f) end + column 'User' do |oo| + link_to(oo.partner_user.name, admin_user_path(oo.partner_user.id), { :title => oo.partner_user.name }) + end + column 'Name' do |oo| + oo.partner_name + end + column 'Type' do |oo| + oo.entity_type + end + column 'Code' do |oo| + oo.id + end + column 'Referral Count' do |oo| + oo.referral_user_count + end + column 'Earnings' do |oo| + sprintf("$%.2f", oo.cumulative_earnings_in_dollars) + end + column 'Amount Owed' do |oo| + sprintf("$%.2f", oo.due_amount_in_cents.to_f / 100.to_f) + end column 'Pay Actions' do |oo| link_to('Mark Paid', mark_paid_admin_affiliate_path(oo.id), :confirm => "Mark this affiliate as PAID?") if oo.unpaid end @@ -32,7 +56,6 @@ ActiveAdmin.register JamRuby::AffiliatePartner, :as => 'Affiliates' do actions end - action_item :only => [:show] do link_to("Mark Paid", mark_paid_admin_affiliate_path(resource.id), diff --git a/admin/app/admin/jam_ruby_users.rb b/admin/app/admin/jam_ruby_users.rb index 58dbe92f1..aaf2b70ca 100644 --- a/admin/app/admin/jam_ruby_users.rb +++ b/admin/app/admin/jam_ruby_users.rb @@ -1,5 +1,11 @@ ActiveAdmin.register JamRuby::User, :as => 'Users' do + searchable_select_options(scope: User.all, + text_attribute: :username, + filter: lambda do |term, scope| + scope.ransack(full_name_or_email_cont: term).result + end) + collection_action :autocomplete_user_email, :method => :get actions :all, :except => [:destroy] diff --git a/admin/app/assets/javascripts/active_admin.js b/admin/app/assets/javascripts/active_admin.js index df9db3400..a79135b71 100644 --- a/admin/app/assets/javascripts/active_admin.js +++ b/admin/app/assets/javascripts/active_admin.js @@ -9,6 +9,7 @@ // require jquery.ui.autocomplete //= require cocoon //= require active_admin/base +//= require active_admin/searchable_select // //= require autocomplete-rails //= require base //= require_tree . diff --git a/admin/app/assets/stylesheets/active_admin.css.scss b/admin/app/assets/stylesheets/active_admin.css.scss index f5bb8a9c2..05c71f28a 100644 --- a/admin/app/assets/stylesheets/active_admin.css.scss +++ b/admin/app/assets/stylesheets/active_admin.css.scss @@ -15,6 +15,7 @@ // Active Admin's got SASS! @import "active_admin/mixins"; @import "active_admin/base"; +@import "active_admin/searchable_select"; // Overriding any non-variable SASS must be done after the fact. // For example, to change the default status-tag color: diff --git a/admin/app/views/admin/affiliates/_form.html.erb b/admin/app/views/admin/affiliates/_form.html.erb index 78a1dce70..cc27cb378 100644 --- a/admin/app/views/admin/affiliates/_form.html.erb +++ b/admin/app/views/admin/affiliates/_form.html.erb @@ -2,6 +2,7 @@ <%= f.semantic_errors *f.object.errors.keys %> <%= f.inputs do %> <%= f.input(:partner_name, :input_html => {:maxlength => 128}) %> + <%= f.input(:partner_user, as: :searchable_select, ajax: true, hint: 'The user that manages/owns this affiliate. They can see affiliate reports') %> <%= f.input(:entity_type, :as => :select, :collection => AffiliatePartner::ENTITY_TYPES) %> <%= f.input(:rate) %> <% end %> diff --git a/ruby/db/migrate/20210202183522_create_init_structure.rb b/ruby/db/migrate/20210202183522_create_init_structure.rb index 99aa70212..65fd6d6ea 100644 --- a/ruby/db/migrate/20210202183522_create_init_structure.rb +++ b/ruby/db/migrate/20210202183522_create_init_structure.rb @@ -1,5 +1,6 @@ class CreateInitStructure < ActiveRecord::Migration def up - ActiveRecord::Base.connection.execute(IO.read(File.expand_path("../../init_db.sql", __FILE__))) + # this can't apply in production or staging, -- and schema.rb captures this test/dev environments + #ActiveRecord::Base.connection.execute(IO.read(File.expand_path("../../init_db.sql", __FILE__))) end end diff --git a/ruby/lib/jam_ruby.rb b/ruby/lib/jam_ruby.rb index 478338039..e5a4c5a21 100755 --- a/ruby/lib/jam_ruby.rb +++ b/ruby/lib/jam_ruby.rb @@ -260,6 +260,7 @@ require "jam_ruby/models/affiliate_monthly_payment" require "jam_ruby/models/affiliate_traffic_total" require "jam_ruby/models/affiliate_referral_visit" require "jam_ruby/models/affiliate_payment" +require "jam_ruby/models/affiliate_link" require "jam_ruby/models/chat_message" require "jam_ruby/models/shopping_cart" require "jam_ruby/models/generic_state" diff --git a/ruby/lib/jam_ruby/models/affiliate_partner.rb b/ruby/lib/jam_ruby/models/affiliate_partner.rb index 733962264..1c00da500 100644 --- a/ruby/lib/jam_ruby/models/affiliate_partner.rb +++ b/ruby/lib/jam_ruby/models/affiliate_partner.rb @@ -12,6 +12,7 @@ class JamRuby::AffiliatePartner < ActiveRecord::Base has_many :traffic_totals, :class_name => 'JamRuby::AffiliateTrafficTotal', foreign_key: :affiliate_partner_id, inverse_of: :affiliate_partner has_many :visits, :class_name => 'JamRuby::AffiliateReferralVisit', foreign_key: :affiliate_partner_id, inverse_of: :affiliate_partner has_many :affiliate_distributions, :class_name => "JamRuby::AffiliateDistribution", foreign_key: :affiliate_referral_id + has_many :links, :class_name => "JamRuby::AffiliateLink", foreign_key: :affiliate_partner_id attr_accessible :partner_name, :partner_code, :partner_user_id, :entity_type, :rate, as: :admin ENTITY_TYPES = %w{ Individual Sole\ Proprietor Limited\ Liability\ Company\ (LLC) Partnership Trust/Estate S\ Corporation C\ Corporation Other } @@ -53,6 +54,7 @@ class JamRuby::AffiliatePartner < ActiveRecord::Base before_save do |record| record.address ||= ADDRESS_SCHEMA.clone record.entity_type ||= ENTITY_TYPES.first + record.partner_user_id = nil if record.partner_user_id1 == '' #for activeadmin coercion end def display_name diff --git a/ruby/lib/jam_ruby/tasks/db/migrate.rake b/ruby/lib/jam_ruby/tasks/db/migrate.rake index 44fdfefca..d7027e271 100644 --- a/ruby/lib/jam_ruby/tasks/db/migrate.rake +++ b/ruby/lib/jam_ruby/tasks/db/migrate.rake @@ -22,6 +22,15 @@ namespace :db do puts "#{ENV['RAILS_ENV']} database migrated." end + desc "Rollback the database" + task :rollback do + steps = (ARGV[1] || "1").to_i + ActiveRecord::Base.establish_connection(db_config) + migrate_dir = File.expand_path("../../../../../db/migrate", __FILE__) + ActiveRecord::Migrator.rollback(migrate_dir, steps) + puts "#{ENV['RAILS_ENV']} database migrated." + end + desc "Drop the database" task :drop do raise "can not drop production database" if ENV['RAILS_ENV'] == 'production' @@ -48,7 +57,7 @@ namespace :db do namespace :g do desc "Generate migration" task :migration do - name = ARGV[1] || raise("Specify name: rake g:migration your_migration") + name = ARGV[1] || raise("Specify name: rake db:g:migration your_migration") timestamp = Time.now.strftime("%Y%m%d%H%M%S") path = File.expand_path("../../../../../db/migrate/#{timestamp}_#{name}.rb", __FILE__) migration_class = name.split("_").map(&:capitalize).join diff --git a/web/app/assets/javascripts/accounts_affiliate.js b/web/app/assets/javascripts/accounts_affiliate.js index f9b5ec02a..61d0aea70 100644 --- a/web/app/assets/javascripts/accounts_affiliate.js +++ b/web/app/assets/javascripts/accounts_affiliate.js @@ -13,7 +13,8 @@ var $screen = null; function beforeShow(data) { - userId = data.id; + + userId = context.JK.currentUserId affiliatePartnerData = null; } @@ -168,48 +169,14 @@ function updateLinks() { - var $select = $screen.find('select.link_type') - var value = $select.val() - logger.debug("value: " + value) + // affiliatePartnerData.account.id - var type = 'jamtrack_songs'; - if(value == 'JamTrack Song') { - type = 'jamtrack_songs' - } - else if(value == 'JamTrack Band') { - type = 'jamtrack_bands' - } - else if(value == 'JamTrack General') { - type = 'jamtrack_general' - } - else if(value == 'JamKazam General') { - type = 'jamkazam' - } - else if(value == 'JamKazam Session') { - type = 'sessions' - } - else if(value == 'JamKazam Recording') { - type = 'recordings' - } - else if(value == 'Custom Link') { - type = 'custom_links' - } - - $screen.find('.link-type-prompt').hide(); - $screen.find('.link-type-prompt[data-type="' + type + '"]').show(); - - if(type == 'custom_links') { - $screen.find('table.links-table').hide(); - $screen.find('.link-type-prompt[data-type="custom_links"] span.affiliate_id').text(affiliatePartnerData.account.id) - } - else { - rest.getLinks(type) - .done(populateLinkTable) - .fail(function() { - app.notify({text: 'Unable to fetch links. Please try again later.' }) - }) - } + rest.getLinks('all', affiliatePartnerData.account.id) + .done(populateLinkTable) + .fail(function() { + app.notify({text: 'Unable to fetch links. Please try again later.' }) + }) } function _renderAffiliateTab(theTab) { @@ -269,13 +236,21 @@ 'postal_code': tab_content.find('#affiliate_partner_postal_code').val(), 'country': tab_content.find('#affiliate_partner_country').val() }, - 'tax_identifier': tab_content.find('#affiliate_partner_tax_identifier').val() + 'tax_identifier': tab_content.find('#affiliate_partner_tax_identifier').val(), + 'paypal_id': tab_content.find('#affiliate_partner_paypal_id').val() } + var button = $('#affiliate-profile-account-submit') + button.addClass("disabled") rest.postAffiliatePartnerData(userId, affiliate_partner_data) - .done(postUpdateAffiliateAccountSuccess); + .done(postUpdateAffiliateAccountSuccess) + .fail(function(jqXHR) { + button.removeClass("disabled") + alert("Unable to update affiliate information.\n\n" + jqXHR.responseText) + }) } function postUpdateAffiliateAccountSuccess(response) { + $('#affiliate-profile-account-submit').removeClass("disabled") app.notify( { title: "Affiliate Account", diff --git a/web/app/assets/javascripts/support/react-components/SupportPage.js.jsx b/web/app/assets/javascripts/support/react-components/SupportPage.js.jsx index 8f0f333cb..80055c6db 100644 --- a/web/app/assets/javascripts/support/react-components/SupportPage.js.jsx +++ b/web/app/assets/javascripts/support/react-components/SupportPage.js.jsx @@ -43,7 +43,7 @@ window.SupportPage = React.createClass({ {support_warning}
The JamKazam help desk offers 1:1 help desk support only to our Gold and Platinum plan - subscribers. More information on subscription plans can be found here. If you are not a Gold or Platinum subscriber, we'd suggest that you look for help in our extensive knowledge base of help articles, diff --git a/web/app/assets/stylesheets/client/account_affiliate.scss b/web/app/assets/stylesheets/client/account_affiliate.scss index 9d52a318c..db6ad3b64 100644 --- a/web/app/assets/stylesheets/client/account_affiliate.scss +++ b/web/app/assets/stylesheets/client/account_affiliate.scss @@ -137,6 +137,8 @@ table.links-table { min-width:100%; margin-top:20px; + border-width: 1px 0 0 0; + border-style: solid; th { padding: 10px 0 20px; @@ -157,7 +159,9 @@ .url { + input { + font-family:courier; background-color: transparent; -webkit-box-shadow:none; box-shadow:none; diff --git a/web/app/controllers/api_controller.rb b/web/app/controllers/api_controller.rb index cef52b25b..6ec166f45 100644 --- a/web/app/controllers/api_controller.rb +++ b/web/app/controllers/api_controller.rb @@ -113,7 +113,11 @@ class ApiController < ApplicationController def affiliate_partner if params[:affiliate_id] @partner = AffiliatePartner.find(params[:affiliate_id]) - if @partner.partner_user.nil? + if @partner.nil? + raise JamPermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR + elsif @partner.partner_user.nil? + raise JamPermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR + elsif !current_user.admin || @partner.partner_user != current_user raise JamPermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR end elsif current_user diff --git a/web/app/controllers/api_links_controller.rb b/web/app/controllers/api_links_controller.rb index 9f50d979f..8cadf984a 100644 --- a/web/app/controllers/api_links_controller.rb +++ b/web/app/controllers/api_links_controller.rb @@ -9,7 +9,27 @@ class ApiLinksController < ApiController @log || Logging.logger[ApiLinksController] end + def all + links = AffiliateLink.all.order(:created_at) + results = [] + links.each do |link| + url = nil + if link.link.index('?') + url = link.link + '&' + affiliate_params.to_query + else + url = link.link + '?' + affiliate_params.to_query + end + + results << {url: url, + target: link.name } + end + render json: results, status: 200 + end +=begin + def jamtrack_song_index + @affiliate_params = affiliate_params() + @affiliate_params = affiliate_params('jamtrack-song') results = [] @@ -106,9 +126,12 @@ class ApiLinksController < ApiController render json: results, status: 200 end +=end private - def affiliate_params(campaign) - {utm_source:'affiliate', utm_medium: 'affiliate', utm_campaign: "#{Date.today.year}-affiliate-#{campaign}", affiliate: @partner.id} + def affiliate_params() + #{utm_source:'affiliate', utm_medium: 'affiliate', utm_campaign: "#{Date.today.year}-affiliate-#{campaign}", affiliate: @partner.id}# + # the above was deemed too noisy + {affiliate: @partner.id} end end diff --git a/web/app/controllers/api_users_controller.rb b/web/app/controllers/api_users_controller.rb index 46df52ac8..33bfd9388 100644 --- a/web/app/controllers/api_users_controller.rb +++ b/web/app/controllers/api_users_controller.rb @@ -865,14 +865,16 @@ class ApiUsersController < ApiController if request.post? oo.address = params[:address] oo.tax_identifier = params[:tax_identifier] + oo.paypal_id = params[:paypal_id] oo.save! - render nothing: true + render json: {}, status: 200 elsif request.get? result = {} result['account'] = { 'address' => oo.address.clone, 'tax_identifier' => oo.tax_identifier, + 'paypal_id' => oo.paypal_id, 'entity_type' => oo.entity_type, 'partner_name' => oo.partner_name, 'partner_id' => oo.partner_user_id, diff --git a/web/app/controllers/supports_controller.rb b/web/app/controllers/supports_controller.rb index 268276878..eec666d01 100644 --- a/web/app/controllers/supports_controller.rb +++ b/web/app/controllers/supports_controller.rb @@ -12,7 +12,7 @@ class SupportsController < ApplicationController gon.plan_code = current_user.subscription_plan_code @title = "Help Desk" - @description = "The JamKazam help desk offers 1:1 help desk support only to in-trial and Gold and Platinum plan subscribers." + @description = "The JamKazam help desk offers 1:1 help desk support only to our Gold and Platinum plan subscribers, as well as those in their initial 30-day trial period." render 'show', :layout => 'support' end diff --git a/web/app/views/clients/_account_affiliate_partner.html.slim b/web/app/views/clients/_account_affiliate_partner.html.slim index 8280cf9b9..3ce3d4ccf 100644 --- a/web/app/views/clients/_account_affiliate_partner.html.slim +++ b/web/app/views/clients/_account_affiliate_partner.html.slim @@ -41,12 +41,18 @@ script type="text/template" id="template-affiliate-partner-account" .right-col | We must have a complete mailing address and a valid tax ID in order to process and mail payments due to all affiliates.  Per the terms of the affiliate agreement, if this information is not available within 90 days of the end of a calendar quarter, then any payment obligation due to the affiliate for such calendar quarter shall be considered fully and permanently discharged, and no further payment for such calendar quarter shall be due or payable to affiliate. br + br + | For fastest receipt of payment, please specify a PayPal.Me account. + br + br | So please provide this data, and be sure to keep it current! .left-col .affiliate-label Affiliate: .w80= "{{ data.partner_name }} ({{data.entity_type}})" br + br + .affiliate-label Street Address 1: = text_field_tag('affiliate_partner_address1', "{{ data.address.address1 }}", {class: 'w60'}) br @@ -69,6 +75,18 @@ script type="text/template" id="template-affiliate-partner-account" .affiliate-label Tax ID: = text_field_tag('affiliate_partner_tax_identifier', "{{ data.tax_identifier }}", {class: 'w60'}) br + br + .affiliate-label PayPal.Me: + = text_field_tag('affiliate_partner_paypal_id', "{{ data.paypal_id }}", { class: 'w60' }) + br + span style="padding-left:138px" + | A PayPal.Me link looks like  + b paypal.me/YourName + |  Please read more info  + a href="https://www.paypal.com/us/smarthelp/article/What-is-PayPalMe-FAQ3025" + | about PayPal.Me + br + br .spacer .input-buttons .right @@ -105,47 +123,9 @@ script type="text/template" id="template-affiliate-partner-signups" script type="text/template" id="template-affiliate-partner-links" .links p.prompt - | This page provides you with lists of ready-to-use links you can use to direct your followers to JamKazam.  - | These links include your unique affiliate ID, and users who follow these links to JamKazam and register for an account will be  - | tagged with your affiliate ID, so that you will be paid on their purchase per the terms of the  - a.affiliate-agreement rel='#' affiliate agreement - | . You can also find a  - a.affiliate-link-page href='#' rel="external" single page listing all affiliate links - |  which you can share with others who may need to share out affiliate links on your behalf. - .link-type-section - label Link Type: - select.link_type.easydropdown name="link_type" - option value="JamTrack Song" JamTrack Song - option value="JamTrack Band" JamTrack Band - option value="JamTrack General" JamTrack General - option value="JamKazam General" JamKazam General - option value="JamKazam Session" JamKazam Session - option value="JamKazam Recording" JamKazam Recording - option value="Custom Link" Custom Link - .link-type-prompt data-type='jamtrack_songs' - | These links take users directly to the "landing page" for a JamTrack - i.e. an individual piece of music. This would be a great fit, for example, if you have produced a YouTube tutorial on how to play a particular song, or if you have music notation for a particular song, etc. - .link-type-prompt data-type='jamtrack_bands' - | These links take users directly to the "landing page" for a band to promote all the JamTracks by that band, not just an individual song. This would be a great fit, for example, if you have music notation for several songs by a band, etc. - .link-type-prompt data-type='jamtrack_general' - | These links take users directly to a"landing page" that promotes JamTracks in general. This page will feature the song listed in the link as an example of a JamTrack, but the landing page is built to promote JamTracks in general versus promoting just the one song. This is a good fit if you want to let your followers know about JamTracks in general. - .link-type-prompt data-type='jamkazam' - | These links take users directly to a product page that promotes JamKazam more generally. This is a good fit if you want to let your followers know about JamKazam or its products in general. - .link-type-prompt data-type='sessions' - | These links take users to a page where they can listen to a session you have organized, and in which you are scheduled to perform, either alone or with others. This is a good fit if you can perform either solo or in a group with other musicians in a JamKazam session, and draw an audience to listen to your session. During the session, you can recommend that your audience members sign up for JamKazam from this page. Below is a list of your currently scheduled JamKazam sessions for which you may share links. - .link-type-prompt data-type='recordings' - | These links take users to a page with a recording you have made in a JamKazam session. This is a good fit if you have made a nice recording in a JamKazam session and can share it with your followers via Facebook, Twitter, email, and so on. Below is a list of your most recent JamKazam recordings for which you may share links. - .link-type-prompt data-type='custom_links' - p You may also link to any page on the JamKazam website and append the following text to the URL of the page to which you are linking: - - p.example-link - | ?utm_source=affiliate&utm_medium=affiliate&utm_campaign=2015-affiliate-custom&affiliate= - span.affiliate_id - - p For example, if you were linking to the JamKazam home page, you would combine https://www.jamkazam.com with the text above, and the result would be: - - p.example-link - | https://www.jamkazam.com?utm_source=affiliate&utm_medium=affiliate&utm_campaign=2015-affiliate-custom&affiliate= - span.affiliate_id + | This page provides you with a list of ready-to-use links you can share with your followers to let them know about JamKazam. These links include your unique affiliate ID, and users who follow these links to JamKazam and sign up for a JamKazam account will be tagged with your affiliate ID, so that when they purchase a subscription and/or JamTracks, you will be paid a revenue share on their purchase payments per the terms of the affiliate agreement. + p.prompt + | Click “select link” next to the link you want to use, then copy the link to the clipboard and paste it wherever you want to share it. table.links-table thead diff --git a/web/config/routes.rb b/web/config/routes.rb index eb0e323ab..8e08735c0 100644 --- a/web/config/routes.rb +++ b/web/config/routes.rb @@ -759,12 +759,13 @@ Rails.application.routes.draw do match '/live_streams/bad_audio' => 'api_alerts#bad_audio', :via => :post # used by client; don't change route # links generated to help affiliates share relevant links - get '/links/jamtrack_songs' => 'api_links#jamtrack_song_index' - get '/links/jamtrack_bands' => 'api_links#jamtrack_band_index' - get '/links/jamtrack_general' => 'api_links#jamtrack_general_index' - get '/links/jamkazam' => 'api_links#jamkazam_general_index' - get '/links/sessions' => 'api_links#session_index' - get '/links/recordings' => 'api_links#recording_index' + #get '/links/jamtrack_songs' => 'api_links#jamtrack_song_index' + #get '/links/jamtrack_bands' => 'api_links#jamtrack_band_index' + #get '/links/jamtrack_general' => 'api_links#jamtrack_general_index' + #get '/links/jamkazam' => 'api_links#jamkazam_general_index' + #get '/links/sessions' => 'api_links#session_index' + #get '/links/recordings' => 'api_links#recording_index' + get '/links/all' => 'api_links#all' match '/lesson_sessions' => 'api_lesson_sessions#index', :via => :get match '/lesson_bookings/unprocessed' => 'api_lesson_bookings#unprocessed', :via => :get