r4 0.1.1
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/Gemfile +4 -0
- data/README.md +64 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/r4 +4 -0
- data/bin/setup +7 -0
- data/lib/r4.rb +5 -0
- data/lib/r4/config.rb +12 -0
- data/lib/r4/installations/default.rb +44 -0
- data/lib/r4/installations/testing.rb +4 -0
- data/lib/r4/odin.rb +76 -0
- data/lib/r4/recipes/bootstrap.rb +9 -0
- data/lib/r4/recipes/bootstrap_app.rb +10 -0
- data/lib/r4/recipes/devise.rb +94 -0
- data/lib/r4/recipes/exception_notification.rb +10 -0
- data/lib/r4/recipes/gemfile.rb +34 -0
- data/lib/r4/recipes/gitignore.rb +8 -0
- data/lib/r4/recipes/install_questions.rb +20 -0
- data/lib/r4/recipes/lazy_high_charts.rb +18 -0
- data/lib/r4/recipes/mysql.rb +22 -0
- data/lib/r4/recipes/rspec_generators.rb +18 -0
- data/lib/r4/recipes/upload_app.rb +9 -0
- data/lib/r4/recipes/wicked_pdf.rb +35 -0
- data/lib/r4/recipes/xlsx_support.rb +6 -0
- data/lib/r4/starter.rb +116 -0
- data/lib/r4/template/.ruby-version +1 -0
- data/lib/r4/template/app/assets/javascripts/main.js.rb +11 -0
- data/lib/r4/template/app/assets/stylesheets/custom.css.scss +128 -0
- data/lib/r4/template/app/assets/stylesheets/main.css.scss +7 -0
- data/lib/r4/template/app/assets/stylesheets/theme.css +7089 -0
- data/lib/r4/template/app/assets/stylesheets/timepress.css.scss +127 -0
- data/lib/r4/template/app/controllers/users_controller.rb +106 -0
- data/lib/r4/template/app/views/layouts/application.html.erb +64 -0
- data/lib/r4/template/app/views/users/_form.html.erb +64 -0
- data/lib/r4/template/app/views/users/edit.html.erb +10 -0
- data/lib/r4/template/app/views/users/edit_password.html.erb +49 -0
- data/lib/r4/template/app/views/users/index.html.erb +36 -0
- data/lib/r4/template/app/views/users/index.json.jbuilder +4 -0
- data/lib/r4/template/app/views/users/new.html.erb +9 -0
- data/lib/r4/template/app/views/users/show.html.erb +14 -0
- data/lib/r4/template/app/views/users/show.json.jbuilder +1 -0
- data/lib/r4/template/config/initializers/html_helpers.rb +99 -0
- data/lib/r4/template/config/locales/cs.yml +307 -0
- data/lib/r4/template/lib/tasks/bootstrap.rake +20 -0
- data/lib/r4/template/lib/tasks/upload.rake +24 -0
- data/lib/r4/version.rb +3 -0
- data/r4.gemspec +29 -0
- metadata +136 -0
@@ -0,0 +1,127 @@
|
|
1
|
+
@media (min-width: 1200px) {
|
2
|
+
.container-small {
|
3
|
+
width: 700px;
|
4
|
+
}
|
5
|
+
.container-large {
|
6
|
+
width: 1320px;
|
7
|
+
}
|
8
|
+
}
|
9
|
+
|
10
|
+
.container-small, .container-large {
|
11
|
+
max-width: 100%;
|
12
|
+
}
|
13
|
+
|
14
|
+
.table-responsive {
|
15
|
+
border-top: 1px solid #D0D3D4;
|
16
|
+
padding: 15px;
|
17
|
+
padding-bottom: 6px;
|
18
|
+
background: #fff;
|
19
|
+
}
|
20
|
+
.vertical-divider {
|
21
|
+
border-top: 1px solid #4E5D6C;
|
22
|
+
-webkit-box-shadow: inset 0px 1px 0px 0px rgba(78,93,108,1);
|
23
|
+
-moz-box-shadow: inset 0px 1px 0px 0px rgba(78,93,108,1);
|
24
|
+
box-shadow: inset 0px 1px 0px 0px rgba(198, 201, 203, 1);
|
25
|
+
}
|
26
|
+
|
27
|
+
.price-diff, .daylight-saving {
|
28
|
+
position: relative;
|
29
|
+
}
|
30
|
+
|
31
|
+
.price-diff:after {
|
32
|
+
content: " ";
|
33
|
+
width: 0;
|
34
|
+
height: 0;
|
35
|
+
position: absolute;
|
36
|
+
top: 8px;
|
37
|
+
left: 100%;
|
38
|
+
border-style: solid;
|
39
|
+
border-width: 4px 0 4px 5px;
|
40
|
+
border-color: transparent transparent transparent #eb2a2a;
|
41
|
+
}
|
42
|
+
|
43
|
+
.daylight-saving:after {
|
44
|
+
content: " ";
|
45
|
+
width: 0;
|
46
|
+
height: 0;
|
47
|
+
position: absolute;
|
48
|
+
top: 8px;
|
49
|
+
right: 0;
|
50
|
+
border-style: solid;
|
51
|
+
border-width: 4px 5px 4px 0;
|
52
|
+
border-color: transparent #31afd5 transparent transparent;
|
53
|
+
}
|
54
|
+
|
55
|
+
.period-select {
|
56
|
+
border-top: 1px solid #D0D3D4;
|
57
|
+
padding: 10px 15px;
|
58
|
+
background: #f0f0f0;
|
59
|
+
padding-bottom: 6px;
|
60
|
+
margin-bottom: 0px;
|
61
|
+
font-weight: 300;
|
62
|
+
overflow-x: auto;
|
63
|
+
white-space: nowrap;
|
64
|
+
.period-list {
|
65
|
+
overflow: auto;
|
66
|
+
}
|
67
|
+
span.year {
|
68
|
+
display: inline;
|
69
|
+
border-radius: 3px;
|
70
|
+
background: #4E5D6C;
|
71
|
+
color: #fff;
|
72
|
+
padding: 0 3px;
|
73
|
+
margin-right: 5px;
|
74
|
+
}
|
75
|
+
table {
|
76
|
+
a {
|
77
|
+
font-weight: 300;
|
78
|
+
color: #428bca;
|
79
|
+
display: inline;
|
80
|
+
}
|
81
|
+
a.active {
|
82
|
+
background: #DF691A;
|
83
|
+
color: white;
|
84
|
+
padding: 0 3px;
|
85
|
+
border-radius: 3px;
|
86
|
+
}
|
87
|
+
a:hover {
|
88
|
+
background: #31AFD5;
|
89
|
+
color: white;
|
90
|
+
padding: 0 3px;
|
91
|
+
border-radius: 3px;
|
92
|
+
text-decoration: none;
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
|
98
|
+
.period-select .mCSB_horizontal.mCSB_inside > .mCSB_container {
|
99
|
+
margin-bottom: 17px;
|
100
|
+
margin-right: 0;
|
101
|
+
}
|
102
|
+
|
103
|
+
.period-select.mCS_no_scrollbar .mCSB_horizontal.mCSB_inside > .mCSB_container {
|
104
|
+
margin-bottom: 0px;
|
105
|
+
}
|
106
|
+
|
107
|
+
.mCSB_scrollTools.mCSB_scrollTools_horizontal {
|
108
|
+
border-top: 1px dotted #D0D3D4;
|
109
|
+
padding-top: 5px;
|
110
|
+
height: 21px;
|
111
|
+
}
|
112
|
+
|
113
|
+
.period-select .mCSB_scrollTools.mCSB_scrollTools_horizontal {
|
114
|
+
border: none;
|
115
|
+
padding-top: 6px;
|
116
|
+
}
|
117
|
+
|
118
|
+
.mCSB_scrollTools.mCSB_scrollTools_horizontal a + .mCSB_draggerContainer {
|
119
|
+
margin-top: 6px;
|
120
|
+
}
|
121
|
+
|
122
|
+
.form {
|
123
|
+
background: #fff;
|
124
|
+
border-top: 1px solid #D0D3D4;
|
125
|
+
padding: 15px 0;
|
126
|
+
margin-bottom: 30px;
|
127
|
+
}
|
@@ -0,0 +1,106 @@
|
|
1
|
+
class UsersController < ApplicationController
|
2
|
+
before_action :set_user, only: [:show, :edit, :update, :destroy]
|
3
|
+
before_filter :only_for_admin, except: [:edit_own_password, :update_password]
|
4
|
+
|
5
|
+
# GET /users
|
6
|
+
# GET /users.json
|
7
|
+
def index
|
8
|
+
@users = User.all
|
9
|
+
end
|
10
|
+
|
11
|
+
# GET /users/1
|
12
|
+
# GET /users/1.json
|
13
|
+
def show
|
14
|
+
end
|
15
|
+
|
16
|
+
# GET /users/new
|
17
|
+
def new
|
18
|
+
@user = User.new
|
19
|
+
end
|
20
|
+
|
21
|
+
# GET /users/1/edit
|
22
|
+
def edit
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit_password
|
27
|
+
@user = User.find(params[:id])
|
28
|
+
end
|
29
|
+
|
30
|
+
def edit_own_password
|
31
|
+
@user = current_user
|
32
|
+
render 'edit_password'
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_password
|
36
|
+
@user = User.find(params[:id])
|
37
|
+
if @user.id == current_user.id
|
38
|
+
if @user.update_with_password(user_params)
|
39
|
+
sign_in @user, :bypass => true
|
40
|
+
redirect_to root_path
|
41
|
+
else
|
42
|
+
render 'edit_password'
|
43
|
+
end
|
44
|
+
else
|
45
|
+
if @user.update(user_params)
|
46
|
+
redirect_to root_path
|
47
|
+
else
|
48
|
+
render 'edit_password'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# POST /users
|
54
|
+
# POST /users.json
|
55
|
+
def create
|
56
|
+
@user = User.new(user_params)
|
57
|
+
|
58
|
+
respond_to do |format|
|
59
|
+
if @user.save
|
60
|
+
format.html { redirect_to users_url, notice: 'Uživatel byl uložen.' }
|
61
|
+
format.json { render :show, status: :created, location: @user }
|
62
|
+
else
|
63
|
+
format.html { render :new }
|
64
|
+
format.json { render json: @user.errors, status: :unprocessable_entity }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# PATCH/PUT /users/1
|
70
|
+
# PATCH/PUT /users/1.json
|
71
|
+
def update
|
72
|
+
respond_to do |format|
|
73
|
+
if @user.update(user_params)
|
74
|
+
format.html { redirect_to users_url, notice: 'Uživatel byl upraven.' }
|
75
|
+
format.json { render :show, status: :ok, location: @user }
|
76
|
+
else
|
77
|
+
format.html { render :edit }
|
78
|
+
format.json { render json: @user.errors, status: :unprocessable_entity }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# DELETE /users/1
|
84
|
+
# DELETE /users/1.json
|
85
|
+
def destroy
|
86
|
+
@user.destroy
|
87
|
+
respond_to do |format|
|
88
|
+
format.html { redirect_to users_url, notice: 'Uživatel byl odstraněn.' }
|
89
|
+
format.json { head :no_content }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
# Use callbacks to share common setup or constraints between actions.
|
95
|
+
def set_user
|
96
|
+
@user = User.find(params[:id])
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
# Never trust parameters from the scary internet, only allow the white list through.
|
102
|
+
def user_params
|
103
|
+
params.required(:user).permit(:password, :password_confirmation, :current_password, :email,
|
104
|
+
:login, :firstname, :lastname)
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>PROJECT_NAME</title>
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
7
|
+
<meta name="description" content="">
|
8
|
+
<meta name="author" content="">
|
9
|
+
|
10
|
+
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
11
|
+
<!--[if lt IE 9]>
|
12
|
+
<%= javascript_include_tag "https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js", "https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js" %>
|
13
|
+
<![endif]-->
|
14
|
+
|
15
|
+
<%= favicon_link_tag 'favicon.png' %>
|
16
|
+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
|
17
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
18
|
+
<%= csrf_meta_tags %>
|
19
|
+
</head>
|
20
|
+
<body>
|
21
|
+
<div class="navbar navbar-default navbar-fixed-top">
|
22
|
+
<div class="container container-large">
|
23
|
+
<div class="navbar-header">
|
24
|
+
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
25
|
+
<span class="sr-only">Toggle navigation</span>
|
26
|
+
<span class="icon-bar"></span>
|
27
|
+
<span class="icon-bar"></span>
|
28
|
+
<span class="icon-bar"></span>
|
29
|
+
</button>
|
30
|
+
</div>
|
31
|
+
<% if current_user %>
|
32
|
+
<div class="collapse navbar-collapse">
|
33
|
+
<ul class="nav navbar-nav">
|
34
|
+
<%= menu_item 'example', '#', /example(?!new)/ %>
|
35
|
+
</ul>
|
36
|
+
<ul class="nav navbar-nav navbar-right">
|
37
|
+
<li id="fat-menu" class="dropdown">
|
38
|
+
<a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
|
39
|
+
<i class="icon-user"></i> <%= 'Přihlášen' %>: <%= current_user.display_name %>
|
40
|
+
<i class="icon-caret-down"></i>
|
41
|
+
</a>
|
42
|
+
<ul class="dropdown-menu">
|
43
|
+
<li><%= link_to 'Změnit heslo', {controller: 'users', action: 'edit_own_password'} , :tabindex => -1 %></li>
|
44
|
+
<li class="divider"></li>
|
45
|
+
<li><%= link_to 'Odhlásit', destroy_user_session_path, :method => :delete %></li>
|
46
|
+
</ul>
|
47
|
+
</li>
|
48
|
+
</ul>
|
49
|
+
</div>
|
50
|
+
<% end %>
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
<div class="container container-large content">
|
54
|
+
<% flash.each do |name, msg| %>
|
55
|
+
<%= content_tag :div, :class => "alert alert-#{ name == :error ? "danger" : "success" } alert-dismissable" do %>
|
56
|
+
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
57
|
+
<%= msg %>
|
58
|
+
<% end %>
|
59
|
+
<% end %>
|
60
|
+
|
61
|
+
<%= yield %>
|
62
|
+
</div>
|
63
|
+
</body>
|
64
|
+
</html>
|
@@ -0,0 +1,64 @@
|
|
1
|
+
<%= form_for(@user, :html => { :class => "form-horizontal" }) do |f| %>
|
2
|
+
<% if @user.errors.any? %>
|
3
|
+
<div class="alert alert-danger alert-dismissable">
|
4
|
+
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
5
|
+
<ul>
|
6
|
+
<% @user.errors.messages.each do |msg| %>
|
7
|
+
<li><%= msg[1].first %></li>
|
8
|
+
<% end %>
|
9
|
+
</ul>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<div class="col-lg-8">
|
14
|
+
<div class="form-group">
|
15
|
+
<%= f.label :login, 'Login', :class => "col-sm-2 control-label" %>
|
16
|
+
<div class="col-sm-6">
|
17
|
+
<%= f.text_field :login, :class => "form-control" %>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
|
21
|
+
<div class="form-group">
|
22
|
+
<%= f.label :email, 'E-mail', :class => "col-sm-2 control-label" %>
|
23
|
+
<div class="col-sm-6">
|
24
|
+
<%= f.text_field :email, :class => "form-control" %>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div class="form-group">
|
29
|
+
<%= f.label :firstname, 'Jméno', :class => "col-sm-2 control-label" %>
|
30
|
+
<div class="col-sm-6">
|
31
|
+
<%= f.text_field :firstname, :class => "form-control" %>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div class="form-group">
|
36
|
+
<%= f.label :lastname, 'Příjmení', :class => "col-sm-2 control-label" %>
|
37
|
+
<div class="col-sm-6">
|
38
|
+
<%= f.text_field :lastname, :class => "form-control" %>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
|
42
|
+
<% if params[:action] == 'new' || params[:action] == 'create' %>
|
43
|
+
<div class="form-group">
|
44
|
+
<%= f.label :password, 'Heslo', :class => "col-sm-2 control-label" %>
|
45
|
+
<div class="col-sm-4">
|
46
|
+
<%= f.password_field :password, :class => "form-control" %>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
|
50
|
+
<div class="form-group">
|
51
|
+
<%= f.label :password_confirmation, 'Potvrzení hesla', :class => "col-sm-2 control-label" %>
|
52
|
+
<div class="col-sm-4">
|
53
|
+
<%= f.password_field :password_confirmation, :class => "form-control" %>
|
54
|
+
</div>
|
55
|
+
</div>
|
56
|
+
<% end %>
|
57
|
+
|
58
|
+
<div class="form-group">
|
59
|
+
<div class="col-sm-offset-2 col-sm-6">
|
60
|
+
<%= f.submit 'Uložit', class: 'btn btn-primary' %>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
</div>
|
64
|
+
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<div class="page-header">
|
2
|
+
<%= delete_button @user, 'Opravdu chcete uživatel odstranit?' %>
|
3
|
+
<%= link_to users_path, :class => 'btn btn-default' do %>
|
4
|
+
<span class="glyphicon glyphicon-list-alt"></span>
|
5
|
+
Zpět
|
6
|
+
<% end %>
|
7
|
+
<h1>Úprava uživatele</h1>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
<%= render 'form' %>
|
@@ -0,0 +1,49 @@
|
|
1
|
+
<div class="page-header">
|
2
|
+
<% if @user.errors.any? %>
|
3
|
+
<div class="alert alert-danger alert-dismissable">
|
4
|
+
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
5
|
+
<ul>
|
6
|
+
<% @user.errors.messages.each do |msg| %>
|
7
|
+
<li><%= msg[1].first %></li>
|
8
|
+
<% end %>
|
9
|
+
</ul>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
12
|
+
|
13
|
+
<h1>Změna hesla</h1>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<%= form_for(@user, url: { action: 'update_password', id: @user }, html: { class: "form-horizontal" } ) do |f| %>
|
17
|
+
|
18
|
+
<div class="col-lg-8">
|
19
|
+
|
20
|
+
<% unless current_user.admin? && @user.id != current_user.id%>
|
21
|
+
<div class="form-group">
|
22
|
+
<%= f.label :current_password, 'Současné heslo', :class => "col-sm-2 control-label" %>
|
23
|
+
<div class="col-sm-4">
|
24
|
+
<%= f.password_field :current_password, :class => "form-control" %>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
<% end %>
|
28
|
+
|
29
|
+
<div class="form-group">
|
30
|
+
<%= f.label :password, 'Heslo', :class => "col-sm-2 control-label" %>
|
31
|
+
<div class="col-sm-4">
|
32
|
+
<%= f.password_field :password, :class => "form-control" %>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
|
36
|
+
<div class="form-group">
|
37
|
+
<%= f.label :password_confirmation, 'Potvrzení hesla', :class => "col-sm-2 control-label" %>
|
38
|
+
<div class="col-sm-4">
|
39
|
+
<%= f.password_field :password_confirmation, :class => "form-control" %>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div class="form-group">
|
44
|
+
<div class="col-sm-offset-2 col-sm-4">
|
45
|
+
<%= f.submit 'Změnit heslo', class: 'btn btn-primary' %>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
</div>
|
49
|
+
<% end %>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
<div class="page-header">
|
2
|
+
<%= link_to new_user_path, :class => 'btn btn-primary' do %>
|
3
|
+
<span class="glyphicon glyphicon-plus"></span>
|
4
|
+
Nový uživatel
|
5
|
+
<% end %>
|
6
|
+
<h1>Seznam uživatelů</h1>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="table-responsive">
|
10
|
+
<table class="table table-striped table-bordered table-hover">
|
11
|
+
<thead>
|
12
|
+
<tr>
|
13
|
+
<th>E-mail</th>
|
14
|
+
<th>Login</th>
|
15
|
+
<th>Jméno</th>
|
16
|
+
<th>Příjmení</th>
|
17
|
+
<th>Admin</th>
|
18
|
+
<th>Poslední přihlášení</th>
|
19
|
+
<th colspan="2">Akce</th>
|
20
|
+
</tr>
|
21
|
+
</thead>
|
22
|
+
|
23
|
+
<tbody>
|
24
|
+
<%= content_tag_for(:tr, @users) do |user| %>
|
25
|
+
<td <%= 'style="font-weight:bold"'.html_safe if user.admin? %>><%= user.email %></td>
|
26
|
+
<td><%= user.login %></td>
|
27
|
+
<td><%= user.firstname %></td>
|
28
|
+
<td><%= user.lastname %></td>
|
29
|
+
<td><%= user.admin ? 'A' : '' %></td>
|
30
|
+
<td><%= lf user.last_sign_in_at, :format=>'long' %></td>
|
31
|
+
<td><%= link_to 'Upravit', edit_user_path(user) %></td>
|
32
|
+
<td><%= link_to 'Heslo', {action: 'edit_password', id: user} %></td>
|
33
|
+
<% end %>
|
34
|
+
</tbody>
|
35
|
+
</table>
|
36
|
+
</div>
|