1
votes

I have this bootstrap layout, which is a container inside an accordion-item. There is a dropdown button, containing messages and there's another button that opens a modal to insert a new message and display it in the dropdown list, using localStorage.

When the page loads or is refreshed, I can select the dropdown item normally, but when I add the item, it actually shows up in the list, but I can't select it nor any other item and the selected item is kept there, until the page is reloaded again.

I can still add more messages using the modal and they will still show up in the list.

There's no error in the console to guide me.

The JavaScript code is located at the bottom of the code.

Demonstrating video: https://www.youtube.com/watch?hd=1&v=fhNfpOaJbGs

HTML:

 <div class="container">
   <div class="row justify-content-center">
        <div class="col-4">
            <div class="dropdown">
                <button class="btn btn-secondary" type="button" id="ddMensagens" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                    Selecione Mensagem
                </button>
                <div class="dropdown-menu scrollable-menu" id="mensagem" aria-labelledby="ddMensagens">
                </div>
            </div>
        </div>
        <div class="col-4">
            <button type="button" class="btn btn-outline-success btn-sm" data-bs-toggle="modal" data-bs-target="#staticBackdrop" title="Clique para cadastrar uma nova mensagem">
                Cadastrar Nova Mensagem
            </button>
            <div class="modal fade" id="staticBackdrop" data-bs-backdrop="false" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
                <div class="modal-dialog modal-dialog-centered"">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h5 class="modal-title" id="modalMensagem">Nova Mensagem</h5>
                            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fechar"></button>
                        </div>
                        <div class="modal-body">
                            <div class="container">
                                <div class="row">
                                    <div class="col">
                                        <div class="form-group">
                                            <label for="txtMensagem">Digite sua mensagem</label>
                                            <input type="text" class="form-control" id="txtMensagem" placeholder="Mensagem" style="width: 400px">
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Fechar</button>
                            <button type="button" class="btn btn-primary" id="saveMensagem" onclick="addItem();" data-bs-dismiss="modal">Salvar</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <br />
    </div>
</div>

JavaScript:

<script defer>
        function updateSelect() {
            const select = document.querySelector('#mensagem');
            const oldMessage = JSON.parse(localStorage.getItem('mensagem')) || false;

            if (oldMessage) {
                select.innerHTML = '';
                oldMessage.forEach(element => {
                    select.innerHTML += `<button class='dropdown-item' type='button'>${element}</option>`
                });
            } else {
                localStorage.setItem('mensagem', '[]')
            }
        }
        function addItem() {
            const text = document.getElementById('txtMensagem').value;

            const database = JSON.parse(localStorage.getItem('mensagem')) || [];

            if (database && text.length > 3) {
                const repetido = database.find(item => item === text.value);

                if (!repetido) {
                    const novasMensagens = [...database, text];
                    localStorage.setItem('mensagem', JSON.stringify(novasMensagens))
                    updateSelect();
                    text.value = ''
                }
            }
        }
        updateSelect()
    </script> 

LINKS:

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">

    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" type="text/javascript"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

Had to change in order to solve my issue (which I still don't know):


function getMensagem() {
    let valueMensagem = document.getElementById('mensagem').value;
    if (valueMensagem != 0) {
        $('select option:selected').each(function (e) {
$('#ContentPlaceHolder1_ddMensagensCopy').val(valueMensagem);
                    });
                }
                else {
                    $('#ContentPlaceHolder1_ddMensagensCopy').val('');
                }
            }

function updateSelectMensagem() {
            const select = document.querySelector('#mensagem');
            const oldMessage = JSON.parse(localStorage.getItem('mensagem')) || false;

            if (oldMessage) {
                select.innerHTML = "<option value='0'> Selecione uma mensagem </option>";
                oldMessage.forEach(element => {
                    select.innerHTML += `<option class='dropdown-item'>${element}</option>`
                });
            } else {
                localStorage.setItem('mensagem', '[]')
            }
        }
        function addItemMensagem() {
            const text = document.getElementById('txtMensagem').value;

            const database = JSON.parse(localStorage.getItem('mensagem')) || [];

            if (database && text.length > 3) {
                const repetido = database.find(item => item === text.value);

                if (!repetido) {
                    const novasMensagens = [...database, text];
                    localStorage.setItem('mensagem', JSON.stringify(novasMensagens))
                    updateSelectMensagem();
                    text.value = ''
                }
            }
        }
        updateSelectMensagem()
<div class="col-4">
    <div class="dropdown-boleto">
        <select id="mensagem" class="btn btn-secondary select">
            <option value="0">Selecione uma mensagem</option>
        </select>
    </div>
</div>
.select option {
            background: white;
            color: #212529;
        }
1

1 Answers