$(document).on 'rails_admin.dom_ready', (e, content) ->
content = if content then content else $('form')
if content.length # don't waste time otherwise
# colorpicker
content.find('[data-color]').each ->
that = this
$(this).ColorPicker
color: $(that).val()
onShow: (el) ->
$(el).fadeIn(500)
false
onHide: (el) ->
$(el).fadeOut(500)
false
onChange: (hsb, hex, rgb) ->
$(that).val(hex)
$(that).css('backgroundColor', '#' + hex)
# datetime picker
$.fn.datetimepicker.defaults.icons =
time: 'fa fa-clock-o'
date: 'fa fa-calendar'
up: 'fa fa-chevron-up'
down: 'fa fa-chevron-down'
previous: 'fa fa-angle-double-left'
next: 'fa fa-angle-double-right'
today: 'fa fa-dot-circle-o'
clear: 'fa fa-trash'
close: 'fa fa-times'
content.find('[data-datetimepicker]').each ->
options = $(this).data('options')
$.extend(options, {locale: RailsAdmin.I18n.locale})
$(this).datetimepicker options
# enumeration
content.find('[data-enumeration]').each ->
if $(this).is('[multiple]')
$(this).filteringMultiselect $(this).data('options')
else
$(this).filteringSelect $(this).data('options')
# fileupload
content.find('[data-fileupload]').each ->
input = this
$(this).on 'click', ".delete input[type='checkbox']", ->
$(input).children('.toggle').toggle('slow')
# fileupload-preview
content.find('[data-fileupload]').change ->
input = this
image_container = $("#" + input.id).parent().children(".preview")
unless image_container.length
image_container = $("#" + input.id).parent().prepend($(' ').addClass('preview').addClass('img-thumbnail')).find('img.preview')
image_container.parent().find('img:not(.preview)').hide()
ext = $("#" + input.id).val().split('.').pop().toLowerCase()
if input.files and input.files[0] and $.inArray(ext, ['gif', 'png', 'jpg', 'jpeg', 'bmp']) != -1
reader = new FileReader()
reader.onload = (e) ->
image_container.attr "src", e.target.result
reader.readAsDataURL input.files[0]
image_container.show()
else
image_container.hide()
# filtering-multiselect
content.find('[data-filteringmultiselect]').each ->
$(this).filteringMultiselect $(this).data('options')
if $(this).parents("#modal").length # hide link if we already are inside a dialog (endless issues on nested dialogs with JS)
$(this).siblings('.btn').remove()
else
$(this).parents('.control-group').first().remoteForm()
# filtering-select
content.find('[data-filteringselect]').each ->
$(this).filteringSelect $(this).data('options')
if $(this).parents("#modal").length # hide link if we already are inside a dialog (endless issues on nested dialogs with JS)
$(this).siblings('.btn').remove()
else
$(this).parents('.control-group').first().remoteForm()
# nested-many
content.find('[data-nestedmany]').each ->
field = $(this).parents('.control-group').first()
nav = field.find('> .controls > .nav')
tab_content = field.find('> .tab-content')
toggler = field.find('> .controls > .btn-group > .toggler')
# add each nested field to a tab-pane and reference it in the nav
tab_content.children('.fields:not(.tab-pane)').addClass('tab-pane').each ->
$(this).attr('id', 'unique-id-' + (new Date().getTime()) + Math.floor(Math.random() * 100000)) # some elements are created on the same ms
nav.append('
' + $(this).children('.object-infos').data('object-label') + ' ')
# only if no tab is set to active
if nav.find("> li.active").length == 0
# init first tab, toggler and tab_content/tabs visibility
nav.find("> li > a[data-toggle='tab']:first").tab('show')
if nav.children().length == 0
nav.hide()
tab_content.hide()
toggler.addClass('disabled').removeClass('active').children('i').addClass('icon-chevron-right')
else
if toggler.hasClass('active')
nav.show()
tab_content.show()
toggler.children('i').addClass('icon-chevron-down')
else
nav.hide()
tab_content.hide()
toggler.children('i').addClass('icon-chevron-right')
# nested-one
content.find('[data-nestedone]').each ->
field = $(this).parents('.control-group').first()
nav = field.find("> .controls > .nav")
tab_content = field.find("> .tab-content")
toggler = field.find('> .controls > .btn-group > .toggler')
tab_content.children(".fields:not(.tab-pane)").addClass('tab-pane active').each ->
# Convert the "add nested field" button to just showing the title of the new model
field.find('> .controls .add_nested_fields').removeClass('add_nested_fields').html($(this).children('.object-infos').data('object-label'))
nav.append('' + $(this).children('.object-infos').data('object-label') + ' ')
first_tab = nav.find("> li > a[data-toggle='tab']:first")
first_tab.tab('show')
field.find("> .controls > [data-target]:first").html(' ' + first_tab.html())
nav.hide()
if nav.children().length == 0
nav.hide()
tab_content.hide()
toggler.addClass('disabled').removeClass('active').children('i').addClass('icon-chevron-right')
else
if toggler.hasClass('active')
toggler.children('i').addClass('icon-chevron-down')
tab_content.show()
else
toggler.children('i').addClass('icon-chevron-right')
tab_content.hide()
# polymorphic-association
content.find('[data-polymorphic]').each ->
type_select = $(this)
field = type_select.parents('.control-group').first()
object_select = field.find('select').last()
urls = type_select.data('urls')
type_select.on 'change', (e) ->
if $(this).val() is ''
object_select.html(' ')
else
$.ajax
url: urls[type_select.val()]
data:
compact: true
all: true
beforeSend: (xhr) ->
xhr.setRequestHeader("Accept", "application/json")
success: (data, status, xhr) ->
html = $(' ')
$(data).each (i, el) ->
option = $(' ')
option.attr('value', el.id)
option.text(el.label)
html = html.add(option)
object_select.html(html)
# ckeditor
goCkeditors = ->
content.find('[data-richtext=ckeditor]').not('.ckeditored').each (index, domEle) ->
try
if instance = window.CKEDITOR.instances[this.id]
instance.destroy(true)
window.CKEDITOR.replace(this, $(this).data('options'))
$(this).addClass('ckeditored')
$editors = content.find('[data-richtext=ckeditor]').not('.ckeditored')
if $editors.length
if not window.CKEDITOR
options = $editors.first().data('options')
window.CKEDITOR_BASEPATH = options['base_location']
$.getScript options['jspath'], (script, textStatus, jqXHR) =>
goCkeditors()
else
goCkeditors()
#codemirror
goCodeMirrors = (array) =>
array.each (index, domEle) ->
options = $(this).data('options')
textarea = this
$.getScript options['locations']['mode'], (script, textStatus, jqXHR) ->
$('head').append(' ')
CodeMirror.fromTextArea(textarea, options['options'])
$(textarea).addClass('codemirrored')
array = content.find('[data-richtext=codemirror]').not('.codemirrored')
if array.length
@array = array
if not window.CodeMirror
options = $(array[0]).data('options')
$('head').append(' ')
$.getScript options['jspath'], (script, textStatus, jqXHR) =>
goCodeMirrors(@array)
else
goCodeMirrors(@array)
# bootstrap_wysihtml5
goBootstrapWysihtml5s = (array, config_options) =>
array.each ->
$(@).addClass('bootstrap-wysihtml5ed')
$(@).closest('.controls').addClass('well')
$(@).wysihtml5(config_options)
array = content.find('[data-richtext=bootstrap-wysihtml5]').not('.bootstrap-wysihtml5ed')
if array.length
@array = array
options = $(array[0]).data('options')
config_options = $.parseJSON(options['config_options'])
if not window.wysihtml5
$('head').append(' ')
$.getScript options['jspath'], (script, textStatus, jqXHR) =>
goBootstrapWysihtml5s(@array, config_options)
else
goBootstrapWysihtml5s(@array, config_options)