card-mod-tinymce_editor 0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ .m-2
2
+ Nest one card in another.
3
+ %p
4
+ This panel will help you:
5
+ %ul
6
+ %li create/edit the nest syntax.
7
+ %li set rules that apply to nested cards
@@ -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"
@@ -0,0 +1,7 @@
1
+
2
+ format :html do
3
+ def tinymce_editor_input
4
+ text_area :content, rows: 3, class: "tinymce-textarea d0-card-content",
5
+ id: unique_id
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ include_set Abstract::CodeFile
2
+
3
+ Self::ScriptMods.add_item :script_tinymce
4
+ Self::InputOptions.add_to_basket :options, "tinymce editor"
@@ -0,0 +1,4 @@
1
+ include_set Abstract::CodeFile
2
+
3
+ Self::ScriptEditors.add_item :script_tinymce_config
4
+ All::Head::HtmlFormat.add_to_basket :mod_js_config, [:tiny_mce, "setTinyMCEConfig"]
@@ -0,0 +1,7 @@
1
+ def raw_help_text
2
+ <<-TEXT
3
+ Configure [[http://tinymce.com|TinyMCE]], Decko's default
4
+ [[http://en.wikipedia.org/wiki/Wysiwyg|wysiwyg]] editor.
5
+ [[http://decko.org/TinyMCE|more]]
6
+ TEXT
7
+ end
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: []