Newer
Older
gnexus-ui-kit / src / vue / components / GnLoginCard.js
import { defineComponent, h, ref } from "vue";
import { cx, iconNode } from "../utils.js";
import GnInput from "./GnInput.js";
import GnButton from "./GnButton.js";
import GnCheckbox from "./GnCheckbox.js";
import GnAlert from "./GnAlert.js";

export default defineComponent({
	name: "GnLoginCard",
	props: {
		title: { type: String, default: "Sign in" },
		logoSrc: { type: String, default: "" },
		logoIcon: { type: String, default: "" },
		usernameLabel: { type: String, default: "Username" },
		usernameIcon: { type: String, default: "ph-user" },
		passwordLabel: { type: String, default: "Password" },
		passwordIcon: { type: String, default: "ph-lock-key" },
		rememberMe: { type: Boolean, default: false },
		rememberLabel: { type: String, default: "Remember me" },
		submitText: { type: String, default: "Sign in" },
		submitVariant: { type: String, default: "primary" },
		loading: { type: Boolean, default: false },
		error: { type: String, default: "" },
		forgotHref: { type: String, default: "" },
		forgotText: { type: String, default: "Forgot password?" },
		signupHref: { type: String, default: "" },
		signupText: { type: String, default: "Create account" }
	},
	emits: ["submit"],
	setup(props, { emit }) {
		const username = ref("");
		const password = ref("");
		const remember = ref(false);

		const onSubmit = (event) => {
			event.preventDefault();
			emit("submit", {
				username: username.value,
				password: password.value,
				remember: remember.value
			});
		};

		return () => h("article", { class: "card login-card" }, [
			(props.title || props.logoSrc || props.logoIcon) && h("header", { class: "card-title login-card-header" }, [
				props.logoSrc && h("img", { src: props.logoSrc, alt: "", class: "login-card-logo" }),
				props.logoIcon && !props.logoSrc && iconNode(props.logoIcon, "login-card-logo-icon"),
				props.title && h("span", { class: "login-card-title" }, props.title)
			]),
			h("div", { class: "card-content" }, [
				props.error && h(GnAlert, { variant: "danger", class: "login-card-error" }, () => props.error),
				h("form", { class: "login-card-form", onSubmit }, [
					h(GnInput, {
						modelValue: username.value,
						"onUpdate:modelValue": (v) => { username.value = v; },
						label: props.usernameLabel,
						icon: props.usernameIcon,
						type: "text",
						autocomplete: "username"
					}),
					h(GnInput, {
						modelValue: password.value,
						"onUpdate:modelValue": (v) => { password.value = v; },
						label: props.passwordLabel,
						icon: props.passwordIcon,
						type: "password",
						autocomplete: "current-password"
					}),
					props.rememberMe && h(GnCheckbox, {
						modelValue: remember.value,
						"onUpdate:modelValue": (v) => { remember.value = v; }
					}, () => props.rememberLabel),
					h(GnButton, {
						variant: props.submitVariant,
						loading: props.loading,
						disabled: props.loading,
						type: "submit",
						class: "login-card-submit"
					}, () => props.submitText),
					(props.forgotHref || props.signupHref) && h("div", { class: "login-card-links" }, [
						props.forgotHref && h("a", { href: props.forgotHref, class: "login-card-link" }, props.forgotText),
						props.signupHref && h("a", { href: props.signupHref, class: "login-card-link" }, props.signupText)
					])
				])
			])
		]);
	}
});