card-mod-tinymce_editor 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/db/migrate_core_cards/20160804112560_add_tinymce_cards.rb +42 -0
- data/db/migrate_core_cards/20171113233151_update_tinymce_config.rb +22 -0
- data/db/migrate_core_cards/20190306172623_update_tinymce_config_to_v5.rb +23 -0
- data/db/migrate_core_cards/20190306172890_tinymce_add_nest_to_toolbar.rb +11 -0
- data/lib/javascript/script_tinymce.js +9 -0
- data/lib/javascript/script_tinymce_config.js.coffee +59 -0
- data/set/all/reference_editor.rb +23 -0
- data/set/all/reference_editor/_link_editor.haml +18 -0
- data/set/all/reference_editor/_nest_editor.haml +17 -0
- data/set/all/reference_editor/link_editor.rb +33 -0
- data/set/all/reference_editor/link_editor/link_parser.rb +35 -0
- data/set/all/reference_editor/nest_editor.rb +172 -0
- data/set/all/reference_editor/nest_editor/_help.haml +7 -0
- data/set/all/reference_editor/nest_editor/_options.haml +12 -0
- data/set/all/reference_editor/nest_editor/_options_select.haml +9 -0
- data/set/all/reference_editor/nest_editor/_options_select_row.haml +10 -0
- data/set/all/reference_editor/nest_editor/nest_parser.rb +71 -0
- data/set/all/reference_editor/nest_image.rb +70 -0
- data/set/all/reference_editor/reference_editor.haml +18 -0
- data/set/all/tinymce_editor.rb +7 -0
- data/set/self/script_tinymce.rb +4 -0
- data/set/self/script_tinymce_config.rb +4 -0
- data/set/self/tiny_mce.rb +7 -0
- metadata +83 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
.options-container.p-2.border-bottom
|
2
|
+
= haml_partial :options_select, template: false, level: 0, data: snippet.options
|
3
|
+
- snippet.item_options.each_with_index do |options, i|
|
4
|
+
.options-container.p-2.border-bottom._configure-items
|
5
|
+
%h6
|
6
|
+
= "#{'sub' * i} items"
|
7
|
+
= haml_partial :options_select, template: false, level: i + 1, data: options
|
8
|
+
.options-container.p-2.border-bottom._configure-items
|
9
|
+
= button_tag "Configure #{'sub' * snippet.item_options.size}items", situation: "secondary", class: "_configure-items-button btn-sm"
|
10
|
+
= haml_partial :options_select, template: true, level: snippet.item_options.size + 1, data: default_nest_editor_item_options
|
11
|
+
|
12
|
+
|
@@ -0,0 +1,9 @@
|
|
1
|
+
._options-select{class: [template &&'_template']}
|
2
|
+
- if data
|
3
|
+
- data.each do |name, value|
|
4
|
+
= haml_partial :options_select_row, template: false, name: name,
|
5
|
+
level: level, value: value
|
6
|
+
= haml_partial :options_select_row, template: false, name: nil, level: level,
|
7
|
+
value: nil
|
8
|
+
= haml_partial :options_select_row, template: true, name: nil, level: level,
|
9
|
+
value: nil
|
@@ -0,0 +1,10 @@
|
|
1
|
+
.form-row._nest-option-row{class: [template && "_template"]}
|
2
|
+
.col-6
|
3
|
+
.input-group.input-group-sm.mb-2.mr-2.d-flex.flex-nowrap
|
4
|
+
.input-group-prepend{class: [!name && "d-none"]}
|
5
|
+
%button.btn.btn-secondary.input-group-text.p-1._nest-delete-option{:type => "button"}
|
6
|
+
%small.text-muted
|
7
|
+
= fa_icon :times
|
8
|
+
= nest_option_name_select name, level
|
9
|
+
.col-6
|
10
|
+
= nest_option_value_select value
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#! no set module
|
2
|
+
|
3
|
+
# Extracts all information needed to generate the nest editor form
|
4
|
+
# from a nest syntax string
|
5
|
+
class NestParser
|
6
|
+
attr_reader :name, :options, :item_options, :raw
|
7
|
+
|
8
|
+
def self.new nest_string, default_view, default_item_view
|
9
|
+
return super if nest_string.is_a? String
|
10
|
+
|
11
|
+
OpenStruct.new(name: "", field?: true,
|
12
|
+
options: [[:view, default_view]], item_options: [],
|
13
|
+
raw: "{{+|view: #{default_view}}}")
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.new_image name
|
17
|
+
OpenStruct.new(name: name, field?: true,
|
18
|
+
options: [%i[view content], %i[size medium]],
|
19
|
+
item_options: [],
|
20
|
+
raw: "{{+#{name}|view: content; size: medium}}")
|
21
|
+
end
|
22
|
+
|
23
|
+
def field?
|
24
|
+
@field
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize nest_string, _default_view, default_item_view
|
28
|
+
@raw = nest_string
|
29
|
+
@default_item_view = default_item_view
|
30
|
+
nest = Card::Content::Chunk::Nest.new nest_string, nil
|
31
|
+
init_name nest.name
|
32
|
+
extract_item_options nest.options
|
33
|
+
@options = extract_options nest.options
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def init_name name
|
39
|
+
@field = name.to_name.simple_relative?
|
40
|
+
@name = @field ? name.to_s[1..-1] : name
|
41
|
+
end
|
42
|
+
|
43
|
+
def extract_options options
|
44
|
+
Card::Set::All::ReferenceEditor::NestEditor::NEST_OPTIONS
|
45
|
+
.each_with_object([]) do |key, res|
|
46
|
+
next unless options[key]
|
47
|
+
|
48
|
+
if key.in? %i[show hide]
|
49
|
+
values = Card::View.normalize_list(options[key])
|
50
|
+
res.concat(values.map { |val| [key, val] })
|
51
|
+
else
|
52
|
+
res << [key, options[key]]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def extract_item_options options
|
58
|
+
@item_options = []
|
59
|
+
item_options = options[:items]
|
60
|
+
while item_options
|
61
|
+
next_item_options = item_options[:items]
|
62
|
+
@item_options << extract_options(item_options)
|
63
|
+
item_options = next_item_options
|
64
|
+
end
|
65
|
+
# @item_options << default_item_options
|
66
|
+
end
|
67
|
+
|
68
|
+
def default_item_options
|
69
|
+
[:view, @default_item_view]
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
format :html do
|
2
|
+
view :nest_image, unknown: true, cache: :never,
|
3
|
+
wrap: {
|
4
|
+
slot: { class: "_overlay d0-card-overlay card nodblclick" }
|
5
|
+
} do
|
6
|
+
nest_image_editor :overlay
|
7
|
+
end
|
8
|
+
|
9
|
+
view :modal_nest_image, unknown: true, cache: :never,
|
10
|
+
wrap: { slot: { class: "nodblclick" } } do
|
11
|
+
nest_image_editor :modal
|
12
|
+
end
|
13
|
+
|
14
|
+
view :new_image, perms: :create, unknown: true, cache: :never do
|
15
|
+
new_view_frame_and_form new_image_form_opts
|
16
|
+
end
|
17
|
+
|
18
|
+
def nest_image_editor editor_mode
|
19
|
+
adapt_reference_editor_for_images
|
20
|
+
nest_editor editor_mode
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
def adapt_reference_editor_for_images
|
25
|
+
nest_name = card.autoname(card.name.field("image01"))
|
26
|
+
voo.show! :content_tab
|
27
|
+
@nest_content_tab = nest(nest_name, view: :new_image, type: :image, hide: :guide)
|
28
|
+
|
29
|
+
image_name = nest_name.to_name.right
|
30
|
+
@nest_snippet = NestEditor::NestParser.new_image image_name
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
def new_image_form_opts
|
35
|
+
{ buttons: new_image_buttons,
|
36
|
+
success: { tinymce_id: Env.params[:tinymce_id],
|
37
|
+
view: :open } }
|
38
|
+
end
|
39
|
+
|
40
|
+
def new_image_buttons
|
41
|
+
button_formgroup do
|
42
|
+
[standard_save_button(no_origin_update: true, class: "_change-create-to-update")]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
format :js do
|
48
|
+
view :change_create_to_update, unknown: true do
|
49
|
+
tm_id = if Env.params[:tinymce_id].present?
|
50
|
+
"\"#{Env.params[:tinymce_id]}\""
|
51
|
+
else
|
52
|
+
'$(".tinymce-textarea").attr("id")'
|
53
|
+
end
|
54
|
+
<<-JAVASCRIPT.strip_heredoc
|
55
|
+
nest.changeCreateToUpdate(#{tm_id});
|
56
|
+
JAVASCRIPT
|
57
|
+
end
|
58
|
+
|
59
|
+
view :open_nest_editor, unknown: true do
|
60
|
+
tm_id = if Env.params[:tinymce_id].present?
|
61
|
+
"\"#{Env.params[:tinymce_id]}\""
|
62
|
+
else
|
63
|
+
'$(".tinymce-textarea").attr("id")'
|
64
|
+
end
|
65
|
+
<<-JAVASCRIPT.strip_heredoc
|
66
|
+
tm = tinymce.get(#{tm_id});
|
67
|
+
nest.insertNest(tm, "{{+#{card.name.tag}|view: content; size: medium}}");
|
68
|
+
JAVASCRIPT
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
%div._nest-editor
|
2
|
+
.nest-header.d-flex.ml-2
|
3
|
+
%h5.mt-1
|
4
|
+
= ref_type.capitalize
|
5
|
+
.ml-auto
|
6
|
+
= link_to fa_icon(:close), path: "#", "data-dismiss": editor_mode, class: "text-dark p-1 ml-1"
|
7
|
+
|
8
|
+
.form
|
9
|
+
= haml_partial "#{ref_type}_editor", snippet: snippet
|
10
|
+
|
11
|
+
.card-footer.p-0
|
12
|
+
.preview.mx-1.my-1.form-control-feedback
|
13
|
+
= text_field_tag "preview", snippet.raw, class: "_#{ref_type}-preview w-100 text-muted", readonly: true
|
14
|
+
%hr.mt-1.mb-1
|
15
|
+
.form-group-inline.d-flex.justify-content-center.py-2
|
16
|
+
= button_tag (modal_tm_snippet_editor? ? "Apply and Close" : "Apply"), apply_opts.merge(class: "_#{ref_type}-apply btn-sm mr-3")
|
17
|
+
%a.border-light.text-dark.btn.btn-sm.btn-outline-secondary{"data-dismiss": editor_mode, href: "#"}
|
18
|
+
= modal_tm_snippet_editor? ? "Cancel" : "Close"
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: card-mod-tinymce_editor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ethan McCutchen
|
8
|
+
- Philipp Kühl
|
9
|
+
- Gerry Gleason
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2020-09-19 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: card-mod-edit
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - '='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.1'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - '='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '0.1'
|
29
|
+
description: ''
|
30
|
+
email:
|
31
|
+
- info@decko.org
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- db/migrate_core_cards/20160804112560_add_tinymce_cards.rb
|
37
|
+
- db/migrate_core_cards/20171113233151_update_tinymce_config.rb
|
38
|
+
- db/migrate_core_cards/20190306172623_update_tinymce_config_to_v5.rb
|
39
|
+
- db/migrate_core_cards/20190306172890_tinymce_add_nest_to_toolbar.rb
|
40
|
+
- lib/javascript/script_tinymce.js
|
41
|
+
- lib/javascript/script_tinymce_config.js.coffee
|
42
|
+
- set/all/reference_editor.rb
|
43
|
+
- set/all/reference_editor/_link_editor.haml
|
44
|
+
- set/all/reference_editor/_nest_editor.haml
|
45
|
+
- set/all/reference_editor/link_editor.rb
|
46
|
+
- set/all/reference_editor/link_editor/link_parser.rb
|
47
|
+
- set/all/reference_editor/nest_editor.rb
|
48
|
+
- set/all/reference_editor/nest_editor/_help.haml
|
49
|
+
- set/all/reference_editor/nest_editor/_options.haml
|
50
|
+
- set/all/reference_editor/nest_editor/_options_select.haml
|
51
|
+
- set/all/reference_editor/nest_editor/_options_select_row.haml
|
52
|
+
- set/all/reference_editor/nest_editor/nest_parser.rb
|
53
|
+
- set/all/reference_editor/nest_image.rb
|
54
|
+
- set/all/reference_editor/reference_editor.haml
|
55
|
+
- set/all/tinymce_editor.rb
|
56
|
+
- set/self/script_tinymce.rb
|
57
|
+
- set/self/script_tinymce_config.rb
|
58
|
+
- set/self/tiny_mce.rb
|
59
|
+
homepage: http://decko.org
|
60
|
+
licenses:
|
61
|
+
- GPL-2.0
|
62
|
+
- GPL-3.0
|
63
|
+
metadata: {}
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 2.3.0
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubygems_version: 3.0.3
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: Calendar editor
|
83
|
+
test_files: []
|