Приложение полностью офлайн, гитхаб френдли ( всегда есть проблема с абсолютными и относительными путями). С возможностью установить как нативное приложение на телефон.Стэк- WASM Cargo Leptos
Browse files.
Стиль Серо- сине - стальной, минималистичный, современный, приятный для глаз.
База данных 100мб+
1.Главный экран. Сверху слева инпут и кнопка Добавить ( добавляется в список фамилия) , справа две кнопки “Импорт”, “Экспорт”. Внизу кнопка " План" (ведёт в окно плана). Нижняя и верхняя панель зафиксированы. При вводе записи и нажатии кнопки в центре добавляется фамилия . Это вертикально скроллируемый список уходящий в невидимую область. Каждая фамилия на главной странице интерактивна и ведет в окно " Карточка сварщика" (КС) . На всех экранах кроме главного , фиксированная кнопка сверху “ На главную”.
2. План. 2.1 Нижняя фиксированная панель подписана Нормы. Слева двойной инпут для артикула и нормы времени /хт637/ 10ч/. При Вводе артикул с нормой отправляются в базу данных. В инпуте при начале ввода Норм происходит подсказка из баззы данных по совпадению. 2.2 Сверху двойной инпут и кнопка “Добавить” | хт637| 6 | . В инпоту тоже подсказка по совпадению из базы данных Норм. В инпут плана можно ввести только то, что есть в базе данных .Запись уходит в вертикальный список ( новая запись сверху) , выглядит так Хт637 6шт ……0 . С этого момента начинается отсчёт( текущий план для данного артикула) записанное количество этого артикула каждого сварщика в КС, суммируется в этот артикул. Например три сварщика выполнили хт637 по 2, в Плане артикул выглядит так Хт637 6шт……….. 6шт. Это значит план выполнен , строка подсвечивается зеленым контуром.
Если ввести в инпут количество 0, это бесконечное количество.
3. "Карточка сварщика" ( КС). Сверху фамилия сварщика, ниже строка ввода разделенная на 2 сектора для артикула и количества, например |хт637| 2 | “Добавить запись”. В этой же строке иконка календарь 📅 ( вызывает интерактивную модалку в виде календаря).
Клик по инпуту вызывает список подсказку из Плана ( текущий план), невозможно ввести артикул, которого нет в плане, или который закрыт ( план выполнен)
Добавленные артикулы формируются в центре экрана в вертикальный скроллируемый список; //последнее изменение в записи всегда сверху, допустим артикул уже в списке, он не на первом месте, но изменение (суммирование или редактирование) ставит его в верх списка, и так для всех артикулов//. Список разделен на блоки по месяцам, хт637 в августе и хт637 в сентябре не суммируются. Новый месячный блок всегда сверху, старый подписанный уходит вниз. Тап или клик по артикулу, который в списке, автоматически подставляет его в строку ввода ( если такой артикул есть в текущем плане), остается только добавить количество. Повторная запись того же артикула суммирует количество ( Например хт52 2шт , хт52 3шт в списке выглядит как хт52 5шт). Долгое нажатие в списке артикулов вызывает диалоговое окно, в котором две функции- функция редактировать артикул ( удалить артикул( корзина) или изменение количества, в соответствии с этим в текущем плане артикула автоматически происходит пересчет )и функция история изменения артикула, сколько раз он менялся и какого числа //например конечное количество хт637 8шт, в меню истории расписывается 08.08 0 -(стрелка) 2шт(добавленно 2шт), 15.08 2- 6 ( добавлено 4шт), 28.08 6- 8 ( добавленно 2шт)//. В модальных окнах история указывается только за текущий месяц, для старого артикула в старом месяце своя история.
. 5 Модалка Календарь. Там происходит распределение времени по ячейкам календаря. Лимит ячеек 8ч, время заливается в день добавления и дальше в будущее. Если в ячейке есть какое то время от прежнего ввода, настоящий ввод добавляет до 8ч и избыток распределяет дальше где есть место. Выходны пропускаются. Исключение - активированные ячейки ( долгий тап), это приоритетные ячейки наполняются временем первые, дальше по стандартной логике. Строго учесть активация не пропадает автоматически, только после повторного тапа. Конвертацию времени в количество делать не нужно, артикул и время вычитать в пропорциях. Например хт637 0,5 шт, = 50% и для количества и для времени. Перенос времени в следующий месяц= переносу такого че процента количества в новый месячный блок. Новый месячный блок формируется когда в него перетекает количество.
- index.html +4 -4
- plan.html +81 -0
- welder-card.html +63 -0
- welders.html +140 -0
|
@@ -56,11 +56,11 @@
|
|
| 56 |
<i data-feather="compass" class="mr-2"></i>
|
| 57 |
Begin Exploration
|
| 58 |
</button>
|
| 59 |
-
<a href="
|
| 60 |
-
<i data-feather="
|
| 61 |
-
|
| 62 |
</a>
|
| 63 |
-
|
| 64 |
</div>
|
| 65 |
|
| 66 |
<div class="mt-16 text-sm text-gray-500 flex items-center">
|
|
|
|
| 56 |
<i data-feather="compass" class="mr-2"></i>
|
| 57 |
Begin Exploration
|
| 58 |
</button>
|
| 59 |
+
<a href="welders.html" class="px-8 py-3 bg-gradient-to-r from-blue-400 to-blue-500 text-white rounded-full font-medium hover:from-blue-500 hover:to-blue-600 transition-all duration-300 flex items-center">
|
| 60 |
+
<i data-feather="user" class="mr-2"></i>
|
| 61 |
+
Welder Tracking
|
| 62 |
</a>
|
| 63 |
+
</div>
|
| 64 |
</div>
|
| 65 |
|
| 66 |
<div class="mt-16 text-sm text-gray-500 flex items-center">
|
|
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Production Plan</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 9 |
+
</head>
|
| 10 |
+
<body class="min-h-screen bg-gray-50">
|
| 11 |
+
<!-- Fixed Top Panel -->
|
| 12 |
+
<div class="fixed top-0 left-0 right-0 bg-white shadow-sm z-10 p-4 flex items-center">
|
| 13 |
+
<a href="welders.html" class="mr-4 text-gray-600 hover:text-gray-800">
|
| 14 |
+
<i data-feather="home"></i>
|
| 15 |
+
</a>
|
| 16 |
+
<h1 class="text-xl font-semibold">Production Plan</h1>
|
| 17 |
+
</div>
|
| 18 |
+
|
| 19 |
+
<!-- Input Section -->
|
| 20 |
+
<div class="mt-16 p-4">
|
| 21 |
+
<div class="bg-white rounded-lg shadow p-4">
|
| 22 |
+
<div class="flex mb-2">
|
| 23 |
+
<input type="text" placeholder="Article" class="flex-1 p-2 border rounded-l">
|
| 24 |
+
<input type="number" placeholder="Qty" class="w-20 p-2 border-t border-b">
|
| 25 |
+
<button class="bg-blue-500 text-white px-4 rounded-r flex items-center">
|
| 26 |
+
<i data-feather="plus" class="mr-2"></i>Add
|
| 27 |
+
</button>
|
| 28 |
+
</div>
|
| 29 |
+
</div>
|
| 30 |
+
</div>
|
| 31 |
+
|
| 32 |
+
<!-- Plan List -->
|
| 33 |
+
<div class="p-4 space-y-4 mb-24">
|
| 34 |
+
<!-- Plan Item (Completed) -->
|
| 35 |
+
<div class="bg-white rounded-lg shadow overflow-hidden completed-plan">
|
| 36 |
+
<div class="p-4">
|
| 37 |
+
<div class="flex items-center">
|
| 38 |
+
<div class="flex-1">
|
| 39 |
+
<div class="font-medium">HT637</div>
|
| 40 |
+
</div>
|
| 41 |
+
<div class="text-green-500 font-medium">6/6</div>
|
| 42 |
+
</div>
|
| 43 |
+
<div class="mt-2 text-sm text-gray-500">
|
| 44 |
+
<div>Johnson: 2, Smith: 2, Williams: 2</div>
|
| 45 |
+
</div>
|
| 46 |
+
</div>
|
| 47 |
+
</div>
|
| 48 |
+
|
| 49 |
+
<!-- Plan Item (In Progress) -->
|
| 50 |
+
<div class="bg-white rounded-lg shadow overflow-hidden">
|
| 51 |
+
<div class="p-4">
|
| 52 |
+
<div class="flex items-center">
|
| 53 |
+
<div class="flex-1">
|
| 54 |
+
<div class="font-medium">HT52</div>
|
| 55 |
+
</div>
|
| 56 |
+
<div class="text-gray-500">3/∞</div>
|
| 57 |
+
</div>
|
| 58 |
+
<div class="mt-2 text-sm text-gray-500">
|
| 59 |
+
<div>Johnson: 1, Williams: 2</div>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
</div>
|
| 63 |
+
</div>
|
| 64 |
+
|
| 65 |
+
<!-- Fixed Bottom Panel -->
|
| 66 |
+
<div class="fixed bottom-0 left-0 right-0 bg-white shadow-md z-10 p-4">
|
| 67 |
+
<div class="font-medium mb-2 text-gray-700">Norms</div>
|
| 68 |
+
<div class="flex">
|
| 69 |
+
<input type="text" placeholder="Article" class="flex-1 p-2 border rounded-l">
|
| 70 |
+
<input type="text" placeholder="Time norm" class="w-24 p-2 border-t border-b">
|
| 71 |
+
<button class="bg-gray-600 text-white px-4 rounded-r flex items-center">
|
| 72 |
+
<i data-feather="plus" class="mr-2"></i>Add
|
| 73 |
+
</button>
|
| 74 |
+
</div>
|
| 75 |
+
</div>
|
| 76 |
+
|
| 77 |
+
<script>
|
| 78 |
+
feather.replace();
|
| 79 |
+
</script>
|
| 80 |
+
</body>
|
| 81 |
+
</html>
|
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Welder Card</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 9 |
+
</head>
|
| 10 |
+
<body class="min-h-screen bg-gray-50">
|
| 11 |
+
<!-- Fixed Top Panel -->
|
| 12 |
+
<div class="fixed top-0 left-0 right-0 bg-white shadow-sm z-10 p-4 flex items-center">
|
| 13 |
+
<a href="welders.html" class="mr-4 text-gray-600 hover:text-gray-800">
|
| 14 |
+
<i data-feather="home"></i>
|
| 15 |
+
</a>
|
| 16 |
+
<h1 class="text-xl font-semibold">Welder Name</h1>
|
| 17 |
+
</div>
|
| 18 |
+
|
| 19 |
+
<!-- Input Section -->
|
| 20 |
+
<div class="mt-16 p-4">
|
| 21 |
+
<div class="bg-white rounded-lg shadow p-4">
|
| 22 |
+
<div class="flex mb-2">
|
| 23 |
+
<input type="text" placeholder="Article" class="flex-1 p-2 border rounded-l">
|
| 24 |
+
<input type="number" placeholder="Qty" class="w-20 p-2 border-t border-b">
|
| 25 |
+
<button class="bg-blue-500 text-white px-4 rounded-r flex items-center">
|
| 26 |
+
<i data-feather="plus" class="mr-2"></i>Add
|
| 27 |
+
</button>
|
| 28 |
+
</div>
|
| 29 |
+
<button class="text-gray-500 mt-2 flex items-center">
|
| 30 |
+
<i data-feather="calendar" class="mr-2"></i>Calendar
|
| 31 |
+
</button>
|
| 32 |
+
</div>
|
| 33 |
+
</div>
|
| 34 |
+
|
| 35 |
+
<!-- Articles List -->
|
| 36 |
+
<div class="p-4 space-y-4 mb-20">
|
| 37 |
+
<!-- Month Divider -->
|
| 38 |
+
<div class="bg-gray-200 px-4 py-2 rounded font-medium">August 2023</div>
|
| 39 |
+
|
| 40 |
+
<!-- Article Items -->
|
| 41 |
+
<div class="bg-white rounded-lg shadow overflow-hidden">
|
| 42 |
+
<div class="p-4 border-b flex items-center">
|
| 43 |
+
<div class="flex-1">
|
| 44 |
+
<div class="font-medium">HT637</div>
|
| 45 |
+
<div class="text-sm text-gray-500">4 pieces</div>
|
| 46 |
+
</div>
|
| 47 |
+
<div class="text-green-500 font-medium">4/6</div>
|
| 48 |
+
</div>
|
| 49 |
+
<div class="p-4 flex items-center">
|
| 50 |
+
<div class="flex-1">
|
| 51 |
+
<div class="font-medium">HT52</div>
|
| 52 |
+
<div class="text-sm text-gray-500">3 pieces</div>
|
| 53 |
+
</div>
|
| 54 |
+
<div class="text-gray-500">3/∞</div>
|
| 55 |
+
</div>
|
| 56 |
+
</div>
|
| 57 |
+
</div>
|
| 58 |
+
|
| 59 |
+
<script>
|
| 60 |
+
feather.replace();
|
| 61 |
+
</script>
|
| 62 |
+
</body>
|
| 63 |
+
</html>
|
|
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Welder Tracking System</title>
|
| 7 |
+
<link rel="manifest" href="/manifest.json">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 10 |
+
<style>
|
| 11 |
+
:root {
|
| 12 |
+
--steel-blue: #4682B4;
|
| 13 |
+
--slate-gray: #708090;
|
| 14 |
+
--light-steel: #B0C4DE;
|
| 15 |
+
}
|
| 16 |
+
body {
|
| 17 |
+
font-family: 'Segoe UI', system-ui, sans-serif;
|
| 18 |
+
background-color: #f8fafc;
|
| 19 |
+
}
|
| 20 |
+
.panel {
|
| 21 |
+
background-color: white;
|
| 22 |
+
border: 1px solid #e2e8f0;
|
| 23 |
+
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
|
| 24 |
+
}
|
| 25 |
+
.input-field {
|
| 26 |
+
border: 1px solid #cbd5e1;
|
| 27 |
+
transition: border-color 0.2s;
|
| 28 |
+
}
|
| 29 |
+
.input-field:focus {
|
| 30 |
+
border-color: var(--steel-blue);
|
| 31 |
+
outline: none;
|
| 32 |
+
}
|
| 33 |
+
.btn-primary {
|
| 34 |
+
background-color: var(--steel-blue);
|
| 35 |
+
color: white;
|
| 36 |
+
transition: background-color 0.2s;
|
| 37 |
+
}
|
| 38 |
+
.btn-primary:hover {
|
| 39 |
+
background-color: #3a6d96;
|
| 40 |
+
}
|
| 41 |
+
.btn-secondary {
|
| 42 |
+
background-color: var(--slate-gray);
|
| 43 |
+
color: white;
|
| 44 |
+
transition: background-color 0.2s;
|
| 45 |
+
}
|
| 46 |
+
.btn-secondary:hover {
|
| 47 |
+
background-color: #5f6e7e;
|
| 48 |
+
}
|
| 49 |
+
.completed-plan {
|
| 50 |
+
border-left: 4px solid #10b981;
|
| 51 |
+
}
|
| 52 |
+
.month-divider {
|
| 53 |
+
background-color: var(--light-steel);
|
| 54 |
+
}
|
| 55 |
+
</style>
|
| 56 |
+
</head>
|
| 57 |
+
<body class="min-h-screen flex flex-col">
|
| 58 |
+
<!-- Fixed Top Panel -->
|
| 59 |
+
<div class="fixed top-0 left-0 right-0 bg-white shadow-sm z-10 p-4 flex items-center">
|
| 60 |
+
<a href="index.html" class="mr-4 text-gray-600 hover:text-gray-800">
|
| 61 |
+
<i data-feather="home"></i>
|
| 62 |
+
</a>
|
| 63 |
+
<input type="text" placeholder="Add welder's name" class="input-field flex-1 px-4 py-2 rounded-l">
|
| 64 |
+
<button class="btn-primary px-4 py-2 rounded-r">
|
| 65 |
+
<i data-feather="plus" class="mr-2"></i>Add
|
| 66 |
+
</button>
|
| 67 |
+
<div class="ml-auto flex space-x-2">
|
| 68 |
+
<button class="btn-secondary px-3 py-2 rounded">
|
| 69 |
+
<i data-feather="download" class="mr-2"></i>Import
|
| 70 |
+
</button>
|
| 71 |
+
<button class="btn-secondary px-3 py-2 rounded">
|
| 72 |
+
<i data-feather="upload" class="mr-2"></i>Export
|
| 73 |
+
</button>
|
| 74 |
+
</div>
|
| 75 |
+
</div>
|
| 76 |
+
|
| 77 |
+
<!-- Main Content -->
|
| 78 |
+
<main class="flex-1 mt-20 mb-24 p-4 overflow-y-auto">
|
| 79 |
+
<!-- Welder's List -->
|
| 80 |
+
<div id="welders-list" class="space-y-2">
|
| 81 |
+
<!-- Welder items will be added here dynamically -->
|
| 82 |
+
</div>
|
| 83 |
+
</main>
|
| 84 |
+
|
| 85 |
+
<!-- Fixed Bottom Panel -->
|
| 86 |
+
<div class="fixed bottom-0 left-0 right-0 bg-white shadow-md z-10 p-4">
|
| 87 |
+
<button id="plan-btn" class="btn-primary w-full py-3 rounded flex items-center justify-center">
|
| 88 |
+
<i data-feather="clipboard" class="mr-2"></i>Plan
|
| 89 |
+
</button>
|
| 90 |
+
</div>
|
| 91 |
+
|
| 92 |
+
<script>
|
| 93 |
+
// Initialize feather icons
|
| 94 |
+
feather.replace();
|
| 95 |
+
|
| 96 |
+
// Sample data for demonstration
|
| 97 |
+
const welders = [
|
| 98 |
+
{ id: 1, name: "Smith" },
|
| 99 |
+
{ id: 2, name: "Johnson" },
|
| 100 |
+
{ id: 3, name: "Williams" }
|
| 101 |
+
];
|
| 102 |
+
|
| 103 |
+
// Render welder's list
|
| 104 |
+
const weldersList = document.getElementById('welders-list');
|
| 105 |
+
welders.forEach(welder => {
|
| 106 |
+
const welderItem = document.createElement('div');
|
| 107 |
+
welderItem.className = 'panel p-4 rounded-lg cursor-pointer transition hover:bg-gray-50';
|
| 108 |
+
welderItem.innerHTML = `
|
| 109 |
+
<div class="flex items-center">
|
| 110 |
+
<i data-feather="user" class="text-gray-500 mr-3"></i>
|
| 111 |
+
<span class="font-medium">${welder.name}</span>
|
| 112 |
+
<i data-feather="chevron-right" class="ml-auto text-gray-400"></i>
|
| 113 |
+
</div>
|
| 114 |
+
`;
|
| 115 |
+
welderItem.addEventListener('click', () => {
|
| 116 |
+
window.location.href = `welder-card.html?id=${welder.id}`;
|
| 117 |
+
});
|
| 118 |
+
weldersList.appendChild(welderItem);
|
| 119 |
+
});
|
| 120 |
+
|
| 121 |
+
// Plan button click handler
|
| 122 |
+
document.getElementById('plan-btn').addEventListener('click', () => {
|
| 123 |
+
window.location.href = 'plan.html';
|
| 124 |
+
});
|
| 125 |
+
|
| 126 |
+
// Service worker registration for PWA
|
| 127 |
+
if ('serviceWorker' in navigator) {
|
| 128 |
+
window.addEventListener('load', () => {
|
| 129 |
+
navigator.serviceWorker.register('/sw.js')
|
| 130 |
+
.then(registration => {
|
| 131 |
+
console.log('ServiceWorker registration successful');
|
| 132 |
+
})
|
| 133 |
+
.catch(err => {
|
| 134 |
+
console.log('ServiceWorker registration failed: ', err);
|
| 135 |
+
});
|
| 136 |
+
});
|
| 137 |
+
}
|
| 138 |
+
</script>
|
| 139 |
+
</body>
|
| 140 |
+
</html>
|