trusty-cms 7.0.29 → 7.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 520f342b36983dbca58c14ba3b104f212ed80c271797d63081212d8945ca7ade
4
- data.tar.gz: 8f0204809ddbd49f9d2db4dde486f92a05bd1da1f410b73764a6d79edab26b73
3
+ metadata.gz: 9ef6650284d438676ef388a1b002d3ff0acfe81dc068bcfafa9e1cb2814749f9
4
+ data.tar.gz: e6a980c1afa8435a04314a5b43b6788ecc4f743e9c7c32015245e15e0c8c0804
5
5
  SHA512:
6
- metadata.gz: 31fd3cb0dcbf88a788b127ac94404e9b813f6af5e09a2533eceab1b7974c821f9eae10884704df8ba59ad3c4a3ee7b5885a8b65024dcda1cfe0f1d6374b8db8e
7
- data.tar.gz: 5ba2f9d8b2bcbd0875d058a35e7035058beed413c835ae5ac3e66a579ecc9b14aad4a86714f8c12eaf16e877e4c5c88291260b4f243523193e8d7bfa0a9089e4
6
+ metadata.gz: 33d9139d690d376c8d4547b3d8c20cec750671050a9aa9378a197c3c28ab79cb04fda4403b17f2da86bdad23c5699d3dfdeef5f16db1469ad17c546464df89b8
7
+ data.tar.gz: f728eb8f4da2af5477ba994c9ccad2d5ac46620f0893295734a66035601c2317dc750985ec3b9d52518c786eebd1f5056a4f8dd301cb2beb4001f82e7d96835c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trusty-cms (7.0.29)
4
+ trusty-cms (7.0.30)
5
5
  RedCloth (= 4.3.3)
6
6
  activestorage-validator
7
7
  acts_as_list (>= 0.9.5, < 1.3.0)
data/README.md CHANGED
@@ -26,7 +26,6 @@ TrustyCMS features:
26
26
  * An advanced plugin system
27
27
  * Asset management & searching
28
28
  * Serve multiple sites (domains) from a single instance
29
- * Social sharing buttons
30
29
  * Reusable bits of content (Snippets)
31
30
  * Allows Rails controllers/actions to use Trusty CMS layouts as their "layout"
32
31
  * Operates in two modes: dev and production depending on the URL
@@ -2,12 +2,13 @@ require 'rqrcode'
2
2
 
3
3
  class Admin::SecurityController < ApplicationController
4
4
  before_action :authenticate_user!
5
- before_action :initialize_variables
6
- before_action :initialize_two_factor_variables, only: %i[show edit update]
5
+ before_action :set_user
6
+ before_action :set_template_names
7
+ before_action :ensure_otp_secret, only: %i[show edit]
8
+ before_action :set_two_factor_variables, only: %i[show edit]
7
9
 
8
10
  def show
9
11
  set_standard_body_style
10
- ensure_user_has_otp_secret
11
12
  render :edit
12
13
  end
13
14
 
@@ -26,8 +27,8 @@ class Admin::SecurityController < ApplicationController
26
27
  end
27
28
 
28
29
  def verify_two_factor
29
- if current_user.validate_and_consume_otp!(params[:otp_attempt])
30
- current_user.update!(otp_required_for_login: true)
30
+ if @user.validate_and_consume_otp!(params[:otp_attempt])
31
+ @user.update!(otp_required_for_login: true)
31
32
  redirect_to admin_security_path, notice: t('security_controller.two_factor_enabled')
32
33
  else
33
34
  flash[:error] = t('security_controller.two_factor_invalid_code')
@@ -36,7 +37,7 @@ class Admin::SecurityController < ApplicationController
36
37
  end
37
38
 
38
39
  def disable_two_factor
39
- if current_user.update!(otp_required_for_login: false)
40
+ if @user.update(otp_required_for_login: false, otp_secret: nil)
40
41
  redirect_to admin_security_path, notice: t('security_controller.two_factor_disabled')
41
42
  else
42
43
  flash[:error] = t('security_controller.two_factor_disabled_error')
@@ -46,26 +47,29 @@ class Admin::SecurityController < ApplicationController
46
47
 
47
48
  private
48
49
 
49
- def initialize_variables
50
- @user = current_user
50
+ def set_user
51
+ @user = current_user
52
+ end
53
+
54
+ def set_template_names
51
55
  @controller_name = 'user'
52
- @template_name = 'security'
56
+ @template_name = 'security'
53
57
  end
54
58
 
55
- def ensure_user_has_otp_secret
56
- return if current_user.otp_secret.present?
59
+ def ensure_otp_secret
60
+ return if @user.otp_secret.present?
57
61
 
58
- current_user.update!(otp_secret: User.generate_otp_secret)
62
+ @user.update!(otp_secret: User.generate_otp_secret)
59
63
  end
60
64
 
61
- def initialize_two_factor_variables
62
- @two_factor_enabled = current_user.otp_required_for_login
65
+ def set_two_factor_variables
66
+ @two_factor_enabled = @user.otp_required_for_login
63
67
 
64
- unless @two_factor_enabled
65
- otp_uri = current_user.otp_provisioning_uri(current_user.email, issuer: 'TrustyCMS')
66
- qr = RQRCode::QRCode.new(otp_uri)
67
- @qr_png_data = qr.as_png(size: 200).to_data_url
68
- end
68
+ return if @two_factor_enabled
69
+
70
+ otp_uri = @user.otp_provisioning_uri(@user.email, issuer: 'TrustyCMS')
71
+ qr = RQRCode::QRCode.new(otp_uri)
72
+ @qr_png_data = qr.as_png(size: 200).to_data_url
69
73
  end
70
74
 
71
75
  def security_params
@@ -45,6 +45,15 @@ class Admin::UsersController < Admin::ResourceController
45
45
  end
46
46
  end
47
47
 
48
+ def disable_2fa
49
+ user = User.find(params[:id])
50
+ user.update(
51
+ otp_required_for_login: false,
52
+ otp_secret: nil,
53
+ )
54
+ redirect_to admin_users_path
55
+ end
56
+
48
57
  private
49
58
 
50
59
  def user_params
@@ -931,22 +931,6 @@ module StandardTags
931
931
  end
932
932
  end
933
933
 
934
- desc 'Widget of sharing icons'
935
- tag 'rad_share_widget' do |tag|
936
- attributes = tag.attr.to_options
937
- url = attributes[:url].nil? ? request.url : attributes[:url]
938
- message = attributes[:message].nil? ? "Check out #{tag.locals.page.title}." : attributes[:message]
939
- email_subject = attributes[:email_subject].nil? ? tag.locals.page.title : attributes[:email_subject]
940
- email_message = attributes[:email_message].nil? ? "I thought you might be interested in this: #{url}" : "#{attributes[:email_message]} #{url}"
941
- email_action_url = attributes[:email_action_url].nil? ? '/rad_social/mail' : attributes[:email_action_url]
942
- request.env['action_controller.instance'].render_to_string partial: 'widget/horizontal_widget',
943
- locals: { url: url,
944
- message: message,
945
- email_subject: email_subject,
946
- email_message: email_message,
947
- email_action_url: email_action_url }
948
- end
949
-
950
934
  private
951
935
 
952
936
  def render_children_with_pagination(tag, opts = {})
@@ -47,7 +47,7 @@
47
47
  = image_tag @qr_png_data, alt: t('security_controller.qr_alt')
48
48
  %p
49
49
  = t('security_controller.manual_key_instructions')
50
- %strong= current_user.otp_secret
50
+ %strong= @user.otp_secret
51
51
 
52
52
  .form-margin-top
53
53
  = form_with url: verify_two_factor_admin_security_path, method: :post do |form|
@@ -11,8 +11,14 @@
11
11
  %th.user== #{t('name')} / #{t('username')}
12
12
  - thead.roles_header do
13
13
  %th.roles= t('roles')
14
+ - thead.two_factor_status_header do
15
+ %th.two_factor_status
16
+ = t('two_factor_authentication_status')
17
+ - thead.disable_two_factor_header do
18
+ %th.disable_two_factor
19
+ Disable 2FA
14
20
  - thead.actions_header do
15
- %th.actions{:style=>'width:9em'}= t('modify')
21
+ %th.actions= t('modify')
16
22
  - thead.last_sign_in_at_header do
17
23
  %th.last_sign_in_at= "Last Sign In"
18
24
  %tbody
@@ -24,6 +30,21 @@
24
30
  = link_to user.name, edit_admin_user_url(user)
25
31
  - tbody.roles_cell do
26
32
  %td.roles= roles(user)
33
+ - tbody.two_factor_status_cell do
34
+ %td.two_factor
35
+ - if user.otp_required_for_login
36
+ = t('enabled')
37
+ - else
38
+ = t('disabled')
39
+ - tbody.disable_two_factor_cell do
40
+ %td.actions
41
+ - if user.otp_required_for_login
42
+ - if !current_user.admin?
43
+ %span.action.disabled
44
+ %i.fas.fa-minus-circle
45
+ Disable
46
+ - else
47
+ = button_to 'Disable', disable_2fa_admin_user_path(user), method: :patch, data: { confirm: "Are you sure you want to disable 2FA for this user?" }
27
48
  - tbody.actions_cell do
28
49
  %td.actions
29
50
  - if !current_user.admin?
@@ -333,6 +333,7 @@ en:
333
333
  by: 'by'
334
334
  last_updated: 'Last Updated'
335
335
  two_factor_authentication: 'Two-Factor Authentication'
336
+ two_factor_authentication_status: '2FA Status'
336
337
  two_factor_controller:
337
338
  invalid_code: 'Invalid two-factor authentication code.'
338
339
  session_expired: 'Your session has expired. Please log in again.'
data/config/routes.rb CHANGED
@@ -4,8 +4,6 @@ TrustyCms::Application.routes.draw do
4
4
  controllers: { sessions: 'admin/sessions' },
5
5
  skip: :registration
6
6
  post '/page-status/refresh' => 'page_status#refresh'
7
- get '/rad_social/mail' => 'social_mailer#social_mail_form', as: :rad_social_mail_form
8
- post '/rad_social/mail' => 'social_mailer#create_social_mail', as: :rad_create_social_mail
9
7
  TrustyCms::Application.config.enabled_extensions.each do |ext|
10
8
  end
11
9
  namespace :admin do
@@ -20,6 +18,7 @@ TrustyCms::Application.routes.draw do
20
18
  end
21
19
  resources :users do
22
20
  get 'remove', on: :member
21
+ patch 'disable_2fa', on: :member
23
22
  end
24
23
  resources :snippets do
25
24
  get :remove, on: :member
@@ -49,7 +49,7 @@ module TrustyCms
49
49
  # can be used as a placeholder for all extensions not explicitly named.
50
50
 
51
51
  # An example of how to add extensions:
52
- # config.extensions = [ :snippets, :clipped, :layouts, :reorder, :multi_site, :rad_social]
52
+ # config.extensions = [ :snippets, :clipped, :layouts, :reorder, :multi_site ]
53
53
 
54
54
  config.extensions = []
55
55
 
@@ -205,8 +205,8 @@ module TrustyCms
205
205
  edit.form_bottom.concat %w{edit_buttons edit_timestamp}
206
206
  end
207
207
  user.index = RegionSet.new do |index|
208
- index.thead.concat %w{title_header roles_header actions_header last_sign_in_at_header}
209
- index.tbody.concat %w{title_cell roles_cell actions_cell last_sign_in_at_cell}
208
+ index.thead.concat %w{title_header roles_header two_factor_status_header disable_two_factor_header actions_header last_sign_in_at_header}
209
+ index.tbody.concat %w{title_cell roles_cell two_factor_status_cell disable_two_factor_cell actions_cell last_sign_in_at_cell}
210
210
  index.bottom.concat %w{new_button}
211
211
  end
212
212
  user.new = user.edit
@@ -18,9 +18,6 @@ module TrustyCms
18
18
  ckeditor/styles.js
19
19
  ckeditor/skins/moono/editor.css
20
20
  ckeditor/lang/en.js
21
- rad_social/rad_screen.css
22
- rad_social/rad_email.js
23
- rad_social/rad_widget.js
24
21
  )
25
22
  end
26
23
  end
@@ -1,3 +1,3 @@
1
1
  module TrustyCms
2
- VERSION = '7.0.29'.freeze
2
+ VERSION = '7.0.30'.freeze
3
3
  end
@@ -53,7 +53,7 @@ module TrustyCms
53
53
  # can be used as a placeholder for all extensions not explicitly named.
54
54
 
55
55
  # An example of how to add extensions:
56
- # config.extensions = [ :snippets, :clipped, :layouts, :reorder, :multi_site, :rad_social]
56
+ # config.extensions = [ :snippets, :clipped, :layouts, :reorder, :multi_site ]
57
57
 
58
58
  config.extensions = []
59
59
  config.extensions_migration_order = []
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trusty-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.29
4
+ version: 7.0.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - TrustyCms CMS dev team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-05-09 00:00:00.000000000 Z
11
+ date: 2025-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activestorage-validator
@@ -741,12 +741,6 @@ files:
741
741
  - app/assets/javascripts/admin/validations/user_validations.js
742
742
  - app/assets/javascripts/ckeditor/config.js
743
743
  - app/assets/javascripts/ckeditor/contents.css
744
- - app/assets/javascripts/rad_social/jquery.validate.min.js
745
- - app/assets/javascripts/rad_social/rad_ajax_form.js
746
- - app/assets/javascripts/rad_social/rad_email.js
747
- - app/assets/javascripts/rad_social/rad_email_form.js
748
- - app/assets/javascripts/rad_social/rad_email_validator.js
749
- - app/assets/javascripts/rad_social/rad_widget.js
750
744
  - app/assets/stylesheets/admin/_base.scss
751
745
  - app/assets/stylesheets/admin/_multi_site_main.scss
752
746
  - app/assets/stylesheets/admin/_reset.scss
@@ -778,7 +772,6 @@ files:
778
772
  - app/assets/stylesheets/admin/partials/_treetable.scss
779
773
  - app/assets/stylesheets/admin/partials/_typography.scss
780
774
  - app/assets/stylesheets/admin/partials/_validations.scss
781
- - app/assets/stylesheets/rad_social/rad_screen.scss
782
775
  - app/controllers/admin/assets_controller.rb
783
776
  - app/controllers/admin/configuration_controller.rb
784
777
  - app/controllers/admin/extensions_controller.rb
@@ -799,7 +792,6 @@ files:
799
792
  - app/controllers/application_controller.rb
800
793
  - app/controllers/page_status_controller.rb
801
794
  - app/controllers/site_controller.rb
802
- - app/controllers/social_mailer_controller.rb
803
795
  - app/helpers/admin/configuration_helper.rb
804
796
  - app/helpers/admin/export_helper.rb
805
797
  - app/helpers/admin/extensions_helper.rb
@@ -815,13 +807,11 @@ files:
815
807
  - app/helpers/admin/users_helper.rb
816
808
  - app/helpers/admin/welcome_helper.rb
817
809
  - app/helpers/application_helper.rb
818
- - app/helpers/rad_social_helper.rb
819
810
  - app/helpers/scoped_helper.rb
820
811
  - app/helpers/site_helper.rb
821
812
  - app/helpers/sites_helper.rb
822
813
  - app/mailers/application_mailer.rb
823
814
  - app/mailers/devise_mailer.rb
824
- - app/mailers/rad_social_mailer.rb
825
815
  - app/models/admins_site.rb
826
816
  - app/models/asset.rb
827
817
  - app/models/asset_type.rb
@@ -931,12 +921,8 @@ files:
931
921
  - app/views/layouts/mail.html.haml
932
922
  - app/views/layouts/mailer.text.haml
933
923
  - app/views/layouts/trusty.html.haml
934
- - app/views/rad_social_mailer/social_mail.html.haml
935
- - app/views/rad_social_mailer/social_mail_form.html.haml
936
924
  - app/views/site/not_found.html.haml
937
925
  - app/views/site/show_page.html.haml
938
- - app/views/widget/_email_form.html.haml
939
- - app/views/widget/_horizontal_widget.html.haml
940
926
  - bin/rails
941
927
  - bin/trusty_cms
942
928
  - config.ru
@@ -1,4 +0,0 @@
1
- /*! jQuery Validation Plugin - v1.13.0 - 7/1/2014
2
- * http://jqueryvalidation.org/
3
- * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */
4
- !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.validateDelegate(":submit","click",function(b){c.settings.submitHandler&&(c.submitButton=b.target),a(b.target).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(b.target).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.submit(function(b){function d(){var d;return c.settings.submitHandler?(c.submitButton&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),!1):!0}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c;return a(this[0]).is("form")?b=this.validate().form():(b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b})),b},removeAttrs:function(b){var c={},d=this;return a.each(b.split(/\s/),function(a,b){c[b]=d.attr(b),d.removeAttr(b)}),c},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(b,c){i[c]=f[c],delete f[c],"required"===c&&a(j).removeAttr("aria-required")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr("aria-required","true")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}),a.extend(a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){return!!a.trim(""+a(b).val())},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&!this.blockFocusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(a,b){(9!==b.which||""!==this.elementValue(a))&&(a.name in this.submitted||a===this.lastElement)&&this.element(a)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date ( ISO ).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c=a.data(this[0].form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!this.is(e.ignore)&&e[d].call(c,this[0],b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox']","focusin focusout keyup",b).validateDelegate("select, option, [type='radio'], [type='checkbox']","click",b),this.settings.invalidHandler&&a(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler),a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required","true")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c=this.clean(b),d=this.validationTargetFor(c),e=!0;return this.lastElement=d,void 0===d?delete this.invalid[c.name]:(this.prepareElement(d),this.currentElements=a(d),e=this.check(d)!==!1,e?delete this.invalid[d.name]:this.invalid[d.name]=!0),a(b).attr("aria-invalid",!e),this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),e},showErrors:function(b){if(b){a.extend(this.errorMap,b),this.errorList=[];for(var c in b)this.errorList.push({message:b[c],element:this.findByName(c)[0]});this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue").removeAttr("aria-invalid")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){return!this.name&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in c||!b.objectLength(a(this).rules())?!1:(c[this.name]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([]),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d=a(b),e=b.type;return"radio"===e||"checkbox"===e?a("input[name='"+b.name+"']:checked").val():"number"===e&&"undefined"!=typeof b.validity?b.validity.badInput?!1:d.val():(c=d.val(),"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),"dependency-mismatch"===c&&1===g){h=!0;continue}if(h=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(j){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",j),j}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a];return void 0},defaultMessage:function(b,c){return this.findDefined(this.customMessage(b.name,c),this.customDataMessage(b,c),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c],"<strong>Warning: No message defined for "+b.name+"</strong>")},formatAndAdd:function(b,c){var d=this.defaultMessage(b,c.method),e=/\$?\{(\d+)\}/g;"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),this.errorList.push({message:d,element:b,method:c.method}),this.errorMap[b.name]=d,this.submitted[b.name]=d},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g=this.errorsFor(b),h=this.idOrName(b),i=a(b).attr("aria-describedby");g.length?(g.removeClass(this.settings.validClass).addClass(this.settings.errorClass),g.html(c)):(g=a("<"+this.settings.errorElement+">").attr("id",h+"-error").addClass(this.settings.errorClass).html(c||""),d=g,this.settings.wrapper&&(d=g.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement(d,a(b)):d.insertAfter(b),g.is("label")?g.attr("for",h):0===g.parents("label[for='"+h+"']").length&&(f=g.attr("id"),i?i.match(new RegExp("\b"+f+"\b"))||(i+=" "+f):i=f,a(b).attr("aria-describedby",i),e=this.groups[b.name],e&&a.each(this.groups,function(b,c){c===e&&a("[name='"+b+"']",this.currentForm).attr("aria-describedby",g.attr("id"))}))),!c&&this.settings.success&&(g.text(""),"string"==typeof this.settings.success?g.addClass(this.settings.success):this.settings.success(g,b)),this.toShow=this.toShow.add(g)},errorsFor:function(b){var c=this.idOrName(b),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+d.replace(/\s+/g,", #")),this.errors().filter(e)},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(a){return this.checkable(a)&&(a=this.findByName(a.name).not(this.settings.ignore)[0]),a},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+b+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):!0},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(a){this.pending[a.name]||(this.pendingRequest++,this.pending[a.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b){return a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),/min|max/.test(c)&&(null===g||/number|range|text/.test(g))&&(d=Number(d)),d||0===d?e[c]=d:g===c&&"range"!==g&&(e[c]=!0);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b);for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),void 0!==d&&(e[c]=d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0!==e.param?e.param:!0:delete b[d]}}),a.each(b,function(d,e){b[d]=a.isFunction(e)?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(b.min&&b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),b.minlength&&b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:a.trim(b).length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(a.trim(b),c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(a.trim(b),c);return this.optional(c)||d>=e},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(a.trim(b),c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||c>=a},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d){if(this.optional(c))return"dependency-mismatch";var e,f,g=this.previousValue(c);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),g.originalMessage=this.settings.messages[c.name].remote,this.settings.messages[c.name].remote=g.message,d="string"==typeof d&&{url:d}||d,g.old===b?g.valid:(g.old=b,e=this,this.startRequest(c),f={},f[c.name]=b,a.ajax(a.extend(!0,{url:d,mode:"abort",port:"validate"+c.name,dataType:"json",data:f,context:e.currentForm,success:function(d){var f,h,i,j=d===!0||"true"===d;e.settings.messages[c.name].remote=g.originalMessage,j?(i=e.formSubmitted,e.prepareElement(c),e.formSubmitted=i,e.successList.push(c),delete e.invalid[c.name],e.showErrors()):(f={},h=d||e.defaultMessage(c,"remote"),f[c.name]=g.message=a.isFunction(h)?h(b):h,e.invalid[c.name]=!0,e.showErrors(f)),g.valid=j,e.stopRequest(c,j)}},d)),"pending")}}}),a.format=function(){throw"$.format has been deprecated. Please use $.validator.format instead."};var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a.extend(a.fn,{validateDelegate:function(b,c,d){return this.bind(c,function(c){var e=a(c.target);return e.is(b)?d.apply(e,arguments):void 0})}})});
@@ -1,82 +0,0 @@
1
- function RadAjaxForm(form) {
2
- var self = this;
3
- this.submitWithoutValidation = function(onSuccess, onError, onComplete) {
4
- if (onError === undefined) {
5
- onError = function() {
6
- };
7
- }
8
- if (onComplete === undefined) {
9
- onComplete = function() {
10
- };
11
- }
12
-
13
- form.find(".loader").addClass('ajax-loader');
14
- form.find(".loader-small").addClass('ajax-loader-small');
15
- $.ajax({
16
- type: "POST",
17
- url: form.find('input[name=submit_url]').attr('value'),
18
- data: form.serialize(),
19
- beforeSend: function ( xhr ) {
20
- xhr.setRequestHeader("X-CSRF-Token", $('meta[name=csrf-token]').attr('content'));
21
- },
22
- success: function(data, status, xhr) {
23
- form.find(".loader").removeClass('ajax-loader');
24
- form.find(".loader-small").removeClass('ajax-loader-small');
25
- onSuccess(data, status, xhr);
26
- },
27
- error: function(data) {
28
- form.find(".loader").removeClass('ajax-loader');
29
- form.find(".loader-small").removeClass('ajax-loader-small');
30
- form.find('.continue').attr('disabled', false);
31
- onError(data);
32
- },
33
- complete: onComplete
34
- });
35
- form.find('.continue').attr('disabled', 'disabled');
36
- return true;
37
- };
38
-
39
- this.defaultSubmitWithoutValidation = function() {
40
- this.submitWithoutValidation(handleSuccess, handleFailure);
41
- };
42
-
43
- this.submit = function(onSuccess, onError, onComplete) {
44
- if (onComplete === undefined) {
45
- onComplete = function() {
46
- };
47
- }
48
-
49
- if (onError === undefined) {
50
- onError = handleFailure;
51
- }
52
-
53
- if (!form.valid()) {
54
- onComplete();
55
- return true;
56
- }
57
- return self.submitWithoutValidation(onSuccess, onError, onComplete);
58
- };
59
-
60
-
61
- function handleSuccess(data, status, xhr)
62
- {
63
- var url = xhr.getResponseHeader("BrowserRedirectTo");
64
- if (url) {
65
- location.href = url
66
- }
67
- }
68
-
69
- function handleFailure(xhr) {
70
- var errorMessage = xhr.getResponseHeader("ErrorMsg");
71
- var errorMessageDialog = new ModalDialog('', function(element) {
72
- return {
73
- autoOpen: false,
74
- minHeight: 20,
75
- title: "We're Sorry!",
76
- dialogClass: 'seat-error-dialog'
77
- };
78
- });
79
- errorMessageDialog.show(errorMessage);
80
- }
81
-
82
- }
@@ -1,5 +0,0 @@
1
- //= require jquery
2
- //= require 'rad_social/jquery.validate.min'
3
- //= require 'rad_social/rad_ajax_form'
4
- //= require 'rad_social/rad_email_validator'
5
- //= require 'rad_social/rad_email_form'
@@ -1,80 +0,0 @@
1
- $(document).ready(function() {
2
-
3
- var radModal;
4
-
5
- function centeredPopup(url,w,h){
6
- var popupWindow = null;
7
- LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
8
- TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
9
- settings =
10
- 'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition;
11
- popupWindow = window.open(url,"Share",settings);
12
- }
13
-
14
- $(".rad-window-close").click(function(event) {
15
- event.preventDefault();
16
- $("#rad-social-email-form").fadeToggle('slow');
17
- });
18
-
19
- $(".rad-popup-window").click(function(event){
20
- event.preventDefault();
21
- var url = $(this).attr("href");
22
- centeredPopup(url, 625, 430)
23
-
24
- });
25
-
26
- var form = $("#rad-social-email-form");
27
-
28
- validator = form.validate({
29
- submitHandler: function(form) {
30
- var button = $('#rad_email_submit');
31
- button.attr('disabled', true);
32
- button.removeClass('primary-button').addClass('disabled-button');
33
- form.submit();
34
- clear_form();
35
- }
36
- });
37
-
38
-
39
- var radEmailValidator = new RadEmailValidator(form);
40
- radEmailValidator.addRules();
41
-
42
- form.find('#rad_email_submit').click(function(e) {
43
- return new RadAjaxForm(form).submit(OnSuccess, OnError, OnComplete);
44
- });
45
-
46
- function OnSuccess(data) {
47
- $("#rad-social-email-form").addClass('hidden');
48
- $("#rad-confirmation").removeClass('hidden');
49
-
50
- }
51
-
52
- function OnError(xhr) {
53
- processFailure(xhr);
54
- }
55
-
56
- function OnComplete() {
57
- //$('#express_contact_form').find('.continue').attr('disabled', false);
58
- //$('#express_contact_form').find(".loader").removeClass('ajax-loader');
59
- }
60
-
61
- function clear_form(){
62
- $('#rs-from').val('');
63
- $('#rs-from_name').val('');
64
- $('#rs-to').val('');
65
- $('#rs-message').val($('#rs-base-message').val());
66
- }
67
-
68
- function processFailure(xhr) {
69
- var error_msg = xhr.getResponseHeader("ErrorMsg");
70
- displayErrorMessage(error_msg);
71
- }
72
-
73
- function displayErrorMessage(msg) {
74
- var error_msg_div = $('.rad-email-error');
75
- error_msg_div.text(msg);
76
- error_msg_div.show();
77
- }
78
-
79
-
80
- });
@@ -1,47 +0,0 @@
1
- function RadEmailValidator(parentElement) {
2
- var rules = {
3
- "rs-from": {
4
- required: true,
5
- email: true,
6
- messages: {
7
- required: "From email is required."
8
- }
9
- },
10
- "rs-from_name": {
11
- required: true,
12
- messages: {
13
- required: "From name is required."
14
- }
15
- },
16
- "rs-to": {
17
- required: true,
18
- email: true,
19
- messages: {
20
- required: "To email is required"
21
- }
22
- },
23
- "rs-message": {
24
- required: true,
25
- messages: {
26
- required: "Email message is required."
27
- }
28
- }
29
- };
30
-
31
- this.addRules = function() {
32
- for (var key in rules) {
33
- $(parentElement).find("[id$=" + key + "]").rules("add", rules[key]);
34
- }
35
- };
36
-
37
- this.removeRules = function() {
38
- for (var key in rules) {
39
- $(parentElement).find("[id$=" + key + "]").rules("remove");
40
- }
41
- };
42
-
43
- function elementKeyFor(key) {
44
- return "[id$=" + parentElement.attr('id') + '_' + key + ']';
45
- }
46
-
47
- }
@@ -1,20 +0,0 @@
1
- $(document).ready(function() {
2
-
3
- function centeredPopup(url,w,h){
4
- var popupWindow = null;
5
- LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
6
- TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
7
- settings =
8
- 'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition;
9
- popupWindow = window.open(url,"Share",settings);
10
- }
11
-
12
- $(".rad-popup-window").click(function(event){
13
- event.preventDefault();
14
- var url = $(this).attr("href");
15
- centeredPopup(url, 625, 430)
16
-
17
- });
18
-
19
-
20
- });
@@ -1,141 +0,0 @@
1
- .rad-icon {
2
- float: left;
3
- padding-right: 3px;
4
-
5
- .rad-facebook {
6
- background-image: url("rad_social/facebook.png");
7
- }
8
-
9
- .rad-twitter {
10
- background-image: url("rad_social/twitter.png");
11
- }
12
-
13
- .rad-email {
14
- background-image: url("rad_social/email.png");
15
- }
16
- }
17
-
18
- .rad-email-form {
19
- padding: 15px;
20
- position: relative;
21
- }
22
-
23
- .hidden {
24
- display: none;
25
- }
26
-
27
- .rad-dialog-titlebar {
28
- background: #EDEDED;
29
- height: 2em;
30
- padding: .5em .3em .3em 1em;
31
- }
32
-
33
- .rad-dialog-title {
34
- float: left;
35
- font-weight: bold;
36
- margin: .3em 0 .2em;
37
- }
38
-
39
- #rad-social-email-form .form-row .form-fields {
40
- float: left;
41
- width: 60%;
42
- }
43
-
44
- #rad-social-email-form .form-row .input-textbox {
45
- display: block;
46
- font-size: 12px;
47
- }
48
-
49
-
50
- .rad-email-form #rad_email_submit {
51
- float: right;
52
- }
53
-
54
- .rad-email-form input.std_input {
55
- margin-bottom: 10px;
56
- }
57
-
58
- .rad-email-form select {
59
- background-color: #fff;
60
- border: 1px solid #ccc;
61
- color: #6e6e6e;
62
- font: 14px "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;
63
- margin-bottom: 10px;
64
- }
65
-
66
- #rad-social-email-form .form-label {
67
- display: block;
68
- float: left;
69
- padding: 5px 10px 0 0;
70
- text-align: left;
71
- width: 15%;
72
- }
73
-
74
- #rad-social-email-form .form-row {
75
- clear: both;
76
- overflow: auto;
77
- padding: 5px;
78
- }
79
-
80
-
81
- .rad-email-form input.std_input,
82
- .rad-email-form textarea {
83
- border: 1px solid #ccc;
84
- color: #6e6e6e;
85
- font: 15px "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;
86
- padding: 5px;
87
- width: 97%;
88
- }
89
-
90
- .rad-email-form table {
91
- width: 100%;
92
- }
93
-
94
- .rad-email-form table input.std_input {
95
- width: 93%;
96
- }
97
-
98
- .rad-email-form table.three-col input.std_input {
99
- width: 90%;
100
- }
101
-
102
- .rad-email-form input.form_but {
103
- background-color: #93ba31;
104
- border: 3px solid #afdd39;
105
- color: #fff;
106
- font: bold 15px "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;
107
- margin-top: 10px;
108
- padding: 5px 10px;
109
- }
110
-
111
- input.error {
112
- border: 1px solid #CD0A0A !important;
113
- color: #CD0A0A !important;
114
- font-family: Arial, Helvetica, sans-serif !important;
115
- }
116
-
117
- .rad-email-error, label.error {
118
- color: #CD0A0A !important;
119
- display: block;
120
- font-family: Arial, Helvetica, sans-serif !important;
121
- padding: 5px 0px !important;
122
- }
123
-
124
- #rad-confirmation {
125
- font-weight: bold;
126
- padding-top: 25px;
127
- text-align: center;
128
- }
129
-
130
- body .ajax-loader {
131
- background: transparent none no-repeat 50% 50%;
132
- background-image: url("ajax-loader.gif");
133
- height: 35px;
134
- }
135
-
136
- body #rad-social-email-form .primary-button {
137
- background: transparent none repeat-x scroll 0 0;
138
- background-image: url("bg_primary-btn.png"); /* sprite-ref: cd-backgrounds-sprite; sprite-alignment: repeat; */
139
- border: 1px solid #924900;
140
- color: white !important;
141
- }
@@ -1,26 +0,0 @@
1
- class SocialMailerController < ApplicationController
2
- include ShareLayouts::Controllers::ActionController
3
- trusty_layout 'default', { only: :create_social_mail }
4
- # no_login_required
5
- skip_before_action :authenticate_user!
6
-
7
- def create_social_mail
8
- mailer_options = {
9
- to: params[:to],
10
- from: params[:from],
11
- from_name: params[:from_name],
12
- message: params[:message],
13
- subject: params[:subject],
14
- }
15
- end
16
-
17
- def social_mail_form
18
- render template: 'rad_social_mailer/social_mail_form',
19
- layout: false,
20
- locals: {
21
- email_message: params[:email_message],
22
- email_subject: params[:email_subject],
23
- email_action_url: params[:email_action_url],
24
- }
25
- end
26
- end
@@ -1,20 +0,0 @@
1
- module RadSocialHelper
2
- def rad_test_method
3
- 'SURPRISE SURPRISE SURPRISE'
4
- end
5
-
6
- def rad_share_widget(options)
7
- url = options[:url].nil? ? request.url : options[:url]
8
- message = options[:message].nil? ? "Check out #{options[:title]}." : options[:message]
9
- email_subject = options[:email_subject].nil? ? options[:title] : options[:email_subject]
10
- email_message = options[:email_message].nil? ? "I thought you might be interested in this: #{url}" : "#{options[:email_message]} #{url}"
11
- email_action_url = options[:email_action_url].nil? ? '/rad_social/mail' : options[:email_action_url]
12
-
13
- render partial: 'widget/horizontal_widget',
14
- locals: { url: url,
15
- message: message,
16
- email_subject: email_subject,
17
- email_message: email_message,
18
- email_action_url: email_action_url }
19
- end
20
- end
@@ -1,25 +0,0 @@
1
- require 'roadie-rails'
2
-
3
- class RadSocialMailer < ApplicationMailer
4
- include Roadie::Rails::Automatic
5
-
6
- def social_mail(options)
7
- from_address = Mail::Address.new options[:from] # ex: "john@example.com"
8
- from_address.display_name = options[:from_name] # ex: "John Doe"
9
-
10
- @from_name = from_address.display_name
11
- @from_email = from_address
12
- @message = options[:message]
13
- @actual_from = ENV.fetch('RAD_SOCIAL_FROM_EMAIL')
14
- @actual_from = from_address if @actual_from.nil?
15
-
16
- mail({
17
- to: options[:to],
18
- from: @actual_from,
19
- reply_to: @from_email,
20
- subject: options[:subject],
21
- text: @message,
22
- content_type: 'text/html',
23
- })
24
- end
25
- end
@@ -1,5 +0,0 @@
1
- %div
2
- %p
3
- = "From: #{@from_name} (#{@from_email})"
4
- %p
5
- = @message
@@ -1,39 +0,0 @@
1
- = stylesheet_link_tag('rad_social/rad_screen')
2
- = javascript_include_tag('rad_social/rad_email')
3
- = csrf_meta_tags
4
-
5
- .rad-dialog-titlebar
6
- %span.rad-dialog-title
7
- Email a Friend
8
-
9
- %form{:id=>'rad-social-email-form', :class=>'rad-email-form'}
10
- .rad-email-error
11
- %div.form-row
12
- %label.form-label{:type=>'label', :for=>'from'}
13
- From Email
14
- %div.form-fields
15
- %input{:class => 'input-textbox', :type => 'text', :id => 'rs-from', :name => 'from', :size => 30, :maxlength => 35}
16
- %div.form-row
17
- %label.form-label{:type=>'label', :for=>'from_name'}
18
- From Name
19
- %div.form-fields
20
- %input{:class => 'input-textbox', :type => 'text', :id => 'rs-from_name', :name => 'from_name', :size => 30, :maxlength => 35}
21
- %div.form-row
22
- %label.form-label{:type=>'label', :for=>'to'}
23
- To Email
24
- %div.form-fields
25
- %input{:class => 'input-textbox', :type => 'text', :id => 'rs-to', :name => 'to', :size => 30, :maxlength => 35}
26
- %div.form-row
27
- %label.form-label{:type=>'label', :for=>'message'}
28
- Message
29
- %div.form-fields
30
- %textarea{:class => 'input-textbox', :id => 'rs-message', :name => 'message', :rows => 5, :cols => 40}
31
- = email_message
32
- %input{:type=>'hidden', :name=>'subject', :value=> email_subject}
33
- %input{:type=>'hidden', :id=>'rs-base-message', :value=> email_message}
34
- %input{:type=>'hidden', :name=>'submit_url', :value=> email_action_url}
35
- %input.button.primary-button{:id => 'rad_email_submit', :type=>:button ,:value=>'Submit'}
36
- .loader
37
-
38
- #rad-confirmation.hidden
39
- Your message has been sent.
@@ -1,20 +0,0 @@
1
- = form_tag
2
- %form{:id=>'rad_social_email_form', :class=>'rad-email-form'}
3
- %label{:for => 'from'}
4
- Your Email:
5
- %input{:class => 'std_input', :type => 'text', :id => 'rs-from', :name => 'from', :size => 40, :maxlength => 35}
6
- %label{:for => 'from_name'}
7
- Your Name:
8
- %input{:class => 'std_input', :type => 'text', :id => 'rs-from_name', :name => 'from_name', :size => 40, :maxlength => 35}
9
- %label{:for => 'to'}
10
- To:
11
- %input{:class => 'std_input', :type => 'text', :id => 'rs-to', :name => 'to', :size => 40, :maxlength => 35}
12
- %label{:for => 'subject'}
13
- To:
14
- %input{:class => 'std_input', :type => 'text', :id => 'rs-subject', :name => 'subject', :size => 40, :maxlength => 35}
15
- %label{:for => 'Message'}
16
- Message:
17
- %textarea{:id => 'rs-message', :rows => 18, :cols => 40}
18
- %input{:type=>'hidden', :name=>'submit_url', :value=>'contact/email'}
19
- %input.button.primary-button{:id => 'email_submit', :type=>:button ,:value=>'Submit'}
20
- .loader
@@ -1,16 +0,0 @@
1
- = stylesheet_link_tag('rad_social/rad_screen')
2
- = javascript_include_tag('rad_social/rad_widget', async: 'true')
3
- - local_variables = defined?(locals) ? locals : local_assigns
4
- - url = local_variables[:url]
5
- - message = local_variables[:message]
6
- - email_action_url = local_variables[:email_action_url]
7
- - email_subject = local_variables[:email_subject]
8
- - email_message = local_variables[:email_message]
9
-
10
- .rad-widget
11
- .rad-icon
12
- %a{:class => 'rad-popup-window rad-facebook', :href => "https://www.facebook.com/sharer/sharer.php?u=#{CGI::escape(url)}", :target=> '_blank'}
13
- .rad-icon
14
- %a{:class => 'rad-popup-window rad-twitter', :href => "https://twitter.com/intent/tweet?text=#{CGI::escape(message + " " + url)}", :target=> '_blank'}
15
- .rad-icon
16
- %a{:class => 'rad-popup-window rad-email', :href => rad_social_mail_form_url(:email_subject => email_subject, :email_message => email_message, :email_action_url => email_action_url)}