@progressive-development/pd-page
Version:
Progressive development page helper, teaser, menu, footer.
310 lines (295 loc) • 9.21 kB
JavaScript
import { css, LitElement, html } from 'lit';
import { localized, msg } from '@lit/localize';
import { property, state, query } from 'lit/decorators.js';
import '@progressive-development/pd-forms/pd-form-container';
import '@progressive-development/pd-forms/pd-form-row';
import '@progressive-development/pd-forms/pd-input';
import '@progressive-development/pd-forms/pd-input-password';
import '@progressive-development/pd-forms/pd-panel-button';
import '@progressive-development/pd-content/pd-notice-box';
import { pdIcons } from '@progressive-development/pd-icon';
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __decorateClass = (decorators, target, key, kind) => {
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
for (var i = decorators.length - 1, decorator; i >= 0; i--)
if (decorator = decorators[i])
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
if (kind && result) __defProp(target, key, result);
return result;
};
let PdLogin = class extends LitElement {
constructor() {
super(...arguments);
this.loading = false;
this.errorMessage = "";
this.successMessage = "";
this.hideForgotPassword = false;
this._view = "login";
this._validForm = false;
this._forgotPasswordValidForm = false;
this._prefillEmail = "";
}
render() {
return this._view === "login" ? this._renderLoginView() : this._renderForgotPasswordView();
}
_renderLoginView() {
return html`
<div class="login-form">
${this.successMessage ? html`<pd-notice-box type="success" variant="sidebar"
>${this.successMessage}</pd-notice-box
>` : ""}
<pd-form-container
id="loginFormId"
@pd-form-change="${this._handleFormChange}"
commonError="${this.errorMessage}"
>
<pd-form-row>
<pd-input
id="eMail"
maxlength="250"
fieldType="mail"
valueName="email"
label="${msg("E-Mail", { id: "pd.login.email.label" })}"
autoCompleteName="email"
required
@enter-pressed="${this._handleSubmit}"
></pd-input>
</pd-form-row>
<pd-form-row>
<pd-input-password
id="pWord"
revealable
maxlength="30"
label="${msg("Passwort", { id: "pd.login.password.label" })}"
valueName="password"
autoCompleteName="current-password"
required
@enter-pressed="${this._handleSubmit}"
></pd-input-password>
${!this.hideForgotPassword ? html`<span class="pwd-link"
><a href="#" @click="${this._handleForgotPassword}"
>${msg("Passwort vergessen?", {
id: "pd.login.forgot.password"
})}</a
></span
>` : ""}
</pd-form-row>
</pd-form-container>
<pd-form-row>
<pd-button
text="${msg("Anmelden", { id: "pd.login.submit" })}"
icon="${pdIcons.ICON_USER}"
?disabled="${!this._validForm || this.loading}"
?loading="${this.loading}"
@button-clicked="${this._handleSubmit}"
></pd-button>
</pd-form-row>
</div>
`;
}
_renderForgotPasswordView() {
return html`
<div class="login-form">
<pd-notice-box type="info" variant="sidebar">
${msg(
"Geben Sie Ihre E-Mail-Adresse ein. Sie erhalten einen Link zum Zurücksetzen Ihres Passworts.",
{
id: "pd.login.forgot.info"
}
)}
</pd-notice-box>
<pd-form-container
id="forgotPasswordFormId"
@pd-form-change="${this._handleForgotPasswordFormChange}"
commonError="${this.errorMessage}"
>
<pd-form-row>
<pd-input
id="forgotEmail"
maxlength="250"
fieldType="mail"
valueName="email"
label="${msg("E-Mail", { id: "pd.login.email.label" })}"
autoCompleteName="email"
.value="${this._prefillEmail}"
required
@enter-pressed="${this._handleForgotPasswordSubmit}"
></pd-input>
<span class="pwd-link">
<a href="#" @click="${this._handleBackToLogin}"
>${msg("Zurück zur Anmeldung", {
id: "pd.login.forgot.back"
})}</a
>
</span>
</pd-form-row>
</pd-form-container>
<pd-form-row>
<pd-button
text="${msg("Link anfordern", { id: "pd.login.forgot.submit" })}"
icon="${pdIcons.ICON_MAIL}"
?disabled="${!this._forgotPasswordValidForm || this.loading}"
?loading="${this.loading}"
@button-clicked="${this._handleForgotPasswordSubmit}"
></pd-button>
</pd-form-row>
</div>
`;
}
/** Clears the form and resets validation state. */
clear() {
this._formElement?.clear();
this._validForm = false;
}
_handleFormChange(e) {
this._validForm = e.detail.overallValidity;
e.stopPropagation();
}
_handleSubmit() {
if (!this._formElement?.valid || this.loading) {
return;
}
const formValues = this._formElement.getValues().origin;
const detail = {
email: formValues.email,
password: formValues.password
};
this.dispatchEvent(
new CustomEvent("login-attempt", {
detail,
bubbles: true,
composed: true
})
);
}
/**
* Central view switch. Emits `view-change` so the owner can clear the
* externally controlled `errorMessage` (which belongs to the view being
* left). The component never mutates `errorMessage` itself.
*/
_setView(view) {
if (this._view === view) return;
this._view = view;
this.dispatchEvent(
new CustomEvent("view-change", {
detail: { view },
bubbles: true,
composed: true
})
);
}
_handleForgotPassword(e) {
e.preventDefault();
const formValues = this._formElement?.getValues()?.origin;
this._prefillEmail = formValues?.email || "";
this._setView("forgot-password");
}
_handleForgotPasswordFormChange(e) {
this._forgotPasswordValidForm = e.detail.overallValidity;
e.stopPropagation();
}
_handleForgotPasswordSubmit() {
if (!this._forgotPasswordFormElement?.valid || this.loading) {
return;
}
const formValues = this._forgotPasswordFormElement.getValues().origin;
const detail = {
email: formValues.email
};
this.dispatchEvent(
new CustomEvent("forgot-password-attempt", {
detail,
bubbles: true,
composed: true
})
);
this._setView("login");
}
_handleBackToLogin(e) {
e.preventDefault();
this.showLogin();
}
/** Switch to forgot password view. */
showForgotPassword() {
const formValues = this._formElement?.getValues()?.origin;
this._prefillEmail = formValues?.email || "";
this._setView("forgot-password");
}
/** Switch back to login view. */
showLogin() {
this._setView("login");
}
};
PdLogin.styles = [
css`
:host {
display: flex;
justify-content: center;
width: 100%;
}
.login-form {
display: flex;
flex-flow: column;
justify-content: center;
background-color: var(
--pd-login-bg-color,
var(--pd-default-bg-light-col)
);
padding: var(--pd-login-padding, 1rem 0 1rem 1rem);
border-radius: var(--pd-login-border-radius, var(--pd-radius-md));
max-width: var(--pd-login-max-width, 500px);
width: 100%;
}
.pwd-link {
display: block;
padding-bottom: 0.5em;
text-align: right;
font-size: 0.8em;
}
.pwd-link a {
color: var(--pd-default-link-col, inherit);
text-decoration: none;
}
.pwd-link a:hover {
text-decoration: underline;
}
pd-notice-box {
margin-bottom: var(--pd-spacing-md, 1rem);
}
`
];
__decorateClass([
property({ type: Boolean })
], PdLogin.prototype, "loading", 2);
__decorateClass([
property({ type: String })
], PdLogin.prototype, "errorMessage", 2);
__decorateClass([
property({ type: String })
], PdLogin.prototype, "successMessage", 2);
__decorateClass([
property({ type: Boolean })
], PdLogin.prototype, "hideForgotPassword", 2);
__decorateClass([
state()
], PdLogin.prototype, "_view", 2);
__decorateClass([
state()
], PdLogin.prototype, "_validForm", 2);
__decorateClass([
state()
], PdLogin.prototype, "_forgotPasswordValidForm", 2);
__decorateClass([
state()
], PdLogin.prototype, "_prefillEmail", 2);
__decorateClass([
query("#loginFormId")
], PdLogin.prototype, "_formElement", 2);
__decorateClass([
query("#forgotPasswordFormId")
], PdLogin.prototype, "_forgotPasswordFormElement", 2);
PdLogin = __decorateClass([
localized()
], PdLogin);
export { PdLogin };