vyapari 0.1.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 (59) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +49 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/vyapari_manifest.js +2 -0
  6. data/app/assets/javascripts/vyapari/application.js +13 -0
  7. data/app/assets/stylesheets/vyapari/application.css +15 -0
  8. data/app/controllers/vyapari/admin/base_controller.rb +17 -0
  9. data/app/controllers/vyapari/admin/countries_controller.rb +64 -0
  10. data/app/controllers/vyapari/admin/dashboard_controller.rb +26 -0
  11. data/app/controllers/vyapari/admin/exchange_rates_controller.rb +70 -0
  12. data/app/controllers/vyapari/admin/regions_controller.rb +67 -0
  13. data/app/controllers/vyapari/admin/resource_controller.rb +15 -0
  14. data/app/controllers/vyapari/admin/users_controller.rb +130 -0
  15. data/app/controllers/vyapari/application_controller.rb +13 -0
  16. data/app/helpers/vyapari/application_helper.rb +4 -0
  17. data/app/jobs/vyapari/application_job.rb +4 -0
  18. data/app/mailers/vyapari/application_mailer.rb +6 -0
  19. data/app/models/brand.rb +114 -0
  20. data/app/models/category.rb +116 -0
  21. data/app/models/country.rb +45 -0
  22. data/app/models/exchange_rate.rb +38 -0
  23. data/app/models/product.rb +139 -0
  24. data/app/models/region.rb +58 -0
  25. data/app/models/vyapari/application_record.rb +6 -0
  26. data/app/views/layouts/kuppayam/_footer.html.erb +25 -0
  27. data/app/views/layouts/kuppayam/_header.html.erb +43 -0
  28. data/app/views/layouts/kuppayam/_navbar.html.erb +55 -0
  29. data/app/views/layouts/kuppayam/_sidebar.html.erb +136 -0
  30. data/app/views/vyapari/admin/countries/_form.html.erb +24 -0
  31. data/app/views/vyapari/admin/countries/_index.html.erb +51 -0
  32. data/app/views/vyapari/admin/countries/_row.html.erb +26 -0
  33. data/app/views/vyapari/admin/countries/_show.html.erb +73 -0
  34. data/app/views/vyapari/admin/countries/index.html.erb +32 -0
  35. data/app/views/vyapari/admin/dashboard/index.html.erb +52 -0
  36. data/app/views/vyapari/admin/exchange_rates/_form.html.erb +28 -0
  37. data/app/views/vyapari/admin/exchange_rates/_index.html.erb +57 -0
  38. data/app/views/vyapari/admin/exchange_rates/_row.html.erb +30 -0
  39. data/app/views/vyapari/admin/exchange_rates/_show.html.erb +72 -0
  40. data/app/views/vyapari/admin/exchange_rates/index.html.erb +32 -0
  41. data/app/views/vyapari/admin/regions/_form.html.erb +28 -0
  42. data/app/views/vyapari/admin/regions/_index.html.erb +54 -0
  43. data/app/views/vyapari/admin/regions/_row.html.erb +28 -0
  44. data/app/views/vyapari/admin/regions/_show.html.erb +74 -0
  45. data/app/views/vyapari/admin/regions/index.html.erb +32 -0
  46. data/app/views/vyapari/admin/users/_form.html.erb +39 -0
  47. data/app/views/vyapari/admin/users/_index.html.erb +101 -0
  48. data/app/views/vyapari/admin/users/_row.html.erb +72 -0
  49. data/app/views/vyapari/admin/users/_show.html.erb +199 -0
  50. data/app/views/vyapari/admin/users/index.html.erb +64 -0
  51. data/config/routes.rb +28 -0
  52. data/db/migrate/20170000000200_create_exchange_rates.rb +16 -0
  53. data/db/migrate/20170000000201_create_countries.rb +12 -0
  54. data/db/migrate/20170000000202_create_regions.rb +16 -0
  55. data/lib/tasks/vyapari_tasks.rake +4 -0
  56. data/lib/vyapari/engine.rb +20 -0
  57. data/lib/vyapari/version.rb +3 -0
  58. data/lib/vyapari.rb +5 -0
  59. metadata +401 -0
@@ -0,0 +1,116 @@
1
+ class Category < Vyapari::ApplicationRecord
2
+
3
+ # Constants
4
+ PUBLISHED = "published"
5
+ UNPUBLISHED = "unpublished"
6
+ REMOVED = "removed"
7
+
8
+ STATUS_HASH = {"Published" => PUBLISHED, "Unpublished" => UNPUBLISHED, "Removed" => REMOVED}
9
+ STATUS_HASH_REVERSE = {PUBLISHED => "Published", UNPUBLISHED => "Unpublished", REMOVED => "Removed"}
10
+
11
+ FEATURED_HASH = {"Featured" => true, "Non Featured" => false}
12
+ FEATURED_HASH_REVERSE = {true => "Featured", false => "Non Featured"}
13
+
14
+ # Callbacks
15
+ before_validation :update_permalink
16
+
17
+ # Validations
18
+ extend PoodleValidators
19
+ validates :name, presence: true
20
+ validates :one_liner, presence: false
21
+ validates :status, :presence=> true, :inclusion => {:in => STATUS_HASH_REVERSE.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
22
+
23
+ # Associations
24
+ has_many :products
25
+ belongs_to :parent, :class_name => 'Category', optional: true
26
+ has_many :sub_categories, :foreign_key => "parent_id", :class_name => "Category"
27
+ has_one :category_image, :as => :imageable, :dependent => :destroy, :class_name => "Image::CategoryImage"
28
+
29
+ # return an active record relation object with the search query in its where clause
30
+ # Return the ActiveRecord::Relation object
31
+ # == Examples
32
+ # >>> object.search(query)
33
+ # => ActiveRecord::Relation object
34
+ scope :search, lambda {|query| where("LOWER(name) LIKE LOWER('%#{query}%') OR\
35
+ LOWER(permalink) LIKE LOWER('%#{query}%') OR\
36
+ LOWER(one_liner) LIKE LOWER('%#{query}%') OR\
37
+ LOWER(description) LIKE LOWER('%#{query}%')")
38
+ }
39
+
40
+ scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
41
+ scope :featured, lambda { |val| where(featured: val) }
42
+
43
+ scope :published, -> { where(status: PUBLISHED) }
44
+ scope :unpublished, -> { where(status: UNPUBLISHED) }
45
+ scope :removed, -> { where(status: REMOVED) }
46
+
47
+ # ------------------
48
+ # Instance variables
49
+ # ------------------
50
+
51
+ # * Return true if the category is published, else false.
52
+ # == Examples
53
+ # >>> category.published?
54
+ # => true
55
+ def published?
56
+ (status == PUBLISHED)
57
+ end
58
+
59
+ # change the status to :published
60
+ # Return the status
61
+ # == Examples
62
+ # >>> category.publish!
63
+ # => "published"
64
+ def publish!
65
+ self.update_attribute(:status, PUBLISHED)
66
+ end
67
+
68
+ # * Return true if the category is unpublished, else false.
69
+ # == Examples
70
+ # >>> category.unpublished?
71
+ # => true
72
+ def unpublished?
73
+ (status == UNPUBLISHED)
74
+ end
75
+
76
+ # change the status to :unpublished
77
+ # Return the status
78
+ # == Examples
79
+ # >>> category.unpublish!
80
+ # => "unpublished"
81
+ def unpublish!
82
+ self.update_attribute(:status, UNPUBLISHED)
83
+ end
84
+
85
+ # * Return true if the category is removed, else false.
86
+ # == Examples
87
+ # >>> category.removed?
88
+ # => true
89
+ def removed?
90
+ (status == REMOVED)
91
+ end
92
+
93
+ # change the status to :removed
94
+ # Return the status
95
+ # == Examples
96
+ # >>> category.remove!
97
+ # => "removed"
98
+ def remove!
99
+ self.update_attribute(:status, REMOVED)
100
+ end
101
+
102
+ def default_image_url(size="medium")
103
+ "/assets/defaults/category-#{size}.png"
104
+ end
105
+
106
+ def display_name
107
+ self.name
108
+ end
109
+
110
+ protected
111
+
112
+ def update_permalink
113
+ self.permalink = "#{self.id}-#{name.parameterize}"
114
+ end
115
+
116
+ end
@@ -0,0 +1,45 @@
1
+ class Country < Vyapari::ApplicationRecord
2
+
3
+ DELETE_MESSAGE = "Cannot delete the country. You should first remove all the cities and exchange rates associated with this country."
4
+
5
+ # Validations
6
+ validates :name, presence: true, length: {minimum: 2, maximum: 250}, allow_blank: false
7
+ validates :code, presence: true, uniqueness: true, length: {minimum: 2, maximum: 32}, allow_blank: false
8
+
9
+ # Associations
10
+ has_many :regions
11
+ has_many :exchange_rates
12
+
13
+ # ------------------
14
+ # Class Methods
15
+ # ------------------
16
+
17
+ # return an active record relation object with the search query in its where clause
18
+ # Return the ActiveRecord::Relation object
19
+ # == Examples
20
+ # >>> obj.search(query)
21
+ # => ActiveRecord::Relation object
22
+ scope :search, lambda {|query| where("LOWER(countries.name) LIKE LOWER('%#{query}%')")}
23
+
24
+ # ------------------
25
+ # Instance Methods
26
+ # ------------------
27
+
28
+ def display_name
29
+ self.name_was
30
+ end
31
+
32
+ def can_be_edited?
33
+ true
34
+ end
35
+
36
+ def can_be_deleted?
37
+ if self.regions.any? || self.exchange_rates.any?
38
+ self.errors.add(:base, DELETE_MESSAGE)
39
+ return false
40
+ else
41
+ return true
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,38 @@
1
+ class ExchangeRate < Vyapari::ApplicationRecord
2
+
3
+ # Validations
4
+ validates :currency_name, presence: true, length: {minimum: 2, maximum: 4}, allow_blank: false
5
+ validates :value, presence: true
6
+ validates :effective_date, presence: true
7
+
8
+ # Associations
9
+ belongs_to :country
10
+
11
+ # ------------------
12
+ # Class Methods
13
+ # ------------------
14
+
15
+ # return an active record relation object with the search query in its where clause
16
+ # Return the ActiveRecord::Relation object
17
+ # == Examples
18
+ # >>> obj.search(query)
19
+ # => ActiveRecord::Relation object
20
+ scope :search, lambda {|query| joins(:country).where("LOWER(exchange_rates.currency_name) LIKE LOWER('%#{query}%') OR LOWER(countries.name) LIKE LOWER('%#{query}%')")}
21
+
22
+ # ------------------
23
+ # Instance Methods
24
+ # ------------------
25
+
26
+ def display_name
27
+ "#{self.currency_name_was}, #{self.country.try(:name)}"
28
+ end
29
+
30
+ def can_be_edited?
31
+ return true
32
+ end
33
+
34
+ def can_be_deleted?
35
+ return true
36
+ end
37
+
38
+ end
@@ -0,0 +1,139 @@
1
+ class Product < Vyapari::ApplicationRecord
2
+
3
+ # Constants
4
+ PUBLISHED = "published"
5
+ UNPUBLISHED = "unpublished"
6
+ REMOVED = "removed"
7
+ STATUS_HASH = {"Published" => PUBLISHED, "Unpublished" => UNPUBLISHED, "Removed" => REMOVED}
8
+ STATUS_HASH_REVERSE = {PUBLISHED => "Published", UNPUBLISHED => "Unpublished", REMOVED => "Removed"}
9
+
10
+ FEATURED_HASH = {"Featured" => true, "Non Featured" => false}
11
+ FEATURED_HASH_REVERSE = {true => "Featured", false => "Non Featured"}
12
+
13
+ # Callbacks
14
+ before_validation :update_permalink
15
+ before_validation :update_top_category
16
+
17
+ # Validations
18
+ validates :name, presence: true
19
+ #validates :description, presence: true
20
+ validates :permalink, presence: true, uniqueness: true
21
+ validates :status, :presence=> true, :inclusion => {:in => STATUS_HASH_REVERSE.keys, :presence_of => :status, :message => "%{value} is not a valid status" }
22
+
23
+ # Associations
24
+ has_one :product_image, :as => :imageable, :dependent => :destroy, :class_name => "Image::ProductImage"
25
+ has_one :brochure, :as => :documentable, :dependent => :destroy, :class_name => "Document::Brochure"
26
+
27
+ belongs_to :brand
28
+ belongs_to :category
29
+ belongs_to :top_category, class_name: "Category"
30
+
31
+ # return an active record relation object with the search query in its where clause
32
+ # Return the ActiveRecord::Relation object
33
+ # == Examples
34
+ # >>> object.search(query)
35
+ # => ActiveRecord::Relation object
36
+ scope :search, lambda {|query| joins("INNER JOIN categories on categories.id = products.category_id").
37
+ where("LOWER(products.name) LIKE LOWER('%#{query}%') OR\
38
+ LOWER(products.permalink) LIKE LOWER('%#{query}%') OR\
39
+ LOWER(products.one_liner) LIKE LOWER('%#{query}%') OR\
40
+ LOWER(products.description) LIKE LOWER('%#{query}%') OR\
41
+ LOWER(categories.name) LIKE LOWER('%#{query}%') OR\
42
+ LOWER(categories.one_liner) LIKE LOWER('%#{query}%') OR\
43
+ LOWER(categories.description) LIKE LOWER('%#{query}%')")
44
+ }
45
+
46
+ scope :status, lambda { |status| where("LOWER(status)='#{status}'") }
47
+ scope :featured, lambda { |val| where(featured: val) }
48
+
49
+ scope :published, -> { where(status: PUBLISHED) }
50
+ scope :unpublished, -> { where(status: UNPUBLISHED) }
51
+ scope :removed, -> { where(status: REMOVED) }
52
+
53
+ # ------------------
54
+ # Instance variables
55
+ # ------------------
56
+
57
+ # * Return true if the brand is published, else false.
58
+ # == Examples
59
+ # >>> brand.published?
60
+ # => true
61
+ def published?
62
+ (status == PUBLISHED)
63
+ end
64
+
65
+ # change the status to :published
66
+ # Return the status
67
+ # == Examples
68
+ # >>> brand.publish!
69
+ # => "published"
70
+ def publish!
71
+ self.update_attribute(:status, PUBLISHED)
72
+ end
73
+
74
+ # * Return true if the brand is unpublished, else false.
75
+ # == Examples
76
+ # >>> brand.unpublished?
77
+ # => true
78
+ def unpublished?
79
+ (status == UNPUBLISHED)
80
+ end
81
+
82
+ # change the status to :unpublished
83
+ # Return the status
84
+ # == Examples
85
+ # >>> brand.unpublish!
86
+ # => "unpublished"
87
+ def unpublish!
88
+ self.update_attributes(status: UNPUBLISHED, featured: false)
89
+ end
90
+
91
+ # * Return true if the brand is removed, else false.
92
+ # == Examples
93
+ # >>> brand.removed?
94
+ # => true
95
+ def removed?
96
+ (status == REMOVED)
97
+ end
98
+
99
+ # change the status to :removed
100
+ # Return the status
101
+ # == Examples
102
+ # >>> brand.remove!
103
+ # => "removed"
104
+ def remove!
105
+ self.update_attributes(status: REMOVED, featured: false)
106
+ end
107
+
108
+ # TODO
109
+ def can_be_deleted?
110
+ #if self.jobs.any?
111
+ # self.errors.add(:base, DELETE_MESSAGE)
112
+ # return false
113
+ #else
114
+ # return true
115
+ #end
116
+ return true
117
+ end
118
+
119
+ def default_image_url(size="medium")
120
+ "/assets/defaults/product-#{size}.png"
121
+ end
122
+
123
+ protected
124
+
125
+ def update_top_category
126
+ if self.category
127
+ if self.category.parent
128
+ self.top_category = self.category.parent
129
+ else
130
+ self.top_category = self.category
131
+ end
132
+ end
133
+ end
134
+
135
+ def update_permalink
136
+ self.permalink = "#{id}-#{name.parameterize}" if self.permalink.blank?
137
+ end
138
+
139
+ end
@@ -0,0 +1,58 @@
1
+ class Region < Vyapari::ApplicationRecord
2
+
3
+ DELETE_MESSAGE = "Cannot delete this Region. You should first delete all the dependant data like Company Cities, Jobs, Budgets etc tagged with this Region"
4
+
5
+ # Validations
6
+ validates :name, presence: true, length: {minimum: 2, maximum: 250}, allow_blank: false
7
+ validates :code, presence: true, uniqueness: true, length: {minimum: 2, maximum: 32}, allow_blank: false
8
+ validates :country, presence: true
9
+
10
+ # Associations
11
+ belongs_to :country
12
+ # has_many :stores
13
+
14
+ # ------------------
15
+ # Class Methods
16
+ # ------------------
17
+
18
+ # return an active record relation object with the search query in its where clause
19
+ # Return the ActiveRecord::Relation object
20
+ # == Examples
21
+ # >>> obj.search(query)
22
+ # => ActiveRecord::Relation object
23
+ scope :search, lambda {|query| joins(:country).where("LOWER(cities.name) LIKE LOWER('%#{query}%') OR LOWER(countries.name) LIKE LOWER('%#{query}%')")}
24
+
25
+ # ------------------
26
+ # Instance Methods
27
+ # ------------------
28
+
29
+ def display_name
30
+ if self.country
31
+ "#{self.name_was}, #{self.country.name}"
32
+ else
33
+ self.name
34
+ end
35
+ end
36
+
37
+ def can_be_edited?
38
+ true
39
+ end
40
+
41
+ def can_be_deleted?
42
+ # if self.stores.any?
43
+ # self.errors.add(:base, DELETE_MESSAGE)
44
+ # return false
45
+ # else
46
+ # return true
47
+ # end
48
+ return true
49
+ end
50
+
51
+ def report_heading
52
+ rh = []
53
+ rh << self.company.try(:name) if self.company.name
54
+ rh << self.display_name
55
+ rh.join(", ")
56
+ end
57
+
58
+ end
@@ -0,0 +1,6 @@
1
+ module Vyapari
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
6
+
@@ -0,0 +1,25 @@
1
+ <footer class="main-footer sticky footer-type-1">
2
+
3
+ <div class="footer-inner">
4
+
5
+ <!-- Add your copyright text here -->
6
+ <div class="footer-text">
7
+ &copy; 2017
8
+ <strong>Kuppayam</strong>
9
+
10
+ All rights reserved. <br>developed, maintained and hosted by <a href="http://rightsolutions.io" target="_blank" style="color:red">Right Solutions</a>
11
+ </div>
12
+
13
+
14
+ <!-- Go to Top Link, just add rel="go-top" to any link to add this functionality -->
15
+ <div class="go-up">
16
+
17
+ <a href="#" rel="go-top">
18
+ <i class="fa-angle-up"></i>
19
+ </a>
20
+
21
+ </div>
22
+
23
+ </div>
24
+
25
+ </footer>
@@ -0,0 +1,43 @@
1
+ <div class="top-bar">
2
+ <div class="top-bar-left">
3
+ <ul class="dropdown menu" data-dropdown-menu>
4
+ <li class="menu-text">Site Title</li>
5
+ <li>
6
+ <a href="#">One</a>
7
+ <ul class="menu vertical">
8
+ <li><a href="#">One</a></li>
9
+ <li><a href="#">Two</a></li>
10
+ <li><a href="#">Three</a></li>
11
+ </ul>
12
+ </li>
13
+ <li><a href="#">Two</a></li>
14
+ <li><a href="#">Three</a></li>
15
+ </ul>
16
+ </div>
17
+ <div class="top-bar-right">
18
+ <ul class="menu">
19
+ <li><input type="search" placeholder="Search"></li>
20
+ <li><button type="button" class="button">Search</button></li>
21
+ </ul>
22
+ </div>
23
+ </div>
24
+
25
+ <div class="header mb-40">
26
+
27
+ <div class="visible-xs pull-left mt-10">
28
+ <a href="#menu-toggle" class="btn btn-default" id="menu-toggle"><i class="fa fa-list"></i></a>
29
+ <%#= theme_button('', 'list', "#menu-toggle", btn_type: "default", id: "menu-toggle", classes: "") %>
30
+ </div>
31
+
32
+ <div class="pull-right mt-10">
33
+ <% if @current_user %>
34
+ <span style="color:#898989;">Welcome</span> <span style="color:#4b4b4b;"><%= @current_user.name %></span>
35
+ &nbsp;&nbsp;|&nbsp;&nbsp;
36
+ <%= link_to raw("Sign Out"), usman.sign_out_path, method: :delete %>
37
+ <% else %>
38
+ <%= link_to raw("Sign In"), "#" %>
39
+ <% end %>
40
+ </div>
41
+ <div class="cl-10"></div>
42
+ </div>
43
+
@@ -0,0 +1,55 @@
1
+ <nav class="navbar user-info-navbar" role="navigation"><!-- User Info, Notifications and Menu Bar -->
2
+
3
+ <!-- Left links for user info navbar -->
4
+ <ul class="user-info-menu left-links list-inline list-unstyled">
5
+
6
+ <li class="hidden-sm hidden-xs">
7
+ <a href="#" data-toggle="sidebar">
8
+ <i class="fa-bars"></i>
9
+ </a>
10
+ </li>
11
+
12
+ </ul>
13
+
14
+ <!-- Right links for user info navbar -->
15
+ <ul class="user-info-menu right-links list-inline list-unstyled">
16
+ <li class="dropdown user-profile">
17
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
18
+
19
+ <%= display_image(@current_user, "profile_picture.image.small.url", width: "32", height: "auto", class: "img-circle img-inline userpic-32", alt: @current_user.display_name) %>
20
+
21
+ <span>
22
+ <%= @current_user.display_name %>
23
+ <i class="fa-angle-down"></i>
24
+ </span>
25
+
26
+ </a>
27
+
28
+ <ul class="dropdown-menu user-profile-menu list-unstyled">
29
+ <li>
30
+ <a href="#settings">
31
+ <i class="fa-wrench"></i>
32
+ Settings
33
+ </a>
34
+ </li>
35
+ <li>
36
+ <a href="#profile">
37
+ <i class="fa-user"></i>
38
+ Profile
39
+ </a>
40
+ </li>
41
+ <li>
42
+ <a href="#help">
43
+ <i class="fa-info"></i>
44
+ Help
45
+ </a>
46
+ </li>
47
+ <li class="last">
48
+ <%= link_to raw("<i class='fa-lock'></i>Sign Out"), usman.sign_out_path, method: :delete %>
49
+ </li>
50
+ </ul>
51
+ </li>
52
+
53
+ </ul>
54
+
55
+ </nav>
@@ -0,0 +1,136 @@
1
+ <div class="sidebar-menu toggle-others fixed collapsed">
2
+
3
+ <div class="sidebar-menu-inner">
4
+
5
+ <header class="logo-env">
6
+
7
+ <!-- logo -->
8
+ <div class="logo">
9
+ <a href="/" class="logo-expanded">
10
+ <img src="/assets/kuppayam/logo.png" width="180" alt="" />
11
+ </a>
12
+
13
+ <a href="/" class="logo-collapsed">
14
+ <img src="/assets/kuppayam/logo.png" width="40" alt="" />
15
+ </a>
16
+ </div>
17
+
18
+ <!-- This will toggle the mobile menu and will be visible only on mobile devices -->
19
+ <div class="mobile-menu-toggle visible-xs">
20
+ <a href="#" data-toggle="user-info-menu">
21
+ <i class="fa-bell-o"></i>
22
+ <span class="badge badge-success">7</span>
23
+ </a>
24
+
25
+ <a href="#" data-toggle="mobile-menu">
26
+ <i class="fa-bars"></i>
27
+ </a>
28
+ </div>
29
+
30
+ </header>
31
+
32
+
33
+
34
+ <ul id="main-menu" class="main-menu">
35
+
36
+ <!-- add class "multiple-expanded" to allow multiple submenus to open -->
37
+
38
+ <!-- class "auto-inherit-active-class" will automatically add "active" class for parent elements who are marked already with class "active" -->
39
+
40
+ <li class="<%= nav_active?('admin/dashboard') ? 'active' : '' %>">
41
+ <%= link_to raw("<i class=\"linecons-desktop\"></i> <span class='title'>Dashboard</span>"), vyapari.admin_dashboard_url %>
42
+ </li>
43
+
44
+ <li class="">
45
+ <a href="/xenon/xenon-files/html/dashboard-1.html">
46
+ <i class="linecons-database"></i>
47
+ <span class="title">Configurations</span>
48
+ </a>
49
+ <ul>
50
+
51
+ <li class="<%= nav_class("admin/users") %>">
52
+ <%= link_to raw("<i class=\"linecons-user\"></i> <span class='title'>Manage Users</span>"), usman.admin_users_url %>
53
+ </li>
54
+
55
+ <li class="<%= nav_class("admin/users") %>">
56
+ <%= link_to raw("<i class=\"linecons-lock\"></i> <span class='title'>Manage Permissions</span>"), usman.admin_permissions_url %>
57
+ </li>
58
+
59
+ <li class="">
60
+ <%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Features</span>"), usman.admin_features_url %>
61
+ </li>
62
+
63
+ <li class="">
64
+ <%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Roles</span>"), usman.admin_roles_url %>
65
+ </li>
66
+
67
+ <li class="">
68
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Countries</span>"), vyapari.admin_countries_url %>
69
+ </li>
70
+
71
+ <li class="">
72
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Regions</span>"), vyapari.admin_regions_url %>
73
+ </li>
74
+
75
+ <li class="">
76
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Exchange Rates</span>"), vyapari.admin_exchange_rates_url %>
77
+ </li>
78
+
79
+ </ul>
80
+ </li>
81
+
82
+ <li class="">
83
+ <a href="/xenon/xenon-files/html/dashboard-1.html">
84
+ <i class="linecons-database"></i>
85
+ <span class="title">Stock Management</span>
86
+ </a>
87
+ <ul>
88
+ <li class="">
89
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Manage Suppliers</span>"), vyapari.admin_suppliers_url %>
90
+ </li>
91
+
92
+ <li class="">
93
+ <%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Manage Stores</span>"), vyapari.admin_stores_url %>
94
+ </li>
95
+
96
+ <li class="">
97
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Manage Brands</span>"), vyapari.admin_brands_url %>
98
+ </li>
99
+
100
+ <li class="">
101
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Manage Categories</span>"), vyapari.admin_categories_url %>
102
+ </li>
103
+
104
+ </ul>
105
+ </li>
106
+
107
+ <li class="">
108
+ <a href="/xenon/xenon-files/html/dashboard-1.html">
109
+ <i class="linecons-database"></i>
110
+ <span class="title">POS</span>
111
+ </a>
112
+ <ul>
113
+ <li class="">
114
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Manage Suppliers</span>"), vyapari.admin_suppliers_url %>
115
+ </li>
116
+
117
+ <li class="">
118
+ <%= link_to raw("<i class=\"linecons-diamond\"></i> <span class='title'>Manage Stores</span>"), vyapari.admin_stores_url %>
119
+ </li>
120
+
121
+ <li class="">
122
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Manage Brands</span>"), vyapari.admin_brands_url %>
123
+ </li>
124
+
125
+ <li class="">
126
+ <%= link_to raw("<i class=\"linecons-database\"></i> <span class='title'>Manage Categories</span>"), vyapari.admin_categories_url %>
127
+ </li>
128
+
129
+ </ul>
130
+ </li>
131
+
132
+ </ul>
133
+
134
+ </div>
135
+
136
+ </div>