diff --git a/src/modules/mini-utilities/components/mini-utilities-module.tsx b/src/modules/mini-utilities/components/mini-utilities-module.tsx
index 9aeb235..b5cc2d7 100644
--- a/src/modules/mini-utilities/components/mini-utilities-module.tsx
+++ b/src/modules/mini-utilities/components/mini-utilities-module.tsx
@@ -22,6 +22,10 @@ import {
ArrowDown,
Unlock,
PenTool,
+ Maximize2,
+ LayoutGrid,
+ Plus,
+ X,
} from "lucide-react";
import { Button } from "@/shared/components/ui/button";
import { Input } from "@/shared/components/ui/input";
@@ -212,13 +216,18 @@ function PercentageCalculator() {
);
}
+const TVA_PRESETS = [5, 9, 19, 21];
+
function TvaCalculator() {
- const TVA_RATE = 19; // Romania standard VAT
+ const [tvaRate, setTvaRate] = useState(19);
+ const [customRate, setCustomRate] = useState("");
const [amount, setAmount] = useState("");
const [mode, setMode] = useState<"add" | "extract">("add");
+ const effectiveRate =
+ customRate !== "" ? parseFloat(customRate) || tvaRate : tvaRate;
const val = parseFloat(amount);
- const tvaMultiplier = TVA_RATE / 100;
+ const tvaMultiplier = effectiveRate / 100;
const cuTva = !isNaN(val) && mode === "add" ? val * (1 + tvaMultiplier) : NaN;
const faraTva =
@@ -239,6 +248,38 @@ function TvaCalculator() {
return (
+ {/* Rate selector */}
+
+
+
+ {TVA_PRESETS.map((r) => (
+
+ ))}
+
+ setCustomRate(e.target.value)}
+ placeholder="Altă cotă"
+ className="w-28 text-sm"
+ />
+ {customRate && (
+ %
+ )}
+
+
+
)}
+ {entry.additionalUsers &&
+ entry.additionalUsers.length > 0 && (
+
+
+ +{entry.additionalUsers.length} utilizator
+ {entry.additionalUsers.length > 1 ? "i" : ""}
+
+ )}
{/* WiFi QR button */}
@@ -695,6 +710,12 @@ function VaultForm({
const [customFields, setCustomFields] = useState(
initial?.customFields ?? [],
);
+ const [additionalUsers, setAdditionalUsers] = useState(
+ initial?.additionalUsers ?? [],
+ );
+ const [showAdditionalUsers, setShowAdditionalUsers] = useState(
+ (initial?.additionalUsers?.length ?? 0) > 0,
+ );
// Password generator state
const [genLength, setGenLength] = useState(16);
@@ -750,6 +771,7 @@ function VaultForm({
company,
notes,
customFields: customFields.filter((cf) => cf.key.trim()),
+ additionalUsers: additionalUsers.filter((u) => u.username.trim() || u.password.trim()),
tags: initial?.tags ?? [],
visibility: initial?.visibility ?? "admin",
});
@@ -1024,6 +1046,127 @@ function VaultForm({
)}
+ {/* Additional users */}
+
+
setShowAdditionalUsers((v) => !v)}
+ >
+
+ Utilizatori suplimentari
+ {additionalUsers.length > 0 && (
+
+ {additionalUsers.length}
+
+ )}
+ {showAdditionalUsers ? (
+
+ ) : (
+
+ )}
+
+ {showAdditionalUsers && (
+
+
+ Adaugă credențiale suplimentare pentru același cont (ex: mai mulți angajați cu acces).
+
+ {additionalUsers.map((u, i) => (
+
+
+ setAdditionalUsers((prev) => prev.filter((_, idx) => idx !== i))
+ }
+ >
+
+
+
+ Utilizator {i + 1}
+
+
+
+
+
+ setAdditionalUsers((prev) =>
+ prev.map((x, idx) =>
+ idx === i ? { ...x, password: e.target.value } : x,
+ ),
+ )
+ }
+ className="mt-0.5 text-sm font-mono h-8"
+ placeholder="parolă"
+ />
+
+
+
+
+ setAdditionalUsers((prev) =>
+ prev.map((x, idx) =>
+ idx === i ? { ...x, notes: e.target.value } : x,
+ ),
+ )
+ }
+ className="mt-0.5 text-sm h-8"
+ placeholder="ex: contul lui Mihai"
+ />
+
+
+ ))}
+
+ setAdditionalUsers((prev) => [
+ ...prev,
+ { username: "", password: "", email: "", notes: "" },
+ ])
+ }
+ >
+ Adaugă utilizator
+
+
+ )}
+
+