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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +0 -1
- data/app/controllers/admin/security_controller.rb +23 -19
- data/app/controllers/admin/users_controller.rb +9 -0
- data/app/models/standard_tags.rb +0 -16
- data/app/views/admin/security/edit.html.haml +1 -1
- data/app/views/admin/users/index.html.haml +22 -1
- data/config/locales/en.yml +1 -0
- data/config/routes.rb +1 -2
- data/lib/generators/trusty_cms/templates/application.rb.erb +1 -1
- data/lib/trusty_cms/admin_ui.rb +2 -2
- data/lib/trusty_cms/engine.rb +0 -3
- data/lib/trusty_cms/version.rb +1 -1
- data/spec/dummy/config/application.rb +1 -1
- metadata +2 -16
- data/app/assets/javascripts/rad_social/jquery.validate.min.js +0 -4
- data/app/assets/javascripts/rad_social/rad_ajax_form.js +0 -82
- data/app/assets/javascripts/rad_social/rad_email.js +0 -5
- data/app/assets/javascripts/rad_social/rad_email_form.js +0 -80
- data/app/assets/javascripts/rad_social/rad_email_validator.js +0 -47
- data/app/assets/javascripts/rad_social/rad_widget.js +0 -20
- data/app/assets/stylesheets/rad_social/rad_screen.scss +0 -141
- data/app/controllers/social_mailer_controller.rb +0 -26
- data/app/helpers/rad_social_helper.rb +0 -20
- data/app/mailers/rad_social_mailer.rb +0 -25
- data/app/views/rad_social_mailer/social_mail.html.haml +0 -5
- data/app/views/rad_social_mailer/social_mail_form.html.haml +0 -39
- data/app/views/widget/_email_form.html.haml +0 -20
- data/app/views/widget/_horizontal_widget.html.haml +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ef6650284d438676ef388a1b002d3ff0acfe81dc068bcfafa9e1cb2814749f9
|
4
|
+
data.tar.gz: e6a980c1afa8435a04314a5b43b6788ecc4f743e9c7c32015245e15e0c8c0804
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33d9139d690d376c8d4547b3d8c20cec750671050a9aa9378a197c3c28ab79cb04fda4403b17f2da86bdad23c5699d3dfdeef5f16db1469ad17c546464df89b8
|
7
|
+
data.tar.gz: f728eb8f4da2af5477ba994c9ccad2d5ac46620f0893295734a66035601c2317dc750985ec3b9d52518c786eebd1f5056a4f8dd301cb2beb4001f82e7d96835c
|
data/Gemfile.lock
CHANGED
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 :
|
6
|
-
before_action :
|
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
|
30
|
-
|
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
|
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
|
50
|
-
@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
|
56
|
+
@template_name = 'security'
|
53
57
|
end
|
54
58
|
|
55
|
-
def
|
56
|
-
return if
|
59
|
+
def ensure_otp_secret
|
60
|
+
return if @user.otp_secret.present?
|
57
61
|
|
58
|
-
|
62
|
+
@user.update!(otp_secret: User.generate_otp_secret)
|
59
63
|
end
|
60
64
|
|
61
|
-
def
|
62
|
-
@two_factor_enabled =
|
65
|
+
def set_two_factor_variables
|
66
|
+
@two_factor_enabled = @user.otp_required_for_login
|
63
67
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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
|
data/app/models/standard_tags.rb
CHANGED
@@ -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=
|
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
|
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?
|
data/config/locales/en.yml
CHANGED
@@ -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
|
52
|
+
# config.extensions = [ :snippets, :clipped, :layouts, :reorder, :multi_site ]
|
53
53
|
|
54
54
|
config.extensions = []
|
55
55
|
|
data/lib/trusty_cms/admin_ui.rb
CHANGED
@@ -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
|
data/lib/trusty_cms/engine.rb
CHANGED
data/lib/trusty_cms/version.rb
CHANGED
@@ -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
|
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.
|
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-
|
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,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,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)}
|