PluginProbe
Advanced Custom Fields (ACF®) / 3.1.4
Advanced Custom Fields (ACF®) v3.1.4
6.8.9 6.8.8 6.8.7 6.8.6 6.8.5 6.8.4 6.8.3 6.8.2 6.8.1 5.8.5 5.8.6 5.8.7 5.8.8 5.8.9 5.9.0 5.9.1 5.9.2 5.9.3 5.9.4 5.9.5 5.9.6 5.9.7 5.9.8 5.9.9 6.0.0 All 230 releases
advanced-custom-fields / js / fields.js
fields.js
548 lines 12.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function($){
2
3 /*----------------------------------------------------------------------
4 *
5 * Exists
6 *
7 *---------------------------------------------------------------------*/
8
9 $.fn.exists = function()
10 {
11 return $(this).length>0;
12 };
13
14 function uniqid()
15 {
16 var newDate = new Date;
17 return newDate.getTime();
18 }
19
20 /*----------------------------------------------------------------------
21 *
22 * Update Names
23 *
24 *---------------------------------------------------------------------*/
25
26 $.fn.update_names = function(new_no, new_sub_no)
27 {
28
29 //alert('passed through '+total_fields);
30 $(this).find('[name]').each(function()
31 {
32
33 var name = $(this).attr('name');
34 var id = $(this).attr('id');
35
36 if(name && name.indexOf("fields[999]") != -1)
37 {
38 name = name.replace('fields[999]','fields['+new_no+']');
39 }
40 if(id && id.indexOf("fields[999]") != -1)
41 {
42 id = id.replace('fields[999]','fields['+new_no+']');
43 }
44
45 if($(this).closest('.sub_field').hasClass('field_clone'))
46 {
47 // dont change this input (its the clone sub field!)
48 }
49 else
50 {
51 if(name && name.indexOf("[sub_fields][999]") != -1)
52 {
53 name = name.replace('[sub_fields][999]','[sub_fields]['+new_sub_no+']');
54 }
55 if(id && id.indexOf("[sub_fields][999]") != -1)
56 {
57 id = id.replace('[sub_fields][999]','[sub_fields]['+new_sub_no+']');
58 }
59 }
60
61 $(this).attr('name', name);
62 $(this).attr('id', id);
63 });
64 }
65
66
67 /*----------------------------------------------------------------------
68 *
69 * Update Order Numbers
70 *
71 *---------------------------------------------------------------------*/
72
73 function update_order_numbers(){
74
75 $('#acf_fields .fields').each(function(){
76 $(this).children('.field').each(function(i){
77 $(this).find('td.field_order .circle').first().html(i+1);
78 });
79 });
80
81 }
82
83
84 /*----------------------------------------------------------------------
85 *
86 * setup_fields
87 *
88 *---------------------------------------------------------------------*/
89
90 function setup_fields()
91 {
92
93 // add edit button functionality
94 $('#acf_fields a.acf_edit_field').live('click', function(){
95
96 var field = $(this).closest('.field');
97
98 if(field.hasClass('form_open'))
99 {
100 field.removeClass('form_open');
101 }
102 else
103 {
104 field.addClass('form_open');
105 }
106
107 field.children('.field_form_mask').animate({'height':'toggle'}, 500);
108
109 });
110
111
112 // add delete button functionality
113 $('#acf_fields a.acf_delete_field').live('click', function(){
114
115 var field = $(this).closest('.field');
116 var fields = field.closest('.fields');
117 var temp = $('<div style="height:' + field.height() + 'px"></div>');
118 //field.css({'-moz-transform' : 'translate(50px, 0)', 'opacity' : 0, '-moz-transition' : 'all 250ms ease-out'});
119 field.animate({'left' : '50px', 'opacity' : 0}, 250, function(){
120 field.before(temp);
121 field.remove();
122
123 temp.animate({'height' : 0 }, 250, function(){
124 temp.remove();
125 })
126
127 update_order_numbers();
128
129 if(!fields.children('.field').exists())
130 {
131 // no more fields, show the message
132 fields.children('.no_fields_message').show();
133 }
134
135 });
136
137
138
139 });
140
141
142 // show field type options
143 $('#acf_fields tr.field_type select').live('change', function(){
144
145 var tbody = $(this).closest('tbody');
146 var type = $(this).val();
147
148 tbody.children('tr.field_option').hide();
149 tbody.children('tr.field_option').find('[name]').attr('disabled', 'true');
150
151 var tr = tbody.children('tr.field_option_'+type);
152 tr.find('[name]').removeAttr('disabled');
153
154 var tr_top = tbody.children('tr.field_type');
155
156 tr.insertAfter(tr_top);
157 tr.show();
158
159 // firefox radio button fix
160 tr.find('input[type="radio"][data-checked="checked"]').each(function(){
161
162 $(this).removeAttr('checked').attr('checked', 'checked');
163
164 });
165
166
167 }).trigger('change');
168
169
170 // Add Field Button
171 $('#acf_fields #add_field').live('click',function(){
172
173 var table_footer = $(this).closest('.table_footer');
174 var fields = table_footer.siblings('.fields');
175
176
177 // clone last tr
178 var new_field = fields.children('.field_clone').clone();
179 new_field.removeClass('field_clone').addClass('field');
180
181
182 // update input names
183 if(new_field.hasClass('sub_field'))
184 {
185
186 // it is a sub field
187 //console.log(fields.parents('.fields').last());
188 var field_length = fields.parents('.fields').last().children('.field').length;
189 var sub_field_length = fields.children('.field').length;
190 //alert(sub_field_length);
191 //alert('update numbers for sub field! field:'+field_length+', sub:'+sub_field_length);
192
193 new_field.update_names(uniqid(), uniqid());
194 }
195 else
196 {
197 var field_length = fields.children('.field').length;
198 new_field.update_names(uniqid(), 0);
199
200 //alert('update numbers for field! field:'+field_length);
201 }
202
203
204 // append to table
205 fields.children('.field_clone').before(new_field);
206 //fields.append(new_field);
207
208
209 // remove no fields message
210 if(fields.children('.no_fields_message').exists())
211 {
212 fields.children('.no_fields_message').hide();
213 }
214
215 // clear name
216 new_field.find('.field_form input[type="text"]').val('');
217 new_field.find('.field_form input[type="text"]').first().focus();
218 new_field.find('tr.field_type select').trigger('change');
219
220 // open up form
221 new_field.find('a.acf_edit_field').first().trigger('click');
222
223
224 // update order numbers
225 update_order_numbers();
226
227 return false;
228
229
230 });
231
232
233 // Auto complete field name
234 $('#acf_fields tr.field_label input.label').live('blur', function()
235 {
236 var label = $(this);
237 var name = $(this).closest('tr').siblings('tr.field_name').find('input.name');
238
239 if(name.val() == '')
240 {
241 var val = label.val().toLowerCase().split(' ').join('_').split('\'').join('');
242 name.val(val);
243 name.trigger('keyup');
244 }
245 });
246
247
248 // update field meta
249 $('#acf_fields .field_form tr.field_label input.label').live('keyup', function()
250 {
251 var val = $(this).val();
252 var name = $(this).closest('.field').find('td.field_label strong a').first().html(val);
253 });
254 $('.field_form tr.field_name input.name').live('keyup', function()
255 {
256 var val = $(this).val();
257 var name = $(this).closest('.field').find('td.field_name').first().html(val);
258 });
259 $('.field_form tr.field_type select').live('change', function()
260 {
261 var val = $(this).val();
262 var label = $(this).find('option[value="' + val + '"]').html();
263
264 // update field type (if not a clone field)
265 if($(this).closest('.field_clone').length == 0)
266 {
267 $(this).closest('.field').find('td.field_type').html(label);
268 }
269
270 });
271
272
273 // sortable
274 $('#acf_fields td.field_order').live('mouseover', function(){
275
276 var fields = $(this).closest('.fields');
277
278 if(fields.hasClass('sortable')) return false;
279
280 fields.addClass('sortable').sortable({
281 update: function(event, ui){
282 update_order_numbers();
283 },
284 handle: 'td.field_order'
285 });
286 });
287
288 }
289
290
291 /*----------------------------------------------------------------------
292 *
293 * setup_rules
294 *
295 *---------------------------------------------------------------------*/
296
297 function setup_rules()
298 {
299 var tbody = $('table#location_rules tbody');
300
301
302 // show field type options
303 tbody.find('td.param select').live('change', function(){
304
305 var tr = $(this).closest('tr');
306 var val = $(this).val();
307
308
309 // does it have options?
310 if(!$(this).find('option[value="options_page"]').exists())
311 {
312 //console.log('select: '+type+'. parent length: '+$(this).closest('.repeater').length);
313 $(this).append('<option value="options_page" disabled="true">Options Page (Unlock field with activation code)</option>');
314
315 }
316
317
318 tr.find('td.value div').hide();
319 tr.find('td.value div [name]').attr('disabled', 'true');
320
321 tr.find('td.value div[rel="'+val+'"]').show();
322 tr.find('td.value div[rel="'+val+'"] [name]').removeAttr('disabled');
323
324 }).trigger('change');
325
326
327 // Add Button
328 tbody.find('td.buttons a.add').live('click',function(){
329
330 var tr_count = $(this).closest('tbody').children('tr').length;
331 var tr = $(this).closest('tr').clone();
332
333 tr.insertAfter($(this).closest('tr'));
334
335 update_names();
336
337 can_remove_more();
338
339 return false;
340
341 });
342
343
344 // Remove Button
345 tbody.find('td.buttons a.remove').live('click',function(){
346
347 var tr = $(this).closest('tr').remove();
348
349 can_remove_more();
350
351 return false;
352
353 });
354
355 function can_remove_more()
356 {
357 if(tbody.children('tr').length == 1)
358 {
359 tbody.children('tr').each(function(){
360 $(this).find('td.buttons a.remove').addClass('disabled');
361 });
362 }
363 else
364 {
365 tbody.children('tr').each(function(){
366 $(this).find('td.buttons a.remove').removeClass('disabled');
367 });
368 }
369
370 }
371
372 can_remove_more();
373
374 function update_names()
375 {
376 tbody.children('tr').each(function(i){
377
378 $(this).find('[name]').each(function(){
379
380 var name = $(this).attr('name').split("][");
381
382 var new_name = name[0] + "][" + i + "][" + name[2];
383
384 $(this).attr('name', new_name).attr('id', new_name);
385 });
386
387 })
388 }
389
390 }
391
392 /*----------------------------------------------------------------------
393 *
394 * Document Ready
395 *
396 *---------------------------------------------------------------------*/
397
398 $(document).ready(function(){
399
400 // firefox radio button bug (fixed on line 152)
401 //if($.browser.mozilla) $("form").attr("autocomplete", "off");
402
403
404 // add active to Settings Menu
405 //$('#adminmenu #menu-settings').removeClass('wp-not-current-submenu').addClass('current wp-menu-open wp-has-current-submenu');
406
407 // setup fields
408 setup_fields();
409 setup_rules();
410
411 });
412
413
414 /*
415 * Flexible Content
416 *
417 * @description: extra javascript for the flexible content field
418 * @created: 3/03/2011
419 */
420
421 function uniqid()
422 {
423 var newDate = new Date;
424 return newDate.getTime();
425 }
426
427
428 /*----------------------------------------------------------------------
429 *
430 * Add Layout Option
431 *
432 *---------------------------------------------------------------------*/
433
434 $('#acf_fields .acf_fc_add').live('click', function(){
435
436 // vars
437 var tr = $(this).closest('tr.field_option_flexible_content');
438 var new_tr = $(this).closest('.field_form').find('tr.field_option_flexible_content:first').clone(false);
439
440 // remove sub fields
441 new_tr.find('.sub_field.field').remove();
442
443 // show add new message
444 new_tr.find('.no_fields_message').show();
445
446 // reset layout meta values
447 new_tr.find('.acf_cf_meta input[type="text"]').val('');
448 new_tr.find('.acf_cf_meta select').val('table');
449
450 // update id / names
451 var new_id = uniqid();
452
453 new_tr.find('[name]').each(function(){
454
455 var name = $(this).attr('name').replace('[layouts][0]','[layouts]['+new_id+']');
456 $(this).attr('name', name);
457 $(this).attr('id', name);
458
459 });
460
461 // add new tr
462 tr.after(new_tr);
463
464 // add drag / drop
465 new_tr.find('.fields').sortable({
466 handle: 'td.field_order'
467 });
468
469 return false;
470 });
471
472
473 /*----------------------------------------------------------------------
474 *
475 * Delete Layout Option
476 *
477 *---------------------------------------------------------------------*/
478
479 $('#acf_fields .acf_fc_delete').live('click', function(){
480
481 var tr = $(this).closest('tr.field_option_flexible_content');
482 var tr_count = tr.siblings('tr.field_option.field_option_flexible_content').length;
483
484 if(tr_count == 0)
485 {
486 alert('Flexible Content requires at least 1 layout');
487 return false;
488 }
489
490 tr.animate({'left' : '50px', 'opacity' : 0}, 250, function(){
491 tr.remove();
492 });
493
494 });
495
496
497 /*----------------------------------------------------------------------
498 *
499 * Sortable Layout Option
500 *
501 *---------------------------------------------------------------------*/
502
503 $('#acf_fields .acf_fc_reorder').live('mouseover', function(){
504
505 var table = $(this).closest('table.acf_field_form_table');
506
507 if(table.hasClass('sortable')) return false;
508
509 var fixHelper = function(e, ui) {
510 ui.children().each(function() {
511 $(this).width($(this).width());
512 });
513 return ui;
514 };
515
516 table.addClass('sortable').children('tbody').sortable({
517 items: ".field_option_flexible_content",
518 handle: 'a.acf_fc_reorder',
519 helper: fixHelper,
520 placeholder: "ui-state-highlight"
521 });
522
523 });
524
525
526 /*----------------------------------------------------------------------
527 *
528 * Label update name
529 *
530 *---------------------------------------------------------------------*/
531
532 $('#acf_fields .acf_fc_label input[type="text"]').live('blur', function(){
533
534 var label = $(this);
535 var name = $(this).parents('td').siblings('td.acf_fc_name').find('input[type="text"]');
536
537 if(name.val() == '')
538 {
539 var val = label.val().toLowerCase().split(' ').join('_').split('\'').join('');
540 name.val(val);
541 name.trigger('keyup');
542 }
543
544 });
545
546
547 })(jQuery);
548