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}