mantenimento-app 2.1.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/app.js CHANGED
@@ -1,26 +1,26 @@
1
1
  const defaultExpenseItems = [
2
- { label: "Affitto", help: "Canone mensile di locazione dell'abitazione." },
3
- { label: "Mutuo casa", help: "Rata mensile del mutuo abitazione." },
4
- { label: "Casa (valore locativo)", help: "Valore locativo teorico della casa in uso, se rilevante." },
5
- { label: "Utenze", help: "Luce, gas, acqua, internet e altre utenze domestiche." },
6
- { label: "Cibo/Alimenti", help: "Spesa alimentare mensile imputabile al nucleo familiare." },
7
- { label: "Abbigliamento", help: "Spese medie mensili per abbigliamento dei figli." },
8
- { label: "Finanziamenti in corso (extra mutuo)", help: "Rate mensili di finanziamenti diversi dal mutuo." },
9
- { label: "Spese macchina", help: "Carburante, assicurazione, bollo, manutenzione ordinaria." },
10
- { label: "Amministrazione condominio", help: "Quote condominiali ordinarie e costi amministrativi ricorrenti." },
11
- { label: "Spese scolastiche/mensa", help: "Costi scolastici ricorrenti, mensa e contributi periodici." },
12
- { label: "Spese sanitarie ricorrenti", help: "Farmaci, visite periodiche e terapie ricorrenti." },
13
- { label: "Sport/attivita figli", help: "Costi medi mensili per sport e attivita extrascolastiche." }
2
+ { label: "🏠 Affitto", help: "Canone mensile di locazione dell'abitazione." },
3
+ { label: "🏦 Mutuo casa", help: "Rata mensile del mutuo abitazione." },
4
+ { label: "🏡 Casa (valore locativo)", help: "Valore locativo teorico della casa in uso, se rilevante." },
5
+ { label: "💡 Utenze", help: "Luce, gas, acqua, internet e altre utenze domestiche." },
6
+ { label: "🛒 Cibo/Alimenti", help: "Spesa alimentare mensile imputabile al nucleo familiare." },
7
+ { label: "👕 Abbigliamento", help: "Spese medie mensili per abbigliamento dei figli." },
8
+ { label: "💳 Finanziamenti in corso (extra mutuo)", help: "Rate mensili di finanziamenti diversi dal mutuo." },
9
+ { label: "🚗 Spese macchina", help: "Carburante, assicurazione, bollo, manutenzione ordinaria." },
10
+ { label: "🏢 Amministrazione condominio", help: "Quote condominiali ordinarie e costi amministrativi ricorrenti." },
11
+ { label: "🎒 Spese scolastiche/mensa", help: "Costi scolastici ricorrenti, mensa e contributi periodici." },
12
+ { label: "🩺 Spese sanitarie ricorrenti", help: "Farmaci, visite periodiche e terapie ricorrenti." },
13
+ { label: "Sport/attivita figli", help: "Costi medi mensili per sport e attivita extrascolastiche." }
14
14
  ];
15
15
  const suggestedExpenseCatalog = [
16
- { label: "Trasporto scolastico", help: "Abbonamenti bus/treno, navetta scolastica o carburante dedicato ai trasferimenti scuola." },
17
- { label: "Libri e materiale didattico", help: "Testi scolastici, quaderni, cancelleria e materiali ricorrenti per lo studio." },
18
- { label: "Doposcuola / ripetizioni", help: "Supporto didattico continuativo o corsi di recupero con cadenza periodica." },
19
- { label: "Centro estivo", help: "Quota media mensile stimata per centri estivi e attivita educative stagionali." },
20
- { label: "Spese mediche non coperte SSN", help: "Visite specialistiche, terapie e farmaci ricorrenti non totalmente rimborsati." },
21
- { label: "Attivita artistiche/musicali", help: "Corsi ricorrenti (musica, teatro, danza) e quote di frequenza periodiche." },
22
- { label: "Tecnologia per studio", help: "Canone internet, software didattici e strumenti digitali con costo ricorrente." },
23
- { label: "Abbigliamento stagionale figli", help: "Spesa periodica media per rinnovo abbigliamento in relazione alla stagione." }
16
+ { label: "🚌 Trasporto scolastico", help: "Abbonamenti bus/treno, navetta scolastica o carburante dedicato ai trasferimenti scuola." },
17
+ { label: "📚 Libri e materiale didattico", help: "Testi scolastici, quaderni, cancelleria e materiali ricorrenti per lo studio." },
18
+ { label: "✏️ Doposcuola / ripetizioni", help: "Supporto didattico continuativo o corsi di recupero con cadenza periodica." },
19
+ { label: "☀️ Centro estivo", help: "Quota media mensile stimata per centri estivi e attivita educative stagionali." },
20
+ { label: "🔬 Spese mediche non coperte SSN", help: "Visite specialistiche, terapie e farmaci ricorrenti non totalmente rimborsati." },
21
+ { label: "🎨 Attivita artistiche/musicali", help: "Corsi ricorrenti (musica, teatro, danza) e quote di frequenza periodiche." },
22
+ { label: "💻 Tecnologia per studio", help: "Canone internet, software didattici e strumenti digitali con costo ricorrente." },
23
+ { label: "🧥 Abbigliamento stagionale figli", help: "Spesa periodica media per rinnovo abbigliamento in relazione alla stagione." }
24
24
  ];
25
25
  let expenseItems = defaultExpenseItems.map((item) => ({ ...item }));
26
26
  let scenarioLab = [];
@@ -1185,8 +1185,20 @@ const defaultExpenseItems = [
1185
1185
  function normalizeExpenseItem(item, fallbackIdx = 0) {
1186
1186
  const rawLabel = String(item && item.label ? item.label : "").trim();
1187
1187
  const rawHelp = String(item && item.help ? item.help : "").trim();
1188
- const label = rawLabel || `Voce personalizzata ${fallbackIdx + 1}`;
1189
- const help = rawHelp || `Voce aggiunta manualmente: ${label}.`;
1188
+ // Strip leading non-letter characters (emoji, spaces) for default-item matching.
1189
+ const stripLeading = (s) => s.replace(/^[^A-Za-z\u00C0-\u024F]+/, "").trim();
1190
+ const strippedRaw = stripLeading(rawLabel);
1191
+ // If the saved label matches a default item (with or without emoji prefix), use
1192
+ // the current default label (so emoji survive save/load round-trips).
1193
+ const defaultMatch = strippedRaw
1194
+ ? defaultExpenseItems.find((d) => stripLeading(d.label) === strippedRaw)
1195
+ : null;
1196
+ const label = defaultMatch
1197
+ ? defaultMatch.label
1198
+ : (rawLabel || `Voce personalizzata ${fallbackIdx + 1}`);
1199
+ const help = defaultMatch
1200
+ ? defaultMatch.help
1201
+ : (rawHelp || `Voce aggiunta manualmente: ${label}.`);
1190
1202
  return { label, help };
1191
1203
  }
1192
1204
 
@@ -1,26 +1,26 @@
1
1
  const defaultExpenseItems = [
2
- { label: "Affitto", help: "Canone mensile di locazione dell'abitazione." },
3
- { label: "Mutuo casa", help: "Rata mensile del mutuo abitazione." },
4
- { label: "Casa (valore locativo)", help: "Valore locativo teorico della casa in uso, se rilevante." },
5
- { label: "Utenze", help: "Luce, gas, acqua, internet e altre utenze domestiche." },
6
- { label: "Cibo/Alimenti", help: "Spesa alimentare mensile imputabile al nucleo familiare." },
7
- { label: "Abbigliamento", help: "Spese medie mensili per abbigliamento dei figli." },
8
- { label: "Finanziamenti in corso (extra mutuo)", help: "Rate mensili di finanziamenti diversi dal mutuo." },
9
- { label: "Spese macchina", help: "Carburante, assicurazione, bollo, manutenzione ordinaria." },
10
- { label: "Amministrazione condominio", help: "Quote condominiali ordinarie e costi amministrativi ricorrenti." },
11
- { label: "Spese scolastiche/mensa", help: "Costi scolastici ricorrenti, mensa e contributi periodici." },
12
- { label: "Spese sanitarie ricorrenti", help: "Farmaci, visite periodiche e terapie ricorrenti." },
13
- { label: "Sport/attivita figli", help: "Costi medi mensili per sport e attivita extrascolastiche." }
2
+ { label: "🏠 Affitto", help: "Canone mensile di locazione dell'abitazione." },
3
+ { label: "🏦 Mutuo casa", help: "Rata mensile del mutuo abitazione." },
4
+ { label: "🏡 Casa (valore locativo)", help: "Valore locativo teorico della casa in uso, se rilevante." },
5
+ { label: "💡 Utenze", help: "Luce, gas, acqua, internet e altre utenze domestiche." },
6
+ { label: "🛒 Cibo/Alimenti", help: "Spesa alimentare mensile imputabile al nucleo familiare." },
7
+ { label: "👕 Abbigliamento", help: "Spese medie mensili per abbigliamento dei figli." },
8
+ { label: "💳 Finanziamenti in corso (extra mutuo)", help: "Rate mensili di finanziamenti diversi dal mutuo." },
9
+ { label: "🚗 Spese macchina", help: "Carburante, assicurazione, bollo, manutenzione ordinaria." },
10
+ { label: "🏢 Amministrazione condominio", help: "Quote condominiali ordinarie e costi amministrativi ricorrenti." },
11
+ { label: "🎒 Spese scolastiche/mensa", help: "Costi scolastici ricorrenti, mensa e contributi periodici." },
12
+ { label: "🩺 Spese sanitarie ricorrenti", help: "Farmaci, visite periodiche e terapie ricorrenti." },
13
+ { label: "Sport/attivita figli", help: "Costi medi mensili per sport e attivita extrascolastiche." }
14
14
  ];
15
15
  const suggestedExpenseCatalog = [
16
- { label: "Trasporto scolastico", help: "Abbonamenti bus/treno, navetta scolastica o carburante dedicato ai trasferimenti scuola." },
17
- { label: "Libri e materiale didattico", help: "Testi scolastici, quaderni, cancelleria e materiali ricorrenti per lo studio." },
18
- { label: "Doposcuola / ripetizioni", help: "Supporto didattico continuativo o corsi di recupero con cadenza periodica." },
19
- { label: "Centro estivo", help: "Quota media mensile stimata per centri estivi e attivita educative stagionali." },
20
- { label: "Spese mediche non coperte SSN", help: "Visite specialistiche, terapie e farmaci ricorrenti non totalmente rimborsati." },
21
- { label: "Attivita artistiche/musicali", help: "Corsi ricorrenti (musica, teatro, danza) e quote di frequenza periodiche." },
22
- { label: "Tecnologia per studio", help: "Canone internet, software didattici e strumenti digitali con costo ricorrente." },
23
- { label: "Abbigliamento stagionale figli", help: "Spesa periodica media per rinnovo abbigliamento in relazione alla stagione." }
16
+ { label: "🚌 Trasporto scolastico", help: "Abbonamenti bus/treno, navetta scolastica o carburante dedicato ai trasferimenti scuola." },
17
+ { label: "📚 Libri e materiale didattico", help: "Testi scolastici, quaderni, cancelleria e materiali ricorrenti per lo studio." },
18
+ { label: "✏️ Doposcuola / ripetizioni", help: "Supporto didattico continuativo o corsi di recupero con cadenza periodica." },
19
+ { label: "☀️ Centro estivo", help: "Quota media mensile stimata per centri estivi e attivita educative stagionali." },
20
+ { label: "🔬 Spese mediche non coperte SSN", help: "Visite specialistiche, terapie e farmaci ricorrenti non totalmente rimborsati." },
21
+ { label: "🎨 Attivita artistiche/musicali", help: "Corsi ricorrenti (musica, teatro, danza) e quote di frequenza periodiche." },
22
+ { label: "💻 Tecnologia per studio", help: "Canone internet, software didattici e strumenti digitali con costo ricorrente." },
23
+ { label: "🧥 Abbigliamento stagionale figli", help: "Spesa periodica media per rinnovo abbigliamento in relazione alla stagione." }
24
24
  ];
25
25
  let expenseItems = defaultExpenseItems.map((item) => ({ ...item }));
26
26
  let scenarioLab = [];
@@ -1185,8 +1185,20 @@ const defaultExpenseItems = [
1185
1185
  function normalizeExpenseItem(item, fallbackIdx = 0) {
1186
1186
  const rawLabel = String(item && item.label ? item.label : "").trim();
1187
1187
  const rawHelp = String(item && item.help ? item.help : "").trim();
1188
- const label = rawLabel || `Voce personalizzata ${fallbackIdx + 1}`;
1189
- const help = rawHelp || `Voce aggiunta manualmente: ${label}.`;
1188
+ // Strip leading non-letter characters (emoji, spaces) for default-item matching.
1189
+ const stripLeading = (s) => s.replace(/^[^A-Za-z\u00C0-\u024F]+/, "").trim();
1190
+ const strippedRaw = stripLeading(rawLabel);
1191
+ // If the saved label matches a default item (with or without emoji prefix), use
1192
+ // the current default label (so emoji survive save/load round-trips).
1193
+ const defaultMatch = strippedRaw
1194
+ ? defaultExpenseItems.find((d) => stripLeading(d.label) === strippedRaw)
1195
+ : null;
1196
+ const label = defaultMatch
1197
+ ? defaultMatch.label
1198
+ : (rawLabel || `Voce personalizzata ${fallbackIdx + 1}`);
1199
+ const help = defaultMatch
1200
+ ? defaultMatch.help
1201
+ : (rawHelp || `Voce aggiunta manualmente: ${label}.`);
1190
1202
  return { label, help };
1191
1203
  }
1192
1204
 
@@ -515,6 +515,6 @@
515
515
  <script src="supabase.min.js"></script>
516
516
  <script src="fabric.min.js"></script>
517
517
  <script src="html2pdf.bundle.min.js"></script>
518
- <script src="app.js?v=2.1.0"></script>
518
+ <script src="app.js?v=2.1.1"></script>
519
519
  </body>
520
520
  </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mantenimento-app",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "description": "Frontend + backend architecture for the mantenimento calculator",
5
5
  "type": "commonjs",
6
6
  "main": "backend/calculate-model.js",