Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.05.2022, 17:29
Новичок на форуме
Отправить личное сообщение для kihodo9t Посмотреть профиль Найти все сообщения от kihodo9t
 
Регистрация: 19.03.2022
Сообщений: 2

Настройка фильтрации
Как можно настроить фильтрацию по году окончания обучения?

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="./css/bootstrap.css">
    <title>Document</title>
</head>
<body>
    <div class="container">

        <form id="addStudent" action="#">
            <div class="row">
                <label class="col-6 mb-2"> Фамилия 
                    <input id="input-sureName" class="form-control"  type="text" tabindex="1">
                </label>

                <label class="col-6 mb-2"> Факультет 
                    <input id="input-faculty" class="form-control" type="text" tabindex="4">
                </label>
    
                <label class="col-6 mb-2"> Имя 
                    <input id="input-name" class="form-control"  type="text" tabindex="2">
                </label>
    

                <label class="col-6 mb-2"> Дата рождения 
                    <input id="input-birthday" class="form-control" type="date" tabindex="5">
                </label>
    
                <label class="col-6 mb-2"> Отчество 
                    <input id="input-middleName" class="form-control" type="text" tabindex="3">
                </label>

                <label class="col-6 mb-2"> Год поступления 
                    <input id="input-startTraining" class="form-control" type="number " min="2000" tabindex="6">
                </label>
    
                <div class="btn-group mb-5">
                    <button class="btn btn-primary" type="submit">Добавить</button>
                    <button class="btn btn-secondary" type="reset">Очистить</button>
                </div>
            </div>
        </form>

        <form class="row" id="filter-form"    action="#" class="" id="filter">
            <span>Поиск по таблице</span>
            <div class="col">
                <input class="form-control" id="filter-fio" type="text" placeholder="ФИО">
            </div>
            <div class="col">
                <input class="form-control" id="filter-faculty" type="text" placeholder="Факультет">
            </div>
            <div class="col">
                <input class="form-control" id="filter-teachStart" type="number" placeholder="Год начала обучения">
            </div>     
            <div class="col">
                <input class="form-control" id="filter-teachFinish" type="number" placeholder="Год окончания обучения">
            </div>
            <div class="col">
                <button class="btn btn-primary" id="filterBtn" type="submit">Найти</button>
            </div>  
                   
        </form>


        <table class="table">
            <thead>
              <tr id="studentsListTR">
                <th data-column="fullName" scope="col">ФИО</th>
                <th data-column="birthday" scope="col">Дата рождения</th>
                <th data-column="faculty" scope="col">Факультет</th>
                <th data-column="teachStart" scope="col">Годы обучения</th>
              </tr>
            </thead>
            <tbody id="students-list">
            </tbody>
          </table>
    </div>




    [JS]// массив студентов
let studentsList = [
    {name: "Владимир",
    middleName: "Николавеич",
    sureName: "Кубанов",
    fullName: "Кубанов Владимир Николавеич",
    teachStart: 2012,
    faculty: "Юридический",
    birthday: new Date(1994, 6, 9),
    },

    {name: "Петр",
    middleName: "Владимирович",
    sureName: "Смирнов",
    fullName: "Смирнов Петр Владимирович",
    teachStart: 2018,
    faculty: "Исторический",
    birthday: new Date(1993, 10, 25),
    },

    {name: "Игорь",
    middleName: "Борисович",
    sureName: "Мельников",
    fullName: "Мельников Игорь Борисович",
    teachStart: 2020,
    faculty: "Юридический",
    birthday: new Date(2000, 3, 9),
    },

    {name: "Иван",
    middleName: "Иванович",
    sureName: "Иванов",
    fullName: "Иванов Иван Иванович",
    teachStart: 2004,
    faculty: "Исторический",
    birthday: new Date(1988, 11, 25),
    },
]; 

const $studentsListTable = document.getElementById('studentsListTR'), 
$studentsListTH = document.querySelectorAll('th');

// Соединяем ФИО
function getFullName(name, middleName, sureName ) {
    const fullName = sureName + ' ' + name + ' ' + middleName;
    return fullName;
};

// Исправляем формат даты рождения
function getBirthday(dateBirthday) {
    let birthday = dateBirthday.toISOString().split('T')[0].split('-');
    let correctBirthday = birthday[2] + '.' +  birthday[1] + '.' + birthday[0];

    return correctBirthday;
};

function getAge(correctBirthday) {
    return ` (${((new Date() - new Date(correctBirthday)) / (24 * 3600 * 365.25 * 1000)) | 0 } лет)`;
};

// считаем закончил ли учиться или на каком курсе учится
function getStudyTime(startTraining) {
    let currentTime = new Date();

    if ((currentTime.getMonth() + 1 >= 9 && (currentTime.getFullYear() - startTraining > 4)) || (currentTime.getFullYear() - startTraining > 4) ) {
        return `${+startTraining} - ${+startTraining + 4} (закончил)`; 
    } else {
        return `${+startTraining} - ${+startTraining + 4} (${currentTime.getFullYear() - startTraining}-й курс)`;
    }
};

// получаем таблицу студентов
const $students_list = document.getElementById('students-list')

function newStudentTR(student) {
    const $studentTR = document.createElement('tr'),
        $fioTD = document.createElement('td'),
        $birthdayTD = document.createElement('td'),
        $facultyTD = document.createElement('td'),
        $teachStartTD = document.createElement('td')

    $fioTD.textContent = student['fullName']
    $birthdayTD.textContent = getBirthday(student['birthday']) + getAge(student['birthday']);
    $facultyTD.textContent = student['faculty'];
    $teachStartTD.textContent = getStudyTime(student['teachStart']);
    
    $studentTR.append($fioTD);
    $studentTR.append($birthdayTD);
    $studentTR.append($facultyTD);
    $studentTR.append($teachStartTD);

    return $studentTR;
};

function getFilterInput() {
    const inputFioValueFilter = document.getElementById('filter-fio').value.toLowerCase().trim();
    const inputFacultyValueFilter = document.getElementById('filter-faculty').value.toLowerCase().trim();
    const inputTeachStartValueFilter = document.getElementById('filter-teachStart').value.trim();
    const inputteachFinishValueFilter = document.getElementById('filter-teachFinish').value.trim();

    return {
        inputFioValueFilter,
        inputteachFinishValueFilter,
        inputFacultyValueFilter,
        inputTeachStartValueFilter
    }
}

// сортировка столбцов таблицы по параметрам
let column = '', 
columnDir = true;

function sortedUsersList(arr, prop, dir) {
    const studentsListCopy = [...arr];
    return studentsListCopy.sort( (studentA,studentB) => {
        if (!dir ? studentA[prop] < studentB[prop] : studentA[prop] > studentB[prop]) 
        return -1;
    }); 
}

// фильтрация таблицы
function filterUsersList(arr, prop, value) {
    let resultFilter = [];
    let studentsListCopy = [...arr];

    for (let item of studentsListCopy) {
        if (String(item[prop]).toLowerCase().includes(String(value))) {
            resultFilter.push(item);
        }
    }
    return resultFilter
    
}


// отрисовка таблицы
function render(arr) {
    let studentsListCopy = [...arr];
    
    studentsListCopy = sortedUsersList(studentsList, column, columnDir);

    studentsListCopy = filterUsersList(studentsListCopy, 'fullName', getFilterInput().inputFioValueFilter)
    studentsListCopy = filterUsersList(studentsListCopy, 'faculty', getFilterInput().inputFacultyValueFilter)
    studentsListCopy = filterUsersList(studentsListCopy, 'teachStart', getFilterInput().inputTeachStartValueFilter)
    studentsListCopy = filterUsersList(studentsListCopy, 'teachStart', getFilterInput().inputteachFinishValueFilter)

    

    $students_list.innerHTML = '';
    for (const student of studentsListCopy) {
        $students_list.append(newStudentTR(student));
    }
};


// получаем данные из формы 
document.getElementById('addStudent').addEventListener('submit', function(event) {
    event.preventDefault();
    let newStudent = {
        name: document.getElementById('input-name').value,
        middleName: document.getElementById('input-middleName'),
        sureName: document.getElementById('input-sureName').value,
        fullName: getFullName(document.getElementById('input-sureName').value, document.getElementById('input-name').value, document.getElementById('input-middleName').value),
        teachStart: document.getElementById('input-startTraining').value,
        faculty: document.getElementById('input-faculty').value,
        birthday: new Date(document.getElementById('input-birthday').value),
    };
    console.log(new Date(document.getElementById('input-birthday').value));
    studentsList.push(newStudent);
    render(studentsList);
})

// события клика по заголовкам таблицы для сортировки
$studentsListTH.forEach(element => {
    element.addEventListener('click', function () {
        column = this.dataset.column;
        columnDir = !columnDir
        render(studentsList);
    })
})

// события кнопик фильтрации
document.getElementById('filter-form').addEventListener('submit', function (event) {
    event.preventDefault();
    render(studentsList)
    
})
render(studentsList);[/JS]
</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 29.05.2022, 18:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

kihodo9t,
строка 170

student.teachFinish = $teachStartTD.textContent.match(/\d+/g)[1];


строка 229

studentsListCopy = filterUsersList(studentsListCopy, 'teachFinish', getFilterInput().inputteachFinishValueFilter)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TopAdmin - самые бородатые админы - поддержка, аудит, подбор, консультации, оптимизац borodaserv Работа 0 25.01.2018 01:05
Настройка и ведение контекстной рекламы Директ и Adwords на профессиональном уровне bacon Работа 0 13.01.2018 10:51
Некорректное отображение списка select после фильтрации WebMorda Events/DOM/Window 11 04.04.2017 13:15
Сбивается стиль таблицы при фильтрации Castromen Общие вопросы Javascript 7 16.12.2015 13:07
Профессиональная настройка Яндекс Директ и Google Adwords Alex.Directolog Работа 0 28.08.2015 20:30