Заполните выпадающий с DataTable JSON - PullRequest
0 голосов
/ 06 марта 2019

Мне нужно заполнить раскрывающийся список значениями, которые хранятся в моем DataTable.

Мой DataTable загружается нажатием кнопки, после чего DataTable пользователь может обновитьзаписей.В этих данных есть «Номер заказа».Мне нужны все существующие номера заказов, чтобы заполнить раскрывающийся список, который отображается, когда пользователь нажимает кнопку «Редактировать», но я не уверен, как и где разместить код.

jQuery для получения и заполнения таблицы

// JSON GET to populate 'Existing Rules' section
var addModifyDeleteButtonClick = function () {
    $('#toDrForm').trigger('reset');
    $('#todrexitingrules').show();
    $('#dialPlanTelNo').html(telNumberSelected);

    if (buttonclicked == 'Modify' || buttonclicked == 'Add') {
        $("#existingRuleSectionHeader").html('Existing dial plan rules');
    } else {
        $("#existingRuleSectionHeader").html('Delete an existing dial plan rule');
    }

    // Existing rule datatable creator
    var existingRuleTable = $('#existingRulesDataTable')
        .on('error.dt', function () {
            $('#todrexitingrules').hide();
            $('#errorModal').modal('show');
            $('#errorModal').on('shown.bs.modal', function () {
                $('#errorModalCloseButton').focus();
            })
            $('#existingRuleError').html(
                '<p>There was an issue retrieving the data. Please try again.</p>'
                + '<p>If the error keeps occurring, please get in touch.</p>');
        })
        .DataTable({
            "ordering": false,                                      // Allows ordering
            "searching": false,                                     // Searchbox
            "paging": true,                                         // Pagination
            "info": false,                                          // Shows 'Showing X of X' information
            "pagingType": 'simple_numbers',                         // Shows Previous, page numbers & next buttons only
            "pageLength": 10,                                       // Defaults number of rows to display in table. If changing this value change the show/hide below
            "dom": '<"top"f>rt<"bottom"lp><"clear">',               // Positions table elements
            "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],  // Sets up the amount of records to display
            "fnDrawCallback": function () {
                if ($('#existingRulesDataTable').DataTable().rows().count() < 11) {
                    $("div[class='bottom']").hide();                // Hides paginator & dropdown if less than 11 records returned
                } else {
                    $("div[class='bottom']").show();                // Shows paginator & dropdown if 11 or more records are returned
                }
            },
            'ajax': {
                "type": 'GET',
                "url": "js/dataTable.json",                         // TODO > Needs to be changed when actual file resolved
                "data": function (data) {
                    return data;
                },
                "dataSrc": function (res) {
                    existingRuleTableCount = res.data.length;
                    return res.data;
                },
                "dataType": 'json',
            },
            "columns": [                                            // Display JSON data in table
                { "data": "position" },
                { "data": "startTime" },
                { "data": "endTime" },
                { "data": "selectedDays" },
                { "data": "selectedDates" },
                { "data": "selectedMonths" },
                { "data": "timeRange" },
                {
                    "data": null,
                    "render": function (data) {
                        if (buttonclicked == 'Modify') {           // Displays the radio button when 'Mod' clicked
                            return '<label class="c-radio" style="margin-bottom: 0px">'
                                + '<input type="radio" name="existingRuleActionRadioButton" value="option1">'
                                + '<span class="fa fa-check"></span>'
                                + '</label>';
                        } else if (buttonclicked == 'Delete') {    // Displays the delete button when 'Del' clicked
                            return '<button name="deleteRuleButton" class="btn btn-danger">'
                                + '<i class="fa fa-trash-o" style="font-size: large"></i>'
                                + '</button>';
                        } else {
                            return '';                             // Needed for the 'Add' button click
                        }
                    }
                },
            ],
            "createdRow": function (row, data, dataIndex) {
                if (data.startTime == 'Anytime') {
                    $('td:eq(1)', row).attr('colspan', 2).css('text-align', 'center').html('All day');  // Adds COLSPAN attribute, centers the wording and changes it from 'Anytime'
                    $('td:eq(2)', row).css('display', 'none');                                          // Hides cell next to the cell with COLSPAN attribute
                }

                if (data.timeRange == '-w') {
                    $('td:eq(6)', row).html('Working hours');       // Changes text returned by JSON if '-w'
                } else if (data.timeRange == '-oo') {
                    $('td:eq(6)', row).html('Out of office hours'); // Changes text returned by JSON if '-oo'
                }
            },
            "initComplete": function () {
                if (buttonclicked == 'Delete') {
                    $('button[name=deleteRuleButton').focus();
                } else if (buttonclicked == 'Modify') {
                    $('input[name=existingRuleActionRadioButton').focus();
                }

                $(this.api().cell(':last', 7, { order: 'original' }).node()).css('display', 'none');
            },
            "destroy": true
        });

    // Function call when a radio button is selected from existing rule table
    $('#existingRulesDataTable').on('click', 'input[type="radio"]', function (event) {
        event.stopImmediatePropagation();
        var modifyRecordData = existingRuleTable.row($(this).closest('tr')).data();
        modifyRadioButtonSelection(modifyRecordData);
    });
}

Вызов функции, вызывается при выборе радиокнопки, форма редактирования которой предварительно всплывает

// Disables other radio buttons when one selected for 'Modify'
var modifyRadioButtonSelection = function (modifyRecordData) {
    $('select[name=existingRulesDataTable_length').attr('disabled', true);
    $('input:radio[name="existingRuleActionRadioButton"]').attr('disabled', true);
    $("#ruleBuilder").show();
    removeValidation();
    $("#ruleBuilderHeader").html('Modify an existing dial plan rule');
    $('#startTimeHr').focus();
    $("#resetButton").css("display", "inline");

    $('button[name=weekdaysbutton').removeClass('btn-primary').addClass('btn-default');
    $('button[name=weekenddaysbutton').removeClass('btn-primary').addClass('btn-default');
    $('button[name=monthday').removeClass('btn-primary').addClass('btn-default');
    $('button[name=month').removeClass('btn-primary').addClass('btn-default');

    addDisable();

    // Populates fields with data passed
    if (modifyRecordData.startTime == 'Anytime') {
        $('#anyTimeRadioButton').prop('checked', true);
        $('#specificTimeRadioButton').removeAttr('checked');
        $('#startEndTimeFields').hide();
    } else {
        $('#anyTimeRadioButton').removeAttr('checked');
        $('#specificTimeRadioButton').prop('checked', true);
        $('#startEndTimeFields').show();
        $('#startTimeHr').val(modifyRecordData.startTimeHr);
        $('#startTimeMin').val(modifyRecordData.startTimeMin);
        $('#endTimeHr').val(modifyRecordData.endTimeHr);
        $('#endTimeMin').val(modifyRecordData.endTimeMin);
    }

    $('#orderPosition').val(modifyRecordData.position);
    $('#timeRange').val(modifyRecordData.timeRange);

    var selectedDays = modifyRecordData.selectedDays;
    var splitSelectedDays = selectedDays.split(',');
    var selectedDates = modifyRecordData.selectedDates;
    var splitSelectedMonthDates = selectedDates.split(',');
    var selectedMonths = modifyRecordData.selectedMonths;
    var splitSelectedMonths = selectedMonths.split(',');

    // Loops though and pre-selects current days passed in
    splitSelectedDays.forEach(day => {
        let dayName = day.trim().toLowerCase();
        $('#' + dayName).toggleClass('btn-default btn-primary');

        if (dayName == 'all days') {
            $('button[name=weekdaysbutton]').toggleClass('btn-default btn-primary');
            $('button[name=weekenddaysbutton]').toggleClass('btn-default btn-primary');
        }
    })

    // Loops though and pre-selects current month dates passed in
    splitSelectedMonthDates.forEach(monthDate => {
        let monthDateValue = monthDate.trim();
        let padZeroMonthDateValue = (monthDateValue < 10 ? "0" : "") + (monthDateValue);

        $('#' + padZeroMonthDateValue).toggleClass('btn-default btn-primary');

        if (padZeroMonthDateValue == 'All days of the month') {
            $('button[name=monthday').toggleClass('btn-default btn-primary');
        }
    })

    // Loops though and pre-selects current months passed in
    splitSelectedMonths.forEach(month => {
        let monthName = month.trim().toLowerCase();

        $('#' + monthName).toggleClass('btn-default btn-primary');

        if (monthName == 'all months') {
            $('button[name=month]').toggleClass('btn-default btn-primary');
        }
    })

    $('#resetButton').mousedown(function (event) {
        buttonclicked = "Reset";
        event.stopImmediatePropagation();
        modifyRadioButtonSelection(modifyRecordData);
    })
};

Это мой HTML

<select id="orderPosition" name="orderPosition"
    class="form-control">
    <option value="orderPositionDefault">
        Please select a position
    </option>
</select>

Мне нужен раскрывающийся списокчтобы получить все возвращенные номера позиций, как показано ниже enter image description here

1 Ответ

1 голос
/ 06 марта 2019

Методы column().data() вместе с .unique() и .sort() вернет вам набор уникальных записей в требуемом столбце, который вы можете использовать для заполнения <option> значений вашего раскрывающегося списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...