usman 0.1.6dev2 → 0.2.0

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.
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 %>