argon_admin 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.
- checksums.yaml +7 -0
- data/README.md +42 -0
- data/lib/argon_admin.rb +7 -0
- data/lib/argon_admin/engine.rb +8 -0
- data/lib/argon_admin/version.rb +3 -0
- data/lib/generators/argon_admin_generator.rb +83 -0
- data/lib/tasks/argon_admin_tasks.rake +15 -0
- data/lib/templates/assets/images/admin/blue.png +0 -0
- data/lib/templates/assets/images/admin/favicon.png +0 -0
- data/lib/templates/assets/images/admin/team-1-800x800.jpg +0 -0
- data/lib/templates/assets/images/admin/white.png +0 -0
- data/lib/templates/assets/javascripts/admin.js +5 -0
- data/lib/templates/assets/stylesheets/admin.scss +4 -0
- data/lib/templates/controllers/base_admin_controller.rb +4 -0
- data/lib/templates/controllers/pages_controller.rb +4 -0
- data/lib/templates/controllers/users_controller.rb +44 -0
- data/lib/templates/layouts/admin.html.erb +26 -0
- data/lib/templates/layouts/devise.html.erb +26 -0
- data/lib/templates/views/kaminari/_gap.html.erb +1 -0
- data/lib/templates/views/kaminari/_next_page.html.erb +8 -0
- data/lib/templates/views/kaminari/_page.html.erb +3 -0
- data/lib/templates/views/kaminari/_paginator.html.erb +17 -0
- data/lib/templates/views/kaminari/_prev_page.html.erb +8 -0
- data/lib/templates/views/pages/dashboard.html.erb +228 -0
- data/lib/templates/views/sessions/new.html.erb +18 -0
- data/lib/templates/views/shared/_alert.html.erb +8 -0
- data/lib/templates/views/shared/_footer.html.erb +25 -0
- data/lib/templates/views/shared/_header.html.erb +7 -0
- data/lib/templates/views/shared/_navbar.html.erb +43 -0
- data/lib/templates/views/shared/_sidebar.html.erb +103 -0
- data/lib/templates/views/users/_user-form.html.erb +11 -0
- data/lib/templates/views/users/_user.html.erb +9 -0
- data/lib/templates/views/users/edit.html.erb +26 -0
- data/lib/templates/views/users/index.html.erb +42 -0
- data/lib/templates/views/users/new.html.erb +23 -0
- data/vendor/assets/fonts/nucleo-icons.eot +0 -0
- data/vendor/assets/fonts/nucleo-icons.svg +312 -0
- data/vendor/assets/fonts/nucleo-icons.ttf +0 -0
- data/vendor/assets/fonts/nucleo-icons.woff +0 -0
- data/vendor/assets/fonts/nucleo-icons.woff2 +0 -0
- data/vendor/assets/javascripts/argon-admin.js +51 -0
- data/vendor/assets/stylesheets/argon-admin.css +17 -0
- data/vendor/assets/stylesheets/nucleo.css +572 -0
- metadata +200 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c891dd162a61bb9d0299259487d9e036afb9ef0761d035754b1d335a5a28a236
|
4
|
+
data.tar.gz: c110fe882dd220994e113ca3ad6c39bd14044eca9e25e4d975d74cfcf47ae740
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 84dbafd0b95268146559cf6155c01a2ed9fc146ffa0438a9d72124fc975b933acc6bac9c1d5431b1aab86aff4525bff9b24677de5258c2fbaf73180f7b63432b
|
7
|
+
data.tar.gz: b230a0608f55b2e54de1e5eb2fc93f872f1ef8af690c943796f87555a370b998ccbb8b109e56ba461f4e00153fca24559b5482f35212009ffc82e6d95ee5a00f
|
data/README.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# ArgonAdmin
|
2
|
+
|
3
|
+
Simple admin panel generator with the [Argon Dashboard theme](https://github.com/creativetimofficial/argon-dashboard) for your new project.
|
4
|
+
|
5
|
+

|
6
|
+
|
7
|
+
Main features included by default:
|
8
|
+
|
9
|
+
- Authentication with [Devise](https://github.com/plataformatec/devise).
|
10
|
+
- [Argon Dashboard theme](https://github.com/creativetimofficial/argon-dashboard) theme included for the admin panel.
|
11
|
+
- ERB template engine.
|
12
|
+
- Pagination with [Kaminari](https://github.com/kaminari/kaminari)
|
13
|
+
- [Simple form](https://github.com/plataformatec/simple_form) integration
|
14
|
+
- Сustomized flash messages
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
Add this line to your application's Gemfile:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
gem 'argon_admin'
|
22
|
+
```
|
23
|
+
And then execute:
|
24
|
+
|
25
|
+
$ bundle i
|
26
|
+
|
27
|
+
Next, you need to run the generator:
|
28
|
+
|
29
|
+
$ rails argon_admin:install
|
30
|
+
|
31
|
+
Generate devise user:
|
32
|
+
|
33
|
+
$ rails db:migrate
|
34
|
+
$ rails db:seed
|
35
|
+
|
36
|
+
And you're ready to go. Test if all it's ok by starting a server and check it with rails s.
|
37
|
+
|
38
|
+
Default admin user with email admin@example.com and password 123456789
|
39
|
+
|
40
|
+
## Contributing
|
41
|
+
|
42
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/zelen-sv/argon_admin.
|
data/lib/argon_admin.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
class ArgonAdminGenerator < Rails::Generators::Base
|
2
|
+
include Singleton
|
3
|
+
source_root File.expand_path("../templates", __dir__)
|
4
|
+
|
5
|
+
ROUTES_TEXT = <<-RUBY
|
6
|
+
namespace :admin do
|
7
|
+
root 'pages#dashboard'
|
8
|
+
resources :users
|
9
|
+
end
|
10
|
+
RUBY
|
11
|
+
|
12
|
+
HELPER_TEXT = <<-RUBY
|
13
|
+
def flash_class(level)
|
14
|
+
case level.to_sym
|
15
|
+
when :notice then "alert alert-primary"
|
16
|
+
when :success then "alert alert-success"
|
17
|
+
when :error then "alert alert-danger"
|
18
|
+
when :alert then "alert alert-warning"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
RUBY
|
22
|
+
|
23
|
+
ASSETS_TEXT = <<-RUBY
|
24
|
+
Rails.application.config.assets.precompile += %w( admin.js admin.scss )
|
25
|
+
Rails.application.config.assets.precompile << /\.(?:svg|eot|woff|ttf)\z/
|
26
|
+
RUBY
|
27
|
+
|
28
|
+
def generate_assets
|
29
|
+
copy_file "assets/stylesheets/admin.scss", "app/assets/stylesheets/admin.scss"
|
30
|
+
copy_file "assets/javascripts/admin.js", "app/assets/javascripts/admin.js"
|
31
|
+
directory "assets/images/admin", "app/assets/images/admin"
|
32
|
+
append_to_file 'config/initializers/assets.rb' do
|
33
|
+
ASSETS_TEXT
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def generate_views
|
38
|
+
directory "layouts", "app/views/layouts"
|
39
|
+
directory "views/pages", "app/views/admin/pages"
|
40
|
+
directory "views/users", "app/views/admin/users"
|
41
|
+
directory "views/shared", "app/views/admin/shared"
|
42
|
+
directory "views/sessions", "app/views/devise/sessions"
|
43
|
+
directory "views/kaminari", "app/views/kaminari"
|
44
|
+
end
|
45
|
+
|
46
|
+
def generate_admin_data
|
47
|
+
insert_into_file "config/routes.rb", after: "Rails.application.routes.draw do\n" do
|
48
|
+
ROUTES_TEXT
|
49
|
+
end
|
50
|
+
insert_into_file "app/helpers/application_helper.rb", after: "module ApplicationHelper\n" do
|
51
|
+
HELPER_TEXT
|
52
|
+
end
|
53
|
+
directory "controllers", "app/controllers/admin/"
|
54
|
+
end
|
55
|
+
|
56
|
+
def generate_devise_data
|
57
|
+
add_secret_key
|
58
|
+
update_development_mailer_config
|
59
|
+
update_seeds_file
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def add_secret_key
|
65
|
+
secret = SecureRandom.hex(64)
|
66
|
+
insert_into_file "config/initializers/devise.rb", after: "Devise.setup do |config|\n" do
|
67
|
+
"config.secret_key = '#{secret}'"
|
68
|
+
end
|
69
|
+
gsub_file('config/initializers/devise.rb', "config.sign_out_via = :delete", "config.sign_out_via = :get")
|
70
|
+
end
|
71
|
+
|
72
|
+
def update_development_mailer_config
|
73
|
+
insert_into_file "config/environments/development.rb", after: "Rails.application.configure do\n" do
|
74
|
+
"config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }\n"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def update_seeds_file
|
79
|
+
append_to_file 'db/seeds.rb' do
|
80
|
+
"User.create!(email: 'admin@example.com', password: '123456789', password_confirmation: '123456789')"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'generators/argon_admin_generator'
|
2
|
+
|
3
|
+
namespace :argon_admin do
|
4
|
+
desc 'Generate admin panel'
|
5
|
+
task :install do
|
6
|
+
generator = ArgonAdminGenerator.instance
|
7
|
+
generator.generate_assets
|
8
|
+
generator.generate_views
|
9
|
+
generator.generate_admin_data
|
10
|
+
system "rails generate simple_form:install --bootstrap"
|
11
|
+
system "rails generate devise:install"
|
12
|
+
generator.generate_devise_data
|
13
|
+
system "rails generate devise user"
|
14
|
+
end
|
15
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,44 @@
|
|
1
|
+
class Admin::UsersController < Admin::BaseAdminController
|
2
|
+
before_action :set_user, only: [:edit, :update, :destroy]
|
3
|
+
|
4
|
+
def new
|
5
|
+
@user = User.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def index
|
9
|
+
@users = User.order(created_at: :desc).page(params[:page]).per(6)
|
10
|
+
end
|
11
|
+
|
12
|
+
def edit
|
13
|
+
end
|
14
|
+
|
15
|
+
def update
|
16
|
+
return redirect_to admin_users_path if @user.update(user_params)
|
17
|
+
flash.now[:error] = 'Failed to update user!'
|
18
|
+
render 'edit'
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
@user = User.new(user_params)
|
23
|
+
|
24
|
+
return redirect_to admin_users_path if @user.save
|
25
|
+
flash.now[:error] = 'Failed to create user!'
|
26
|
+
render 'new'
|
27
|
+
end
|
28
|
+
|
29
|
+
def destroy
|
30
|
+
@user.destroy
|
31
|
+
flash[:error] = 'User destroyed'
|
32
|
+
redirect_to admin_users_path
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def set_user
|
38
|
+
@user = User.find(params[:id])
|
39
|
+
end
|
40
|
+
|
41
|
+
def user_params
|
42
|
+
params.require(:user).permit(:email, :password, :password_confirmation)
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html class="no-js h-100">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
6
|
+
<title>Admin panel</title>
|
7
|
+
|
8
|
+
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
|
9
|
+
|
10
|
+
<%= csrf_meta_tags %>
|
11
|
+
<%= stylesheet_link_tag 'admin', media: 'all', 'data-turbolinks-track': 'reload' %>
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<%= render 'admin/shared/sidebar' %>
|
15
|
+
<div class="main-content">
|
16
|
+
<%= render 'admin/shared/navbar' %>
|
17
|
+
<%= render 'admin/shared/header' %>
|
18
|
+
<div class="container-fluid mt--7">
|
19
|
+
<%= render 'admin/shared/alert' %>
|
20
|
+
<%= yield %>
|
21
|
+
<%= render 'admin/shared/footer' %>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</body>
|
25
|
+
<%= javascript_include_tag 'admin' %>
|
26
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html class="no-js h-100">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
6
|
+
<title>Admin panel | Login</title>
|
7
|
+
|
8
|
+
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700" rel="stylesheet">
|
9
|
+
|
10
|
+
<%= csrf_meta_tags %>
|
11
|
+
<%= stylesheet_link_tag 'admin', media: 'all', 'data-turbolinks-track': 'reload' %>
|
12
|
+
</head>
|
13
|
+
<body class="bg-default">
|
14
|
+
<div class="main-content">
|
15
|
+
<div class="container mt-4 pb-5">
|
16
|
+
<div class="row justify-content-center">
|
17
|
+
<div class="col-lg-5 col-md-7">
|
18
|
+
<%= yield %>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
</body>
|
24
|
+
<%= javascript_include_tag 'admin' %>
|
25
|
+
</html>
|
26
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
<span class="page-item gap"><%= "…".html_safe %></span>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= paginator.render do -%>
|
2
|
+
<nav>
|
3
|
+
<ul class="pagination justify-content-end" role="navigation" aria-label="pager">
|
4
|
+
<%= prev_page_tag unless current_page.first? %>
|
5
|
+
<% each_page do |page| -%>
|
6
|
+
<% if page.display_tag? -%>
|
7
|
+
<%= page_tag page %>
|
8
|
+
<% elsif !page.was_truncated? -%>
|
9
|
+
<%= gap_tag %>
|
10
|
+
<% end -%>
|
11
|
+
<% end -%>
|
12
|
+
<% unless current_page.out_of_range? %>
|
13
|
+
<%= next_page_tag unless current_page.last? %>
|
14
|
+
<% end %>
|
15
|
+
</ul>
|
16
|
+
</nav>
|
17
|
+
<% end -%>
|
@@ -0,0 +1,228 @@
|
|
1
|
+
<% content_for :header_body do %>
|
2
|
+
<div class="container">
|
3
|
+
<div class="col-lg-7 col-md-10">
|
4
|
+
<h1 class="display-2 text-white">Hello Admin</h1>
|
5
|
+
<p class="text-white mt-0 mb-5">This is your dashboard page.</p>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<div class="row">
|
11
|
+
<div class="col">
|
12
|
+
<div class="card shadow">
|
13
|
+
<div class="card-header border-0">
|
14
|
+
<h3 class="mb-0">Example projects table</h3>
|
15
|
+
</div>
|
16
|
+
<div class="table-responsive">
|
17
|
+
<table class="table align-items-center table-flush">
|
18
|
+
<thead class="thead-light">
|
19
|
+
<tr>
|
20
|
+
<th scope="col">Project</th>
|
21
|
+
<th scope="col">Budget</th>
|
22
|
+
<th scope="col">Status</th>
|
23
|
+
<th scope="col">Completion</th>
|
24
|
+
<th scope="col">Actions</th>
|
25
|
+
</tr>
|
26
|
+
</thead>
|
27
|
+
<tbody>
|
28
|
+
<tr>
|
29
|
+
<th scope="row">
|
30
|
+
<div class="media align-items-center">
|
31
|
+
<div class="media-body">
|
32
|
+
<span class="mb-0 text-sm">Project №1</span>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
</th>
|
36
|
+
<td>
|
37
|
+
$2,500 USD
|
38
|
+
</td>
|
39
|
+
<td>
|
40
|
+
<span class="badge badge-dot mr-4">
|
41
|
+
<i class="bg-warning"></i> pending
|
42
|
+
</span>
|
43
|
+
</td>
|
44
|
+
<td>
|
45
|
+
<div class="d-flex align-items-center">
|
46
|
+
<span class="mr-2">60%</span>
|
47
|
+
<div>
|
48
|
+
<div class="progress">
|
49
|
+
<div class="progress-bar bg-warning" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;"></div>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
</td>
|
54
|
+
<td class="text-right">
|
55
|
+
<div class="dropdown">
|
56
|
+
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
57
|
+
<i class="fa fa-ellipsis-v"></i>
|
58
|
+
</a>
|
59
|
+
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
|
60
|
+
<a class="dropdown-item" href="#">Action</a>
|
61
|
+
<a class="dropdown-item" href="#">Another action</a>
|
62
|
+
<a class="dropdown-item" href="#">Something else here</a>
|
63
|
+
</div>
|
64
|
+
</div>
|
65
|
+
</td>
|
66
|
+
</tr>
|
67
|
+
<tr>
|
68
|
+
<th scope="row">
|
69
|
+
<div class="media align-items-center">
|
70
|
+
<div class="media-body">
|
71
|
+
<span class="mb-0 text-sm">Project №2</span>
|
72
|
+
</div>
|
73
|
+
</div>
|
74
|
+
</th>
|
75
|
+
<td>
|
76
|
+
$1,800 USD
|
77
|
+
</td>
|
78
|
+
<td>
|
79
|
+
<span class="badge badge-dot">
|
80
|
+
<i class="bg-success"></i> completed
|
81
|
+
</span>
|
82
|
+
</td>
|
83
|
+
<td>
|
84
|
+
<div class="d-flex align-items-center">
|
85
|
+
<span class="mr-2">100%</span>
|
86
|
+
<div>
|
87
|
+
<div class="progress">
|
88
|
+
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%;"></div>
|
89
|
+
</div>
|
90
|
+
</div>
|
91
|
+
</div>
|
92
|
+
</td>
|
93
|
+
<td class="text-right">
|
94
|
+
<div class="dropdown">
|
95
|
+
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
96
|
+
<i class="fa fa-ellipsis-v"></i>
|
97
|
+
</a>
|
98
|
+
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
|
99
|
+
<a class="dropdown-item" href="#">Action</a>
|
100
|
+
<a class="dropdown-item" href="#">Another action</a>
|
101
|
+
<a class="dropdown-item" href="#">Something else here</a>
|
102
|
+
</div>
|
103
|
+
</div>
|
104
|
+
</td>
|
105
|
+
</tr>
|
106
|
+
<tr>
|
107
|
+
<th scope="row">
|
108
|
+
<div class="media align-items-center">
|
109
|
+
<div class="media-body">
|
110
|
+
<span class="mb-0 text-sm">Project №3</span>
|
111
|
+
</div>
|
112
|
+
</div>
|
113
|
+
</th>
|
114
|
+
<td>
|
115
|
+
$3,150 USD
|
116
|
+
</td>
|
117
|
+
<td>
|
118
|
+
<span class="badge badge-dot mr-4">
|
119
|
+
<i class="bg-danger"></i> delayed
|
120
|
+
</span>
|
121
|
+
</td>
|
122
|
+
<td>
|
123
|
+
<div class="d-flex align-items-center">
|
124
|
+
<span class="mr-2">73%</span>
|
125
|
+
<div>
|
126
|
+
<div class="progress">
|
127
|
+
<div class="progress-bar bg-danger" role="progressbar" aria-valuenow="73" aria-valuemin="0" aria-valuemax="100" style="width: 73%;"></div>
|
128
|
+
</div>
|
129
|
+
</div>
|
130
|
+
</div>
|
131
|
+
</td>
|
132
|
+
<td class="text-right">
|
133
|
+
<div class="dropdown">
|
134
|
+
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
135
|
+
<i class="fa fa-ellipsis-v"></i>
|
136
|
+
</a>
|
137
|
+
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
|
138
|
+
<a class="dropdown-item" href="#">Action</a>
|
139
|
+
<a class="dropdown-item" href="#">Another action</a>
|
140
|
+
<a class="dropdown-item" href="#">Something else here</a>
|
141
|
+
</div>
|
142
|
+
</div>
|
143
|
+
</td>
|
144
|
+
</tr>
|
145
|
+
<tr>
|
146
|
+
<th scope="row">
|
147
|
+
<div class="media align-items-center">
|
148
|
+
<div class="media-body">
|
149
|
+
<span class="mb-0 text-sm">Project №4</span>
|
150
|
+
</div>
|
151
|
+
</div>
|
152
|
+
</th>
|
153
|
+
<td>
|
154
|
+
$4,400 USD
|
155
|
+
</td>
|
156
|
+
<td>
|
157
|
+
<span class="badge badge-dot">
|
158
|
+
<i class="bg-info"></i> on schedule
|
159
|
+
</span>
|
160
|
+
</td>
|
161
|
+
<td>
|
162
|
+
<div class="d-flex align-items-center">
|
163
|
+
<span class="mr-2">90%</span>
|
164
|
+
<div>
|
165
|
+
<div class="progress">
|
166
|
+
<div class="progress-bar bg-info" role="progressbar" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100" style="width: 90%;"></div>
|
167
|
+
</div>
|
168
|
+
</div>
|
169
|
+
</div>
|
170
|
+
</td>
|
171
|
+
<td class="text-right">
|
172
|
+
<div class="dropdown">
|
173
|
+
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
174
|
+
<i class="fa fa-ellipsis-v"></i>
|
175
|
+
</a>
|
176
|
+
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
|
177
|
+
<a class="dropdown-item" href="#">Action</a>
|
178
|
+
<a class="dropdown-item" href="#">Another action</a>
|
179
|
+
<a class="dropdown-item" href="#">Something else here</a>
|
180
|
+
</div>
|
181
|
+
</div>
|
182
|
+
</td>
|
183
|
+
</tr>
|
184
|
+
<tr>
|
185
|
+
<th scope="row">
|
186
|
+
<div class="media align-items-center">
|
187
|
+
<div class="media-body">
|
188
|
+
<span class="mb-0 text-sm">Project №5</span>
|
189
|
+
</div>
|
190
|
+
</div>
|
191
|
+
</th>
|
192
|
+
<td>
|
193
|
+
$2,200 USD
|
194
|
+
</td>
|
195
|
+
<td>
|
196
|
+
<span class="badge badge-dot mr-4">
|
197
|
+
<i class="bg-success"></i> completed
|
198
|
+
</span>
|
199
|
+
</td>
|
200
|
+
<td>
|
201
|
+
<div class="d-flex align-items-center">
|
202
|
+
<span class="mr-2">100%</span>
|
203
|
+
<div>
|
204
|
+
<div class="progress">
|
205
|
+
<div class="progress-bar bg-success" role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%;"></div>
|
206
|
+
</div>
|
207
|
+
</div>
|
208
|
+
</div>
|
209
|
+
</td>
|
210
|
+
<td class="text-right">
|
211
|
+
<div class="dropdown">
|
212
|
+
<a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
213
|
+
<i class="fa fa-ellipsis-v"></i>
|
214
|
+
</a>
|
215
|
+
<div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
|
216
|
+
<a class="dropdown-item" href="#">Action</a>
|
217
|
+
<a class="dropdown-item" href="#">Another action</a>
|
218
|
+
<a class="dropdown-item" href="#">Something else here</a>
|
219
|
+
</div>
|
220
|
+
</div>
|
221
|
+
</td>
|
222
|
+
</tr>
|
223
|
+
</tbody>
|
224
|
+
</table>
|
225
|
+
</div>
|
226
|
+
</div>
|
227
|
+
</div>
|
228
|
+
</div>
|