Skip to content

Instantly share code, notes, and snippets.

@eduzera
Last active December 12, 2015 07:09
Show Gist options
  • Save eduzera/4734640 to your computer and use it in GitHub Desktop.
Save eduzera/4734640 to your computer and use it in GitHub Desktop.
methods to nested attributes jquery plugin
// 1.
$('a.more_emails').on( 'click', addEmailsFields);
// 1.1
$('input[id*="client_client_emails_attributes"]').each(function(index, element){
$(element).parent().css({position: 'relative'});
$(element).parent().append(createRemoveEmailLink);
});
// 2.
function addEmailsFields(event){
var link = $(event.target);
var parent = link.parent();
var input = parent.find('input[id*="emails_attributes"]')[0];
addMoreFields(link, input, 'email', 'E-mail', 'client_client_emails_attributes_', 'client[client_emails_attributes]', createRemoveEmailLink());
}
// 3.1
function addMoreFields(link, input, field_name, label_txt, id_attr, name_attr, remove_link_method){
var field_number = input ? parseInt($(input).attr('name').match(/\d/)[0]) + 1 : 0;
var fields = fieldNameAndId(field_number, field_name, id_attr, name_attr);
var label = $('<label>',
{ for: fields.id })
.text(label_txt);
var new_input = $('<input>',
{
id: fields.id,
name: fields.name,
type: 'text',
size: '50'
});
var container = $('<div>',
{ class: 'input string' })
.css({ position: 'relative' });
container.append(label);
container.append(new_input);
container.append(remove_link_method);
link.before(container);
}
// 3.2
function fieldNameAndId(process_number, field_name, id, name){
var id_attr = id+process_number+"_"+field_name;
var name_attr = name+"["+process_number+"]["+field_name+"]";
return {
id: id_attr,
name: name_attr
}
}
// 4.
function removeEmailsFields(event){
var link = $(event.target);
var parent = link.parent();
var input_hidden = parent.next();
removeMoreFields(link, parent, input_hidden, 'client_client_emails_attributes_', 'client[client_emails_attributes]');
}
// 5.
function removeMoreFields(link, parent, input_hidden, id_attr, name_attr){
if (input_hidden.is("input")) {
var field_number = parseInt(input_hidden.attr('name').match(/\d/)[0]);
var fields = fieldNameAndId(field_number, '_destroy', id_attr, name_attr);
var input = $('<input>',
{
type: 'hidden',
id: fields.id,
name: fields.name
}).attr('value', '1');
parent.append(input);
}
link.parent().fadeOut();
}
// 6.
function createRemoveEmailLink(){
var link = $('<a>', {
href: 'javascript://',
class: 'less_process'
})
.text('-')
.on('click', removeEmailsFields);
return link;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment