cowtech-js-rails 1.0.0.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.
- data/README +6 -0
- data/lib/cowtech_js.rb +14 -0
- data/lib/cowtech_js/version.rb +20 -0
- data/vendor/assets/javascripts/cowtech/accesskeys.coffee +92 -0
- data/vendor/assets/javascripts/cowtech/autocomplete.coffee +49 -0
- data/vendor/assets/javascripts/cowtech/bulk.coffee +71 -0
- data/vendor/assets/javascripts/cowtech/calculator.coffee +110 -0
- data/vendor/assets/javascripts/cowtech/clipboard.coffee +46 -0
- data/vendor/assets/javascripts/cowtech/combobox.coffee +101 -0
- data/vendor/assets/javascripts/cowtech/document.coffee +252 -0
- data/vendor/assets/javascripts/cowtech/dynamic-table.coffee +184 -0
- data/vendor/assets/javascripts/cowtech/form.coffee +383 -0
- data/vendor/assets/javascripts/cowtech/google-analytics.coffee +22 -0
- data/vendor/assets/javascripts/cowtech/keepalive.coffee +57 -0
- data/vendor/assets/javascripts/cowtech/messages.coffee +258 -0
- data/vendor/assets/javascripts/cowtech/modal.coffee +175 -0
- data/vendor/assets/javascripts/cowtech/numeric.coffee +77 -0
- data/vendor/assets/javascripts/cowtech/scroll.coffee +34 -0
- data/vendor/assets/javascripts/cowtech/search.coffee +43 -0
- data/vendor/assets/javascripts/cowtech/share.coffee +59 -0
- data/vendor/assets/javascripts/cowtech/utils.coffee +110 -0
- data/vendor/assets/javascripts/cowtech/wysiwyg.coffee +155 -0
- metadata +101 -0
data/README
ADDED
data/lib/cowtech_js.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the cowtech-js-rails gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Cowtech
|
8
|
+
module Rails
|
9
|
+
module JS
|
10
|
+
class Engine < Rails::Engine
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
# This file is part of the cowtech-js-rails gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
|
7
|
+
module Cowtech
|
8
|
+
module Rails
|
9
|
+
module JS
|
10
|
+
module Version
|
11
|
+
MAJOR = 1
|
12
|
+
MINOR = 0
|
13
|
+
PATCH = 0
|
14
|
+
BUILD = 0
|
15
|
+
|
16
|
+
STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
###
|
2
|
+
#
|
3
|
+
# This file is part of the cowtech-js-rails gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
###
|
7
|
+
|
8
|
+
(($) ->
|
9
|
+
$.cowtech = $.cowtech || {}
|
10
|
+
$.cowtech.accesskeys =
|
11
|
+
registered: null
|
12
|
+
mod: (if navigator.appVersion.indexOf("Mac") != -1 then "⌃⌥" else "Alt + ")
|
13
|
+
|
14
|
+
add: (key, description, trigger) ->
|
15
|
+
$.cowtech.accesskeys.registered = {} if !$.cowtech.accesskeys.registered?
|
16
|
+
$.cowtech.accesskeys.registered[key.toUpperCase()] = description
|
17
|
+
$("<a href=\"#\" accesskey=\"#{key}\"></a>").appendTo($("body")).on "click", (ev) ->
|
18
|
+
$(":focus").trigger("blur").trigger("change")
|
19
|
+
trigger($(this), ev)
|
20
|
+
false
|
21
|
+
|
22
|
+
add_trigger: (element, key, description, the_event, no_label) ->
|
23
|
+
return if $(element).size() == 0
|
24
|
+
if no_label == true
|
25
|
+
el = $(element)
|
26
|
+
|
27
|
+
if el.size() > 0
|
28
|
+
lel = el
|
29
|
+
lel = lel.find("span.label") if lel.find("span.label").size() > 0
|
30
|
+
label = (if lel.is("input") || lel.is("submit") then lel.val() else lel.html())
|
31
|
+
regex = $.ui.autocomplete.escapeRegex(" (#{$.cowtech.accesskeys.mod}@)").replace("@", "[A-Za-z0-9]+")
|
32
|
+
label = label.replace(new RegExp(regex), "")
|
33
|
+
label += " (#{$.cowtech.accesskeys.mod + key.toUpperCase()})"
|
34
|
+
(if lel.is("input") || lel.is("submit") then lel.val(label) else lel.html(label))
|
35
|
+
|
36
|
+
$.cowtech.accesskeys.add(key, description, (sender, ev) ->
|
37
|
+
selector = sender.data("accesskeys-element")
|
38
|
+
action_event = sender.data("accesskeys-event")
|
39
|
+
el = $(selector)
|
40
|
+
|
41
|
+
if $.cowtech.utils.is_blank(action_event)
|
42
|
+
el.click()
|
43
|
+
else
|
44
|
+
el.trigger(action_event)
|
45
|
+
).data(
|
46
|
+
"accesskeys-element": element
|
47
|
+
"accesskeys-event": the_event || ""
|
48
|
+
)
|
49
|
+
|
50
|
+
autoload: ->
|
51
|
+
if $("body").is(":not(.embedded)")
|
52
|
+
setTimeout((->
|
53
|
+
if $.cowtech.accesskeys.registered?
|
54
|
+
summary = $("[data-accesskeys-role=summary]")
|
55
|
+
$.each($.cowtech.accesskeys.registered, (key, desc) ->
|
56
|
+
$("<tr><td>" + $.cowtech.accesskeys.mod + key + "</td><td>" + desc + "</td></tr>").appendTo(summary)
|
57
|
+
)
|
58
|
+
|
59
|
+
$.cowtech.modal.setup($("[data-accesskeys-role=\"help\"]"),
|
60
|
+
autoScale: true
|
61
|
+
autoDimensions: true
|
62
|
+
iframe: false
|
63
|
+
html: $("[data-accesskeys-role=\"template\"]").html()
|
64
|
+
width: 800
|
65
|
+
height: 800
|
66
|
+
)
|
67
|
+
), 10)
|
68
|
+
|
69
|
+
link = $("<a data-accesskeys-role=\"help\" href=\"#\"></a>").appendTo($("[data-accesskeys-role=placeholder]"))
|
70
|
+
$("<span class=\"c-icon accesskeys\"></span><span class=\"c-icon-label\">Scorciatoie da tastiera (#{$.cowtech.accesskeys.mod}H)</span>").appendTo(link)
|
71
|
+
|
72
|
+
$.cowtech.accesskeys.add_trigger(link, "h", "Visualizza questo aiuto")
|
73
|
+
$.cowtech.accesskeys.add_trigger("[data-ui-role=add]", "a", "Aggiungi", null, true)
|
74
|
+
|
75
|
+
if $("[data-ui-role=save]").size() > 0
|
76
|
+
$.cowtech.accesskeys.add("s", "Salva modifiche", ->
|
77
|
+
submit = $("[data-ui-role=save]")
|
78
|
+
form = submit.closest("form")
|
79
|
+
if form.is(".to-validate") && !form.data("validator").checkValidity()
|
80
|
+
return
|
81
|
+
else
|
82
|
+
submit.click()
|
83
|
+
)
|
84
|
+
|
85
|
+
$("[data-ui-role=save]").each(->
|
86
|
+
$(this).val $(this).val() + " (" + $.cowtech.accesskeys.mod + "S)"
|
87
|
+
)
|
88
|
+
|
89
|
+
$.cowtech.accesskeys.add_trigger("[data-search-role=search]", "c", "Cerca", null, true)
|
90
|
+
$.cowtech.accesskeys.add_trigger("[data-search-role=clear]", "v", "Visualizza tutti", null, true)
|
91
|
+
$.cowtech.accesskeys.add_trigger("#select-action-button", "x", "Esegui azione sulle righe selezionate", null, true)
|
92
|
+
)(jQuery)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
###
|
2
|
+
#
|
3
|
+
# This file is part of the cowtech-js-rails gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
###
|
7
|
+
|
8
|
+
(($) ->
|
9
|
+
$.cowtech = $.cowtech ||{}
|
10
|
+
|
11
|
+
$.cowtech.autocomplete =
|
12
|
+
sources: {}
|
13
|
+
|
14
|
+
autoload: (->
|
15
|
+
$("[type=\"autocomplete\"]").each(->
|
16
|
+
input = $(this)
|
17
|
+
id = input.attr("id")
|
18
|
+
|
19
|
+
$.cowtech.autocomplete.sources[id] = input.attr("data-autocomplete-source") if !input.attr("data-autocomplete-source")?
|
20
|
+
|
21
|
+
wrapper = $("<div></div>").attr("style", "display: inline-block; position: relative").attr("data-autocomplete-role", "wrapper")
|
22
|
+
input.wrap(wrapper)
|
23
|
+
|
24
|
+
input.autocomplete(
|
25
|
+
minLength: 1
|
26
|
+
source: ((request, response) ->
|
27
|
+
regex = "#{(if input.attr("data-autocomplete-match-beginning") == "true" then "^(" else "(")}#{$.ui.autocomplete.escapeRegex(request.term)})"
|
28
|
+
matcher = new RegExp(regex, "i")
|
29
|
+
|
30
|
+
response($.map($.cowtech.autocomplete.sources[id], (text) ->
|
31
|
+
if text && (!request.term || matcher.test(text))
|
32
|
+
{
|
33
|
+
label: text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(#{$.ui.autocomplete.escapeRegex(request.term)})(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>")
|
34
|
+
value: text
|
35
|
+
}
|
36
|
+
else
|
37
|
+
null
|
38
|
+
))
|
39
|
+
)
|
40
|
+
open: (->
|
41
|
+
$("ul.ui-autocomplete.ui-menu").css(s)
|
42
|
+
)
|
43
|
+
)
|
44
|
+
input.data("autocomplete")._renderItem = ((ul, item) ->
|
45
|
+
$("<li></li>").data("item.autocomplete", item).append("<a>" + item.label + "</a>").appendTo(ul)
|
46
|
+
)
|
47
|
+
)
|
48
|
+
)
|
49
|
+
)(jQuery)
|
@@ -0,0 +1,71 @@
|
|
1
|
+
###
|
2
|
+
#
|
3
|
+
# This file is part of the cowtech-js-rails gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
###
|
7
|
+
|
8
|
+
(($) ->
|
9
|
+
$.cowtech = $.cowtech || {}
|
10
|
+
$.cowtech.bulk =
|
11
|
+
action: null
|
12
|
+
button: null
|
13
|
+
label: null
|
14
|
+
|
15
|
+
update: ->
|
16
|
+
count = $("[data-bulk-role=single]:checked").size()
|
17
|
+
if $.cowtech.bulk.label
|
18
|
+
text = $.cowtech.bulk.label.text().replace(/(\(\d+\))?:$/, "").trim()
|
19
|
+
if count > 0
|
20
|
+
text += " <b>(#{count})</b>:"
|
21
|
+
else
|
22
|
+
text += ":"
|
23
|
+
$.cowtech.bulk.label.html(text)
|
24
|
+
|
25
|
+
if count > 0
|
26
|
+
$.cowtech.bulk.button.show()
|
27
|
+
else
|
28
|
+
$.cowtech.bulk.button.hide()
|
29
|
+
|
30
|
+
autoload: ->
|
31
|
+
$.cowtech.bulk.action = $("[data-bulk-role=action]")
|
32
|
+
$.cowtech.bulk.label = $.cowtech.bulk.action.prev("label")
|
33
|
+
$.cowtech.bulk.button = $("[data-bulk-role=execute]")
|
34
|
+
$("[data-bulk-role=all]").on("change", ->
|
35
|
+
if $(this).is(":checked")
|
36
|
+
$(this).closest("table").find("[data-bulk-role=single]").attr("checked", "checked")
|
37
|
+
else
|
38
|
+
$(this).closest("table").find("[data-bulk-role=single]").removeAttr("checked")
|
39
|
+
$.cowtech.bulk.update()
|
40
|
+
)
|
41
|
+
|
42
|
+
$("[data-bulk-role=single]").on("change", ->
|
43
|
+
$.cowtech.bulk.update()
|
44
|
+
false
|
45
|
+
)
|
46
|
+
|
47
|
+
$.cowtech.bulk.action.on("change", ->
|
48
|
+
$("[date-bulk-role=date]").css "display", (if $(this).val() == "change-" then "inline" else "none")
|
49
|
+
false
|
50
|
+
).change()
|
51
|
+
|
52
|
+
$.cowtech.bulk.button.on("click", (ev) ->
|
53
|
+
action = $.cowtech.bulk.action.val()
|
54
|
+
|
55
|
+
if !$.cowtech.utils.is_blank(action)
|
56
|
+
ids = []
|
57
|
+
$("[data-bulk-role=single]:checked").each ->
|
58
|
+
ids.push $(this).attr("id").replace("select-", "")
|
59
|
+
|
60
|
+
if ids.length > 0
|
61
|
+
action += "#{$("select#change-year-field").val()}-#{$("select#change-month-field").val()}" if action == "change-"
|
62
|
+
uri = $.param(
|
63
|
+
bulk_action: action
|
64
|
+
ids: ids.join(",")
|
65
|
+
)
|
66
|
+
location.href = "#{$.cowtech.data.params.bulk_url}?#{uri}"
|
67
|
+
false
|
68
|
+
)
|
69
|
+
|
70
|
+
$.cowtech.bulk.update()
|
71
|
+
)(jQuery)
|
@@ -0,0 +1,110 @@
|
|
1
|
+
###
|
2
|
+
#
|
3
|
+
# This file is part of the cowtech-js-rails gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
###
|
7
|
+
|
8
|
+
(($) ->
|
9
|
+
$.cowtech = $.cowtech || {}
|
10
|
+
|
11
|
+
$.cowtech.calculator =
|
12
|
+
root: null
|
13
|
+
field: null
|
14
|
+
last: null
|
15
|
+
result: null
|
16
|
+
copy: null
|
17
|
+
redo: null
|
18
|
+
|
19
|
+
autoload: ->
|
20
|
+
if $("body").is(":not(.embedded)")
|
21
|
+
link = $("<a data-calculator-role=\"help\" href=\"#\"></a>").appendTo($("[data-calculator-role=placeholder]"))
|
22
|
+
$("<span class=\"c-icon calcolatrice\"></span><span class=\"c-icon-label\">Calcolatrice (#{$.cowtech.accesskeys.mod}Q)</span>").appendTo(link)
|
23
|
+
|
24
|
+
$.cowtech.modal.callbacks.completed.push( ->
|
25
|
+
$.cowtech.calculator.setup()
|
26
|
+
)
|
27
|
+
|
28
|
+
$.cowtech.modal.setup(link, {
|
29
|
+
autoScale: true
|
30
|
+
autoDimensions: true
|
31
|
+
content: $("[data-calculator-role=template]").html()
|
32
|
+
iframe: false
|
33
|
+
width: 700
|
34
|
+
height: 200
|
35
|
+
scrolling: false
|
36
|
+
})
|
37
|
+
|
38
|
+
$.cowtech.accesskeys.add_trigger("#calculator-opener", "q", "Apri la calcolatrice", null, true)
|
39
|
+
|
40
|
+
string_to_expr: (num) ->
|
41
|
+
num.trim().replace(/,/g, ".").replace(/\s+/g, "")
|
42
|
+
|
43
|
+
format_history: (num) ->
|
44
|
+
num.replace(/\./g, ",").replace(/(\+|\*|-|\/)/g, " $1 ")
|
45
|
+
|
46
|
+
compute: ->
|
47
|
+
input = $.cowtech.calculator.string_to_expr($.cowtech.calculator.field.val())
|
48
|
+
|
49
|
+
$.cowtech.calculator.field.val("").removeClass("unset error success")
|
50
|
+
$.cowtech.calculator.last.removeClass("unset error success")
|
51
|
+
$.cowtech.calculator.result.removeClass("unset error success")
|
52
|
+
|
53
|
+
if !$.cowtech.utils.is_blank(input)
|
54
|
+
$.cowtech.calculator.last.val($.cowtech.calculator.format_history(input))
|
55
|
+
result = null
|
56
|
+
|
57
|
+
if /^([0-9\+\-\*\/\%\^\(\).]+)$/.test(input)
|
58
|
+
internal_result = 0.0
|
59
|
+
|
60
|
+
try
|
61
|
+
eval("internal_result = 0.0 + (" + input + ")")
|
62
|
+
result = internal_result if $.cowtech.utils.is_of_type(internal_result, "number")
|
63
|
+
catch e
|
64
|
+
result = null
|
65
|
+
|
66
|
+
if !result?
|
67
|
+
$.cowtech.calculator.last.addClass("error")
|
68
|
+
$.cowtech.calculator.result.addClass("error").val("Calcolo non valido")
|
69
|
+
else
|
70
|
+
$.cowtech.calculator.result.addClass("success").val(result)
|
71
|
+
else
|
72
|
+
$.cowtech.calculator.last.val("Nessun calcolo effettuato")
|
73
|
+
$.cowtech.calculator.result.val("Nessun calcolo effettuato")
|
74
|
+
|
75
|
+
redo: ->
|
76
|
+
$.cowtech.calculator.field.val($.cowtech.calculator.last.val()) if !$.cowtech.calculator.last.is(".unset")
|
77
|
+
$.cowtech.calculator.field.focus()
|
78
|
+
|
79
|
+
setup: ->
|
80
|
+
$.cowtech.calculator.root = $.cowtech.modal.root.find("[data-calculator-role=root]")
|
81
|
+
return if $.cowtech.calculator.root.size() == 0
|
82
|
+
|
83
|
+
$.cowtech.calculator.field = $.cowtech.calculator.root.find("[data-calculator-role=expression]")
|
84
|
+
$.cowtech.calculator.last = $.cowtech.calculator.root.find("[data-calculator-role=last]")
|
85
|
+
$.cowtech.calculator.result = $.cowtech.calculator.root.find("[data-calculator-role=result]")
|
86
|
+
$.cowtech.calculator.copy = $.cowtech.calculator.root.find("[data-calculator-role=copy]")
|
87
|
+
$.cowtech.calculator.repeat = $.cowtech.calculator.root.find("[data-calculator-role=repeat]")
|
88
|
+
|
89
|
+
$.cowtech.calculator.field.on("change", (ev) ->
|
90
|
+
ev.preventDefault()
|
91
|
+
$.cowtech.calculator.compute()
|
92
|
+
).on("keypress", (ev) ->
|
93
|
+
if ev.keyCode == 13
|
94
|
+
ev.preventDefault()
|
95
|
+
$.cowtech.calculator.compute()
|
96
|
+
)
|
97
|
+
|
98
|
+
$.cowtech.calculator.repeat.on("click", (ev) ->
|
99
|
+
$.cowtech.calculator.redo()
|
100
|
+
false
|
101
|
+
)
|
102
|
+
|
103
|
+
$.cowtech.clipboard.setup($.cowtech.calculator.copy,
|
104
|
+
set_text: (client) ->
|
105
|
+
text = (if $.cowtech.calculator.result.is(".success") then $.cowtech.calculator.result.val() else " ")
|
106
|
+
client.setText(text)
|
107
|
+
copied: (client, text) ->
|
108
|
+
$.cowtech.messages.alert("success", "Risultato copiato negli appunti.") if !$.cowtech.utils.is_blank(text)
|
109
|
+
)
|
110
|
+
)(jQuery)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
###
|
2
|
+
#
|
3
|
+
# This file is part of the cowtech-js-rails gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
###
|
7
|
+
|
8
|
+
(($) ->
|
9
|
+
$.cowtech = $.cowtech || {}
|
10
|
+
$.cowtech.clipboard =
|
11
|
+
swf: "",
|
12
|
+
|
13
|
+
setup: ((el, options) ->
|
14
|
+
return if el.size() == 0
|
15
|
+
|
16
|
+
clipboard = new ZeroClipboard.Client()
|
17
|
+
text = el.attr("data-clipboard-data")
|
18
|
+
msg = el.attr("data-clipboard-msg")
|
19
|
+
options = $.cowtech.utils.initialize(options, {})
|
20
|
+
|
21
|
+
text = el.attr("href") if $.cowtech.utils.is_null(text)
|
22
|
+
msg = "Testo copiato negli appunti." if $.cowtech.utils.is_null(msg)
|
23
|
+
|
24
|
+
copier = clipboard.getHTML(el.outerWidth(), el.outerHeight())
|
25
|
+
el.after(copier)
|
26
|
+
el.parent().attr("data-clipboard-role", "wrapper")
|
27
|
+
|
28
|
+
if !$.cowtech.utils.is_null(options.set_text)
|
29
|
+
clipboard.addEventListener("onMouseDown", options.set_text)
|
30
|
+
else
|
31
|
+
clipboard.setText(text)
|
32
|
+
|
33
|
+
clipboard.glue(el.get(0))
|
34
|
+
|
35
|
+
clipboard.addEventListener("onComplete", (if !$.cowtech.utils.is_null(options.copied) then options.copied else ((client, text) ->
|
36
|
+
$.cowtech.messages.alert("success", msg)
|
37
|
+
)))
|
38
|
+
)
|
39
|
+
|
40
|
+
autoload: (->
|
41
|
+
ZeroClipboard.setMoviePath($.cowtech.clipboard.swf)
|
42
|
+
$("[data-clipboard=true]").each(->
|
43
|
+
$.cowtech.clipboard.setup($(this))
|
44
|
+
)
|
45
|
+
)
|
46
|
+
)(jQuery)
|
@@ -0,0 +1,101 @@
|
|
1
|
+
###
|
2
|
+
#
|
3
|
+
# This file is part of the cowtech-js-rails gem. Copyright (C) 2012 and above Shogun <shogun_panda@me.com>.
|
4
|
+
# Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
|
5
|
+
#
|
6
|
+
###
|
7
|
+
|
8
|
+
(($) ->
|
9
|
+
$.widget("ui.combobox", {
|
10
|
+
_create: ->
|
11
|
+
self = this
|
12
|
+
select = @element.hide()
|
13
|
+
selected = select.children(":selected")
|
14
|
+
value = (if selected.val() then selected.text() else "")
|
15
|
+
|
16
|
+
# Modification #1: Wrap in a div
|
17
|
+
wrapper = $("<div class=\"input-append ui-combo\"></div>").attr("style", "display: inline-block; position: relative").attr("data-combobox-role", "wrapper")
|
18
|
+
select.wrap(wrapper)
|
19
|
+
|
20
|
+
input = $("<input/>").insertAfter(select).val(value).autocomplete(
|
21
|
+
delay: 0
|
22
|
+
minLength: 0
|
23
|
+
source: ((request, response) ->
|
24
|
+
regex = "#{if select.attr("data-combobox-match-beginning" == "true") then "^(" else "("}#{$.ui.autocomplete.escapeRegex(request.term)})"
|
25
|
+
matcher = new RegExp(regex, "i")
|
26
|
+
|
27
|
+
response select.children("option").map(->
|
28
|
+
text = $(this).text()
|
29
|
+
if @value && (!request.term || matcher.test(text))
|
30
|
+
{
|
31
|
+
label: text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(#{$.ui.autocomplete.escapeRegex(request.term)})(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>")
|
32
|
+
value: text
|
33
|
+
option: this
|
34
|
+
}
|
35
|
+
)
|
36
|
+
)
|
37
|
+
open: (-> # Modification #2: Positioning fix and style fix
|
38
|
+
ul = $("ul.ui-autocomplete.ui-menu")
|
39
|
+
ul.css(
|
40
|
+
marginTop: "3px"
|
41
|
+
width: "#{input.closest("div.ui-combo").width() - 2}px"
|
42
|
+
zIndex: ""
|
43
|
+
)
|
44
|
+
)
|
45
|
+
select: ((event, ui) ->
|
46
|
+
ui.item.option.selected = true
|
47
|
+
self._trigger("selected", event, {
|
48
|
+
item: ui.item.option
|
49
|
+
})
|
50
|
+
)
|
51
|
+
change: ((event, ui) ->
|
52
|
+
if !ui.item
|
53
|
+
matcher = new RegExp("^#{$.ui.autocomplete.escapeRegex($(this).val())}$", "i")
|
54
|
+
valid = false
|
55
|
+
|
56
|
+
select.children("option").each(->
|
57
|
+
if @value.match(matcher)
|
58
|
+
@selected = valid = true
|
59
|
+
false
|
60
|
+
)
|
61
|
+
|
62
|
+
if !valid
|
63
|
+
$(this).val("")
|
64
|
+
select.val("")
|
65
|
+
return false
|
66
|
+
)
|
67
|
+
).addClass("ui-widget ui-widget-content ui-corner-left ui-combo")
|
68
|
+
|
69
|
+
# Modification #3: Copy original classes
|
70
|
+
input.addClass(select.attr("class"))
|
71
|
+
|
72
|
+
# Modification #4: Add validation tip-field
|
73
|
+
input.attr("id", "#{select.attr("id")}_ce")
|
74
|
+
select.attr("data-form-validation-msg-target", "##{input.attr("id")}")
|
75
|
+
|
76
|
+
input.data("autocomplete")._renderItem = ((ul, item) ->
|
77
|
+
$("<li></li>").data("item.autocomplete", item).append("<a>#{item.label}</a>").appendTo(ul)
|
78
|
+
)
|
79
|
+
|
80
|
+
addon = $("<label class=\"add-on\"></label").insertAfter(input)
|
81
|
+
|
82
|
+
$("<button> </button>").attr("tabIndex", -1).attr("title", "Show All Items").appendTo(addon).button(
|
83
|
+
icons:
|
84
|
+
primary: "c-icon c-icon-32 down"
|
85
|
+
text: false
|
86
|
+
).removeClass("ui-corner-all").addClass("ui-corner-right ui-button-icon ui-combo").on("click", ->
|
87
|
+
if input.autocomplete("widget").is(":visible")
|
88
|
+
input.autocomplete("close")
|
89
|
+
else
|
90
|
+
input.autocomplete("search", "")
|
91
|
+
input.focus()
|
92
|
+
false
|
93
|
+
)
|
94
|
+
})
|
95
|
+
|
96
|
+
$.cowtech = $.cowtech || {}
|
97
|
+
$.cowtech.combobox =
|
98
|
+
autoload: (->
|
99
|
+
$("[type=\"combobox\"]").combobox()
|
100
|
+
)
|
101
|
+
)(jQuery)
|