( function () {
    // Создаем и возвращаем заголовок приложения
    function createAppTitle (title) {
        let appTitle = document.createElement('h2');
        appTitle.innerHTML = title;
        return appTitle;
    };
    
    // Создаем и возвращаем форму для создания дела
    function createTodoItemForm () {
        let form = document.createElement('form');
        let input = document.createElement('input');
        let wrapperButton = document.createElement('div');
        let button = document.createElement('button');
        input.type = 'text';
        input.placeholder = 'Введите название нового дела';
        form.classList.add('input-group', 'mb-3');
        input.classList.add('form-control');
        wrapperButton.classList.add('input-group-append');
        button.classList.add('btn', 'btn-primary');
        button.disabled = true;
        button.textContent = 'Добавить';
        form.append(input);
        form.append(wrapperButton);
        wrapperButton.append(button);
        input.addEventListener('input', function(e) {
            e.preventDefault();
            if (input.value.length > 0) {
            button.disabled = false;
            } else if (input.value.length == 0) {
            button.disabled = true;                        
        }
        });
            
        
        return {
            form,
            input,
            button,
        }
    };
    // Создаем и возвращаем список элементов
    function createTodoList () {
        ul = document.createElement('ul');
        ul.classList.add('list-group');
        return ul;
    }
    // Создаем и возвращаем элементы для создания списка дел
    function createTodoItem(name) {
        let item = document.createElement('li');
        // Кнопки помещаем в элемент, который красиво покажет их в одной группе
        let buttonGroup = document.createElement('div');
        let doneButton = document.createElement('button');
        let deleteButton = document.createElement('button');
        // Устанавливаем стили для элемента списка, а так же для размещения кнопок в его правой части с помощью flex
        item.classList.add('list-group-item', 'd-flex', 'justify-content-between', 'align-items-center');
        item.textContent = name;
        buttonGroup.classList.add('btn-group', 'btn-group-sm');
        doneButton.classList.add('btn', 'btn-success')
        doneButton.textContent = 'Готово';
        deleteButton.classList.add('btn', 'btn-danger');
        deleteButton.textContent = 'Удалить';
        // Вкладываем кнопки в отдельный элемент, чтобы они обьединились в один блок
        buttonGroup.append(doneButton);
        buttonGroup.append(deleteButton);
        item.append(buttonGroup);
        // приложению нужен доступ к самому элементу и кнопкам, чтобы обрабатывать события нажатия
        return {
            item, 
            doneButton,
            deleteButton,
        }
    }
    function createTodoApp(container, title) {
        
        let TodoAppTitle = createAppTitle (title);
        let TodoItemForm = createTodoItemForm ();
        let todoList = createTodoList ();
        
        container.append(TodoAppTitle);
        container.append(TodoItemForm.form);
        container.append(todoList);
        
        // Браузер создает событие submit на форме по нажатию на Enter или на кнопку создания дела
        TodoItemForm.form.addEventListener('submit', function(e) {
            //эта строчка необходима чтобы предотвратить стандартное действие браузера, в данном случае мы не хотим чтобы страница перезагружалась при отправке формы
            e.preventDefault();
            // игнорируем создание элемента, если пользователь ничего не ввел в поле
            if (!TodoItemForm.input.value) {
                return;
            }
            let object = {
                name: TodoItemForm.input.value,
                done: false,
            }
            let {name, done} = object
            let todoItem = createTodoItem(JSON.stringify(object));
            todoItem.doneButton.addEventListener('click', function() {
            todoItem.item.classList.toggle('list-group-item-success');
            if (todoItem.item.classList.contains('list-group-item-success')) {
                console.log('ПРивет')
            } else {object.done = 'false';}
            });
            todoItem.deleteButton.addEventListener('click', function() {
                if (confirm('Вы уверены?')) {
                    todoItem.item.remove();
                }
            });
            todoList.append(todoItem.item);
            TodoItemForm.input.value = '';
        });
    }
    window.createTodoApp = createTodoApp;
}) ();
Этап 1
Измените функцию создания дела, чтобы она принимала и корректно обрабатывала объект { name, done }, а не просто название. Это пригодится для преобразования объекта дела в DOM-элемент.(Этот пункт мне сделать удалось, прошу подсказать правильно ли?) 
Этап 2
Сделайте так, чтобы у кнопки в форме устанавливался атрибут disabled, когда поле ввода пустое. Не забудьте, что disabled должен устанавливаться и при загрузке приложения, так как изначально поле тоже пустое. (Данный пункт я так же выполнил, прошу проверить правильность выполнения)
Этап 3
Каждое созданное дело должно храниться в массиве дел в виде объекта. При создании нового дела в массив должен добавляться новый объект с тремя параметрами: name — название дела, done — статус дела, который может принимать значения true или false, и id — уникальный числовой параметр.
Чтобы сгенерировать id, вы можете выбрать один из двух способов:
Для каждого нового объекта (дела) можно генерировать id с произвольным, рандомным числом.
Написать функцию, которая будет искать максимальный id в массиве дел и прибавлять к максимальному id число 1.
Пример массива с объектами дел
[
    {id: 1, name: ‘Купить хлеб', done: false},
    {id: 2, name: ‘Покормить кота’, done: true},
    {id: 3, name: ‘Сделать задание по JS’, done: true}
]
Этап 4
Сделайте так, чтобы при нажатии на кнопку «Удалить» удалялся не только DOM-элемент li из DOM-дерева, но и объект в массиве дел. Для решения этой задачи при клике на кнопку «Удалить» необходимо найти в массиве дел объект с таким же id и удалить его. Искать элементы в массиве вы уже умеете.
Так же поступите и с кнопкой изменения статуса. При клике на неё найдите в массиве объектов нужный объект и измените параметр done на противоположный.
Этап 5
Создайте функцию сохранения массива дел в localStorage. Вызывайте функцию сохранения каждый раз, когда вы изменяете список дел, а именно: добавляете новое дело, удаляете дело или изменяете статус.
Перед выполнением этого этапа рекомендуем почитать материалы:
JSON.stringify 
JSON.parse 
Window.localStorage
Учтите, что список дел разный для каждой страницы, поэтому нужно использовать разные ключи в localStorage. Ключ можно передавать отдельным параметром в createTodoApp.
Добавьте в функцию createTodoApp() третий параметр listName, который поможет вам создать собственный список для каждого пользователя.
Пример запуска приложения на странице пользователя:
document.addEventListener('DOMContentLoaded', function(){
      createTodoApp(document.getElementById('todo-app'), 'Мои дела', 'my');
});
Этап 6
Сейчас ваше приложение может сохранять список дел. На данном этапе нужно сделать так, чтобы при запуске приложения в функции createTodoApp() была выполнена проверка на наличие данных в localStorage. Если в localStorage есть данные, то их нужно расшифровать и полученный массив отрисовать на экране в виде DOM-элементов списка.
Критерии оценки
При работе приложения в браузере не должны возникать ошибки в консоли.
Список дел должен сохраняться: при обновлении страницы сохранённый список должен отображаться на экране.