Приветствуем вас на форуме проекта WoW Circle. Если вы читаете это, значит не зарегистрировались у нас. Для того, чтобы получить доступ к расширенным возможностям нашего форума нажмите сюда и пройди регистрацию, которая не займет у вас много времени. После регистрации будут доступны новые, более расширенные, возможности.
ToDo менеджер (dailies, cd, etc)

Упомянутые в теме пользователи:

Показано с 1 по 4 из 4

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Почетный флудер Аватар для Hibor
    Регистрация
    24.01.2012
    Сообщений
    2,724
    Поблагодарил(а)
    237
    Получено благодарностей: 533 (сообщений: 460).
    Репутация: 3538

    ToDo менеджер (dailies, cd, etc)

    Искал на днях какой-н todo-менеджер, легкий портативный - под использование с чарами (дейлики, кд проф и в общем задачи).
    Как известно (давным давно копал) приемлемых аддонов на Личе на это нет, если не считать аддоны на локдауны, все приличные появились позже ~10.x.
    Думал уж набросать по-быстрому приложуху, но лень - не люблю возиться с фейсами и работать за собранными на скорую :)
    Так что искал через ИИ ссылки на внешние ("унив-е" приложения), а он мне подсказал отличную мысль - можно же в html банальный скрипт!

    Вот и родилась, а за 15м "созрела" эта "приложуха" на основе веб-странички. Может пригодится.

    От 1й минималки (мин.функционал, редактура структуры - в блокноте, зато скрипт мизерный - сохранение, сброс ручной и авто - просто и надежно как камень)

    миним-ка, для тех кто хочет надежно и на долго (править неудобняк)

    правим/добавляем в скрипте, все понятно (легко подстраивается и фейс/стили):
    class="char-group" - группа
    class="char-name" - название
    class="task" - задача :
    id="mag_daily" - людое уникальное, нагляднее составное от группы и таска
    data-cooldown="daily" - тип кд, варианты daily (сброс по указанному в RESET_HOUR), число часов, или async - вручную
    class="cooldown"> - текстовый вар-т
    Код HTML:
    <!DOCTYPE html>
    <html lang="ru">
    <head>
        <meta charset="UTF-8">
        <title>WoW ToDo Трекер (lite)</title>
        <style>
            body { font-family: 'Segoe UI', Arial, sans-serif; background: #121212; color: #e0e0e0; padding: 25px; margin: 0; }
            .container { max-width: 1500px; margin: 0 auto; background: #1e1e1e; padding: 20px; border-radius: 8px; box-shadow: 0 4px 15px rgba(0,0,0,0.5); }
            
            .header-box { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid #333; padding-bottom: 15px; margin-bottom: 20px; }
            h1 { color: #f5a623; font-size: 22px; margin: 0; }
            
            /* Кнопка ручного сброса всех галочек */
            .reset-btn { background: #c0392b; color: #fff; border: none; padding: 8px 15px; border-radius: 4px; font-weight: bold; cursor: pointer; transition: background 0.2s; }
            .reset-btn:hover { background: #e74c3c; }
    
            /* Сетка в два столбца для групп персонажей */
            .columns-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; }
            
            /* Адаптивность: если окно узкое, переключит в 1 столбец */
               [MENTION=275396]MeDiA[/MENTION] (max-width: 768px) {
                .columns-grid { grid-template-columns: 1fr; }
            }
    
            .char-group { border: 1px solid #2a2a2a; border-radius: 6px; background: #161616; padding: 15px; display: flex; flex-direction: column; }
            .char-name { font-weight: bold; color: #4a90e2; font-size: 16px; margin-bottom: 12px; border-bottom: 1px dashed #333; padding-bottom: 6px; }
            .task { display: flex; align-items: center; margin: 6px 0; font-size: 14px; }
            input[type="checkbox"] { margin-right: 12px; width: 18px; height: 18px; cursor: pointer; accent-color: #f5a623; flex-shrink: 0; }
            .cooldown { color: #888; font-size: 11px; margin-left: auto; background: #222; padding: 2px 6px; border-radius: 4px; border: 1px solid #333; flex-shrink: 0; }
            .checked { color: #666; text-decoration: line-through; }
        </style>
    </head>
    <body>
    
    <div class="container">
        <div class="header-box">
            <h1>Персонажи</h1>
            <button class="reset-btn" id="clear_all_btn">Сбросить всё вручную</button>
        </div>
    
        <!-- НАЧАЛО СЕТКИ В ДВА СТОЛБЦА -->
        <div class="columns-grid">
    
            <!-- СТОЛБЕЦ 1: ПЕРСОНАЖ 1 -->
            <div class="char-group">
                <div class="char-name">Маг (Начертание / Алхимия)</div>
                <div class="task"><input type="checkbox" id="mag_daily" data-cooldown="daily"> <span>Дейлик в кулинарию</span> <span class="cooldown">6:00</span></div>
                <div class="task"><input type="checkbox" id="mag_ink" data-cooldown="daily"> <span>Исследование начертания</span> <span class="cooldown">6:00</span></div>
                <div class="task"><input type="checkbox" id="mag_titan" data-cooldown="20"> <span>Трансмутация: Титановая сталь</span> <span class="cooldown">20 ч</span></div>
            </div>
    
            <!-- СТОЛБЕЦ 2: ПЕРСОНАЖ 2 -->
            <div class="char-group">
                <div class="char-name">Паладин (Ювелирка)</div>
                <div class="task"><input type="checkbox" id="pal_daily" data-cooldown="daily"> <span>Ювелирный дейлик</span> <span class="cooldown">6:00</span></div>
                <div class="task"><input type="checkbox" id="pal_heroic" data-cooldown="daily"> <span>рандом ППг</span> <span class="cooldown">6:00</span></div>
            </div>
    
            <!-- СТОЛБЕЦ 1 (ПРОДОЛЖЕНИЕ): ПЕРСОНАЖ 3 -->
            <div class="char-group">
                <div class="char-name">Друид (Травничество)</div>
                <div class="task"><input type="checkbox" id="dru_olo" data-cooldown="2.5"> <span>Проверить траву на ОЛО</span> <span class="cooldown">2.5 ч</span></div>
            </div>
    
            <!-- СТОЛБЕЦ 2 (ПРОДОЛЖЕНИЕ): ПЕРСОНАЖ 4 -->
            <div class="char-group">
                <div class="char-name">Жрец (Портняжное дело)</div>
                <div class="task"><input type="checkbox" id="priest_cloth" data-cooldown="async"> <span>Сшить Иссиня-черную ткань</span> <span class="cooldown">Без КД</span></div>
                <div class="task"><input type="checkbox" id="priest_weekly" data-cooldown="async"> <span>Сдать реги на еженедельник</span> <span class="cooldown">Вручную</span></div>
            </div>
    
        </div> <!-- КОНЕЦ СЕТКИ -->
    </div>
    
    <script>
        const RESET_HOUR = 6; // Час ежедневного сброса WoW
    
        // Функция проверки наступления 6 утра
        function isDailyResetPast(savedTime) {
            const lastCheck = new Date(savedTime);
            const now = new Date();
            const todayReset = new Date(now.getFullYear(), now.getMonth(), now.getDate(), RESET_HOUR, 0, 0);
            if (now < todayReset) todayReset.setDate(todayReset.getDate() - 1);
            return lastCheck < todayReset;
        }
    
        // Инициализация и автоматическая проверка КД при открытии страницы
        function initTracker() {
            document.querySelectorAll('input[type="checkbox"]').forEach(cb => {
                const savedData = localStorage.getItem(cb.id);
                const taskText = cb.nextElementSibling;
    
                if (savedData) {
                    const data = JSON.parse(savedData);
                    const type = cb.getAttribute('data-cooldown');
                    const now = Date.now();
    
                    let shouldReset = false;
    
                    if (type === 'daily') {
                        shouldReset = isDailyResetPast(data.time);
                    } else if (type !== 'async') {
                        // Почасовое КД (20 часов, 2.5 часа и т.д.)
                        const hoursInMs = parseFloat(type) * 60 * 60 * 1000;
                        shouldReset = (now - data.time) >= hoursInMs;
                    }
    
                    if (shouldReset) {
                        localStorage.removeItem(cb.id);
                        cb.checked = false;
                        taskText.classList.remove('checked');
                    } else {
                        cb.checked = data.checked;
                        if (data.checked) taskText.classList.add('checked');
                    }
                }
    
                // Навешиваем клик на чекбокс (если еще не навешан)
                if (!cb.dataset.hasListener) {
                    cb.addEventListener('change', () => {
                        const tText = cb.nextElementSibling;
                        if (cb.checked) {
                            tText.classList.add('checked');
                            localStorage.setItem(cb.id, JSON.stringify({ checked: true, time: Date.now() }));
                        } else {
                            tText.classList.remove('checked');
                            localStorage.removeItem(cb.id);
                        }
                    });
                    cb.dataset.hasListener = "true";
                }
            });
        }
    
        // Логика для кнопки полного сброса
        document.getElementById('clear_all_btn').addEventListener('click', () => {
            if (confirm('Вы уверены, что хотите сбросить ВСЕ задачи для всех персонажей?')) {
                // Удаляем из локальной памяти только ключи задач (оставляем системные, если будут)
                document.querySelectorAll('input[type="checkbox"]').forEach(cb => {
                    localStorage.removeItem(cb.id);
                    cb.checked = false;
                    cb.nextElementSibling.classList.remove('checked');
                });
            }
        });
    
        // Запуск при старте
        initTracker();
    </script>
    </body>
    </html>
    [свернуть]


    До версии с динамическим наполнением - вообщем-то все что нужно (что быстро в голову пришло):
    Features () :
    • добавление/удаление групп, задач (все в браузере)
    • есть быстрый фильтр - как по задачам, так и по группам (в назв-я групп можно теги проф вставлять к примеру)
    • группа обычно - чар с цветовой дифференциацией классов или общая, если не задать имя, то группа - по классу, общая
    • для группы (чара) есть возможность добавить заметку, с выводом в тултип кнопки
    • текст задачи редактируем (мало ли счетчик)
    • для задачи проставляется кд - виклик (с указанием для недели, по-умолчанию среда), дейлик (сброс в 6, изм. в файле), КД профы (20ч), 2.5ч, без кд (ручной сброс)
    • автосброс чекнутых по условиям кд соответственно - дейлики, виклики и т.д.
    • ручной сброс - только дейлики/всё
    • так как все хранится в кэше браузера (что подвержено "очистить историю") - есть возможность экспорта настроек и соотв. импорта )
    • все стили легко читаемы и изменяемы (кол-во колонок, границы, мин-макс размеры и т.д.)
    • на харде только одна html-ка в 26kb, любой браузeр, легкий код, норм.фейс

    https://disk.yandex.ru/d/QfjOyyuJlGpJjw (обновлено, доп. описание - пост ниже)
    кидаете куда угодно, открываете в браузере, данные хранятся в кэше - бэкапить настроенную структуру не забываем

    1_base.png

    еще скрины элементов

    тип групп (класс, цветовое разделение)
    2_tasktype.png

    кд
    3_cd.png

    редакт задачи
    4_tastedit.png

    заметка группы
    5_note.png

    тултип заметки
    6_tooltip.png
    [свернуть]


    Больше ничего из функционала в голову не пришло (и так все есть, устраивает, пашет норм)
    Поставляется "AS IS", вопросы/ошибки/предложения пусть идут к гуглу.
    Удачи в альтоводстве!

    p.s. «почему не аддон» - кто хочет формить бэк-порт замечательных современных аддонов - буду рад
    Последний раз редактировалось Hibor; 12.08.2026 в 00:07.
    За Альянс! Нет... за Орду! Стой... так за кого там?
    PUG: «Who needs tactics, skill or brain, just out-gear it bro...»

  2. 1 пользователь сказал cпасибо Hibor за это полезное сообщение:

    Bubuzyaka (11.08.2026)

Похожие темы

  1. Ответов: 6
    Последнее сообщение: 11.11.2019, 12:29
  2. Todo
    от Smackofgod в разделе Нарушители
    Ответов: 1
    Последнее сообщение: 13.06.2017, 23:53
  3. Todo bueno
    от Abort в разделе Корзина
    Ответов: 44
    Последнее сообщение: 01.02.2015, 10:22
  4. Ответов: 0
    Последнее сообщение: 20.09.2013, 17:08
  5. ульдуар todo
    от Ramusik в разделе Архив
    Ответов: 478
    Последнее сообщение: 21.02.2013, 19:19

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •