tomify 0.0.9 → 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 +4 -4
- data/app/assets/javascripts/tomify/default/array.coffee +1 -0
- data/app/assets/javascripts/tomify/dynamic/react/components/admin/pages.coffee.erb +8 -0
- data/app/assets/javascripts/tomify/dynamic/react/components/admin/settings.coffee +1 -1
- data/app/assets/javascripts/tomify/dynamic/react/components/layout/admin_navbar.coffee +18 -5
- data/app/assets/javascripts/tomify/dynamic/react/components/layout/public_navbar.coffee +11 -10
- data/app/assets/javascripts/tomify/dynamic/react/components/public/profile.coffee +7 -9
- data/app/assets/javascripts/tomify/dynamic/react/components/public/sessions/show.coffee +19 -21
- data/app/assets/javascripts/tomify/dynamic/react/components/public/subscription.coffee +13 -15
- data/app/assets/stylesheets/tomify/_default.scss +34 -1
- data/app/controllers/tomify/api/admin/pages_controller.rb +14 -0
- data/app/controllers/tomify/api/admin/settings_controller.rb +7 -0
- data/app/controllers/tomify/api/admin/sidebars_controller.rb +3 -0
- data/app/controllers/tomify/api/admin/uploads_controller.rb +3 -0
- data/app/controllers/tomify/api/admin/users_controller.rb +14 -5
- data/app/controllers/tomify/api/public/users_controller.rb +4 -0
- data/app/controllers/tomify/concerns/api/admin.rb +0 -4
- data/app/controllers/tomify/concerns/api/helpers.rb +37 -17
- data/app/controllers/tomify/concerns/api/json.rb +9 -4
- data/app/controllers/tomify/concerns/api/public.rb +0 -4
- data/app/controllers/tomify/concerns/default/env_helper.rb +3 -31
- data/app/controllers/tomify/concerns/default/navbar_helper.rb +76 -0
- data/app/controllers/tomify/concerns/default.rb +1 -0
- data/app/helpers/tomify/carrierwave_helper.rb +2 -2
- data/app/models/tomify/concerns/page.rb +11 -13
- data/app/models/tomify/concerns/sidebar.rb +0 -6
- data/app/models/tomify/concerns/upload.rb +0 -6
- data/app/models/tomify/concerns/user.rb +0 -15
- data/app/models/tomify/setting.rb +2 -7
- data/app/uploaders/tomify/setting_uploader.rb +24 -1
- data/app/views/templates/contact.haml +1 -1
- data/app/views/templates/default.haml +1 -1
- data/app/views/tomify/defaults/_container.haml +1 -1
- data/app/views/tomify/defaults/_meta.haml +20 -17
- data/lib/tomify/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7adedc7c0800596d7cb43f4fa62d73f062c60de
|
4
|
+
data.tar.gz: 22f4e06750d3eff48a100d576de05fc0c6f36368
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f317a362b20c86647022e24a3bec525f70ff0b724c84df451d1d723d1de61a80e3e92fcb349fa2c2731bfbb8812f203865cd2a25e2fabc3188b531ba2d47651
|
7
|
+
data.tar.gz: ac43203ca348e0da245ed209dba4c2520adbe84c29f988dc5e207cccb4f94406cd43e9a2996c758946d34292c328b0b8ef2df4a5bf46788ad5924d6a10628bc3
|
@@ -6,6 +6,14 @@ model.columns = [
|
|
6
6
|
{ name: "sidebar_id", value: (r) -> r.sidebar?.name ? "None" },
|
7
7
|
{ name: "name" },
|
8
8
|
{ name: "path" },
|
9
|
+
{ name: "cover_image", value: (r) ->
|
10
|
+
return "None" unless r.cover_image.url
|
11
|
+
<a href={r.cover_image.url} target="_blank">View</a>
|
12
|
+
},
|
13
|
+
{ name: "share_image", value: (r) ->
|
14
|
+
return "None" unless r.share_image.url
|
15
|
+
<a href={r.share_image.url} target="_blank">View</a>
|
16
|
+
},
|
9
17
|
{ name: "updated_at", value: (r) -> r.updated_at.date() },
|
10
18
|
{ name: "actions", edit: true, destroy: true, view: (r) ->
|
11
19
|
<a key="visit" href="/#{r.path}" target="_blank">Visit</a>
|
@@ -4,7 +4,7 @@ model.columns = [
|
|
4
4
|
{ name: "public", value: (r) -> if r.public then "Yes" else "No" },
|
5
5
|
{ name: "type", value: (r) -> r.type.split("::").last },
|
6
6
|
{ name: "value", value: (r) ->
|
7
|
-
return unless r.value?
|
7
|
+
return "None" unless r.value?
|
8
8
|
switch type = r.type.split("::").last
|
9
9
|
when "Boolean" then "#{r.value}"
|
10
10
|
when "Uploader"
|
@@ -2,8 +2,12 @@ Component.create "Layout.AdminNavbar",
|
|
2
2
|
followStores: ["user", pages: "Navbar.Admin"]
|
3
3
|
componentWillInitialize: ->
|
4
4
|
env = Store.find "Env"
|
5
|
-
Store.create "Navbar.Admin", env.get().navbar.admin || []
|
6
|
-
@follow env.on "change", -> pages.set
|
5
|
+
pages = Store.create "Navbar.Admin", env.get().navbar.admin || []
|
6
|
+
@follow env.on "change", -> pages.set env.get().navbar.public
|
7
|
+
link: (page) ->
|
8
|
+
<li key={page.name}>
|
9
|
+
<a href={page.url} target={"_blank" if page.external}>{page.name}</a>
|
10
|
+
</li>
|
7
11
|
render: ->
|
8
12
|
return <div /> unless @state.user.admin
|
9
13
|
<div className="brand-navbar navbar navbar-default center">
|
@@ -19,9 +23,18 @@ Component.create "Layout.AdminNavbar",
|
|
19
23
|
<div id="admin-navbar" className="navbar-collapse collapse">
|
20
24
|
<ul className="nav navbar-nav">
|
21
25
|
{for page in @state.pages
|
22
|
-
|
23
|
-
<
|
24
|
-
|
26
|
+
if page.children[0]
|
27
|
+
<li key={page.name} className="dropdown">
|
28
|
+
<a href="#" className="dropdown-toggle" data-toggle="dropdown">
|
29
|
+
{page.name} <i className="fa fa-caret-down" />
|
30
|
+
</a>
|
31
|
+
<ul className="dropdown-menu">
|
32
|
+
{@link(page) if page.url}
|
33
|
+
{@link(child) for child in page.children}
|
34
|
+
</ul>
|
35
|
+
</li>
|
36
|
+
else
|
37
|
+
@link(page)
|
25
38
|
}
|
26
39
|
</ul>
|
27
40
|
</div>
|
@@ -2,8 +2,8 @@ Component.create "Layout.PublicNavbar",
|
|
2
2
|
followStores: ["user", pages: "Navbar.Public"]
|
3
3
|
componentWillInitialize: ->
|
4
4
|
env = Store.find "Env"
|
5
|
-
Store.create "Navbar.Public", env.get().navbar.public || []
|
6
|
-
@follow env.on "change", -> pages.set
|
5
|
+
pages = Store.create "Navbar.Public", env.get().navbar.public || []
|
6
|
+
@follow env.on "change", -> pages.set env.get().navbar.public
|
7
7
|
logout: (e) ->
|
8
8
|
e.preventDefault()
|
9
9
|
Model.find("Public.Session").destroy().then (response) ->
|
@@ -11,10 +11,10 @@ Component.create "Layout.PublicNavbar",
|
|
11
11
|
message type: response.type, text: response.message
|
12
12
|
link: (page) ->
|
13
13
|
<li key={page.name}>
|
14
|
-
<a href=
|
14
|
+
<a href={page.url} target={"_blank" if page.external}>{page.name}</a>
|
15
15
|
</li>
|
16
16
|
render: ->
|
17
|
-
root =
|
17
|
+
root = Store.find("Pages").get().find (page) -> page.root
|
18
18
|
<div className="navbar navbar-default center">
|
19
19
|
<div className="container-fluid">
|
20
20
|
<div className="navbar-header">
|
@@ -27,19 +27,20 @@ Component.create "Layout.PublicNavbar",
|
|
27
27
|
</div>
|
28
28
|
<div id="navbar" className="navbar-collapse collapse">
|
29
29
|
<ul className="nav navbar-nav">
|
30
|
-
{if
|
31
|
-
@
|
32
|
-
|
33
|
-
|
30
|
+
{if setting "allow_signup"
|
31
|
+
if @state.user.id
|
32
|
+
@link(name: "Login", url: "/session")
|
33
|
+
else
|
34
|
+
@link(name: "Profile", url: "/profile")
|
34
35
|
}
|
35
|
-
{for page in @state.pages
|
36
|
+
{for page in @state.pages
|
36
37
|
if page.children[0]
|
37
38
|
<li key={page.name} className="dropdown">
|
38
39
|
<a href="#" className="dropdown-toggle" data-toggle="dropdown">
|
39
40
|
{page.name} <i className="fa fa-caret-down" />
|
40
41
|
</a>
|
41
42
|
<ul className="dropdown-menu">
|
42
|
-
{@link(page)}
|
43
|
+
{@link(page) if page.url}
|
43
44
|
{@link(child) for child in page.children}
|
44
45
|
</ul>
|
45
46
|
</li>
|
@@ -13,14 +13,12 @@ Component.create "Public.Profile",
|
|
13
13
|
e.preventDefault()
|
14
14
|
Model.findOrCreate("Public.User").edit()
|
15
15
|
render: ->
|
16
|
-
<div className="
|
17
|
-
<div className="
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
}
|
24
|
-
</div>
|
16
|
+
<div className="row text-center">
|
17
|
+
<div className="dynamic-sm">
|
18
|
+
{if @state.edit
|
19
|
+
<Public.Users.Edit />
|
20
|
+
else
|
21
|
+
<Public.Users.Show />
|
22
|
+
}
|
25
23
|
</div>
|
26
24
|
</div>
|
@@ -7,27 +7,25 @@ Component.create "Public.Sessions.Show",
|
|
7
7
|
newPassword: ->
|
8
8
|
@setState(newPassword: true)
|
9
9
|
render: ->
|
10
|
-
<div className="
|
11
|
-
|
12
|
-
|
13
|
-
<
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
<div className="
|
18
|
-
<div className="
|
19
|
-
<
|
20
|
-
|
21
|
-
|
22
|
-
<
|
23
|
-
<Public.Users.New />
|
24
|
-
</div>
|
10
|
+
<div className="row text-center">
|
11
|
+
{if @state.newPassword
|
12
|
+
<div className="dynamic-sm">
|
13
|
+
<Public.Passwords.New />
|
14
|
+
</div>
|
15
|
+
else if setting "allow_signup"
|
16
|
+
<div className="dynamic-lg">
|
17
|
+
<div className="row">
|
18
|
+
<div className="col-md-6">
|
19
|
+
<Public.Sessions.New />
|
20
|
+
</div>
|
21
|
+
<div className="col-md-6">
|
22
|
+
<Public.Users.New />
|
25
23
|
</div>
|
26
24
|
</div>
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
</div>
|
26
|
+
else
|
27
|
+
<div className="dynamic-sm">
|
28
|
+
<Public.Sessions.New />
|
29
|
+
</div>
|
30
|
+
}
|
33
31
|
</div>
|
@@ -13,20 +13,18 @@ Component.create "Public.Subscription",
|
|
13
13
|
e.preventDefault()
|
14
14
|
@model.destroy subscription: { email: @state.email }
|
15
15
|
render: ->
|
16
|
-
<div className="
|
17
|
-
<div className="
|
18
|
-
<
|
19
|
-
|
20
|
-
{
|
21
|
-
|
22
|
-
|
23
|
-
<
|
24
|
-
<
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
30
|
-
</div>
|
16
|
+
<div className="row text-center">
|
17
|
+
<div className="dynamic-sm">
|
18
|
+
<h3>Unsubscribe</h3>
|
19
|
+
{if @state.unsubscribed
|
20
|
+
<p>{@state.message}</p>
|
21
|
+
else
|
22
|
+
<div>
|
23
|
+
<p>
|
24
|
+
By clicking Submit, <strong>{@state.email}</strong> will be no longer recieve the majority of emails from {setting "name"}.
|
25
|
+
</p>
|
26
|
+
<a href="#" onClick={@destroy} className="btn btn-danger" data-confirm="Are you sure?">Submit</a>
|
27
|
+
</div>
|
28
|
+
}
|
31
29
|
</div>
|
32
30
|
</div>
|
@@ -21,6 +21,39 @@ em { font-size: 24px; }
|
|
21
21
|
.panel-heading {
|
22
22
|
h4 {
|
23
23
|
display: inline-block;
|
24
|
-
|
24
|
+
.btn { margin-left: 10px; }
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
.with-sidebar {
|
29
|
+
.dynamic-sm {
|
30
|
+
@include make-md-column(8);
|
31
|
+
@include make-md-column-offset(2);
|
32
|
+
}
|
33
|
+
|
34
|
+
.dynamic-md {
|
35
|
+
@include make-md-column(10);
|
36
|
+
@include make-md-column-offset(1);
|
37
|
+
}
|
38
|
+
|
39
|
+
.dynamic-lg {
|
40
|
+
@include make-md-column(12);
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
.without-sidebar {
|
45
|
+
.dynamic-sm {
|
46
|
+
@include make-md-column(4);
|
47
|
+
@include make-md-column-offset(4);
|
48
|
+
}
|
49
|
+
|
50
|
+
.dynamic-md {
|
51
|
+
@include make-md-column(6);
|
52
|
+
@include make-md-column-offset(3);
|
53
|
+
}
|
54
|
+
|
55
|
+
.dynamic-lg {
|
56
|
+
@include make-md-column(8);
|
57
|
+
@include make-md-column-offset(2);
|
25
58
|
}
|
26
59
|
}
|
@@ -1,2 +1,16 @@
|
|
1
1
|
class Tomify::Api::Admin::PagesController < Tomify.controllers.admin_api
|
2
|
+
def permitted_attributes
|
3
|
+
[
|
4
|
+
:parent_id, :sidebar_id,
|
5
|
+
:active, :root, :rank,
|
6
|
+
:path, :name, :template,
|
7
|
+
:title, :description,
|
8
|
+
:cover_image, :share_image,
|
9
|
+
:text
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
def serializable_options
|
14
|
+
{ include: [:parent, :sidebar] }
|
15
|
+
end
|
2
16
|
end
|
@@ -1,16 +1,25 @@
|
|
1
1
|
class Tomify::Api::Admin::UsersController < Tomify.controllers.admin_api
|
2
2
|
before_action :not_allowed, only: [:update, :destroy]
|
3
3
|
|
4
|
+
def not_allowed
|
5
|
+
find_record
|
6
|
+
if @record.email == "tom@tomify.me" || @record.id == current_user.id
|
7
|
+
render json: { type: :danger, message: "You shall not pass" }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def permitted_attributes
|
13
|
+
[:admin, :email, :first_name, :last_name]
|
14
|
+
end
|
15
|
+
|
4
16
|
def record_params
|
5
17
|
attributes = super
|
6
18
|
attributes[:invited] = true if action_name == "create"
|
7
19
|
attributes
|
8
20
|
end
|
9
21
|
|
10
|
-
def
|
11
|
-
|
12
|
-
if @record.email == "tom@tomify.me" || @record.id == current_user.id
|
13
|
-
render json: { type: :danger, message: "You shall not pass" }
|
14
|
-
end
|
22
|
+
def serializable_options
|
23
|
+
{ methods: [:name] }
|
15
24
|
end
|
16
25
|
end
|
@@ -28,6 +28,10 @@ class Tomify::Api::Public::UsersController < Tomify.controllers.public_api
|
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
31
|
+
def permitted_attributes
|
32
|
+
[:email, :first_name, :last_name, :password, :password_confirmation]
|
33
|
+
end
|
34
|
+
|
31
35
|
def set_record
|
32
36
|
@record = current_user
|
33
37
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Tomify::Concerns::Api::Helpers
|
2
2
|
def find_records
|
3
|
-
@records ||= model.where(
|
3
|
+
@records ||= model.where(search_options)
|
4
4
|
end
|
5
5
|
|
6
6
|
def find_record
|
@@ -12,27 +12,23 @@ module Tomify::Concerns::Api::Helpers
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def update_record
|
15
|
-
|
15
|
+
record.update!(record_params)
|
16
16
|
end
|
17
17
|
|
18
18
|
def destroy_record
|
19
|
-
|
19
|
+
record.destroy!
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
# Helpers
|
23
|
+
def date_range(start_date, end_date = nil)
|
24
|
+
start_date = DateTime.strptime(start_date, "%D")
|
25
|
+
end_date = end_date ? DateTime.strptime(end_date, "%D") : DateTime.now
|
25
26
|
|
26
|
-
|
27
|
-
@search_params = {}
|
28
|
-
@search_params[:created_at] = date_range(params[:created_at]) if params[:created_at]
|
29
|
-
@search_params[:updated_at] = date_range(params[:updated_at]) if params[:updated_at]
|
30
|
-
@search_params
|
27
|
+
(start_date.beginning_of_day)..(end_date.end_of_day)
|
31
28
|
end
|
32
29
|
|
33
30
|
def model
|
34
|
-
|
35
|
-
@model = model_name.constantize rescue nil
|
31
|
+
@model ||= model_name.constantize rescue nil
|
36
32
|
@model ||= "Tomify::#{model_name}".constantize
|
37
33
|
end
|
38
34
|
|
@@ -44,10 +40,34 @@ module Tomify::Concerns::Api::Helpers
|
|
44
40
|
@model_param ||= controller_name.chomp("s")
|
45
41
|
end
|
46
42
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
43
|
+
def record
|
44
|
+
@record
|
45
|
+
end
|
50
46
|
|
51
|
-
|
47
|
+
def records
|
48
|
+
@records
|
49
|
+
end
|
50
|
+
|
51
|
+
def record_params
|
52
|
+
@record_params ||= params.require(model_param).permit(permitted_attributes)
|
53
|
+
end
|
54
|
+
|
55
|
+
def recursive_options(association, base, depth)
|
56
|
+
return base if depth.zero?
|
57
|
+
options = base.dup
|
58
|
+
options[:include] ||= []
|
59
|
+
options[:include] << { association => recursive_options(association, base, depth - 1) }
|
60
|
+
options
|
61
|
+
end
|
62
|
+
|
63
|
+
def search_options
|
64
|
+
@search_options = {}
|
65
|
+
@search_options[:created_at] = date_range(params[:created_at]) if params[:created_at]
|
66
|
+
@search_options[:updated_at] = date_range(params[:updated_at]) if params[:updated_at]
|
67
|
+
@search_options
|
68
|
+
end
|
69
|
+
|
70
|
+
def serializable_options
|
71
|
+
@serializable_options ||= {}
|
52
72
|
end
|
53
73
|
end
|
@@ -19,23 +19,23 @@ module Tomify::Concerns::Api::JSON
|
|
19
19
|
|
20
20
|
def index
|
21
21
|
find_records
|
22
|
-
render json: { type: :success, data:
|
22
|
+
render json: { type: :success, data: data }
|
23
23
|
end
|
24
24
|
|
25
25
|
def show
|
26
26
|
find_record
|
27
|
-
render json: { type: :success, data:
|
27
|
+
render json: { type: :success, data: data }
|
28
28
|
end
|
29
29
|
|
30
30
|
def create
|
31
31
|
create_record
|
32
|
-
render json: { type: :success, data:
|
32
|
+
render json: { type: :success, data: data, message: "#{model_name} Created" }
|
33
33
|
end
|
34
34
|
|
35
35
|
def update
|
36
36
|
find_record
|
37
37
|
update_record
|
38
|
-
render json: { type: :success, data:
|
38
|
+
render json: { type: :success, data: data, message: "#{model_name} Updated" }
|
39
39
|
end
|
40
40
|
|
41
41
|
def destroy
|
@@ -43,4 +43,9 @@ module Tomify::Concerns::Api::JSON
|
|
43
43
|
destroy_record
|
44
44
|
render json: { type: :danger, message: "#{model_name} Deleted" }
|
45
45
|
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def data
|
49
|
+
@data ||= (record || records).as_json(serializable_options)
|
50
|
+
end
|
46
51
|
end
|
@@ -2,38 +2,10 @@ module Tomify::Concerns::Default::EnvHelper
|
|
2
2
|
def js_env
|
3
3
|
{
|
4
4
|
messages: flash.collect { |key, value| { type: key, text: value }},
|
5
|
-
navbar:
|
6
|
-
|
7
|
-
|
8
|
-
},
|
9
|
-
pages: pages,
|
10
|
-
settings: public_settings,
|
5
|
+
navbar: navbar,
|
6
|
+
pages: Tomify.models.page.for_env,
|
7
|
+
settings: Tomify.models.setting.for_env,
|
11
8
|
user: current_user
|
12
9
|
}
|
13
10
|
end
|
14
|
-
|
15
|
-
def admin_pages
|
16
|
-
[
|
17
|
-
{ name: "App", path: "admin/settings" },
|
18
|
-
{ name: "Pages", path: "admin/pages" },
|
19
|
-
{ name: "Sidebars", path: "admin/sidebars" },
|
20
|
-
{ name: "Uploads", path: "admin/uploads" },
|
21
|
-
{ name: "Users", path: "admin/users" }
|
22
|
-
]
|
23
|
-
end
|
24
|
-
|
25
|
-
def pages
|
26
|
-
Tomify.models.page.all.as_json(only: [:active, :name, :path, :root, :template, :parent_id])
|
27
|
-
end
|
28
|
-
|
29
|
-
def public_pages
|
30
|
-
Tomify.models.page.where(parent_id: nil).as_json(
|
31
|
-
only: [:active, :name, :path, :root],
|
32
|
-
include: [children: { only: [:active, :name, :path] }]
|
33
|
-
)
|
34
|
-
end
|
35
|
-
|
36
|
-
def public_settings
|
37
|
-
Tomify.models.setting.where(public: true).as_json(only: [:name, :value])
|
38
|
-
end
|
39
11
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Tomify::Concerns::Default::NavbarHelper
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
class_attribute :_navbar, instance_accessor: false
|
6
|
+
self._navbar = {}
|
7
|
+
|
8
|
+
add_to_navbar :public, Proc.new { Tomify.models.page.for_navbar }
|
9
|
+
add_to_navbar :admin, [
|
10
|
+
{ name: "App", path: "admin/settings" },
|
11
|
+
{ name: "Pages", path: "admin/pages" },
|
12
|
+
{ name: "Sidebars", path: "admin/sidebars" },
|
13
|
+
{ name: "Uploads", path: "admin/uploads" },
|
14
|
+
{ name: "Users", path: "admin/users" }
|
15
|
+
]
|
16
|
+
end
|
17
|
+
|
18
|
+
class_methods do
|
19
|
+
def add_to_navbar(type, *pages)
|
20
|
+
self._navbar[type] ||= []
|
21
|
+
pages.each do |item|
|
22
|
+
self._navbar[type] << item
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def prepend_to_navbar(type, *pages)
|
27
|
+
self._navbar[type] ||= []
|
28
|
+
pages.each do |item|
|
29
|
+
self._navbar[type].unshift item
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def navbar
|
35
|
+
types = {}
|
36
|
+
|
37
|
+
self.class._navbar.each do |type, pages|
|
38
|
+
types[type] = []
|
39
|
+
pages.each do |item|
|
40
|
+
types[type].concat navbar_pages_from(item)
|
41
|
+
end
|
42
|
+
types[type].flatten!
|
43
|
+
end
|
44
|
+
|
45
|
+
types
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
def navbar_pages_from(item)
|
50
|
+
case item
|
51
|
+
when Proc
|
52
|
+
navbar_pages_from item.call
|
53
|
+
when Hash
|
54
|
+
navbar_pages_from_hash item
|
55
|
+
when Array
|
56
|
+
navbar_pages_from_array item
|
57
|
+
else
|
58
|
+
[]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def navbar_pages_from_hash(hash)
|
63
|
+
hash.symbolize_keys!
|
64
|
+
return [] if hash[:active] == false
|
65
|
+
page = hash.slice(:children, :external, :name, :url)
|
66
|
+
page[:children] = navbar_pages_from page[:children]
|
67
|
+
page[:url] ||= "/#{hash[:path]}" if page[:children].empty?
|
68
|
+
[page]
|
69
|
+
end
|
70
|
+
|
71
|
+
def navbar_pages_from_array(array)
|
72
|
+
pages = []
|
73
|
+
array.each { |item| pages.concat navbar_pages_from(item) }
|
74
|
+
pages
|
75
|
+
end
|
76
|
+
end
|
@@ -4,6 +4,7 @@ module Tomify::Concerns::Default
|
|
4
4
|
include Tomify::Concerns::Default::Helper
|
5
5
|
include Tomify::Concerns::Default::AuthHelper
|
6
6
|
include Tomify::Concerns::Default::EnvHelper
|
7
|
+
include Tomify::Concerns::Default::NavbarHelper
|
7
8
|
include Tomify::Concerns::Default::ReactHelper
|
8
9
|
|
9
10
|
included do
|
@@ -4,8 +4,8 @@ module Tomify::CarrierwaveHelper
|
|
4
4
|
return unless settings = Tomify.setting(:aws)
|
5
5
|
|
6
6
|
descendants = CarrierWave::Uploader::Base.descendants
|
7
|
-
descendants
|
8
|
-
descendants
|
7
|
+
descendants << CarrierWave::Uploader::Base
|
8
|
+
descendants << CarrierWave
|
9
9
|
descendants.each do |klass|
|
10
10
|
klass.configure do |config|
|
11
11
|
config.fog_provider = "fog/aws"
|
@@ -2,6 +2,9 @@ module Tomify::Concerns::Page
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
included do
|
5
|
+
mount_uploader :cover_image, Tomify.uploaders.setting
|
6
|
+
mount_uploader :share_image, Tomify.uploaders.setting
|
7
|
+
|
5
8
|
belongs_to :sidebar, class_name: Tomify.models.sidebar.to_s, optional: true
|
6
9
|
belongs_to :parent, class_name: self.to_s, optional: true
|
7
10
|
has_many :children, class_name: self.to_s, foreign_key: :parent_id
|
@@ -35,21 +38,16 @@ module Tomify::Concerns::Page
|
|
35
38
|
@files.sort_by! { |f| f == "default" ? "" : f } # Default First
|
36
39
|
end
|
37
40
|
|
38
|
-
def
|
39
|
-
[
|
40
|
-
:parent_id, :sidebar_id,
|
41
|
-
:active, :root, :rank,
|
42
|
-
:path, :name, :template,
|
43
|
-
:title, :description,
|
44
|
-
:cover_image, :share_image,
|
45
|
-
:text
|
46
|
-
]
|
41
|
+
def for_env
|
42
|
+
all.as_json(only: [:active, :name, :path, :root, :template, :parent_id])
|
47
43
|
end
|
48
|
-
end
|
49
44
|
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
def for_navbar
|
46
|
+
where(parent_id: nil).as_json(
|
47
|
+
only: [:active, :name, :path],
|
48
|
+
include: [children: { only: [:active, :name, :path] }]
|
49
|
+
)
|
50
|
+
end
|
53
51
|
end
|
54
52
|
|
55
53
|
private
|
@@ -21,16 +21,6 @@ module Tomify::Concerns::User
|
|
21
21
|
scope :admin, -> { where(admin: true) }
|
22
22
|
end
|
23
23
|
|
24
|
-
class_methods do
|
25
|
-
def admin_params
|
26
|
-
[:admin, :email, :first_name, :last_name]
|
27
|
-
end
|
28
|
-
|
29
|
-
def public_params
|
30
|
-
[:email, :first_name, :last_name, :password, :password_confirmation]
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
24
|
def name
|
35
25
|
"#{first_name} #{last_name}"
|
36
26
|
end
|
@@ -43,11 +33,6 @@ module Tomify::Concerns::User
|
|
43
33
|
tokens.find_or_create_by(name: name)
|
44
34
|
end
|
45
35
|
|
46
|
-
def serializable_hash(options = nil)
|
47
|
-
options = { methods: [:name] } if options.blank?
|
48
|
-
super options
|
49
|
-
end
|
50
|
-
|
51
36
|
private
|
52
37
|
def format_email
|
53
38
|
self.email = email.try(:strip).try(:downcase)
|
@@ -13,13 +13,8 @@ class Tomify::Setting < Tomify.models.base
|
|
13
13
|
["allow_signup", "aws", "name", "email", "timezone"]
|
14
14
|
end
|
15
15
|
|
16
|
-
def self.
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def serializable_hash(options = nil)
|
21
|
-
options ||= {}
|
22
|
-
super({ methods: [:type] }.update(options))
|
16
|
+
def self.for_env
|
17
|
+
Tomify.models.setting.where(public: true).as_json(only: [:name, :value])
|
23
18
|
end
|
24
19
|
|
25
20
|
private
|
@@ -1,3 +1,26 @@
|
|
1
1
|
class Tomify::SettingUploader < Tomify.uploaders.base
|
2
|
-
|
2
|
+
def self.width
|
3
|
+
Proc.new do |uploader|
|
4
|
+
uploader.setting["width"] || 1000000000
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.height
|
9
|
+
Proc.new do |uploader|
|
10
|
+
uploader.setting["height"] || 1000000000
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
process resize_to_fit: [width, height]
|
15
|
+
|
16
|
+
def setting_key
|
17
|
+
[
|
18
|
+
model.class.name.split("::").last.underscore,
|
19
|
+
mounted_as, "dimensions"
|
20
|
+
].join("_")
|
21
|
+
end
|
22
|
+
|
23
|
+
def setting
|
24
|
+
Tomify.setting(setting_key) || { "width" => width, "height" => height }
|
25
|
+
end
|
3
26
|
end
|
@@ -1,17 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
%link(rel="apple-touch-icon" sizes="
|
4
|
-
%link(rel="apple-touch-icon" sizes="
|
5
|
-
%link(rel="apple-touch-icon" sizes="
|
6
|
-
%link(rel="apple-touch-icon" sizes="
|
7
|
-
%link(rel="apple-touch-icon" sizes="
|
8
|
-
%link(rel="apple-touch-icon" sizes="
|
9
|
-
%link(rel="apple-touch-icon" sizes="
|
10
|
-
%link(rel="icon"
|
11
|
-
%link(rel="icon"
|
12
|
-
%link(rel="icon" type="image/png" sizes="
|
13
|
-
%link(rel="icon" type="image/png" sizes="
|
14
|
-
%link(rel="
|
15
|
-
%
|
16
|
-
%meta(name="msapplication-
|
17
|
-
%meta(name="
|
1
|
+
- if meta = setting(:meta)
|
2
|
+
- if meta["favicon"] == "ready"
|
3
|
+
%link(rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png")
|
4
|
+
%link(rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png")
|
5
|
+
%link(rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png")
|
6
|
+
%link(rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png")
|
7
|
+
%link(rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png")
|
8
|
+
%link(rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png")
|
9
|
+
%link(rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png")
|
10
|
+
%link(rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png")
|
11
|
+
%link(rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png")
|
12
|
+
%link(rel="icon" type="image/png" sizes="192x192" href="/android-icon-192x192.png")
|
13
|
+
%link(rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png")
|
14
|
+
%link(rel="icon" type="image/png" sizes="96x96" href="/favicon-96x96.png")
|
15
|
+
%link(rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png")
|
16
|
+
%meta(name="msapplication-TileColor" content="#ffffff")
|
17
|
+
%meta(name="msapplication-TileImage" content="/ms-icon-144x144.png")
|
18
|
+
%meta(name="theme-color" content="#ffffff")
|
19
|
+
- if meta["manifest"] == "ready"
|
20
|
+
%link(rel="manifest" href="/manifest.json")
|
data/lib/tomify/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tomify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Prats
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -334,6 +334,7 @@ files:
|
|
334
334
|
- app/controllers/tomify/concerns/default/auth_helper.rb
|
335
335
|
- app/controllers/tomify/concerns/default/env_helper.rb
|
336
336
|
- app/controllers/tomify/concerns/default/helper.rb
|
337
|
+
- app/controllers/tomify/concerns/default/navbar_helper.rb
|
337
338
|
- app/controllers/tomify/concerns/default/react_helper.rb
|
338
339
|
- app/controllers/tomify/public/controller.rb
|
339
340
|
- app/controllers/tomify/public/pages_controller.rb
|