Add calendar toolbox with weekly and monthly scheduling
All checks were successful
Deploy Sokko G / deploy (push) Successful in 14s

This commit is contained in:
Shinuwa 2026-08-20 15:48:24 +02:00
parent 4f73e0068b
commit 992665f4ea
39 changed files with 4331 additions and 36 deletions

View file

@ -40,6 +40,165 @@
"id": "m9",
"type": "timer"
},
{
"id": "md",
"type": "calendar",
"title": "Calendrier hebdomadaire",
"controls": [
{
"group": "Contrôles",
"icon": "calendar",
"title": "Bouton changement de couleur",
"preview": {
"kind": "color"
}
},
{
"group": "Contrôles",
"icon": "refresh",
"title": "Répéter les événements",
"preview": {
"kind": "switch",
"icon": "refresh",
"active": true
}
},
{
"group": "Contrôles",
"icon": "eye-closed",
"title": "Masquer / Afficher les heures inutiles",
"preview": {
"kind": "switch",
"icon": "eye-closed"
}
},
{
"group": "Contrôles",
"icon": "sound-mute",
"title": "Alerte désactivée",
"preview": {
"kind": "iconButton",
"icon": "sound-mute"
}
},
{
"group": "Contrôles",
"icon": "sound-min",
"title": "Alerte sur la page",
"preview": {
"kind": "iconButton",
"icon": "sound-min"
}
},
{
"group": "Contrôles",
"icon": "sound-max",
"title": "Alerte sur le site",
"preview": {
"kind": "iconButton",
"icon": "sound-max"
}
},
{
"group": "Contrôles",
"icon": "trash",
"title": "Bouton supprimer",
"preview": {
"kind": "iconButton",
"icon": "trash",
"danger": true
}
}
],
"importFormat": {
"text": "Exemple texte du calendrier hebdomadaire de démonstration.",
"example": "@viewMode: week\nevent | title=Uturi | day=lundi | start=00:15 | end=00:20\nevent | title=Uturi | day=lundi | start=16:00 | end=16:05\nevent | title=Uturi | day=mardi | start=19:00 | end=19:05\nevent | title=Uturi | day=mercredi | start=22:15 | end=22:20\nevent | title=Uturi | day=jeudi | start=00:15 | end=00:20\nevent | title=Uturi | day=vendredi | start=12:00 | end=12:05\nevent | title=Uturi | day=samedi | start=02:00 | end=02:05\nevent | title=Uturi | day=dimanche | start=12:00 | end=12:05\nevent | title=Garmoth | color=pink | day=lundi | start=14:00 | end=14:05\nevent | title=Garmoth | color=pink | day=mardi | start=14:00 | end=14:05\nevent | title=Garmoth | color=pink | day=mercredi | start=14:00 | end=14:05\nevent | title=Garmoth | color=pink | day=jeudi | start=14:00 | end=14:05\nevent | title=Garmoth | color=pink | day=vendredi | start=14:00 | end=14:05\nevent | title=Garmoth | color=pink | day=samedi | start=14:00 | end=14:05\nevent | title=Garmoth | color=pink | day=dimanche | start=14:00 | end=14:05\nevent | title=Garmoth | color=pink | day=lundi | start=23:15 | end=23:20\nevent | title=Garmoth | color=pink | day=mardi | start=23:15 | end=23:20\nevent | title=Garmoth | color=pink | day=mercredi | start=23:15 | end=23:20\nevent | title=Garmoth | color=pink | day=jeudi | start=23:15 | end=23:20\nevent | title=Garmoth | color=pink | day=vendredi | start=23:15 | end=23:20\nevent | title=Garmoth | color=pink | day=dimanche | start=23:15 | end=23:20\nevent | title=Garmoth | color=pink | day=dimanche | start=19:15 | end=19:20\nevent | title=Vell | color=cyan | day=mercredi | start=19:00 | end=19:05\nevent | title=Vell | color=cyan | day=dimanche | start=16:00 | end=16:05\nevent | title=Maintenance | color=gold | day=jeudi | start=10:00 | end=14:00"
}
},
{
"id": "me",
"type": "calendar",
"title": "Calendrier mensuel",
"controls": [
{
"group": "Contrôles",
"icon": "calendar",
"title": "Bouton changement de couleur",
"preview": {
"kind": "color"
}
},
{
"group": "Contrôles",
"icon": "day-number",
"title": "Numéro de jour",
"preview": {
"kind": "iconButton",
"icon": "day-number"
}
},
{
"group": "Contrôles",
"icon": "day-name",
"title": "Nom de jour",
"preview": {
"kind": "iconButton",
"icon": "day-name"
}
},
{
"group": "Contrôles",
"icon": "refresh",
"title": "Répéter les événements",
"preview": {
"kind": "switch",
"icon": "refresh",
"active": true
}
},
{
"group": "Contrôles",
"icon": "sound-mute",
"title": "Alerte désactivée",
"preview": {
"kind": "iconButton",
"icon": "sound-mute"
}
},
{
"group": "Contrôles",
"icon": "sound-min",
"title": "Alerte sur la page",
"preview": {
"kind": "iconButton",
"icon": "sound-min"
}
},
{
"group": "Contrôles",
"icon": "sound-max",
"title": "Alerte sur le site",
"preview": {
"kind": "iconButton",
"icon": "sound-max"
}
},
{
"group": "Contrôles",
"icon": "trash",
"title": "Bouton supprimer",
"preview": {
"kind": "iconButton",
"icon": "trash",
"danger": true
}
}
],
"importFormat": {
"text": "Exemple texte du calendrier mensuel de démonstration.",
"example": "@viewMode: month\nevent | title=Double EXP 1er Week end du mois | repeatBy=weekday | repeat=none | startDate=2026-08-01 | endDate=2026-08-02\nevent | title=Event de drop rare | color=gold | repeatBy=weekday | repeat=none | startDate=2026-08-18 | endDate=2026-08-25\nevent | title=Maintenance | color=pink | repeatBy=weekday | repeat=weekly | startDate=2026-08-04\nevent | title=Récompenses du 15 | color=green | repeatBy=monthDay | repeat=none | startDate=2026-08-15"
}
},
{
"id": "ma",
"type": "taskPlanner"
@ -54,8 +213,8 @@
}
],
"moduleOrder": {
"one": ["m1", "m2", "m3", "m4", "m5", "m6", "m7", "m8", "m9", "ma", "mb", "mc"],
"two": [["m1", "m2", "m3", "m4", "m5", "m6"], ["m7", "m8", "m9", "ma", "mb", "mc"]]
"one": ["m1", "m2", "m3", "m4", "m5", "m6", "m7", "m8", "m9", "md", "me", "ma", "mb", "mc"],
"two": [["m1", "m2", "m3", "m4", "m5", "m6", "ma"], ["m7", "m8", "m9", "md", "me", "mb", "mc"]]
},
"updatedAt": "2026-08-09T07:34:31.425Z",
"moduleColumns": 1
@ -1325,6 +1484,238 @@
}
]
},
"md": {
"initialized": true,
"events": [
{
"id": "hdl7oex",
"title": "Uturi",
"startMinutes": 15,
"dayIndex": 0,
"endMinutes": 20
},
{
"id": "hgdodzy",
"title": "Uturi",
"startMinutes": 960,
"dayIndex": 0,
"endMinutes": 965
},
{
"id": "hy95mcm",
"title": "Uturi",
"startMinutes": 1140,
"dayIndex": 1,
"endMinutes": 1145
},
{
"id": "hs2tg2h",
"title": "Uturi",
"startMinutes": 1335,
"dayIndex": 2,
"endMinutes": 1340
},
{
"id": "hv903h8",
"title": "Uturi",
"startMinutes": 15,
"dayIndex": 3,
"endMinutes": 20
},
{
"id": "hanpqlt",
"title": "Uturi",
"startMinutes": 720,
"dayIndex": 4,
"endMinutes": 725
},
{
"id": "h0e6ma2",
"title": "Uturi",
"startMinutes": 120,
"dayIndex": 5,
"endMinutes": 125
},
{
"id": "hc3ocs0",
"title": "Uturi",
"startMinutes": 720,
"dayIndex": 6,
"endMinutes": 725
},
{
"id": "hv1i4lf",
"title": "Garmoth",
"startMinutes": 840,
"dayIndex": 0,
"endMinutes": 845,
"color": "pink"
},
{
"id": "h1uz1u2",
"title": "Garmoth",
"startMinutes": 840,
"dayIndex": 1,
"endMinutes": 845,
"color": "pink"
},
{
"id": "hdci41f",
"title": "Garmoth",
"startMinutes": 840,
"dayIndex": 2,
"endMinutes": 845,
"color": "pink"
},
{
"id": "h08ha51",
"title": "Garmoth",
"startMinutes": 840,
"dayIndex": 3,
"endMinutes": 845,
"color": "pink"
},
{
"id": "hnz11qv",
"title": "Garmoth",
"startMinutes": 840,
"dayIndex": 4,
"endMinutes": 845,
"color": "pink"
},
{
"id": "h2dexvq",
"title": "Garmoth",
"startMinutes": 840,
"dayIndex": 5,
"endMinutes": 845,
"color": "pink"
},
{
"id": "hq9ctue",
"title": "Garmoth",
"startMinutes": 840,
"dayIndex": 6,
"endMinutes": 845,
"color": "pink"
},
{
"id": "hfq7scf",
"title": "Garmoth",
"startMinutes": 1395,
"dayIndex": 0,
"endMinutes": 1400,
"color": "pink"
},
{
"id": "hfbeg1y",
"title": "Garmoth",
"startMinutes": 1395,
"dayIndex": 1,
"endMinutes": 1400,
"color": "pink"
},
{
"id": "h2gfv4o",
"title": "Garmoth",
"startMinutes": 1395,
"dayIndex": 2,
"endMinutes": 1400,
"color": "pink"
},
{
"id": "hjjzqfz",
"title": "Garmoth",
"startMinutes": 1395,
"dayIndex": 3,
"endMinutes": 1400,
"color": "pink"
},
{
"id": "h1h2zsd",
"title": "Garmoth",
"startMinutes": 1395,
"dayIndex": 4,
"endMinutes": 1400,
"color": "pink"
},
{
"id": "ht08lsw",
"title": "Garmoth",
"startMinutes": 1395,
"dayIndex": 6,
"endMinutes": 1400,
"color": "pink"
},
{
"id": "h8k8cbm",
"title": "Garmoth",
"startMinutes": 1155,
"dayIndex": 6,
"endMinutes": 1160,
"color": "pink"
},
{
"id": "hzq4r4v",
"title": "Vell",
"startMinutes": 1140,
"dayIndex": 2,
"endMinutes": 1145,
"color": "cyan"
},
{
"id": "hxq7o9p",
"title": "Vell",
"startMinutes": 960,
"dayIndex": 6,
"endMinutes": 965,
"color": "cyan"
},
{
"id": "hfkycds",
"title": "Maintenance",
"startMinutes": 600,
"dayIndex": 3,
"endMinutes": 840,
"color": "gold"
}
]
},
"me": {
"initialized": true,
"viewMode": "month",
"events": [
{
"id": "hpnato7",
"title": "Double EXP 1er Week end du mois",
"startDate": "2026-08-01",
"endDate": "2026-08-02",
"monthlyRepeatBy": "weekday"
},
{
"id": "hdygtpx",
"title": "Event de drop rare",
"startDate": "2026-08-18",
"endDate": "2026-08-25",
"monthlyRepeatBy": "weekday",
"color": "gold"
},
{
"id": "hy8bjtd",
"title": "Maintenance",
"startDate": "2026-08-04",
"repeat": "weekly",
"monthlyRepeatBy": "weekday",
"color": "pink"
},
{
"id": "hytouda",
"title": "Récompenses du 15",
"startDate": "2026-08-15",
"color": "green"
}
]
},
"ma": {
"lastResetAt": 1786226400000,
"hideCompleted": true,

View file

@ -884,6 +884,90 @@
"example": "@activeTab: countdown\nlap | label=Fosse 110 | elapsedMs=1046475\nlap | label=Fosse 55 | elapsedMs=50019\ncountdown | label=Fin de vague infernale | type=time_pattern | alertMode=off | pattern=X:55:X\ncountdown | label=Boss Mondial | type=daily_time | alertMode=off | time=14:00:00\ncountdown | label=Legion | type=interval | alertMode=off | autoRefresh=true | intervalMs=1800000 | startMode=now\ncountdown | label=Durée | type=duration | alertMode=off | durationMs=1800000"
}
},
"calendar": {
"controls": [
{
"group": "Événement",
"icon": "calendar",
"title": "Sélection de créneaux",
"preview": {
"kind": "iconButton",
"icon": "calendar"
}
},
{
"group": "Événement",
"icon": "copy",
"title": "Copier un événement",
"preview": {
"kind": "iconButton",
"icon": "copy"
}
},
{
"group": "Alertes",
"icon": "sound-max",
"title": "Alerte site",
"preview": {
"kind": "iconButton",
"icon": "sound-max"
}
},
{
"group": "Événement",
"icon": "trash",
"title": "Supprimer",
"preview": {
"kind": "iconButton",
"icon": "trash",
"danger": true
}
}
],
"features": [
{
"title": "Vue hebdomadaire",
"text": "Une grille jours par créneaux de 30 minutes pour planifier les événements de session.",
"details": [
"Les heures peuvent être saisies à 5 minutes près.",
"La grille reste lisible dans la toolbox complète et dans le panneau latéral.",
"Les plages vides peuvent être masquées sans retirer l'indicateur de tranche horaire."
]
},
{
"title": "Vue mensuelle",
"text": "Une grille semaines par jours affiche les numéros du mois courant sans nommer le mois.",
"details": [
"Les événements mensuels peuvent cibler un numéro du jour ou un jour de semaine.",
"Les événements multi-jours s'affichent en barre horizontale.",
"Les jours hors mois courant ne sont pas sélectionnables."
]
},
{
"title": "Création rapide",
"text": "Un événement peut être saisi au formulaire ou prérempli en sélectionnant des cellules.",
"details": [
"Un événement peut être ponctuel ou avoir une durée.",
"Dans un calendrier hebdomadaire, les événements se répètent automatiquement chaque semaine.",
"Un événement copié peut être collé sur un autre créneau en conservant durée, couleur et alerte.",
"La couleur permet de distinguer rapidement les catégories d'événements."
]
},
{
"title": "Alertes",
"text": "Les alertes utilisent les mêmes modes que le timer, avec un délai de 5 ou 10 minutes.",
"details": [
"Aucune alerte garde l'événement silencieux.",
"Alerte visible prévient seulement quand la toolbox concernée est ouverte.",
"Alerte site fonctionne sur toute l'application et signale aussi une session déjà en cours une seule fois."
]
}
],
"importFormat": {
"text": "Le calendrier s'échange en lignes texte : une meta @viewMode puis une ligne event par entrée.",
"example": "@viewMode: week\nevent | title=Raid hebdo | day=vendredi | start=18:00 | end=20:00 | color=gold | alertMode=site | alerts=10,5\n\n@viewMode: month\nevent | title=Week-end Double EXP | repeatBy=monthDay | repeat=monthly | startDate=2026-08-07 | endDate=2026-08-09\nevent | title=Maintenance | repeatBy=weekday | repeat=weekly | startDate=2026-08-06 | color=pink"
}
},
"taskPlanner": {
"controls": [
{
@ -1792,6 +1876,81 @@
"renameTitle": "Renommer",
"deleteTitle": "Supprimer"
},
"calendar": {
"init": {
"title": "Créer un calendrier",
"weekly": "Hebdomadaire",
"weeklyDescription": "Grille jours par créneaux de 30 minutes.",
"monthly": "Mensuel",
"monthlyDescription": "Grille mensuelle datée avec navigation.",
"soon": "À venir"
},
"gridLabel": "Calendrier hebdomadaire",
"monthGridLabel": "Calendrier mensuel",
"titleLabel": "Titre",
"titlePlaceholder": "Raid, reset, event...",
"dayLabel": "Jour",
"startDayLabel": "Date début",
"endDayLabel": "Date fin",
"startLabel": "Début",
"endLabel": "Fin",
"alertModeTitle": "Mode d'alerte",
"alertTypeLabel": "Type d'alertes",
"alertOffTitle": "Pas d'alerte",
"alertVisibleTitle": "Alerte quand la toolbox est affichée",
"alertSiteTitle": "Alerte sur tout le site",
"alertOffsetLabel": "Alerte",
"alertOffset10": "10 min avant",
"alertOffset5": "5 min avant",
"alertOffset0": "Au début et pendant",
"alertMessage": "{label} commence bientôt dans {toolbox}.",
"resumeAlertMessage": "{label} est en cours dans {toolbox}.",
"hideEmptyHoursLabel": "Masquer les heures vides",
"colorLabel": "Couleur",
"colorViolet": "Violet",
"colorGold": "Or",
"colorCyan": "Cyan",
"colorPink": "Rose",
"colorGreen": "Vert",
"colorGray": "Gris",
"repeatableTitle": "Répétable",
"repeatLabel": "Répétition",
"repeatNone": "Aucune",
"repeatWeekly": "Chaque semaine",
"repeatMonthly": "Chaque mois",
"monthlyRepeatLabel": "Règle mensuelle",
"monthlyRepeatMonthDay": "Numéro du jour",
"monthlyRepeatWeekday": "Jour de semaine",
"monthDatePickerLabel": "Choisir une date",
"previousMonthTitle": "Mois précédent",
"nextMonthTitle": "Mois suivant",
"currentMonthTitle": "Mois courant",
"previousShortLabel": "Prec.",
"nextShortLabel": "Suiv.",
"importPlaceholder": "@viewMode: week\nevent | title=Raid hebdo | day=vendredi | start=18:00 | end=20:00 | color=gold | alertMode=site | alerts=10,5\n\n@viewMode: month\nevent | title=Maintenance | repeatBy=weekday | repeat=monthly | startDate=2026-08-03 | endDate=2026-08-05 | color=pink",
"importOpenButton": "Importer du texte",
"exportOpenButton": "Exporter en format texte",
"importModalTitle": "Importer un calendrier",
"exportModalTitle": "Exporter un calendrier",
"importButton": "Importer le texte",
"exportButton": "Copier le texte",
"exportInfo": "Format calendrier texte compatible avec les vues hebdomadaire et mensuelle.",
"importSuccess": "Import calendrier terminé.",
"exportSuccess": "Export calendrier copié.",
"importError": "Format de calendrier invalide.",
"addButton": "Ajouter",
"saveButton": "Enregistrer",
"cancelButton": "Annuler",
"editTitle": "Modifier",
"copyTitle": "Copier",
"copiedTitle": "Événement copié.",
"pastedTitle": "Événement collé.",
"deleteTitle": "Supprimer",
"deleteOccurrenceTitle": "Supprimer cette occurrence",
"deleteSeriesTitle": "Supprimer toutes les répétitions",
"requiredError": "Titre, date et heure de début requis.",
"invalidRangeError": "La fin doit être après le début."
},
"taskPlanner": {
"importPlaceholder": "@resetTime: 06:00\n# Raid\n- daily Préparer la route\n @description: Notes rapides\n - unique Sous-tâche",
"importOpenButton": "Importer du texte",