dokno 1.0.0 → 1.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/dokno.js +11 -0
- data/app/controllers/dokno/application_controller.rb +3 -0
- data/app/controllers/dokno/articles_controller.rb +6 -0
- data/app/controllers/dokno/categories_controller.rb +11 -0
- data/app/helpers/dokno/application_helper.rb +1 -3
- data/app/models/dokno/category.rb +32 -9
- data/app/views/dokno/_article_panel.html.erb +7 -0
- data/app/views/dokno/articles/_article_form.html.erb +2 -0
- data/app/views/dokno/articles/show.html.erb +8 -0
- data/app/views/dokno/categories/_category_form.html.erb +5 -0
- data/app/views/dokno/categories/index.html.erb +5 -0
- data/app/views/layouts/dokno/application.html.erb +7 -0
- data/lib/dokno/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: df8bbd2d17e134f0298f31fc97d049b245c4830e9d44655a8c4659507c6ebe6f
|
4
|
+
data.tar.gz: bdeb9513295036198a8f30a476a1ea8a4c34d35330c9e6e75e2364aadddf0b3b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97c1353f3c85e9a6e40de60a0947101978bb101b0dc85be48945ee7e54bb13596fd0f1afbd011113f538c5dfe0ed8784c09c87643b5813e5021292c49244273b
|
7
|
+
data.tar.gz: 1bfda031b688b21b65fc8b43fd550e006fec2d5b5f1fd50d4f536db9724ef4853ed47f49e8b2e3ed3329f9ecd6092eb2d678dc6562fa1c07d092da0412ff1e12
|
@@ -61,6 +61,17 @@ function deleteArticle(id) {
|
|
61
61
|
sendRequest(dokno__base_path + 'articles/' + id, {}, callback, 'DELETE');
|
62
62
|
}
|
63
63
|
|
64
|
+
function deleteCategory(id) {
|
65
|
+
if (!confirm('Delete Category\n\nThis will remove this category. Any articles in this category will become uncategorized and appear on the home page until re-categorized.')) {
|
66
|
+
return true;
|
67
|
+
}
|
68
|
+
|
69
|
+
const callback = function(_data) {
|
70
|
+
location.href = dokno__base_path;
|
71
|
+
}
|
72
|
+
sendRequest(dokno__base_path + 'categories/' + id, {}, callback, 'DELETE');
|
73
|
+
}
|
74
|
+
|
64
75
|
function previewArticleToggle() {
|
65
76
|
const markdown = elem('div#dokno-content-container textarea#markdown').value;
|
66
77
|
const callback = function(data) {
|
@@ -27,9 +27,11 @@ module Dokno
|
|
27
27
|
set_editor_username
|
28
28
|
|
29
29
|
if @article.save
|
30
|
+
flash[:green] = 'Article was created'
|
30
31
|
@article.categories = Category.where(code: params[:category_code]) if params[:category_code].present?
|
31
32
|
redirect_to article_path @article.slug
|
32
33
|
else
|
34
|
+
flash.now[:red] = 'Article could not be created'
|
33
35
|
@category_codes = params[:category_code]
|
34
36
|
render :new
|
35
37
|
end
|
@@ -42,9 +44,11 @@ module Dokno
|
|
42
44
|
set_editor_username
|
43
45
|
|
44
46
|
if @article.update(article_params)
|
47
|
+
flash[:green] = 'Article was updated'
|
45
48
|
@article.categories = Category.where(code: params[:category_code])
|
46
49
|
redirect_to article_path @article.slug
|
47
50
|
else
|
51
|
+
flash.now[:red] = 'Article could not be updated'
|
48
52
|
@category_codes = params[:category_code]
|
49
53
|
render :edit
|
50
54
|
end
|
@@ -52,6 +56,8 @@ module Dokno
|
|
52
56
|
|
53
57
|
def destroy
|
54
58
|
Article.find(params[:id].to_i).destroy!
|
59
|
+
|
60
|
+
flash[:green] = 'Article was deleted'
|
55
61
|
render json: {}, layout: false
|
56
62
|
end
|
57
63
|
|
@@ -35,8 +35,10 @@ module Dokno
|
|
35
35
|
@category = Category.new(name: params[:name], parent: Category.find_by(code: params[:parent_category_code]))
|
36
36
|
|
37
37
|
if @category.save
|
38
|
+
flash[:green] = 'Category was created'
|
38
39
|
redirect_to article_index_path(@category.code)
|
39
40
|
else
|
41
|
+
flash.now[:red] = 'Category could not be created'
|
40
42
|
@parent_category_code = params[:parent_category_code]
|
41
43
|
render :new
|
42
44
|
end
|
@@ -46,13 +48,22 @@ module Dokno
|
|
46
48
|
return redirect_to root_path if @category.blank?
|
47
49
|
|
48
50
|
if @category.update(name: params[:name], parent: Category.find_by(code: params[:parent_category_code]))
|
51
|
+
flash[:green] = 'Category was updated'
|
49
52
|
redirect_to article_index_path(@category.code)
|
50
53
|
else
|
54
|
+
flash.now[:red] = 'Category could not be updated'
|
51
55
|
@parent_category_code = params[:parent_category_code]
|
52
56
|
render :edit
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
60
|
+
def destroy
|
61
|
+
Category.find(params[:id].to_i).destroy!
|
62
|
+
|
63
|
+
flash[:green] = 'Category was deleted'
|
64
|
+
render json: {}, layout: false
|
65
|
+
end
|
66
|
+
|
56
67
|
private
|
57
68
|
|
58
69
|
def fetch_category
|
@@ -9,9 +9,7 @@ module Dokno
|
|
9
9
|
|
10
10
|
return "Dokno article slug '#{slug}' not found" if article.blank?
|
11
11
|
|
12
|
-
%Q(
|
13
|
-
<a href="javascript:;" onclick="doknoOpenPanel('#{j article.slug}');">#{link_text.presence || article.title}</a>
|
14
|
-
).html_safe
|
12
|
+
%Q(<a href="javascript:;" onclick="doknoOpenPanel('#{j article.slug}');">#{link_text.presence || article.title}</a>).html_safe
|
15
13
|
end
|
16
14
|
end
|
17
15
|
end
|
@@ -20,6 +20,8 @@ module Dokno
|
|
20
20
|
|
21
21
|
before_validation :set_code
|
22
22
|
|
23
|
+
scope :alpha_order, -> { order(:name) }
|
24
|
+
|
23
25
|
# The display breadcrumb for the Category
|
24
26
|
def breadcrumb
|
25
27
|
crumbs = [name]
|
@@ -71,19 +73,40 @@ module Dokno
|
|
71
73
|
categories.flatten
|
72
74
|
end
|
73
75
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
76
|
+
def self.select_option_markup(selected_category_codes: nil, exclude_category_id: nil, context_category: nil, level: 0)
|
77
|
+
return '' if level.positive? && context_category.blank?
|
78
|
+
|
79
|
+
options = []
|
80
|
+
level_categories = where(category_id: context_category&.id).alpha_order
|
81
|
+
|
82
|
+
level_categories.each do |category|
|
83
|
+
options << option_markup(
|
84
|
+
category: category,
|
85
|
+
selected_category_codes: selected_category_codes,
|
86
|
+
exclude_category_id: exclude_category_id,
|
87
|
+
level: level
|
88
|
+
)
|
89
|
+
|
90
|
+
options << select_option_markup(
|
91
|
+
selected_category_codes: selected_category_codes,
|
92
|
+
exclude_category_id: exclude_category_id,
|
93
|
+
context_category: category,
|
94
|
+
level: (level + 1)
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
options.join
|
83
99
|
end
|
84
100
|
|
85
101
|
private
|
86
102
|
|
103
|
+
def self.option_markup(category:, selected_category_codes:, exclude_category_id:, level: 0)
|
104
|
+
return '' if category.id == exclude_category_id
|
105
|
+
|
106
|
+
selected = selected_category_codes&.include?(category.code)
|
107
|
+
%(<option value="#{category.code}" #{'selected="selected"' if selected}>#{(' ' * level)}#{category.name}</option>)
|
108
|
+
end
|
109
|
+
|
87
110
|
# Never allow setting of parent to self
|
88
111
|
def circular_parent_check
|
89
112
|
return unless persisted? && id.to_i == category_id.to_i
|
@@ -67,6 +67,7 @@
|
|
67
67
|
|
68
68
|
// Close on escape
|
69
69
|
document.addEventListener('keydown', dokno__keydown_listener, false);
|
70
|
+
document.addEventListener('click', dokno__click_listener, false);
|
70
71
|
}
|
71
72
|
};
|
72
73
|
|
@@ -78,6 +79,7 @@
|
|
78
79
|
dokno__panel.classList.remove('open');
|
79
80
|
document.body.classList.remove('dokno-no-scroll');
|
80
81
|
document.removeEventListener('keydown', dokno__keydown_listener, false);
|
82
|
+
document.removeEventListener('click', dokno__click_listener, false);
|
81
83
|
|
82
84
|
dokno__slug = null;
|
83
85
|
}
|
@@ -106,6 +108,11 @@
|
|
106
108
|
if (e.key === 'Escape') { doknoClosePanel(); }
|
107
109
|
}
|
108
110
|
|
111
|
+
const dokno__click_listener = function(e) {
|
112
|
+
var isClickInside = dokno__panel.contains(e.target);
|
113
|
+
if (!isClickInside) { doknoClosePanel(); }
|
114
|
+
}
|
115
|
+
|
109
116
|
dokno__close.onclick = function() { doknoClosePanel(); }
|
110
117
|
|
111
118
|
var dokno__id, dokno__slug;
|
@@ -1,6 +1,14 @@
|
|
1
1
|
<%= render 'dokno/article_formatting' %>
|
2
2
|
|
3
3
|
<section>
|
4
|
+
<% if @article.categories.present? %>
|
5
|
+
<div class="text-gray-500 mb-5">
|
6
|
+
<% @article.categories.each do |category| %>
|
7
|
+
<div><a href="<%= article_index_path(category.code) %>"><%= category.breadcrumb %></a></div>
|
8
|
+
<% end %>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
|
4
12
|
<div class="flex">
|
5
13
|
<div id="dokno-article-sidebar" class="w-2/5 pr-10">
|
6
14
|
<div id="article-deprecated-alert" class="<%= 'hidden' if @article.active %> bg-yellow-700 p-4 mb-5 rounded text-lg border-t-4 border-yellow-900 text-white font-base">
|
@@ -28,6 +28,11 @@
|
|
28
28
|
|
29
29
|
<div class="mt-10">
|
30
30
|
<button type="submit" class="bg-gray-700 text-gray-300 hover:bg-gray-900 hover:text-white rounded py-2 px-3 font-bold"><i data-feather="check" class="inline h-5"></i> SAVE CATEGORY</button>
|
31
|
+
<% if category.persisted? %>
|
32
|
+
<button type="button" class="bg-red-700 text-gray-300 hover:bg-red-900 hover:text-white rounded py-2 px-3 font-bold ml-5" onclick="deleteCategory('<%= category.id %>');"><i data-feather="trash" class="inline h-5"></i> DELETE</button>
|
33
|
+
<% end %>
|
31
34
|
<span class="text-lg ml-5"><a class="no-underline" href="<%= category.persisted? ? "#{root_path}?id=#{category.id}" : root_path %>">Cancel</a></span>
|
32
35
|
</div>
|
33
36
|
</section>
|
37
|
+
|
38
|
+
<script> elem('input#name').focus(); </script>
|
@@ -63,6 +63,13 @@
|
|
63
63
|
<% end %>
|
64
64
|
|
65
65
|
<div id="dokno-content-container" class="w-full max-w-screen-xl m-auto print-this">
|
66
|
+
<% flash.each do |color, msg| %>
|
67
|
+
<div class="bg-<%= color %>-700 p-4 mb-5 rounded text-lg border-t-4 border-<%= color %>-900 text-white font-base">
|
68
|
+
<i data-feather="<%= (color == 'green' ? 'check-circle' : (color == 'yellow' ? 'alert-circle' : 'x-circle')) %>" class="inline mr-2"></i>
|
69
|
+
<%= msg %>
|
70
|
+
</div>
|
71
|
+
<% end %>
|
72
|
+
|
66
73
|
<%= yield %>
|
67
74
|
</div>
|
68
75
|
</main>
|
data/lib/dokno/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dokno
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Courtney Payne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-12-
|
11
|
+
date: 2020-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: diffy
|
@@ -169,8 +169,7 @@ dependencies:
|
|
169
169
|
- !ruby/object:Gem::Version
|
170
170
|
version: '2.15'
|
171
171
|
description: Dokno allows you to easily mount a self-contained knowledgebase / wiki
|
172
|
-
/ help system to your Rails app
|
173
|
-
to your app.
|
172
|
+
/ help system to your Rails app.
|
174
173
|
email:
|
175
174
|
- cpayne624@gmail.com
|
176
175
|
executables: []
|