card-mod-script 0.13.1 → 0.14.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.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/assets/script/decko/autosave.js.coffee +30 -0
  3. data/assets/script/decko/bridge.js.coffee +31 -0
  4. data/assets/script/decko/card_menu.js.coffee +26 -0
  5. data/assets/script/decko/components.js.coffee +49 -0
  6. data/assets/script/decko/decko.js.coffee +82 -0
  7. data/assets/script/decko/doubleclick.js.coffee +30 -0
  8. data/assets/script/decko/editor.js.coffee +57 -0
  9. data/assets/script/decko/filter.js.coffee +183 -0
  10. data/assets/script/decko/filter_items.js.coffee +128 -0
  11. data/assets/script/decko/filter_links.js.coffee +81 -0
  12. data/assets/script/decko/follow.js.coffee +22 -0
  13. data/assets/script/decko/layout.js.coffee +76 -0
  14. data/assets/script/decko/link_editor.js.coffee +61 -0
  15. data/assets/script/decko/mod.js.coffee +79 -0
  16. data/assets/script/decko/modal.js.coffee +113 -0
  17. data/assets/script/decko/name_editor.js.coffee +40 -0
  18. data/assets/script/decko/navbox.js.coffee +74 -0
  19. data/assets/script/decko/nest_editor.js.coffee +166 -0
  20. data/assets/script/decko/nest_editor_name.js.coffee +102 -0
  21. data/assets/script/decko/nest_editor_options.js.coffee +93 -0
  22. data/assets/script/decko/nest_editor_rules.js.coffee +3 -0
  23. data/assets/script/decko/overlay.js.coffee +54 -0
  24. data/assets/script/decko/pointer_config.js.coffee +79 -0
  25. data/assets/script/decko/pointer_list_editor.js.coffee +67 -0
  26. data/assets/script/decko/recaptcha.js.coffee +19 -0
  27. data/assets/script/decko/selectable_filtered_content.js.coffee +12 -0
  28. data/assets/script/decko/slot.js.coffee +182 -0
  29. data/assets/script/decko/slot_ready.js.coffee +12 -0
  30. data/assets/script/decko/slotter.js.coffee +268 -0
  31. data/assets/script/decko/type_editor.js.coffee +21 -0
  32. data/assets/script/decko/upload.js.coffee +64 -0
  33. data/assets/script/jquery-ui.min.js +13 -0
  34. data/assets/script/jquery.autosize.js +274 -0
  35. data/assets/script/manifest.yml +57 -0
  36. data/init/early/init_execjs.rb +3 -0
  37. data/set/abstract/00_script.rb +30 -31
  38. data/set/abstract/01_asset_script.rb +0 -16
  39. data/set/abstract/{script_asset_list.rb → script_group.rb} +12 -13
  40. data/set/all/head_javascript.rb +12 -8
  41. data/set/right/script.rb +1 -14
  42. data/set/type/local_script_folder_group.rb +2 -2
  43. data/set/type/local_script_manifest_group.rb +1 -1
  44. data/set/type_plus_right/mod/script.rb +56 -0
  45. data/set/type_plus_right/set/script.rb +7 -0
  46. data/vendor/jquery_file_upload/LICENSE.txt +11 -12
  47. data/vendor/jquery_file_upload/README.md +189 -72
  48. data/vendor/jquery_file_upload/SECURITY.md +227 -0
  49. data/vendor/jquery_file_upload/VULNERABILITIES.md +118 -0
  50. data/vendor/jquery_file_upload/cors/postmessage.html +68 -58
  51. data/vendor/jquery_file_upload/cors/result.html +12 -10
  52. data/vendor/jquery_file_upload/css/jquery.fileupload-ui.css +24 -13
  53. data/vendor/jquery_file_upload/css/jquery.fileupload.css +3 -4
  54. data/vendor/jquery_file_upload/docker-compose.yml +55 -0
  55. data/vendor/jquery_file_upload/index.html +332 -230
  56. data/vendor/jquery_file_upload/js/cors/jquery.postmessage-transport.js +109 -109
  57. data/vendor/jquery_file_upload/js/cors/jquery.xdr-transport.js +81 -73
  58. data/vendor/jquery_file_upload/js/demo.js +75 -0
  59. data/vendor/jquery_file_upload/js/jquery.fileupload-audio.js +82 -94
  60. data/vendor/jquery_file_upload/js/jquery.fileupload-image.js +321 -300
  61. data/vendor/jquery_file_upload/js/jquery.fileupload-process.js +138 -146
  62. data/vendor/jquery_file_upload/js/jquery.fileupload-ui.js +737 -692
  63. data/vendor/jquery_file_upload/js/jquery.fileupload-validate.js +91 -97
  64. data/vendor/jquery_file_upload/js/jquery.fileupload-video.js +82 -94
  65. data/vendor/jquery_file_upload/js/jquery.fileupload.js +1569 -1451
  66. data/vendor/jquery_file_upload/js/jquery.iframe-transport.js +208 -205
  67. data/vendor/jquery_file_upload/js/vendor/jquery.ui.widget.js +397 -340
  68. data/vendor/jquery_file_upload/package-lock.json +6853 -0
  69. data/vendor/jquery_file_upload/package.json +71 -10
  70. data/vendor/jquery_file_upload/server/gae-python/app.yaml +11 -10
  71. data/vendor/jquery_file_upload/server/php/Dockerfile +23 -17
  72. data/vendor/jquery_file_upload/server/php/UploadHandler.php +206 -137
  73. data/vendor/jquery_file_upload/server/php/php.ini +5 -0
  74. data/vendor/jquery_file_upload/test/index.html +36 -159
  75. data/vendor/jquery_file_upload/test/unit.js +989 -0
  76. data/vendor/jquery_file_upload/test/vendor/chai.js +10854 -0
  77. data/vendor/jquery_file_upload/test/vendor/mocha.css +325 -0
  78. data/vendor/jquery_file_upload/test/vendor/mocha.js +18178 -0
  79. data/vendor/jquery_file_upload/wdio/LICENSE.txt +20 -0
  80. data/vendor/jquery_file_upload/wdio/assets/black+white-3x2.jpg +0 -0
  81. data/vendor/jquery_file_upload/wdio/assets/black+white-60x40.gif +0 -0
  82. data/vendor/jquery_file_upload/wdio/conf/chrome.js +40 -0
  83. data/vendor/jquery_file_upload/wdio/conf/firefox.js +25 -0
  84. data/vendor/jquery_file_upload/wdio/hooks/index.js +36 -0
  85. data/vendor/jquery_file_upload/wdio/test/pages/file-upload.js +79 -0
  86. data/vendor/jquery_file_upload/wdio/test/specs/01-file-upload.js +25 -0
  87. data/vendor/jquery_file_upload/wdio/wdio.conf.js +4 -0
  88. metadata +66 -50
  89. data/file/mod_script_script_decko_machine_output/file.js +0 -2710
  90. data/file/mod_script_script_jquery_machine_output/file.js +0 -12924
  91. data/lib/javascript/script_html5shiv_printshiv.js +0 -1
  92. data/set/self/script_html5shiv_printshiv.rb +0 -11
  93. data/set/self/script_mods.rb +0 -1
  94. data/set/type/mod_script_assets.rb +0 -21
  95. data/vendor/jquery_file_upload/CONTRIBUTING.md +0 -15
  96. data/vendor/jquery_file_upload/angularjs.html +0 -211
  97. data/vendor/jquery_file_upload/basic-plus.html +0 -226
  98. data/vendor/jquery_file_upload/basic.html +0 -136
  99. data/vendor/jquery_file_upload/bower-version-update.js +0 -16
  100. data/vendor/jquery_file_upload/bower.json +0 -64
  101. data/vendor/jquery_file_upload/css/jquery-ui-demo-ie8.css +0 -21
  102. data/vendor/jquery_file_upload/css/jquery-ui-demo.css +0 -67
  103. data/vendor/jquery_file_upload/css/style.css +0 -15
  104. data/vendor/jquery_file_upload/jquery-ui.html +0 -252
  105. data/vendor/jquery_file_upload/js/app.js +0 -101
  106. data/vendor/jquery_file_upload/js/jquery.fileupload-angular.js +0 -437
  107. data/vendor/jquery_file_upload/js/jquery.fileupload-jquery-ui.js +0 -161
  108. data/vendor/jquery_file_upload/js/main.js +0 -75
  109. data/vendor/jquery_file_upload/server/gae-go/app/main.go +0 -361
  110. data/vendor/jquery_file_upload/server/gae-go/app.yaml +0 -12
  111. data/vendor/jquery_file_upload/server/gae-go/static/favicon.ico +0 -0
  112. data/vendor/jquery_file_upload/server/gae-go/static/robots.txt +0 -2
  113. data/vendor/jquery_file_upload/server/php/docker-compose.yml +0 -9
  114. data/vendor/jquery_file_upload/test/test.js +0 -1292
@@ -0,0 +1,166 @@
1
+ $(document).ready ->
2
+ $('body').on 'click', 'button._nest-apply', () ->
3
+ if $(this).data("index")?
4
+ nest.applyNestToNestListEditor($(this).data("index"))
5
+ else
6
+ nest.applyNestToTinymceEditor($(this).data("tinymce-id"), $(this).data("tm-snippet-start"), $(this).data("tm-snippet-size"))
7
+
8
+ $('body').on 'click', 'button._change-create-to-update', () ->
9
+ tm_id = $(this).closest("form").find("#success_tinymce_id").val()
10
+ nest.changeCreateToUpdate(tm_id)
11
+
12
+ $('body').on 'click', 'button._open-nest-editor', () ->
13
+ form = $(this).closest("._nest-form")
14
+ reference = form.find("._reference").val()
15
+ nest_options = form.find("._nest-options").val()
16
+ encoded_nest = encodeURIComponent "{{#{reference}|#{nest_options}}}"
17
+ nest.openNestEditorForSlot(
18
+ $(this).closest(".card-slot"),
19
+ $(this).closest(".slotter"),
20
+ "index=#{form.data('index')}&tm_snippet_raw=#{encoded_nest}"
21
+ )
22
+
23
+
24
+ window.nest ||= {}
25
+
26
+ $.extend nest,
27
+ # called by TinyMCE
28
+ openNestEditor: (tm, params) ->
29
+ params = nest.editParams(tm) unless params?
30
+ this.openEditorForTm(tm, params, "nest_editor", "modal_nest_editor")
31
+
32
+ openNestEditorForSlot: (slot, slotter, params) ->
33
+ card = if slot[0] then $(slot[0]).attr('data-card-name') else ":update"
34
+ nest.request(card, "nest_editor", "modal_nest_editor", slotter, params)
35
+
36
+ openEditorForTm: (tm, params, overlay_view, modal_view) ->
37
+ params += "&tinymce_id=#{tm.id}"
38
+ slot = $("##{tm.id}").closest(".card-slot")
39
+ slotter = $("##{tm.id}")
40
+ card = if slot[0] then $(slot[0]).attr('data-card-name') else ":update"
41
+ nest.request(card, overlay_view, modal_view, slotter, params)
42
+
43
+ # called by TinyMCE
44
+ openImageEditor: (tm) ->
45
+ params = nest.editParams(tm, "{{", "}}", false) unless params?
46
+ this.openEditorForTm(tm, params,"nest_image", "modal_nest_image")
47
+
48
+ changeCreateToUpdate: (tm_id) ->
49
+ form = $("##{tm_id}").closest("form")
50
+ new_action = form.attr("action").replace("card/create", "card/update")
51
+ form.attr("action", new_action)
52
+
53
+ insertNest: (tm, nest_string) ->
54
+ tm.insertContent(nest_string)
55
+ # insertIndex = nest.offsetAfterInsert(tm, nest_string)
56
+ # params = nest.paramsStr(insertIndex, nest_string)
57
+ # nest.openNestEditor(etm, params)
58
+
59
+
60
+ request: (card, overlay_view, modal_view, slotter, params) ->
61
+ slot = $(".bridge-sidebar > ._overlay-container-placeholder > .card-slot")
62
+
63
+ if slot[0]
64
+ view = overlay_view
65
+ mode = "overlay"
66
+ else
67
+ slot = $($(".card-slot")[0])
68
+ view = modal_view
69
+ mode = "modal"
70
+
71
+ nest.sendRequest(slotter, slot, mode, card, view, params)
72
+
73
+ sendRequest: (slotter, slot, mode, card, view, params) ->
74
+ params = "" unless params?
75
+ url = "/#{card}?view=#{view}&#{params}"
76
+ $.ajax
77
+ url: url
78
+ type: 'GET'
79
+ success: (html) ->
80
+ slot.setSlotContent html, mode, slotter
81
+
82
+ editParams: (tm, prefix="{{", postfix="}}", edit=true) ->
83
+ sel = tm.selection.getSel()
84
+ return nest.paramsStr(0) unless sel? and sel.anchorNode?
85
+
86
+ text = sel.anchorNode.data
87
+ return nest.paramsStr(sel.anchorOffset) unless text
88
+
89
+ offset = sel.anchorOffset
90
+ before = text.substr(0, offset)
91
+ after = text.substr(offset)
92
+ index = {
93
+ before: {
94
+ close: before.lastIndexOf(postfix)
95
+ open: before.lastIndexOf(prefix)
96
+ },
97
+ after: {
98
+ close: after.indexOf(postfix)
99
+ open: after.indexOf(prefix)
100
+ }
101
+ }
102
+ if index.before.open > index.before.close &&
103
+ index.after.close != -1 &&
104
+ (index.after.open == -1 || index.after.close < index.after.open)
105
+ nest_start = index.before.open
106
+ unless name?
107
+ nest_size = index.after.close + offset + 2 - nest_start
108
+ name = text.substr(nest_start, nest_size)
109
+ if edit
110
+ nest.paramsStr(nest_start, name)
111
+ else
112
+ nest.paramsStr(nest_start + nest_size)
113
+ else
114
+ nest.paramsStr(offset)
115
+
116
+ paramsStr: (start, name) ->
117
+ params = ""
118
+ if start?
119
+ params += "&tm_snippet_start=#{start}"
120
+ if name? and name.length > 0
121
+ params += "&tm_snippet_raw=#{encodeURIComponent(name)}"
122
+
123
+ params
124
+
125
+ offsetAfterInsert: (editor, content) ->
126
+ offset = editor.selection.getSel().anchorOffset
127
+ offset - content.lengthr
128
+
129
+ applyNestToTinymceEditor: (tinymce_id, nest_start, nest_size) ->
130
+ nest.applySnippet("nest", tinymce_id, nest_start, nest_size)
131
+
132
+ applyNestToNestListEditor: (index) ->
133
+ row = $("._nest-form[data-index='#{index}']")
134
+ row.find("._reference").val(nest.name())
135
+ row.find("._nest-options").val(nest.options())
136
+ decko.updateAddItemButton(row)
137
+
138
+
139
+ applySnippet: (snippet_type, tinymce_id, start, size) ->
140
+ content = $("._#{snippet_type}-preview").val()
141
+ editor = tinymce.get(tinymce_id)
142
+ if start?
143
+ nest.replaceSnippet(editor, start, size, content)
144
+ else
145
+ editor.insertContent content
146
+ offset = nest.offsetAfterInsert(editor, content)
147
+ $("button._#{snippet_type}-apply").attr("data-tm-snippet-start", offset)
148
+
149
+ $("button._#{snippet_type}-apply").attr("data-tm-snippet-size", content.length)
150
+
151
+ replaceSnippet: (editor, start, size, content) ->
152
+ sel = editor.selection.getSel()
153
+ if sel? and sel.anchorNode? and sel.anchorNode.data?
154
+ text = sel.anchorNode.data
155
+ size = 0 unless size?
156
+ text = "#{text.substr(0, start)}#{content}#{text.substr(start + size)}"
157
+ sel.anchorNode.data = text
158
+ else
159
+ editor.insertContent content
160
+
161
+ updatePreview: (new_val) ->
162
+ new_val = "{{#{nest.name()}|#{nest.options()}}}" unless new_val?
163
+ preview = $("._nest-preview")
164
+ preview.val new_val
165
+ preview.data("nest-options", nest.options())
166
+ preview.data("reference", nest.name())
@@ -0,0 +1,102 @@
1
+ nestNameTimeout = null
2
+
3
+ $(document).ready ->
4
+ $('body').on 'click', '._nest-field-toggle', () ->
5
+ if $(this).is(':checked')
6
+ nest.addPlus()
7
+ else
8
+ nest.removePlus()
9
+
10
+ $('body').on 'input', 'input._nest-name', (event) ->
11
+ nest.nameChanged()
12
+
13
+ unless event.which == 13
14
+ clearTimeout(nestNameTimeout) if nestNameTimeout
15
+ nestNameTimeout = setTimeout (-> nest.updateNameRelatedTabs()), 700
16
+
17
+ $('body').on 'keydown', 'input._nest-name', (event) ->
18
+ if event.which == 13
19
+ clearTimeout(nestNameTimeout) if nestNameTimeout
20
+ nest.updateNameRelatedTabs()
21
+
22
+ $.extend nest,
23
+ name: () ->
24
+ nest.evalFieldOption $('input._nest-name').val()
25
+
26
+ nameChanged: () ->
27
+ new_val = $("._nest-preview").val().replace(/^\{\{[^}|]*/, "{{" + nest.name())
28
+ nest.updatePreview new_val
29
+
30
+ evalFieldOption: (name) ->
31
+ if nest.isField() then "+#{name}" else name
32
+
33
+ isField: ->
34
+ $('._nest-field-toggle').is(":checked")
35
+
36
+ addPlus: () ->
37
+ new_val = $("._nest-preview").val().replace(/^\{\{\+?/, "{{+")
38
+ nest.updatePreview new_val
39
+ $(".input-group.hide-prefix").removeClass("hide-prefix").addClass("show-prefix")
40
+
41
+ removePlus: () ->
42
+ new_val = $("._nest-preview").val().replace(/^\{\{\+?/, "{{")
43
+ nest.updatePreview new_val
44
+ $(".input-group.show-prefix").removeClass("show-prefix").addClass("hide-prefix")
45
+
46
+ rulesTabSlot: () ->
47
+ $("._nest-editor .tab-pane-rules > .card-slot")
48
+
49
+ contentTabSlot: () ->
50
+ $("._nest-editor .tab-pane-content > .card-slot")
51
+
52
+ emptyNameAlert: (show) ->
53
+ if show
54
+ $("._empty-nest-name-alert").removeClass("d-none")
55
+ else
56
+ $("._empty-nest-name-alert:not(.d-none)").addClass("d-none")
57
+
58
+ updateNameRelatedTabs: () ->
59
+ nest.updateRulesTab()
60
+ nest.updateContentTab()
61
+
62
+ updateContentTab: () ->
63
+ $contentTab = nest.contentTabSlot()
64
+ if $contentTab.length > 0
65
+ url = decko.path "#{nest.fullName()}?view=nest_content"
66
+ nest.updateNameDependentSlot($contentTab, url)
67
+
68
+ updateRulesTab: () ->
69
+ $rulesTab = nest.rulesTabSlot()
70
+ url = decko.path "#{nest.setNameForRules()}?view=nest_rules"
71
+ nest.updateNameDependentSlot($rulesTab, url)
72
+
73
+ updateNameDependentSlot: ($slot, url) ->
74
+ name = $("input._nest-name").val()
75
+ if name? && name.length > 0
76
+ nest.emptyNameAlert(false)
77
+ $slot.reloadSlot url
78
+ else
79
+ $slot.clearSlot()
80
+ nest.emptyNameAlert(true)
81
+
82
+ fullName: () ->
83
+ input = $('input._nest-name')
84
+ nest_name = input.val()
85
+ if nest.isField() and input.attr("data-left-name")
86
+ "#{input.attr("data-left-name")}+#{nest_name}"
87
+ else
88
+ nest_name
89
+
90
+ # set in the sense of card set
91
+ setNameForRules: () ->
92
+ input = $('input._nest-name')
93
+ nest_name = input.val()
94
+ if nest.isField()
95
+ if input.attr("data-left-type")
96
+ "#{input.attr("data-left-type")}+#{nest_name}+*type plus right"
97
+ else
98
+ "#{nest_name}+*right"
99
+ else
100
+ return "#{nest_name}+*self"
101
+
102
+
@@ -0,0 +1,93 @@
1
+ $(document).ready ->
2
+ $('body').on 'keyup', 'input._nest-option-value', () ->
3
+ nest.updatePreview()
4
+
5
+ $('body').on "select2:select", "._nest-option-name", () ->
6
+ nest.toggleOptionName($(this).closest("._options-select"), $(this).val(), true)
7
+ nest.updatePreview()
8
+
9
+ $('body').on "select2:selecting", "._nest-option-name", () ->
10
+ nest.toggleOptionName($(this).closest("._options-select"), $(this).val(), false)
11
+
12
+ $('body').on "select2:select", "._nest-option-name._new-row", () ->
13
+ $(this).closest(".input-group").find(".input-group-prepend").removeClass("d-none")
14
+ row = $(this).closest("._nest-option-row")
15
+ row.find("._nest-option-value").removeAttr("disabled")
16
+ template = row.parent().find("._nest-option-row._template")
17
+ $(this).removeClass("_new-row")
18
+ nest.addRow(template)
19
+
20
+ $('body').on "click", "._configure-items-button", () ->
21
+ nest.addItemsOptions($(this))
22
+
23
+ $('body').on 'click', 'button._nest-delete-option', () ->
24
+ nest.removeRow $(this).closest("._nest-option-row")
25
+
26
+ $.extend nest,
27
+ showTemplate: (elem) ->
28
+ elem.removeClass("_template") #.removeClass("_#{name}-template").addClass("_#{name}")
29
+
30
+ addRow: (template) ->
31
+ select_tag = template.find("select")
32
+ select_tag.select2("destroy")
33
+ select_tag.removeAttr("data-select2-id")
34
+ double = template.clone()
35
+ #double = template.cloneSelect2(true, true)
36
+ decko.initSelect2(select_tag)
37
+ nest.showTemplate template
38
+ template.after(double)
39
+ decko.initSelect2(double.find("select"))
40
+
41
+ removeRow: (row) ->
42
+ name = row.find("._nest-option-name").val()
43
+ nest.toggleOptionName(row.closest("._options-select"), name,false)
44
+ row.remove()
45
+ nest.updatePreview()
46
+
47
+ addItemsOptions: (button) ->
48
+ container = button.closest("._configure-items")
49
+ next = container.cloneSelect2(true)
50
+ title = button.text()
51
+ button.replaceWith($("<h6>#{title.substr(9)}<h6>"))
52
+ nest.showTemplate container.find("._options-select._template")
53
+ next.find("._configure-items-button").text(title.replace("items", "subitems"))
54
+ container.after(next)
55
+ nest.updatePreview()
56
+
57
+ options: () ->
58
+ options = []
59
+ for ele in $("._options-select:not(._template")
60
+ options.push nest.extractOptions($(ele))
61
+
62
+ level_options = options.map (opts) ->
63
+ nest.toNestSyntax(opts)
64
+ level_options.join "|"
65
+
66
+ # extract options for one item level
67
+ extractOptions: (ele) ->
68
+ options = {}
69
+ nest.addOption(options, $(row)) for row in ele.find("._nest-option-row:not(.template)")
70
+ options
71
+
72
+ addOption: (options, row) ->
73
+ val = row.find("._nest-option-value").val()
74
+ return unless val? && val.length > 0
75
+
76
+ name = row.find("._nest-option-name").val()
77
+ if options[name]?
78
+ options[name].push val
79
+ else
80
+ options[name] = [val]
81
+
82
+ toggleOptionName: (container, name, active) ->
83
+ return true if name == "show" || name == "hide"
84
+ for sel in container.find("._nest-option-name")
85
+ if $(sel).val() != name
86
+ $(sel).find("option[value=#{name}]").attr "disabled", active
87
+ # $(sel).find("option[value=#{val}]").removeAttr "disabled"
88
+ decko.initSelect2($(sel))
89
+
90
+ toNestSyntax: (opts) ->
91
+ str = []
92
+ str.push "#{name}: #{values.join ', '}" for name, values of opts
93
+ str.join "; "
@@ -0,0 +1,54 @@
1
+ jQuery.fn.extend
2
+ overlaySlot: ->
3
+ oslot = @closest(".card-slot._overlay")
4
+ return oslot if oslot[0]?
5
+ oslot = @closest(".overlay-container").find("._overlay")
6
+ oslot[0]? && $(oslot[0])
7
+
8
+ addOverlay: (overlay, $slotter) ->
9
+ if @parent().hasClass("overlay-container")
10
+ if $(overlay).hasClass("_stack-overlay")
11
+ @before overlay
12
+ else
13
+ $("._overlay-origin").removeClass("_overlay-origin")
14
+ @replaceOverlay(overlay)
15
+ else
16
+ if @parent().hasClass("_overlay-container-placeholder")
17
+ @parent().addClass("overlay-container")
18
+ else
19
+ @wrapAll('<div class="overlay-container">')
20
+ @addClass("_bottomlay-slot")
21
+ @before overlay
22
+
23
+ $slotter.registerAsOrigin("overlay", overlay)
24
+ decko.contentLoaded(overlay, $slotter)
25
+
26
+ replaceOverlay: (overlay) ->
27
+ @overlaySlot().trigger "slotDestroy"
28
+ @overlaySlot().replaceWith overlay
29
+ $(".bridge-sidebar .tab-pane:not(.active) .bridge-pills > .nav-item > .nav-link.active").removeClass("active")
30
+
31
+ isInOverlay: ->
32
+ return @closest(".card-slot._overlay").length
33
+
34
+ removeOverlay: () ->
35
+ slot = @overlaySlot()
36
+ if slot
37
+ slot.removeOverlaySlot()
38
+
39
+ removeOverlaySlot: () ->
40
+ @trigger "slotDestroy"
41
+ if @siblings().length == 1
42
+ bottomlay = $(@siblings()[0])
43
+ if bottomlay.hasClass("_bottomlay-slot")
44
+ if bottomlay.parent().hasClass("_overlay-container-placeholder")
45
+ bottomlay.parent().removeClass("overlay-container")
46
+ else
47
+ bottomlay.unwrap()
48
+ bottomlay.removeClass("_bottomlay-slot").updateBridge(true, bottomlay)
49
+
50
+ #bottomlay.find(".tinymce-textarea").each ->
51
+ # tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
52
+ # decko.initTinyMCE($(this).attr("id"))
53
+
54
+ @remove()
@@ -0,0 +1,79 @@
1
+ $.extend decko.editorContentFunctionMap,
2
+ 'select.pointer-select': ->
3
+ pointerContent @val()
4
+ 'select.pointer-multiselect': ->
5
+ pointerContent @val()
6
+ '.pointer-radio-list': ->
7
+ pointerContent @find('input:checked').val()
8
+ '.pointer-list-ul': ->
9
+ pointerContent @find('input').map( -> $(this).val() )
10
+ '.pointer-link-list-ul': ->
11
+ decko.linkListContent @find('.input-group')
12
+ '._nest-list-ul': ->
13
+ decko.nestListContent @find('.input-group')
14
+ '.pointer-checkbox-list': ->
15
+ pointerContent @find('input:checked').map( -> $(this).val() )
16
+ '.pointer-select-list': ->
17
+ pointerContent @find('.pointer-select select').map( -> $(this).val() )
18
+ '._pointer-filtered-list': ->
19
+ pointerContent @find('._filtered-list-item').map( -> $(this).data('cardName') )
20
+ '._pointer-list': ->
21
+ pointerContent @find('._pointer-item').map( -> $(this).val() )
22
+ # can't find evidence that the following is in use: #efm
23
+ # '.pointer-mixed': ->
24
+ # element = '.pointer-checkbox-sublist input:checked,\
25
+ # .pointer-sublist-ul input'
26
+ # pointerContent @find(element).map( -> $(this).val() )
27
+ # must happen after pointer-list-ul, I think
28
+ '.perm-editor': -> permissionsContent this
29
+
30
+ decko.editorInitFunctionMap['.pointer-list-editor'] = ->
31
+ @sortable({handle: '.handle', cancel: ''})
32
+ decko.initPointerList @find('input')
33
+
34
+ decko.editorInitFunctionMap['._pointer-filtered-list'] = ->
35
+ @sortable({handle: '._handle', cancel: ''})
36
+
37
+ $.extend decko,
38
+ initPointerList: (input) ->
39
+ decko.initAutoCardPlete input
40
+
41
+ initAutoCardPlete: (input) ->
42
+ optionsCard = input.data 'options-card'
43
+ return unless !!optionsCard
44
+ path = optionsCard + '.json?view=name_match'
45
+ input.autocomplete { source: decko.slotPath(path) }
46
+
47
+ pointerContent: (vals) ->
48
+ $.makeArray(vals).join "\n"
49
+
50
+ linkListContent: (input_groups) ->
51
+ vals = input_groups.map( ->
52
+ v = $(this).find('input._reference').val()
53
+ title = $(this).find('input._title').val()
54
+ v += "|#{title}" if title.length > 0
55
+ v
56
+ )
57
+ list = $.map $.makeArray(vals), (v) -> if v then '[[' + v + ']]'
58
+ $.makeArray(list).join "\n"
59
+
60
+ nestListContent: (input_groups) ->
61
+ vals = input_groups.map( ->
62
+ v = $(this).find('input._reference').val()
63
+ options = $(this).find('input._nest-options').val()
64
+ v += "|#{options}" if options.length > 0
65
+ v
66
+ )
67
+ list = $.map $.makeArray(vals), (v) -> if v then '{{' + v + '}}'
68
+ $.makeArray(list).join "\n"
69
+
70
+
71
+ pointerContent = (vals) ->
72
+ decko.pointerContent vals
73
+ # deprecated. backwards compatibility
74
+
75
+ permissionsContent = (ed) ->
76
+ return '_left' if ed.find('#inherit').is(':checked')
77
+ groups = ed.find('.perm-group input:checked').map( -> $(this).val() )
78
+ indivs = ed.find('.perm-indiv input' ).map( -> $(this).val() )
79
+ pointerContent $.makeArray(groups).concat($.makeArray(indivs))
@@ -0,0 +1,67 @@
1
+ $(window).ready ->
2
+ # add pointer item when clicking on "add another" button
3
+ $('body').on 'click', '._pointer-item-add', (event)->
4
+ decko.addPointerItem this
5
+ event.preventDefault() # Prevent link from following its href
6
+
7
+ # add pointer item when you hit enter in an item
8
+ $('body').on 'keydown', '.pointer-item-text', (event)->
9
+ if event.key == 'Enter'
10
+ decko.addPointerItem this
11
+ event.preventDefault() # was triggering extra item in unrelated pointer
12
+
13
+ # enable/disable add
14
+ $('body').on 'keyup', '.pointer-item-text', (_event)->
15
+ decko.updateAddItemButton this
16
+
17
+ $('body').on 'click', '.pointer-item-delete', ->
18
+ item = $(this).closest 'li'
19
+ list = item.closest('ul')
20
+ if list.find('.pointer-li').length > 1
21
+ item.remove()
22
+ else
23
+ item.find('input').val ''
24
+ decko.updateAddItemButton(list)
25
+
26
+ decko.slotReady (slot) ->
27
+ slot.find('.pointer-list-editor').each ->
28
+ decko.updateAddItemButton this
29
+
30
+ $.extend decko,
31
+ addPointerItem: (el) ->
32
+ slot = $(el).slot()
33
+ slot.trigger "slotDestroy"
34
+ # why is this necessary?
35
+ # this can have a lot of side effects in a multi-card form.
36
+
37
+ newInput = decko.nextPointerInput decko.lastPointerItem(el)
38
+ newInput.val ''
39
+
40
+ slot.trigger "slotReady"
41
+ decko.initializeEditors slot
42
+ # should be (but is not) handled by slotReady
43
+ # without this, "add another" was breaking tinymce editors in same slot
44
+
45
+ newInput.first().focus()
46
+ decko.updateAddItemButton el
47
+ decko.initPointerList newInput
48
+
49
+ nextPointerInput: (lastItem)->
50
+ lastInputs = lastItem.find 'input'
51
+ all_empty = true
52
+ for input in lastInputs
53
+ all_empty = all_empty and $(input).val() == ''
54
+ return lastInputs if all_empty
55
+
56
+ newItem = lastItem.clone()
57
+ lastItem.after newItem
58
+ newItem.attr("data-index", parseInt(lastItem.attr("data-index") + 1))
59
+ newItem.find 'input'
60
+
61
+ lastPointerItem: (el)->
62
+ $(el).closest('.content-editor').find '.pointer-li:last'
63
+
64
+ updateAddItemButton: (el)->
65
+ button = $(el).closest('.content-editor').find '._pointer-item-add'
66
+ disabled = decko.lastPointerItem(el).find('input').val() == ''
67
+ button.prop 'disabled', disabled
@@ -0,0 +1,19 @@
1
+ jQuery.fn.extend {
2
+ updateRecaptchaToken: (event) ->
3
+ recaptcha = @find("input._recaptcha-token")
4
+
5
+ if !recaptcha[0]?
6
+ recaptcha.val "recaptcha-token-field-missing"
7
+ else if !grecaptcha?
8
+ recaptcha.val("grecaptcha-undefined")
9
+ else
10
+ $slotter = $(this)
11
+ event.stopPropagation() if event
12
+ grecaptcha.execute(recaptcha.data("site-key"), action: recaptcha.data("action"))
13
+ .then (token) ->
14
+ recaptcha.val(token)
15
+ recaptcha.addClass("_token-updated")
16
+ if event
17
+ $slotter.submit()
18
+ false
19
+ }
@@ -0,0 +1,12 @@
1
+ $(window).ready ->
2
+
3
+ # TODO: generalize so this works with item views other than bar
4
+ $("body").on "click", "._selectable-filtered-content .bar-body", (e) ->
5
+ item = $(this)
6
+ name = item.slot().data("card-name")
7
+ container = item.closest("._selectable-filtered-content")
8
+ input = $(container.data("input-selector"))
9
+ input.val name
10
+ item.closest('.modal').modal('hide')
11
+ e.preventDefault()
12
+ e.stopPropagation()