Plugin Directory

Changeset 3074988


Ignore:
Timestamp:
04/22/2024 11:48:00 AM (22 months ago)
Author:
pinpointe
Message:

Ensure mailing lists is required and at least one list is selected in both frontend and backend

Location:
pinpointe-form-integration/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • pinpointe-form-integration/trunk/assets/js/pinpointe-admin.js

    r3070994 r3074988  
    333333            placeholder: placeholderText ?? "Choose a mailing list.",
    334334            options,
     335            onItemAdd: function (value, $item) {
     336                if (this.items.length) {
     337                    jQuery('#submit').prop('disabled', false);
     338                } else {
     339                    jQuery('#submit').prop('disabled', true);
     340                }
     341            },
     342            onItemRemove: function (value, $item) {
     343                if (this.items.length) {
     344                    jQuery('#submit').prop('disabled', false);
     345                } else {
     346                    jQuery('#submit').prop('disabled', true);
     347                }
     348            },
    335349            render: {
    336350                option: function (data, escape) {
     
    451465                            }
    452466
    453                             var fieldField = '<select multiple style="width: 100% !important;"' +
     467                            var fieldField = '<select multiple required style="width: 100% !important;"' +
    454468                                'data-placeholder="' + pinpointe_label_select_mailing_tag + '" id="pinpointe_forms_tag_field_' + current_field_id +
    455469                                '" name="pinpointe_options[forms][' + current_field_id + '][tag_field][]" ' +
     
    478492                        }
    479493                         pinpointe_forms_page_hints();
     494
     495                        jQuery('#submit').prop('disabled', true);
    480496
    481497                    });
     
    641657        }
    642658
    643         hide_selected_options('#pinpointe_forms_tag_field_' + current_id + '_' + last_mailing_list);
     659        // hide_selected_options('#pinpointe_forms_tag_field_' + current_id + '_' + last_mailing_list);
    644660
    645661        var last_select_selected_values = [];
     
    667683        // Re-activate Chosen on the cloned select element
    668684        var newSelectRow = newRow.find('#pinpointe_forms_tag_field_' + current_id + '_' + next_id)
     685        newSelectRow.attr('required', true);
    669686        if (newSelectRow && !newSelectRow.get(0).tomselect) {
    670687            var { results, selected } = transformMailingListSelectOptionsToObjectArray(
     
    739756                    this_field = this_field.replace('%%%value%%%', current_selected_merge[prop]['name']);
    740757                    // SDL: Moved field label after field
    741                     fields_table += '<tr class="pinpointe_field_row" id="pinpointe_field_' + current_field_id + '_' + prop + '"><td><select class="pinpointe_tag_select" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][tag]" id="pinpointe_field_tag_' + current_field_id + '_' + prop + '">' + field_options + '</select></td><td>' + this_field + '</td><td><select name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][icon]" id="pinpointe_field_icon_' + current_field_id + '_' + prop + '" class="pinpointe_fields_icon">' + font_awesome_list + '</select></td><td><button type="button" class="pinpointe_remove_field"><i class="fa-solid fa-xmark"></i></button></td><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][type]" id="pinpointe_forms_fields_type_' + current_field_id + '_' + prop + '" value="' + (typeof merge_fields[current_selected_merge[prop]['tag']]['type'] !== 'undefined' ? merge_fields[current_selected_merge[prop]['tag']]['type'] : '') + '" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][req]" id="pinpointe_forms_fields_req_' + current_field_id + '_' + prop + '" value="' + (typeof merge_fields[current_selected_merge[prop]['tag']]['req'] !== 'undefined' ? merge_fields[current_selected_merge[prop]['tag']]['req'] : '') + '" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][us_phone]" id="pinpointe_forms_fields_us_phone_' + current_field_id + '_' + prop + '" value="' + (typeof merge_fields[current_selected_merge[prop]['tag']]['us_phone'] !== 'undefined' ? merge_fields[current_selected_merge[prop]['tag']]['us_phone'] : '') + '" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][choices]" id="pinpointe_forms_fields_choices_' + current_field_id + '_' + prop + '" value="' + (typeof merge_fields[current_selected_merge[prop]['tag']]['choices'] !== 'undefined' ? merge_fields[current_selected_merge[prop]['tag']]['choices'] : '') + '" /></tr>';
     758                    fields_table += '<tr class="pinpointe_field_row" id="pinpointe_field_' + current_field_id + '_' + prop + '"><td><select class="pinpointe_tag_select" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][tag]" id="pinpointe_field_tag_' + current_field_id + '_' + prop + '" style="width: 346px">' + field_options + '</select></td><td>' + this_field + '</td><td><select name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][icon]" id="pinpointe_field_icon_' + current_field_id + '_' + prop + '" class="pinpointe_fields_icon">' + font_awesome_list + '</select></td><td><button type="button" class="pinpointe_remove_field"><i class="fa-solid fa-xmark"></i></button></td><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][type]" id="pinpointe_forms_fields_type_' + current_field_id + '_' + prop + '" value="' + (typeof merge_fields[current_selected_merge[prop]['tag']]['type'] !== 'undefined' ? merge_fields[current_selected_merge[prop]['tag']]['type'] : '') + '" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][req]" id="pinpointe_forms_fields_req_' + current_field_id + '_' + prop + '" value="' + (typeof merge_fields[current_selected_merge[prop]['tag']]['req'] !== 'undefined' ? merge_fields[current_selected_merge[prop]['tag']]['req'] : '') + '" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][us_phone]" id="pinpointe_forms_fields_us_phone_' + current_field_id + '_' + prop + '" value="' + (typeof merge_fields[current_selected_merge[prop]['tag']]['us_phone'] !== 'undefined' ? merge_fields[current_selected_merge[prop]['tag']]['us_phone'] : '') + '" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][' + prop + '][choices]" id="pinpointe_forms_fields_choices_' + current_field_id + '_' + prop + '" value="' + (typeof merge_fields[current_selected_merge[prop]['tag']]['choices'] !== 'undefined' ? merge_fields[current_selected_merge[prop]['tag']]['choices'] : '') + '" /></tr>';
    742759                }
    743760            }
     
    750767            this_field = this_field.replace('%%%value%%%', '');
    751768            // SDL: fields_table += '<tr class="pinpointe_field_row" id="pinpointe_field_' + current_field_id + '_1"><td>' + this_field + '</td><td><select class="pinpointe_tag_select" name="pinpointe_options[forms][' + current_field_id + '][fields][1][tag]" id="pinpointe_field_tag_' + current_field_id + '_1">' + field_options + '</select></td><td><select name="pinpointe_options[forms][' + current_field_id + '][fields][1][icon]" id="pinpointe_field_icon_' + current_field_id + '_1" class="pinpointe_fields_icon">' + font_awesome_list + '</select></td><td><button type="button" class="pinpointe_remove_field"><i class="fa-solid fa-xmark"></i></button></td><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][type]" id="pinpointe_forms_fields_type_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][req]" id="pinpointe_forms_fields_req_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][us_phone]" id="pinpointe_forms_fields_us_phone_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][choices]" id="pinpointe_forms_fields_choices_' + current_field_id + '_1" value="" /></tr>';
    752             fields_table += '<tr class="pinpointe_field_row" id="pinpointe_field_' + current_field_id + '_1"><td><select class="pinpointe_tag_select" name="pinpointe_options[forms][' + current_field_id + '][fields][1][tag]" id="pinpointe_field_tag_' + current_field_id + '_1">' + field_options + '</select></td><td>' + this_field + '</td><td><select name="pinpointe_options[forms][' + current_field_id + '][fields][1][icon]" id="pinpointe_field_icon_' + current_field_id + '_1" class="pinpointe_fields_icon">' + font_awesome_list + '</select></td><td><button type="button" class="pinpointe_remove_field"><i class="fa-solid fa-xmark"></i></button></td><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][type]" id="pinpointe_forms_fields_type_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][req]" id="pinpointe_forms_fields_req_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][us_phone]" id="pinpointe_forms_fields_us_phone_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][choices]" id="pinpointe_forms_fields_choices_' + current_field_id + '_1" value="" /></tr>';
     769            fields_table += '<tr class="pinpointe_field_row" id="pinpointe_field_' + current_field_id + '_1"><td><select class="pinpointe_tag_select" name="pinpointe_options[forms][' + current_field_id + '][fields][1][tag]" id="pinpointe_field_tag_' + current_field_id + '_1" style="width: 346px;">' + field_options + '</select></td><td>' + this_field + '</td><td><select name="pinpointe_options[forms][' + current_field_id + '][fields][1][icon]" id="pinpointe_field_icon_' + current_field_id + '_1" class="pinpointe_fields_icon">' + font_awesome_list + '</select></td><td><button type="button" class="pinpointe_remove_field"><i class="fa-solid fa-xmark"></i></button></td><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][type]" id="pinpointe_forms_fields_type_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][req]" id="pinpointe_forms_fields_req_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][us_phone]" id="pinpointe_forms_fields_us_phone_' + current_field_id + '_1" value="" /><input type="hidden" name="pinpointe_options[forms][' + current_field_id + '][fields][1][choices]" id="pinpointe_forms_fields_choices_' + current_field_id + '_1" value="" /></tr>';
    753770        }
    754771
     
    876893
    877894                    var cloned_select = jQuery('#pinpointe_field_tag_' + current_field_id + '_' + next_id);
    878                     cloned_select.css('width', '100%');
     895                    cloned_select.css('width', '346px');
    879896
    880897                    let tomSelectOptions = {
     
    964981                        // Disable
    965982                        jQuery(this).find('option[value="' + all_selected[prop] + '"]').prop('disabled', true);
     983
     984                        if (this.tomselect) { // add the already selected item to be selected. That way it cant be selected again.
     985                            this.tomselect.items.push(all_selected[prop]);
     986                        }
    966987                    }
    967988
     
    13211342            selectElement.attr('data-current-mail-list', next_id + '_1');
    13221343            selectElement.attr('style', "width: 100% !important");
     1344            selectElement.attr('required', true);
    13231345
    13241346            // Reinitialize chosen after updating attributes
  • pinpointe-form-integration/trunk/includes/pinpointe-prepare-form.inc.php

    r3070994 r3074988  
    431431            $html .= "<p class='label'>Please select the mailing list(s) you would like to receive updates from.</p>";
    432432
     433            $input_name = "pinpointe_".$context .'_subscribe[custom][selected_tags][]';
     434
     435            // add mailing list validation rules.
     436            $validation_rules[$input_name]["required"] = true;
     437            $validation_rules[$input_name]["minlength"] = 1;
     438            $validation_messages[$input_name]["minlength"] = $validation_messages[$input_name]["required"] = "You need to select at least one mailing list.";
     439
    433440            foreach ($mailing_list_settings as $tag_id => $tag) {
    434441                $input_id = "pinpointe_tags_" . $context . "_" . $tag_id;
    435                 $input_name = "pinpointe_".$context .'_subscribe[custom][selected_tags][]';
    436442
    437443                $html .= '<label for="'.$input_id .'" style="width: 100%;display: flex; justify-content: space-between;align-items: center; margin-bottom: 5px; width: 100%;">';
  • pinpointe-form-integration/trunk/pinpointe-signup-form.php

    r3073079 r3074988  
    687687               
    688688                if ($key === 'tags') {
     689                    $value = is_array($value) ? $value : [$value];
    689690                    $value = array_map('sanitize_key', $value);
    690691                    return;
     
    14761477                        // Show Mailing list
    14771478                        $new_forms[$form_number]['show_mailing_list'] = (isset($form['show_mailing_list']) && !empty($form['show_mailing_list'])) ? $form['show_mailing_list'] : 'off';
     1479
     1480                        if (empty($new_forms[$form_number]['tags'])) {
     1481                            array_push(
     1482                                $errors,
     1483                                array(
     1484                                    'setting' => 'tags',
     1485                                    'custom' => printf(esc_html__('%s', 'pinpointe'), esc_html("You must selected at least one mailing list"))
     1486                                )
     1487                            );
     1488                        }
    14781489
    14791490                        $this->saveTagMetadata($form_number, $new_forms[$form_number]['show_mailing_list'], $new_forms[$form_number]['tags']);
Note: See TracChangeset for help on using the changeset viewer.