card-mod-script 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +7 -0
  2. data/lib/javascript/decko/autosave.js.coffee +30 -0
  3. data/lib/javascript/decko/bridge.js.coffee +31 -0
  4. data/lib/javascript/decko/card_menu.js.coffee +26 -0
  5. data/lib/javascript/decko/components.js.coffee +51 -0
  6. data/lib/javascript/decko/decko.js.coffee +100 -0
  7. data/lib/javascript/decko/doubleclick.js.coffee +30 -0
  8. data/lib/javascript/decko/editor.js.coffee +55 -0
  9. data/lib/javascript/decko/filter.js.coffee +176 -0
  10. data/lib/javascript/decko/filter_items.js.coffee +128 -0
  11. data/lib/javascript/decko/filter_links.js.coffee +81 -0
  12. data/lib/javascript/decko/follow.js.coffee +22 -0
  13. data/lib/javascript/decko/layout.js.coffee +76 -0
  14. data/lib/javascript/decko/link_editor.js.coffee +61 -0
  15. data/lib/javascript/decko/mod.js.coffee +85 -0
  16. data/lib/javascript/decko/modal.js.coffee +110 -0
  17. data/lib/javascript/decko/name_editor.js.coffee +51 -0
  18. data/lib/javascript/decko/navbox.js.coffee +74 -0
  19. data/lib/javascript/decko/nest_editor.js.coffee +166 -0
  20. data/lib/javascript/decko/nest_editor_name.js.coffee +102 -0
  21. data/lib/javascript/decko/nest_editor_options.js.coffee +93 -0
  22. data/lib/javascript/decko/nest_editor_rules.js.coffee +3 -0
  23. data/lib/javascript/decko/overlay.js.coffee +57 -0
  24. data/lib/javascript/decko/recaptcha.js.coffee +19 -0
  25. data/lib/javascript/decko/selectable_filtered_content.js.coffee +12 -0
  26. data/lib/javascript/decko/slot.js.coffee +172 -0
  27. data/lib/javascript/decko/slot_ready.js.coffee +11 -0
  28. data/lib/javascript/decko/slotter.js.coffee +269 -0
  29. data/lib/javascript/decko/upload.js.coffee +57 -0
  30. data/lib/javascript/jquery-ui.js +10 -0
  31. data/lib/javascript/jquery.autosize.js +274 -0
  32. data/lib/javascript/jquery.iframe-transport.js +185 -0
  33. data/lib/javascript/script_html5shiv_printshiv.js +1 -0
  34. data/lib/javascript/script_pointer_config.js.coffee +80 -0
  35. data/lib/javascript/script_pointer_list_editor.js.coffee +67 -0
  36. data/lib/javascript/theme-textmate.js +130 -0
  37. data/set/abstract/script.rb +85 -0
  38. data/set/right/script.rb +19 -0
  39. data/set/self/01_script_libraries.rb +1 -0
  40. data/set/self/script.rb +1 -0
  41. data/set/self/script_decko.rb +12 -0
  42. data/set/self/script_editors.rb +1 -0
  43. data/set/self/script_html5shiv_printshiv.rb +11 -0
  44. data/set/self/script_jquery.rb +10 -0
  45. data/set/self/script_jquery_helper.rb +14 -0
  46. data/set/self/script_mods.rb +1 -0
  47. data/set/self/script_pointer_config.rb +9 -0
  48. data/set/type/coffee_script.rb +25 -0
  49. data/set/type/java_script.rb +9 -0
  50. data/vendor/jquery_file_upload/CONTRIBUTING.md +15 -0
  51. data/vendor/jquery_file_upload/LICENSE.txt +21 -0
  52. data/vendor/jquery_file_upload/README.md +107 -0
  53. data/vendor/jquery_file_upload/angularjs.html +211 -0
  54. data/vendor/jquery_file_upload/basic-plus.html +226 -0
  55. data/vendor/jquery_file_upload/basic.html +136 -0
  56. data/vendor/jquery_file_upload/bower-version-update.js +16 -0
  57. data/vendor/jquery_file_upload/bower.json +64 -0
  58. data/vendor/jquery_file_upload/cors/postmessage.html +75 -0
  59. data/vendor/jquery_file_upload/cors/result.html +24 -0
  60. data/vendor/jquery_file_upload/css/jquery-ui-demo-ie8.css +21 -0
  61. data/vendor/jquery_file_upload/css/jquery-ui-demo.css +67 -0
  62. data/vendor/jquery_file_upload/css/jquery.fileupload-noscript.css +22 -0
  63. data/vendor/jquery_file_upload/css/jquery.fileupload-ui-noscript.css +17 -0
  64. data/vendor/jquery_file_upload/css/jquery.fileupload-ui.css +57 -0
  65. data/vendor/jquery_file_upload/css/jquery.fileupload.css +37 -0
  66. data/vendor/jquery_file_upload/css/style.css +15 -0
  67. data/vendor/jquery_file_upload/img/loading.gif +0 -0
  68. data/vendor/jquery_file_upload/img/progressbar.gif +0 -0
  69. data/vendor/jquery_file_upload/index.html +255 -0
  70. data/vendor/jquery_file_upload/jquery-ui.html +252 -0
  71. data/vendor/jquery_file_upload/js/app.js +101 -0
  72. data/vendor/jquery_file_upload/js/cors/jquery.postmessage-transport.js +126 -0
  73. data/vendor/jquery_file_upload/js/cors/jquery.xdr-transport.js +89 -0
  74. data/vendor/jquery_file_upload/js/jquery.fileupload-angular.js +437 -0
  75. data/vendor/jquery_file_upload/js/jquery.fileupload-audio.js +113 -0
  76. data/vendor/jquery_file_upload/js/jquery.fileupload-image.js +326 -0
  77. data/vendor/jquery_file_upload/js/jquery.fileupload-jquery-ui.js +161 -0
  78. data/vendor/jquery_file_upload/js/jquery.fileupload-process.js +178 -0
  79. data/vendor/jquery_file_upload/js/jquery.fileupload-ui.js +714 -0
  80. data/vendor/jquery_file_upload/js/jquery.fileupload-validate.js +125 -0
  81. data/vendor/jquery_file_upload/js/jquery.fileupload-video.js +113 -0
  82. data/vendor/jquery_file_upload/js/jquery.fileupload.js +1486 -0
  83. data/vendor/jquery_file_upload/js/jquery.iframe-transport.js +224 -0
  84. data/vendor/jquery_file_upload/js/main.js +75 -0
  85. data/vendor/jquery_file_upload/js/vendor/jquery.ui.widget.js +748 -0
  86. data/vendor/jquery_file_upload/package.json +55 -0
  87. data/vendor/jquery_file_upload/server/gae-go/app.yaml +12 -0
  88. data/vendor/jquery_file_upload/server/gae-go/app/main.go +361 -0
  89. data/vendor/jquery_file_upload/server/gae-go/static/favicon.ico +0 -0
  90. data/vendor/jquery_file_upload/server/gae-go/static/robots.txt +2 -0
  91. data/vendor/jquery_file_upload/server/gae-python/app.yaml +17 -0
  92. data/vendor/jquery_file_upload/server/gae-python/main.py +204 -0
  93. data/vendor/jquery_file_upload/server/gae-python/static/favicon.ico +0 -0
  94. data/vendor/jquery_file_upload/server/gae-python/static/robots.txt +2 -0
  95. data/vendor/jquery_file_upload/server/php/Dockerfile +38 -0
  96. data/vendor/jquery_file_upload/server/php/UploadHandler.php +1411 -0
  97. data/vendor/jquery_file_upload/server/php/docker-compose.yml +9 -0
  98. data/vendor/jquery_file_upload/server/php/index.php +15 -0
  99. data/vendor/jquery_file_upload/test/index.html +172 -0
  100. data/vendor/jquery_file_upload/test/test.js +1292 -0
  101. data/vendor/jquery_rails/CHANGELOG.md +359 -0
  102. data/vendor/jquery_rails/CONTRIBUTING.md +132 -0
  103. data/vendor/jquery_rails/Gemfile +22 -0
  104. data/vendor/jquery_rails/MIT-LICENSE +21 -0
  105. data/vendor/jquery_rails/README.md +75 -0
  106. data/vendor/jquery_rails/Rakefile +59 -0
  107. data/vendor/jquery_rails/VERSIONS.md +62 -0
  108. data/vendor/jquery_rails/jquery-rails.gemspec +26 -0
  109. data/vendor/jquery_rails/lib/jquery-rails.rb +1 -0
  110. data/vendor/jquery_rails/lib/jquery/assert_select.rb +149 -0
  111. data/vendor/jquery_rails/lib/jquery/rails.rb +8 -0
  112. data/vendor/jquery_rails/lib/jquery/rails/engine.rb +6 -0
  113. data/vendor/jquery_rails/lib/jquery/rails/version.rb +9 -0
  114. data/vendor/jquery_rails/test/assert_select_jquery_test.rb +85 -0
  115. data/vendor/jquery_rails/test/test_helper.rb +6 -0
  116. data/vendor/jquery_rails/vendor/assets/javascripts/jquery.js +11008 -0
  117. data/vendor/jquery_rails/vendor/assets/javascripts/jquery.min.js +5 -0
  118. data/vendor/jquery_rails/vendor/assets/javascripts/jquery.min.map +1 -0
  119. data/vendor/jquery_rails/vendor/assets/javascripts/jquery2.js +9814 -0
  120. data/vendor/jquery_rails/vendor/assets/javascripts/jquery2.min.js +4 -0
  121. data/vendor/jquery_rails/vendor/assets/javascripts/jquery2.min.map +1 -0
  122. data/vendor/jquery_rails/vendor/assets/javascripts/jquery3.js +10364 -0
  123. data/vendor/jquery_rails/vendor/assets/javascripts/jquery3.min.js +2 -0
  124. data/vendor/jquery_rails/vendor/assets/javascripts/jquery3.min.map +1 -0
  125. data/vendor/jquery_rails/vendor/assets/javascripts/jquery_ujs.js +555 -0
  126. metadata +212 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e568dae1e38d71977aa1fcfb1bea1003b8cca38ee19329436e7b8fbc4f265025
4
+ data.tar.gz: b4e98c0f5b1aa8a3ca69a6ba2a87c9c1856d3316fed79d47c49d764ddcbf2997
5
+ SHA512:
6
+ metadata.gz: 88d15512c8480d5948ed84bf34f3679963f475d219610818b245e13a32e17fb36033e197e9d9126f039c33d69338501e99988a38f2bf090d355a275d07d264de
7
+ data.tar.gz: b8417e758797098fb7e2c19a7bfbecc1eca9a99968603a8f30cfd2ff18d4dc352d55772c0ffbdfcc16b555c68e4625b1ed20f8e1db0435d57381778cc95a9b83
@@ -0,0 +1,30 @@
1
+ jQuery.fn.extend
2
+ autosave: ->
3
+ slot = @slot()
4
+ return if @attr 'no-autosave'
5
+ multi = @closest '.form-group'
6
+ if multi[0]
7
+ return unless id = multi.data 'cardId'
8
+ reportee = ': ' + multi.data 'cardName'
9
+ else
10
+ id = slot.data 'cardId'
11
+ reportee = ''
12
+
13
+ return unless id
14
+
15
+ # might be better to put this href base in the html
16
+ submit_url = decko.path 'update/~' + id
17
+ form_data = $('#edit_card_'+id).serializeArray().reduce( ((obj, item) ->
18
+ obj[item.name] = item.value
19
+ return obj
20
+ ), { 'draft' : 'true', 'success[view]' : 'blank'});
21
+ $.ajax submit_url, {
22
+ data : form_data,
23
+ type : 'POST'
24
+ }
25
+ ##{ 'card[content]' : @val() },
26
+
27
+ $(window).ready ->
28
+ $('body').on 'change', '.autosave .d0-card-content', ->
29
+ content_field = $(this)
30
+ setTimeout ( -> content_field.autosave() ), 500
@@ -0,0 +1,31 @@
1
+ decko.slotReady (slot, slotter) ->
2
+ slot.updateBridge(false, slotter)
3
+
4
+ links = slot.find('ul._auto-single-select > li.nav-item > a.nav-link')
5
+ if links.length == 1
6
+ $(links[0]).click()
7
+
8
+ jQuery.fn.extend
9
+ # overlayClosed=true means the bridge update was
10
+ # triggered by closing an overlay
11
+ updateBridge: (overlayClosed=false, slotter) ->
12
+ return unless @closest(".bridge").length > 0
13
+ if @data("breadcrumb")
14
+ @updateBreadcrumb()
15
+ else if slotter and $(slotter).data("breadcrumb")
16
+ $(slotter).updateBreadcrumb()
17
+
18
+ if overlayClosed
19
+ $(".bridge-pills > .nav-item > .nav-link.active").removeClass("active")
20
+
21
+ updateBreadcrumb: () ->
22
+ bc_item = $(".modal-header ._bridge-breadcrumb li:last-child")
23
+ bc_item.text(this.data("breadcrumb"))
24
+ bc_item.attr("class", "breadcrumb-item active #{this.data('breadcrumb-class')}")
25
+
26
+ $(window).ready ->
27
+ $('body').on "select2:select", "._close-rule-overlay-on-select", (event) ->
28
+ $(".overlay-container > ._overlay.card-slot.overlay_rule-view.RULE").removeOverlay()
29
+
30
+ $('body').on "click", "._update-history-pills", (event) ->
31
+ $(this).closest(".slotter").data("update-foreign-slot", ".card-slot.history_tab-view")
@@ -0,0 +1,26 @@
1
+ decko.isTouchDevice = ->
2
+ if 'ontouchstart' of window or window.DocumentTouch and
3
+ document instanceof DocumentTouch
4
+ return true
5
+ else
6
+ return detectMobileBrowser()
7
+
8
+ # source for this method: detectmobilebrowsers.com
9
+ detectMobileBrowser = (userAgent) ->
10
+ userAgent = navigator.userAgent or navigator.vendor or window.opera
11
+ /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(userAgent) or /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(userAgent.substr(0, 4))
12
+
13
+ decko.slotReady (slot) ->
14
+ if decko.isTouchDevice()
15
+ slot.find('._show-on-hover').removeClass('_show-on-hover')
16
+
17
+ $(window).ready ->
18
+ $('body').on 'show.bs.popover', '._card-menu-popover', () ->
19
+ $(this).closest(".card-menu._show-on-hover")
20
+ .removeClass("_show-on-hover")
21
+ .addClass("_show-on-hover-disabled")
22
+
23
+ $('body').on 'hide.bs.popover', '._card-menu-popover', () ->
24
+ $(this).closest(".card-menu._show-on-hover-disabled")
25
+ .removeClass("_show-on-hover-disabled")
26
+ .addClass("_show-on-hover")
@@ -0,0 +1,51 @@
1
+ decko.slotReady (slot) ->
2
+ $('[data-toggle="popover"]').popover(html: true)
3
+
4
+ $('.colorpicker-component').colorpicker()
5
+
6
+ submitAfterTyping = null
7
+
8
+ $(window).ready ->
9
+ $('body').on 'show.bs.tab', 'a.load[data-toggle="tab"][data-url]', (e) ->
10
+ tab_id = $(e.target).attr('href')
11
+ url = $(e.target).data('url')
12
+ $(e.target).removeClass('load')
13
+ $.ajax
14
+ url: url
15
+ type: 'GET'
16
+ success: (html) ->
17
+ $(tab_id).append(html)
18
+ decko.contentLoaded($(tab_id), $(this))
19
+
20
+ $('body').on "input", "._submit-after-typing", (event) ->
21
+ form = $(event.target).closest('form')
22
+ form.slot().find(".autosubmit-success-notification").remove()
23
+ clearTimeout(submitAfterTyping) if submitAfterTyping
24
+ submitAfterTyping = setTimeout ->
25
+ $(event.target).closest('form').submit()
26
+ submitAfterTyping = null
27
+ , 1000
28
+
29
+ $('body').on "keydown", "._submit-after-typing", (event) ->
30
+ if event.which == 13
31
+ clearTimeout(submitAfterTyping) if submitAfterTyping
32
+ submitAfterTyping = null
33
+ $(event.target).closest('form').submit()
34
+ false
35
+
36
+ $('body').on "change", "._submit-on-change", (event) ->
37
+ $(event.target).closest('form').submit()
38
+ false
39
+
40
+ $('body').on "change", "._edit-item", (event) ->
41
+ cb = $(event.target)
42
+ if cb.is(":checked")
43
+ cb.attr("name", "add_item")
44
+ else
45
+ cb.attr("name", "drop_item")
46
+
47
+ $(event.target).closest('form').submit()
48
+ false
49
+
50
+
51
+
@@ -0,0 +1,100 @@
1
+ $.extend decko,
2
+ # returns absolute path (starting with a slash)
3
+ # if rawPath is complete url, this returns the complete url
4
+ # if rawPath is relative (no slash), this adds relative root
5
+ path: (rawPath) ->
6
+ if rawPath.match /^\/|:\/\//
7
+ rawPath
8
+ else
9
+ decko.rootUrl + rawPath
10
+
11
+ pingName: (name, success)->
12
+ $.getJSON decko.path(''), format: 'json', view: 'status', 'card[name]': name, success
13
+
14
+ jQuery.fn.extend {
15
+ notify: (message, status) ->
16
+ slot = @slot(status)
17
+ notice = slot.find '.card-notice'
18
+ unless notice[0]
19
+ notice = $('<div class="card-notice"></div>')
20
+ form = slot.find('.card-form')
21
+ if form[0]
22
+ $(form[0]).append notice
23
+ else
24
+ slot.append notice
25
+ notice.html message
26
+ notice.show 'blind'
27
+
28
+ report: (message) ->
29
+ report = @slot().find '.card-report'
30
+ return false unless report[0]
31
+ report.hide()
32
+ report.html message
33
+ report.show 'drop', 750
34
+ setTimeout (->report.hide 'drop', 750), 3000
35
+ }
36
+
37
+ #~~~~~ ( EVENTS )
38
+
39
+ $(window).ready ->
40
+ $.ajaxSetup cache: false
41
+
42
+ $('body').on 'click', '.submitter', ->
43
+ $(this).closest('form').submit()
44
+
45
+ $('body').on 'click', 'button.redirecter', ->
46
+ window.location = $(this).attr('href')
47
+
48
+ $('body').on "change", '.live-type-field', ->
49
+ $this = $(this)
50
+
51
+ setSlotMode($this)
52
+ $this.data 'params', $(this).closest('form').serialize()
53
+ $this.data 'url', $(this).attr 'href'
54
+
55
+ $('body').on 'change', '.edit-type-field', ->
56
+ $(this).closest('form').submit()
57
+
58
+ $('body').on 'mouseenter', '[hover_content]', ->
59
+ $(this).attr 'hover_restore', $(this).html()
60
+ $(this).html $(this).attr( 'hover_content' )
61
+ $('body').on 'mouseleave', '[hover_content]', ->
62
+ $(this).html $(this).attr( 'hover_restore' )
63
+
64
+ $('body').on 'click', '.render-error-link', (event) ->
65
+ msg = $(this).closest('.render-error').find '.render-error-message'
66
+ msg.show()
67
+ # msg.dialog()
68
+ event.preventDefault()
69
+
70
+ decko.slotReady (slot) ->
71
+ slot.find('card-view-placeholder').each ->
72
+ $place = $(this)
73
+ return if $place.data("loading")
74
+
75
+ $place.data "loading", true
76
+ $.get $place.data("url"), (data, _status) ->
77
+ $place.replaceWith data
78
+
79
+ # important: this prevents jquery-mobile from taking over everything
80
+ # $( document ).on "mobileinit", ->
81
+ # $.extend $.mobile , {
82
+ # #autoInitializePage: false
83
+ # #ajaxEnabled: false
84
+ # }
85
+
86
+ setSlotMode = ($el, mode=null) ->
87
+ $slotter = $el.closest(".slotter")
88
+ if $slotter.length && $slotter.attr('data-slotter-mode')
89
+ $slotter.attr 'data-original-slotter-mode', $slotter.attr('slotter-mode')
90
+ $slotter.attr 'data-slotter-mode', mode
91
+
92
+ snakeCase = (str)->
93
+ str.replace /([a-z])([A-Z])/g, (match) -> match[0] + '_' +
94
+ match[1].toLowerCase()
95
+
96
+ warn = (stuff) -> console.log stuff if console?
97
+
98
+
99
+
100
+
@@ -0,0 +1,30 @@
1
+ doubleClickActiveMap = { off: false, on: true, signed_in: decko.currentUserId }
2
+
3
+ doubleClickActive = () ->
4
+ doubleClickActiveMap[decko.doubleClick]
5
+ # else alert "illegal configuration: " + decko.doubleClick
6
+
7
+ doubleClickApplies = (el) ->
8
+ return false if ['.nodblclick', '.d0-card-header', '.card-editor'].some (klass) ->
9
+ el.closest(klass)[0]
10
+ # double click inactive inside header, editor, or tag with "nodblclick" class
11
+ !el.slot().find('.card-editor')[0]?
12
+
13
+
14
+ triggerDoubleClickEditingOn = (el)->
15
+ slot = el.slot()
16
+ edit_link = decko.slotEditLink(slot)
17
+
18
+ if edit_link
19
+ edit_link.click()
20
+ else
21
+ edit_view = decko.slotEditView(slot)
22
+ url = decko.path("~#{slot.data('cardId')}?view=#{edit_view}")
23
+ slot.reloadSlot url
24
+
25
+ $(window).ready ->
26
+ if doubleClickActive()
27
+ $('body').on 'dblclick', 'div', (_event) ->
28
+ if doubleClickApplies $(this)
29
+ triggerDoubleClickEditingOn $(this)
30
+ false # don't propagate up to next slot
@@ -0,0 +1,55 @@
1
+ $.extend decko,
2
+ initializeEditors: (range, map) ->
3
+ map = decko.editorInitFunctionMap unless map?
4
+ $.each map, (selector, fn) ->
5
+ $.each range.find(selector), ->
6
+ fn.call $(this)
7
+
8
+ editorContentFunctionMap: {}
9
+
10
+ editorInitFunctionMap:
11
+ 'textarea': -> $(this).autosize()
12
+ '.file-upload': -> decko.upload_file(this)
13
+ '.etherpad-textarea': ->
14
+ $(this).closest('form')
15
+ .find('.edit-submit-button')
16
+ .attr('class', 'etherpad-submit-button')
17
+
18
+ addEditor: (selector, init, get_content) ->
19
+ decko.editorContentFunctionMap[selector] = get_content
20
+ decko.editorInitFunctionMap[selector] = init
21
+
22
+ jQuery.fn.extend
23
+ setContentFieldsFromMap: (map) ->
24
+ map = decko.editorContentFunctionMap unless map?
25
+ this_form = $(this)
26
+ $.each map, (selector, fn) ->
27
+ this_form.setContentFields(selector, fn)
28
+ setContentFields: (selector, fn) ->
29
+ $.each @find(selector), ->
30
+ $(this).setContentField(fn)
31
+ setContentField: (fn) ->
32
+ field = @closest('.card-editor').find('.d0-card-content')
33
+ init_val = field.val() # tinymce-jquery overrides val();
34
+ # that's why we're not using it.
35
+ new_val = fn.call this
36
+ field.val new_val
37
+ field.change() if init_val != new_val
38
+
39
+ $(window).ready ->
40
+ # decko.initializeEditors $('body > :not(.modal)')
41
+ setTimeout (-> decko.initializeEditors $('body > :not(.modal)')), 10
42
+ # dislike the timeout, but without this forms with multiple TinyMCE editors
43
+ # were failing to load properly
44
+ # I couldn't reproduce that problem described above -pk
45
+
46
+ $('body').on 'submit', '.card-form', ->
47
+ $(this).setContentFieldsFromMap()
48
+ $(this).find('.d0-card-content').attr('no-autosave','true')
49
+ true
50
+
51
+ setInterval (-> $('.card-form').setContentFieldsFromMap()), 20000
52
+
53
+
54
+
55
+
@@ -0,0 +1,176 @@
1
+ # filter object that manages dynamic sorting and filtering
2
+
3
+ # el can be any element inside widget
4
+ decko.filter = (el) ->
5
+ closest_widget = $(el).closest "._filter-widget"
6
+ @widget =
7
+ if closest_widget.length
8
+ closest_widget
9
+ else
10
+ $(el).closest("._filtered-content").find "._filter-widget"
11
+
12
+ @activeContainer = @widget.find "._filter-container"
13
+ @dropdown = @widget.find "._add-filter-dropdown"
14
+ @dropdownItems = @widget.find "._filter-category-select"
15
+ @form = @widget.find "._filter-form"
16
+ @quickFilter = @widget.find "._quick-filter"
17
+
18
+ @showWithStatus = (status) ->
19
+ f = this
20
+ $.each (@dropdownItems), ->
21
+ item = $(this)
22
+ if item.data status
23
+ f.activate item.data("category")
24
+
25
+ @reset = () ->
26
+ # @clear()
27
+ @dropdownItems.show()
28
+ @restrict @form.find("._reset-filter").data("reset")
29
+
30
+ @clear = () ->
31
+ @activeContainer.find(".input-group").remove()
32
+
33
+ @activate = (category, value) ->
34
+ @activateField category, value
35
+ @hideOption category
36
+
37
+ @showOption = (category) ->
38
+ @dropdown.show()
39
+ @option(category).show()
40
+
41
+ @hideOption = (category) ->
42
+ @option(category).hide()
43
+ @dropdown.hide() if @dropdownItems.length <= @activeFields().length
44
+
45
+ @activeFields = () ->
46
+ @activeContainer.find "._filter-input"
47
+
48
+ @option = (category) ->
49
+ @dropdownItems.filter("[data-category='#{category}']")
50
+
51
+ @findPrototype = (category) ->
52
+ @widget.find "._filter-input-field-prototypes ._filter-input-#{category}"
53
+
54
+ @activateField = (category, value) ->
55
+ field = @findPrototype(category).clone()
56
+ @fieldValue field, value
57
+ @dropdown.before field
58
+ @initField field
59
+ field.find("input, select").first().focus()
60
+
61
+ @fieldValue = (field, value) ->
62
+ if typeof(value) == "object"
63
+ @compoundFieldValue field, value
64
+ else
65
+ @simpleFieldValue field, value
66
+
67
+ @simpleFieldValue = (field, value) ->
68
+ input = field.find("input, select")
69
+ input.val value if (typeof value != 'undefined')
70
+
71
+ @compoundFieldValue = (field, vals) ->
72
+ for key of vals
73
+ input = field.find "#filter_value_" + key
74
+ input.val vals[key]
75
+
76
+ @removeField = (category)->
77
+ @activeField(category).remove()
78
+ @showOption category
79
+
80
+ @initField = (field) ->
81
+ @initSelectField field
82
+ decko.initAutoCardPlete field.find("input")
83
+ # only has effect if there is a data-options-card value
84
+
85
+ @initSelectField = (field) ->
86
+ field.find("select").select2(
87
+ containerCssClass: ":all:"
88
+ width: "auto"
89
+ dropdownAutoWidth: "true"
90
+ )
91
+
92
+ @activeField = (category) ->
93
+ @activeContainer.find("._filter-input-#{category}")
94
+
95
+ @isActive = (category) ->
96
+ @activeField(category).length
97
+
98
+ @restrict = (data) ->
99
+ @clear()
100
+ for key of data
101
+ @activateField key, data[key]
102
+ @update()
103
+
104
+ @addRestrictions = (hash) ->
105
+ for category of hash
106
+ @removeField category
107
+ @activate category, hash[category]
108
+ @update()
109
+
110
+ @removeRestrictions = (hash) ->
111
+ for category of hash
112
+ @removeField category
113
+ @update()
114
+
115
+ # triggers update
116
+ @setInputVal = (field, value) ->
117
+ select = field.find "select"
118
+ if select.length
119
+ @setSelect2Val select, value
120
+ else
121
+ @setTextInputVal field.find("input"), value
122
+
123
+ # this triggers change, which updates form
124
+ # if we just use simple "val", the display doesn't update correctly
125
+ @setSelect2Val = (select, value) ->
126
+ value = [value] if select.attr("multiple") && !Array.isArray(value)
127
+ select.select2 "val", value
128
+
129
+ @setTextInputVal = (input, value) ->
130
+ input.val value
131
+ @update()
132
+
133
+ @updateLastVals = ()->
134
+ @activeFields().find("input, select").each ()->
135
+ $(this).data "lastVal", $(this).val()
136
+
137
+ @updateUrlBar = () ->
138
+ return if @widget.closest('._noFilterUrlUpdates')[0]
139
+ window.history.pushState "filter", "filter", '?' + @form.serialize()
140
+
141
+ @update = ()->
142
+ @updateLastVals()
143
+ @updateQuickLinks()
144
+ @form.submit()
145
+ @updateUrlBar()
146
+
147
+ @updateQuickLinks = ()->
148
+ widget = this
149
+ links = @quickFilter.find "._filter-link"
150
+ links.addClass "active"
151
+ links.each ->
152
+ link = $(this)
153
+ opts = link.data "filter"
154
+ for key of opts
155
+ widget.deactivateQuickLink link, key, opts[key]
156
+
157
+ @deactivateQuickLink = (link, key, value) ->
158
+ sel = "._filter-input-#{key}"
159
+ $.map [@form.find("#{sel} input, #{sel} select").val()], (arr) ->
160
+ arr = [arr].flat()
161
+ link.removeClass "active" if $.inArray(value, arr) > -1
162
+
163
+ @updateIfChanged = ()->
164
+ @update() if @changedSinceLastVal()
165
+
166
+ @updateIfPresent = (category)->
167
+ val = @activeField(category).find("input, select").val()
168
+ @update() if val && val.length > 0
169
+
170
+ @changedSinceLastVal = () ->
171
+ changed = false
172
+ @activeFields().find("input, select").each ()->
173
+ changed = true if $(this).val() != $(this).data("lastVal")
174
+ changed
175
+
176
+ this