usman 0.1.6dev2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/android-icon-144x144.png +0 -0
  3. data/app/assets/images/android-icon-192x192.png +0 -0
  4. data/app/assets/images/android-icon-36x36.png +0 -0
  5. data/app/assets/images/android-icon-48x48.png +0 -0
  6. data/app/assets/images/android-icon-72x72.png +0 -0
  7. data/app/assets/images/android-icon-96x96.png +0 -0
  8. data/app/assets/images/apple-icon-114x114.png +0 -0
  9. data/app/assets/images/apple-icon-120x120.png +0 -0
  10. data/app/assets/images/apple-icon-144x144.png +0 -0
  11. data/app/assets/images/apple-icon-152x152.png +0 -0
  12. data/app/assets/images/apple-icon-180x180.png +0 -0
  13. data/app/assets/images/apple-icon-57x57.png +0 -0
  14. data/app/assets/images/apple-icon-60x60.png +0 -0
  15. data/app/assets/images/apple-icon-72x72.png +0 -0
  16. data/app/assets/images/apple-icon-76x76.png +0 -0
  17. data/app/assets/images/apple-icon-precomposed.png +0 -0
  18. data/app/assets/images/apple-icon.png +0 -0
  19. data/app/assets/images/browserconfig.xml +2 -0
  20. data/app/assets/images/favicon-16x16.png +0 -0
  21. data/app/assets/images/favicon-32x32.png +0 -0
  22. data/app/assets/images/favicon-96x96.png +0 -0
  23. data/app/assets/images/favicon.ico +0 -0
  24. data/app/assets/images/logo-on-white.png +0 -0
  25. data/app/assets/images/logo-small.png +0 -0
  26. data/app/assets/images/logo.png +0 -0
  27. data/app/assets/images/manifest.json +41 -0
  28. data/app/assets/images/ms-icon-144x144.png +0 -0
  29. data/app/assets/images/ms-icon-150x150.png +0 -0
  30. data/app/assets/images/ms-icon-310x310.png +0 -0
  31. data/app/assets/images/ms-icon-70x70.png +0 -0
  32. data/app/assets/sketches/logo.sketch +0 -0
  33. data/app/controllers/api/v1/base_controller.rb +13 -0
  34. data/app/controllers/api/v1/registrations_controller.rb +41 -0
  35. data/app/controllers/usman/admin_controller.rb +26 -0
  36. data/app/controllers/usman/application_controller.rb +16 -0
  37. data/app/controllers/usman/dashboard_controller.rb +26 -0
  38. data/app/controllers/usman/features_controller.rb +83 -0
  39. data/app/controllers/usman/my_account_controller.rb +25 -0
  40. data/app/controllers/usman/permissions_controller.rb +85 -0
  41. data/app/controllers/usman/resource_controller.rb +21 -0
  42. data/app/controllers/usman/roles_controller.rb +68 -0
  43. data/app/controllers/usman/sessions_controller.rb +4 -1
  44. data/app/controllers/usman/user_roles_controller.rb +141 -0
  45. data/app/controllers/usman/users_controller.rb +133 -0
  46. data/app/helpers/usman/api_helper.rb +79 -0
  47. data/app/helpers/usman/authentication_helper.rb +21 -7
  48. data/app/models/device.rb +149 -0
  49. data/app/models/feature.rb +11 -7
  50. data/app/models/permission.rb +17 -13
  51. data/app/models/registration.rb +108 -0
  52. data/app/models/role.rb +11 -7
  53. data/app/models/user.rb +19 -13
  54. data/app/services/usman/mobile_registration_service.rb +127 -0
  55. data/app/views/layouts/kuppayam/_sidebar.html.erb +39 -19
  56. data/app/views/layouts/kuppayam/profile.html.erb +120 -0
  57. data/app/views/usman/dashboard/index.html.erb +118 -0
  58. data/app/views/usman/{admin/features → features}/_form.html.erb +1 -1
  59. data/app/views/usman/{admin/features → features}/_index.html.erb +10 -10
  60. data/app/views/usman/{admin/features → features}/_row.html.erb +10 -10
  61. data/app/views/usman/{admin/features → features}/_show.html.erb +2 -2
  62. data/app/views/usman/{admin/features → features}/index.html.erb +4 -4
  63. data/app/views/usman/my_account/index.html.erb +1 -0
  64. data/app/views/usman/{admin/permissions → permissions}/_form.html.erb +1 -1
  65. data/app/views/usman/{admin/permissions → permissions}/_index.html.erb +2 -2
  66. data/app/views/usman/{admin/permissions → permissions}/_row.html.erb +2 -2
  67. data/app/views/usman/{admin/permissions → permissions}/_show.html.erb +2 -2
  68. data/app/views/usman/{admin/permissions → permissions}/index.html.erb +4 -4
  69. data/app/views/usman/{admin/roles → roles}/_form.html.erb +1 -1
  70. data/app/views/usman/{admin/roles → roles}/_index.html.erb +3 -3
  71. data/app/views/usman/{admin/roles → roles}/_row.html.erb +3 -3
  72. data/app/views/usman/{admin/roles → roles}/_show.html.erb +6 -6
  73. data/app/views/usman/{admin/roles → roles}/index.html.erb +5 -5
  74. data/app/views/usman/sessions/_form.html.erb +1 -1
  75. data/app/views/usman/{admin/user_roles → user_roles}/_form.html.erb +1 -1
  76. data/app/views/usman/{admin/user_roles → user_roles}/_index.html.erb +2 -2
  77. data/app/views/usman/{admin/user_roles → user_roles}/_row.html.erb +3 -3
  78. data/app/views/usman/{admin/users → users}/_form.html.erb +1 -1
  79. data/app/views/usman/{admin/users → users}/_index.html.erb +9 -9
  80. data/app/views/usman/{admin/users → users}/_row.html.erb +9 -9
  81. data/app/views/usman/{admin/users → users}/_show.html.erb +8 -8
  82. data/app/views/usman/{admin/users → users}/index.html.erb +8 -8
  83. data/config/locales/usman/mobile_registration.ar.yml +14 -0
  84. data/config/locales/usman/mobile_registration.en.yml +14 -0
  85. data/config/routes.rb +25 -21
  86. data/db/master_data/roles.csv +2 -0
  87. data/db/migrate/{20170728095744_create_otp_registrations.rb → 20170819113217_create_registrations.rb} +4 -4
  88. data/db/migrate/20170819113218_add_registration_id_to_users.rb +7 -0
  89. data/db/migrate/20170819113219_create_devices.rb +41 -0
  90. data/lib/tasks/usman/data.rake +85 -0
  91. data/lib/tasks/usman/master_data.rake +44 -0
  92. data/lib/usman/engine.rb +2 -1
  93. data/lib/usman/version.rb +1 -1
  94. metadata +111 -52
  95. data/app/controllers/usman/admin/base_controller.rb +0 -46
  96. data/app/controllers/usman/admin/dashboard_controller.rb +0 -26
  97. data/app/controllers/usman/admin/features_controller.rb +0 -83
  98. data/app/controllers/usman/admin/permissions_controller.rb +0 -85
  99. data/app/controllers/usman/admin/resource_controller.rb +0 -17
  100. data/app/controllers/usman/admin/roles_controller.rb +0 -68
  101. data/app/controllers/usman/admin/user_roles_controller.rb +0 -142
  102. data/app/controllers/usman/admin/users_controller.rb +0 -133
  103. data/app/views/usman/admin/dashboard/index.html.erb +0 -51
  104. data/config/initializers/overide_kuppayam_controllers.rb +0 -74
  105. data/lib/tasks/usman/all.rake +0 -73
  106. /data/app/views/usman/{admin/permissions → permissions}/_action_buttons.html.erb +0 -0
  107. /data/config/locales/{kuppayam → usman}/authentication.ar.yml +0 -0
  108. /data/config/locales/{kuppayam → usman}/authentication.en.yml +0 -0
  109. /data/db/{import_data → data}/dummy/features.csv +0 -0
  110. /data/db/{import_data → data}/dummy/permissions.csv +0 -0
  111. /data/db/{import_data → data}/dummy/roles.csv +0 -0
  112. /data/db/{import_data → data}/dummy/users.csv +0 -0
  113. /data/db/{import_data → data}/features.csv +0 -0
  114. /data/db/{import_data → data}/permissions.csv +0 -0
  115. /data/db/{import_data → data}/roles.csv +0 -0
  116. /data/db/{import_data → data}/users.csv +0 -0
@@ -0,0 +1,108 @@
1
+ class Registration < ApplicationRecord
2
+
3
+ # Constants
4
+ PENDING = "pending"
5
+ VERIFIED = "verified"
6
+
7
+ STATUS = {
8
+ PENDING => "Pending",
9
+ VERIFIED => "Verified"
10
+ }
11
+
12
+ STATUS_REVERSE = {
13
+ "Pending" => PENDING,
14
+ "Verified" => VERIFIED
15
+ }
16
+
17
+ # Associations
18
+ has_one :user
19
+ belongs_to :country
20
+ belongs_to :city, optional: true
21
+ has_many :devices
22
+
23
+ # Validations
24
+ validates :dialing_prefix, presence: true, length: {minimum: 2, maximum: 4}
25
+ validates :mobile_number, presence: true, length: {minimum: 9, maximum: 11}
26
+ validates :status, :presence => true, :inclusion => {:in => STATUS.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
27
+
28
+ # ------------------
29
+ # Class Methods
30
+ # ------------------
31
+
32
+ # return an active record relation object with the search query in its where clause
33
+ # Return the ActiveRecord::Relation object
34
+ # == Examples
35
+ # >>> registration.search(query)
36
+ # => ActiveRecord::Relation object
37
+ scope :search, lambda {|query| joins("INNER JOIN users on users.id = registrations.user_id").
38
+ where("LOWER(mobile_number) LIKE LOWER('%#{query}%') OR
39
+ LOWER(users.name) LIKE LOWER('%#{query}%')")}
40
+ scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
41
+
42
+ scope :pending, -> { where(status: PENDING) }
43
+ scope :verified, -> { where(status: VERIFIED) }
44
+
45
+ # ------------------
46
+ # Instance Methods
47
+ # ------------------
48
+
49
+ # Status Methods
50
+ # --------------
51
+
52
+ # * Return true if the user is pending, else false.
53
+ # == Examples
54
+ # >>> registration.pending?
55
+ # => true
56
+ def pending?
57
+ (status == PENDING)
58
+ end
59
+
60
+ # * Return true if the user is not verified, else false.
61
+ # == Examples
62
+ # >>> registration.verified?
63
+ # => true
64
+ def verified?
65
+ (status == VERIFIED)
66
+ end
67
+
68
+ # change the status to :verified
69
+ # Return the status
70
+ # == Examples
71
+ # >>> registration.pending!
72
+ # => "pending"
73
+ def pending!
74
+ self.update_attribute(:status, PENDING)
75
+ end
76
+
77
+ # change the status to :verified
78
+ # Return the status
79
+ # == Examples
80
+ # >>> registration.verify!
81
+ # => "verified"
82
+ def verify!
83
+ self.update_attribute(:status, VERIFIED)
84
+ end
85
+
86
+ # Permission Methods
87
+ # ------------------
88
+
89
+ def can_be_edited?
90
+ pending?
91
+ end
92
+
93
+ def can_be_deleted?
94
+ pending?
95
+ end
96
+
97
+ # Other Methods
98
+ # -------------
99
+
100
+ # * Return mobile number with dialling prefix
101
+ # == Examples
102
+ # >>> registration.display_name
103
+ # => "+919880123456"
104
+ def display_name
105
+ "#{self.dialing_prefix} #{self.mobile_number}"
106
+ end
107
+
108
+ end
data/app/models/role.rb CHANGED
@@ -18,20 +18,24 @@ class Role < Usman::ApplicationRecord
18
18
  scope :search, lambda {|query| where("LOWER(roles.name) LIKE LOWER('%#{query}%')")
19
19
  }
20
20
 
21
- def self.save_row_data(row)
21
+ def self.save_row_data(hsh)
22
22
 
23
- row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
23
+ return if hsh[:name].blank?
24
24
 
25
- return if row[:name].blank?
26
-
27
- role = Role.find_by_name(row[:name]) || Role.new
28
- role.name = row[:name]
25
+ role = Role.find_by_name(hsh[:name]) || Role.new
26
+ role.name = hsh[:name]
29
27
 
30
28
  # Initializing error hash for displaying all errors altogether
31
29
  error_object = Kuppayam::Importer::ErrorHash.new
32
30
 
33
31
  if role.valid?
34
- role.save!
32
+ begin
33
+ role.save!
34
+ rescue Exception => e
35
+ summary = "uncaught #{e} exception while handling connection: #{e.message}"
36
+ details = "Stack trace: #{e.backtrace.map {|l| " #{l}\n"}.join}"
37
+ error_object.errors << { summary: summary, details: details }
38
+ end
35
39
  else
36
40
  summary = "Error while saving role: #{role.name}"
37
41
  details = "Error! #{role.errors.full_messages.to_sentence}"
data/app/models/user.rb CHANGED
@@ -39,6 +39,8 @@ class User < Usman::ApplicationRecord
39
39
  has_one :profile_picture, :as => :imageable, :dependent => :destroy, :class_name => "Image::ProfilePicture"
40
40
  has_many :permissions
41
41
  has_many :features, through: :permissions
42
+ has_many :devices
43
+ has_one :registration
42
44
  has_and_belongs_to_many :roles
43
45
 
44
46
 
@@ -70,29 +72,33 @@ class User < Usman::ApplicationRecord
70
72
 
71
73
  # Import Methods
72
74
 
73
- def self.save_row_data(row)
75
+ def self.save_row_data(hsh)
74
76
 
75
- row.headers.each{ |cell| row[cell] = row[cell].to_s.strip }
77
+ return if hsh[:name].blank?
76
78
 
77
- return if row[:name].blank?
79
+ user = User.find_by_username(hsh[:username]) || User.new
80
+ user.name = hsh[:name]
81
+ user.username = hsh[:username]
82
+ user.designation = hsh[:designation]
83
+ user.email = hsh[:email]
84
+ user.phone = hsh[:phone]
78
85
 
79
- user = User.find_by_username(row[:username]) || User.new
80
- user.name = row[:name]
81
- user.username = row[:username]
82
- user.designation = row[:designation]
83
- user.email = row[:email]
84
- user.phone = row[:phone]
86
+ user.super_admin = ["true", "t","1","yes","y"].include?(hsh[:super_admin].to_s.downcase.strip)
85
87
 
86
- user.super_admin = ["true", "t","1","yes","y"].include?(row[:super_admin].to_s.downcase.strip)
87
-
88
- user.status = row[:status]
88
+ user.status = hsh[:status]
89
89
  user.assign_default_password
90
90
 
91
91
  # Initializing error hash for displaying all errors altogether
92
92
  error_object = Kuppayam::Importer::ErrorHash.new
93
93
 
94
94
  if user.valid?
95
- user.save!
95
+ begin
96
+ user.save!
97
+ rescue Exception => e
98
+ summary = "uncaught #{e} exception while handling connection: #{e.message}"
99
+ details = "Stack trace: #{e.backtrace.map {|l| " #{l}\n"}.join}"
100
+ error_object.errors << { summary: summary, details: details }
101
+ end
96
102
  else
97
103
  summary = "Error while saving user: #{user.name}"
98
104
  details = "Error! #{user.errors.full_messages.to_sentence}"
@@ -0,0 +1,127 @@
1
+ module Usman
2
+ class MobileRegistrationService
3
+
4
+ attr_reader :dialing_prefix, :mobile_number,
5
+ :country, :city,
6
+ :error_heading, :error_message, :error_details,
7
+ :uuid, :device_token,
8
+ :device_name, :device_type,
9
+ :operating_system, :software_version,
10
+ :registration, :device, :remote_ip
11
+
12
+ def initialize(params)
13
+ @dialing_prefix = params[:dialing_prefix]
14
+ @mobile_number = params[:mobile_number]
15
+
16
+ @country = Country.find_by_id(params[:country_id])
17
+ @city = City.find_by_id(params[:city_id])
18
+
19
+ # Edge case to catch city selected that of a different country
20
+ @city = nil unless @city.country == @country if @city
21
+
22
+ @uuid = params[:uuid]
23
+ @device_token = params[:device_token]
24
+ @device_name = params[:device_name]
25
+ @device_type = params[:device_type]
26
+ @operating_system = params[:operating_system]
27
+ @software_version = params[:software_version]
28
+
29
+ @remote_ip = params[:remote_ip]
30
+ @error_message = nil
31
+ @error_details = {}
32
+
33
+ # @registration and @device will be initiated by the
34
+ # below method if the device is already registered
35
+ check_if_device_is_already_registered
36
+
37
+ register_new_device
38
+
39
+ # Validate the inputs
40
+ @registration.valid?
41
+ @device.valid?
42
+
43
+ if @registration.errors.any? or @device.errors.any?
44
+ errors = @registration.errors.to_hash.merge(@device.errors.to_hash)
45
+ set_error("mobile_registration.invalid_inputs", errors)
46
+ end
47
+
48
+ end
49
+
50
+ def check_if_device_is_already_registered
51
+ @registration = Registration.where("LOWER(mobile_number) = LOWER('#{@mobile_number}')").first
52
+ if @registration
53
+ @country = @registration.country unless @country
54
+ @city = @registration.city unless @city
55
+ end
56
+ @device = Device.where("LOWER(uuid) = LOWER('#{@uuid}')").first if @registration
57
+ end
58
+
59
+ def register_new_device
60
+
61
+ if @device && @device.blocked?
62
+ set_error("mobile_registration.device_blocked")
63
+ return
64
+ end
65
+
66
+ ActiveRecord::Base.transaction do
67
+ # Create a new registration if it doesn't exist
68
+ @registration = Registration.new unless @registration
69
+ @registration.country = @country
70
+ @registration.city = @city
71
+ @registration.dialing_prefix = @dialing_prefix
72
+ @registration.mobile_number = @mobile_number
73
+
74
+ # Create device entry if it doesn't exist
75
+ @device = Device.new unless @device
76
+ @device.registration = @registration
77
+ @device.user = @registration.user
78
+ @device.uuid = @uuid
79
+ @device.device_token = @device_token
80
+ @device.device_name = @device_name
81
+ @device.device_type = @device_type
82
+ @device.operating_system = @operating_system
83
+ @device.software_version = @software_version
84
+
85
+ @registration.valid?
86
+ @device.valid?
87
+
88
+ if @registration.errors.blank? && @device.errors.blank?
89
+ @registration.save
90
+ @device.save
91
+ generate_new_otp
92
+ else
93
+ raise ActiveRecord::Rollback
94
+ end
95
+ end
96
+
97
+ end
98
+
99
+ def generate_new_otp
100
+ @device.generate_otp
101
+ if send_otp
102
+ @device.update_attribute(:otp_sent_at, Time.now)
103
+ else
104
+ set_error("mobile_registration.otp_not_sent")
105
+ end
106
+ end
107
+
108
+ def send_otp
109
+ return true
110
+ end
111
+
112
+ def set_error(key, hsh={})
113
+ @error_heading = I18n.t("#{key}.heading")
114
+ @error_message = I18n.t("#{key}.message")
115
+ @error_details = hsh if hsh.is_a?(Hash)
116
+ end
117
+
118
+ def errors
119
+ {
120
+ heading: @error_heading,
121
+ message: @error_message,
122
+ details: @error_details
123
+ }
124
+ end
125
+
126
+ end
127
+ end
@@ -7,11 +7,11 @@
7
7
  <!-- logo -->
8
8
  <div class="logo">
9
9
  <a href="/" class="logo-expanded">
10
- <img src="/assets/kuppayam/logo.png" width="180" alt="" />
10
+ <img src="/assets/logo.png" width="180" alt="" />
11
11
  </a>
12
12
 
13
13
  <a href="/" class="logo-collapsed">
14
- <img src="/assets/kuppayam/logo.png" width="40" alt="" />
14
+ <img src="/assets/logo-small.png" width="40" alt="" />
15
15
  </a>
16
16
  </div>
17
17
 
@@ -38,23 +38,43 @@
38
38
  <!-- class "auto-inherit-active-class" will automatically add "active" class for parent elements who are marked already with class "active" -->
39
39
 
40
40
  <!-- Admin Dashboard -->
41
- <li class="<%= nav_active?('admin/dashboard') ? 'active' : '' %>">
42
- <%= link_to raw("<i class=\"linecons-desktop\"></i> <span class='title'>Dashboard</span>"), usman.admin_dashboard_url %>
43
- </li>
41
+ <% if @current_user.super_admin? || @current_user.has_role?("Site Admin") %>
42
+ <li class="<%= nav_active?('admin/dashboard') ? 'active' : '' %>">
43
+ <%= link_to raw("<i class=\"linecons-desktop\"></i> <span class='title'>Dashboard</span>"), usman.dashboard_url %>
44
+ </li>
44
45
 
45
- <li class="<%= nav_active?('admin/users') ? 'active' : '' %>">
46
-
47
- <a href="#">
48
- <i class="linecons-cog"></i>
49
- <span class="title">Admin</span>
50
- </a>
46
+ <li class="<%= nav_active?('admin/users') ? 'active' : '' %>">
47
+
48
+ <a href="#">
49
+ <i class="linecons-cog"></i>
50
+ <span class="title">Admin</span>
51
+ </a>
51
52
 
52
- <ul>
53
- <li class="<%= nav_class("admin/users") %>">
54
- <%= link_to raw("<i class=\"linecons-user\"></i> <span class='title'>Manage Users</span>"), usman.admin_users_url %>
55
- </li>
56
- </ul>
57
- </li>
53
+ <ul>
54
+ <li class="<%= nav_class("admin/users") %>">
55
+ <%= link_to raw("<i class=\"linecons-user\"></i> <span class='title'>Manage Users</span>"), usman.users_url %>
56
+ </li>
57
+ </ul>
58
+ </li>
59
+ <% else %>
60
+ <li class="<%= nav_active?('profile/dashboard') ? 'active' : '' %>">
61
+ <%= link_to raw("<i class=\"linecons-desktop\"></i> <span class='title'>Dashboard</span>"), usman.my_account_url %>
62
+ </li>
63
+
64
+ <li class="<%= nav_active?('profile/profile') ? 'active' : '' %>">
65
+
66
+ <a href="#">
67
+ <i class="linecons-user"></i>
68
+ <span class="title">My Account</span>
69
+ </a>
70
+
71
+ <ul>
72
+ <li class="<%= nav_class("profile/settings") %>">
73
+ <%= link_to raw("<i class=\"linecons-cog\"></i> <span class='title'>Settings</span>"), "#" %>
74
+ </li>
75
+ </ul>
76
+ </li>
77
+ <% end %>
58
78
 
59
79
  <% if @current_user.super_admin? %>
60
80
  <li class="">
@@ -65,11 +85,11 @@
65
85
 
66
86
  <ul>
67
87
  <li class="">
68
- <%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Manage Features</span>"), usman.admin_features_url %>
88
+ <%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Manage Features</span>"), usman.features_url %>
69
89
  </li>
70
90
 
71
91
  <li class="<%= nav_class("admin/users") %>">
72
- <%= link_to raw("<i class=\"linecons-lock\"></i> <span class='title'>Manage Permissions</span>"), usman.admin_permissions_url %>
92
+ <%= link_to raw("<i class=\"linecons-lock\"></i> <span class='title'>Manage Permissions</span>"), usman.permissions_url %>
73
93
  </li>
74
94
  </ul>
75
95
 
@@ -0,0 +1,120 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <!-- Head -->
5
+ <%= render :partial=>"/layouts/kuppayam/head" -%>
6
+ </head>
7
+
8
+ <body class="page-body">
9
+
10
+ <!-- <div class="settings-pane" id="settings_pane">
11
+ <%#= render :partial=>"/layouts/kuppayam/settings_pane" -%>
12
+ </div> -->
13
+
14
+ <div class="page-container">
15
+
16
+ <!-- Sidebar Navigation -->
17
+ <%= render :partial=>"/layouts/kuppayam/sidebar" -%>
18
+
19
+ <div class="main-content">
20
+
21
+ <!-- Top Navigation -->
22
+ <%= render :partial=>"/layouts/kuppayam/navbar" -%>
23
+
24
+ <!-- Heading & Breadcrumbs -->
25
+ <%= render :partial=>"/layouts/kuppayam/heading" -%>
26
+
27
+ <%#* Show flash messages if controller has set any. -%>
28
+ <div id="div_flash_message" class="mt-10">
29
+ <%= flash_message(false) if defined?(flash) -%>
30
+ </div>
31
+
32
+ <%#* Page Content Starts here -%>
33
+ <div id="div_page_content_main">
34
+ <%= yield %>
35
+ </div>
36
+
37
+ <!-- Footer -->
38
+ <%= render :partial=>"/layouts/kuppayam/footer" -%>
39
+
40
+ </div>
41
+
42
+ </div>
43
+
44
+ <div id="div_modal_generic" class="modal" style="z-index: 1056;">
45
+ <div class="modal-dialog">
46
+ <div class="modal-content">
47
+ <div class="modal-header">
48
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
49
+ <h3 class="modal-title">Modal title</h3>
50
+ </div>
51
+ <div class="modal-body-main"></div>
52
+ </div><!-- /.modal-content -->
53
+ </div><!-- /.modal-dialog -->
54
+ </div><!-- /.modal -->
55
+
56
+ <div id="div_modal_large" class="modal">
57
+ <div class="modal-dialog modal-lg" style="width: 96%">
58
+ <div class="modal-content">
59
+ <div class="modal-header">
60
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
61
+ <h3 class="modal-title">Modal title</h3>
62
+ </div>
63
+ <div class="modal-body-main"></div>
64
+ </div><!-- /.modal-content -->
65
+ </div><!-- /.modal-dialog -->
66
+ </div><!-- /.modal -->
67
+
68
+ <div id="div_modal_message" class="modal fade">
69
+ <div class="modal-dialog">
70
+ <div class="modal-content">
71
+ <div class="modal-header">
72
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
73
+ <h3 class="modal-title">Modal title</h3>
74
+ </div>
75
+ <div class="modal-body">
76
+ <p>One fine body&hellip;</p>
77
+ </div>
78
+ <div class="modal-footer">
79
+ <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
80
+ </div>
81
+ </div><!-- /.modal-content -->
82
+ </div><!-- /.modal-dialog -->
83
+ </div><!-- /.modal -->
84
+
85
+ <div id="div_modal_image_upload" class="modal" style="z-index: 1057;">
86
+ <div class="modal-dialog">
87
+ <div class="modal-content">
88
+ <div class="modal-header">
89
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
90
+ <h3 class="modal-title">Modal title</h3>
91
+ </div>
92
+ <div class="modal-body-main"></div>
93
+ </div><!-- /.modal-content -->
94
+ </div><!-- /.modal-dialog -->
95
+ </div><!-- /.modal -->
96
+
97
+ <script type="text/javascript">
98
+ $('.modal').on('shown.bs.modal', function(e){
99
+ $(this).modal('handleUpdate'); //Update backdrop on modal show
100
+ $(this).scrollTop(0); //reset modal to top position
101
+ });
102
+ </script>
103
+
104
+ <!-- Page Loading Overlay -->
105
+ <!-- <div class="page-loading-overlay">
106
+ <div class="loader-3"></div>
107
+ </div> -->
108
+
109
+ <%#* Loading Javascripts -%>
110
+ <%= javascript_include_tag @javascript_filename -%>
111
+
112
+ <%= yield :javascript_footer -%>
113
+
114
+ <iframe id="iframe_document" name="iframe_document" width="100%" style="display:none"></iframe>
115
+
116
+ <iframe id="iframe_image" name="iframe_image" width="100%" style="display:none"></iframe>
117
+
118
+ </body>
119
+
120
+ </html>
@@ -0,0 +1,118 @@
1
+ <%
2
+ items = {
3
+ users: {
4
+ counts: {
5
+ total: User.normal_users.count,
6
+ approved: User.normal_users.approved.count,
7
+ pending: User.normal_users.pending.count,
8
+ suspended: User.normal_users.suspended.count
9
+ },
10
+ text: "Users",
11
+ icon_class: "fa-user",
12
+ url: usman.users_url
13
+ }
14
+ }
15
+ %>
16
+
17
+ <h3 class="text-gray mt-50 mb-10">
18
+ Admin <br>
19
+ <small class="text-muted">Manage Users and much more...</small>
20
+ </h3>
21
+ <hr class="mb-30" style="border-top:1px solid #ddd;">
22
+
23
+ <div class="row">
24
+
25
+ <% items.each do |key, values| %>
26
+ <div class="col-lg-4 col-md-4 col-sm-6 col-xs-12">
27
+
28
+ <div class="xe-widget xe-vertical-counter xe-vertical-counter-white" data-count=".num" data-from="0" data-to="128" data-duration="4">
29
+ <div class="xe-icon">
30
+ <i class="<%= values[:icon_class] %>"></i>
31
+ </div>
32
+
33
+ <div class="xe-label">
34
+ <strong class="num"><%= values[:text] %></strong>
35
+ </div>
36
+
37
+ <div class="xe-label" style="margin-top:10px; margin-bottom: 10px;height: 100px; overflow-y: auto;">
38
+ <% values[:counts].each do |count_text, count_value| %>
39
+ <span><%= count_text.to_s.titleize %>: <strong><%= count_value %></strong></span>
40
+ <% end %>
41
+ </div>
42
+
43
+ <div class="xe-label">
44
+ <span><%= link_to("Manage", values[:url], class: "btn btn-sm btn-primary btn-block") %></span>
45
+ </div>
46
+ </div>
47
+
48
+ </div>
49
+ <% end %>
50
+ </div>
51
+
52
+ <% if @current_user.super_admin? %>
53
+ <%
54
+ items = {
55
+ features: {
56
+ counts: {
57
+ total: Feature.published.count
58
+ },
59
+ text: "Features",
60
+ icon_class: "linecons-diamond",
61
+ url: usman.features_url
62
+ },
63
+ roles: {
64
+ counts: {
65
+ total: Role.count
66
+ },
67
+ text: "Roles",
68
+ icon_class: "linecons-graduation-cap",
69
+ url: usman.roles_url
70
+ },
71
+ permissions: {
72
+ counts: {
73
+ total: Permission.count
74
+ },
75
+ text: "Permissions",
76
+ icon_class: "fa-lock",
77
+ url: usman.permissions_url
78
+ },
79
+
80
+ }
81
+ %>
82
+
83
+ <h3 class="text-gray mt-50 mb-10">
84
+ Super Admin <br>
85
+ <small class="text-muted">Manage Features, Permissions and other super admin modules</small>
86
+ </h3>
87
+ <hr class="mb-30" style="border-top:1px solid #ddd;">
88
+
89
+ <div class="row">
90
+
91
+ <% items.each do |key, values| %>
92
+ <div class="col-lg-4 col-md-4 col-sm-6 col-xs-12">
93
+
94
+ <div class="xe-widget xe-vertical-counter xe-vertical-counter-white" data-count=".num" data-from="0" data-to="128" data-duration="4">
95
+ <div class="xe-icon">
96
+ <i class="<%= values[:icon_class] %>"></i>
97
+ </div>
98
+
99
+ <div class="xe-label">
100
+ <strong class="num"><%= values[:text] %></strong>
101
+ </div>
102
+
103
+ <div class="xe-label" style="margin-top:10px; margin-bottom: 10px;height: 100px; overflow-y: auto;">
104
+ <% values[:counts].each do |count_text, count_value| %>
105
+ <span><%= count_text.to_s.titleize %>: <strong><%= count_value %></strong></span>
106
+ <% end %>
107
+ </div>
108
+
109
+ <div class="xe-label">
110
+ <span><%= link_to("Manage", values[:url], class: "btn btn-sm btn-primary btn-block") %></span>
111
+ </div>
112
+ </div>
113
+
114
+ </div>
115
+ <% end %>
116
+
117
+ </div>
118
+ <% end %>
@@ -1,4 +1,4 @@
1
- <%= form_for([:admin, @feature], :html => {:id=>"form_feature", :class=>"mb-0 form-horizontal", :role => "form", :method => (@feature.new_record? ? :post : :put), :remote=>true}) do |f| %>
1
+ <%= form_for([@feature], :html => {:id=>"form_feature", :class=>"mb-0 form-horizontal", :role => "form", :method => (@feature.new_record? ? :post : :put), :remote=>true}) do |f| %>
2
2
 
3
3
  <div id="feature_form_error">
4
4
  <%= @feature.errors[:base].to_sentence %>