523 lines
18 KiB
Vue
Executable File
523 lines
18 KiB
Vue
Executable File
<template>
|
|
<AppDoc name="PasswordDemo" :sources="sources" github="password/PasswordDemo.vue">
|
|
<h5>Import via Module</h5>
|
|
<pre v-code.script><code>
|
|
import Password from 'primevue/password';
|
|
|
|
</code></pre>
|
|
|
|
<h5>Import via CDN</h5>
|
|
<pre v-code><code>
|
|
<script src="https://unpkg.com/primevue@^3/core/core.min.js"></script>
|
|
<script src="https://unpkg.com/primevue@^3/password/password.min.js"></script>
|
|
|
|
</code></pre>
|
|
|
|
<h5>Getting Started</h5>
|
|
<p>A model can be bound using the standard v-model directive.</p>
|
|
<pre v-code><code>
|
|
<Password v-model="value" />
|
|
|
|
</code></pre>
|
|
|
|
<h5>Customization</h5>
|
|
<p>Password component uses regular expressions for middle and strong passwords with the following defaults.</p>
|
|
|
|
<h6>Medium</h6>
|
|
<p><i>^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,}).</i></p>
|
|
<ul>
|
|
<li>At least one lowercase</li>
|
|
<li>At least one uppercase or one number</li>
|
|
<li>Minimum 6 characters</li>
|
|
</ul>
|
|
|
|
<h6>Strong</h6>
|
|
<p><i>^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,})</i></p>
|
|
<ul>
|
|
<li>At least one lowercase</li>
|
|
<li>At least one uppercase</li>
|
|
<li>At least one numeric</li>
|
|
<li>Minimum 8 characters</li>
|
|
</ul>
|
|
|
|
<p>It is possible to define your own checks with the <i>mediumRegex</i> and <i>strongRegex</i> properties.</p>
|
|
|
|
<h5>Templating</h5>
|
|
<p>3 slots are included to customize the overlay. These are <i>header</i>, <i>content</i> and <i>footer</i>. Note that content overrides the default meter.</p>
|
|
<pre v-code><code>
|
|
<Password v-model="value4">
|
|
<template #header>
|
|
<h6>Pick a password</h6>
|
|
</template>
|
|
<template #footer>
|
|
<Divider />
|
|
<p class="mt-2">Suggestions</p>
|
|
<ul class="pl-2 ml-2 mt-0" style="line-height: 1.5">
|
|
<li>At least one lowercase</li>
|
|
<li>At least one uppercase</li>
|
|
<li>At least one numeric</li>
|
|
<li>Minimum 8 characters</li>
|
|
</ul>
|
|
</template>
|
|
</Password>
|
|
|
|
</code></pre>
|
|
|
|
<h5>Properties</h5>
|
|
<p>Any property such as name and placeholder are passed to the underlying input element. Following are the additional properties to configure the component.</p>
|
|
<div class="doc-tablewrapper">
|
|
<table class="doc-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>Type</th>
|
|
<th>Default</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>modelValue</td>
|
|
<td>any</td>
|
|
<td>null</td>
|
|
<td>Value of the component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>inputId</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Identifier of the underlying input element.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>promptLabel</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Text to prompt password entry. Defaults to PrimeVue <router-link to="/locale">Locale</router-link> configuration.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>mediumRegex</td>
|
|
<td>string</td>
|
|
<td>^(((?=.*[a-z])(?=.*[A-Z]))|((?=.*[a-z])(?=.*[0-9]))|((?=.*[A-Z])(?=.*[0-9])))(?=.{6,})</td>
|
|
<td>Regex for a medium level password.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>strongRegex</td>
|
|
<td>string</td>
|
|
<td>^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.{8,})</td>
|
|
<td>Regex for a strong level password.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>weakLabel</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Text for a weak password. Defaults to PrimeVue <router-link to="/locale">Locale</router-link> configuration.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>mediumLabel</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Text for a medium password. Defaults to PrimeVue <router-link to="/locale">Locale</router-link> configuration.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>strongLabel</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Text for a strong password. Defaults to PrimeVue <router-link to="/locale">Locale</router-link> configuration.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>feedback</td>
|
|
<td>boolean</td>
|
|
<td>true</td>
|
|
<td>Whether to show the strength indicator or not.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>toggleMask</td>
|
|
<td>boolean</td>
|
|
<td>false</td>
|
|
<td>Whether to show an icon to display the password as plain text.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>appendTo</td>
|
|
<td>string</td>
|
|
<td>body</td>
|
|
<td>A valid query selector or an HTMLElement to specify where the overlay gets attached. Special keywords are "body" for document body and "self" for the element itself.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>hideIcon</td>
|
|
<td>string</td>
|
|
<td>pi pi-eye-slash</td>
|
|
<td>Icon to hide displaying the password as plain text.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>showIcon</td>
|
|
<td>string</td>
|
|
<td>pi pi-eye</td>
|
|
<td>Icon to show displaying the password as plain text.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>disabled</td>
|
|
<td>boolean</td>
|
|
<td>false</td>
|
|
<td>When present, it specifies that the element should be disabled.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>placeholder</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Placeholder text for the input.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>required</td>
|
|
<td>boolean</td>
|
|
<td>false</td>
|
|
<td>When present, it specifies that an input field must be filled out before submitting the form.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>inputId</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Style class of the component input field.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>inputClass</td>
|
|
<td>any</td>
|
|
<td>null</td>
|
|
<td>Style class of the input field.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>inputStyle</td>
|
|
<td>any</td>
|
|
<td>null</td>
|
|
<td>Inline style of the input field.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>inputProps</td>
|
|
<td>object</td>
|
|
<td>null</td>
|
|
<td>Uses to pass all properties of the HTMLInputElement to the focusable input element inside the component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>panelId</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Identifier of the underlying overlay panel element.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>panelClass</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Style class of the overlay panel.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>panelStyle</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Inline style of the overlay panel.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>panelProps</td>
|
|
<td>object</td>
|
|
<td>null</td>
|
|
<td>Uses to pass all properties of the HTMLDivElement to the overlay panel inside the component.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>aria-label</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Defines a string value that labels an interactive element.</td>
|
|
</tr>
|
|
<tr>
|
|
<td>aria-labelledby</td>
|
|
<td>string</td>
|
|
<td>null</td>
|
|
<td>Establishes relationships between the component and label(s) where its value should be one or more element IDs.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<h5>Events</h5>
|
|
<p>Any valid event such as focus, blur and input are passed to the underlying input element.</p>
|
|
|
|
<h5>Slots</h5>
|
|
<div class="doc-tablewrapper">
|
|
<table class="doc-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>Parameters</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>header</td>
|
|
<td>-</td>
|
|
</tr>
|
|
<tr>
|
|
<td>content</td>
|
|
<td>-</td>
|
|
</tr>
|
|
<tr>
|
|
<td>footer</td>
|
|
<td>-</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<h5>Styling</h5>
|
|
<p>Following is the list of structural style classes, for theming classes visit <router-link to="/theming">theming</router-link> page.</p>
|
|
<div class="doc-tablewrapper">
|
|
<table class="doc-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>Element</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>p-password-panel</td>
|
|
<td>Container of password panel</td>
|
|
</tr>
|
|
<tr>
|
|
<td>p-password-meter</td>
|
|
<td>Meter element of password strength</td>
|
|
</tr>
|
|
<tr>
|
|
<td>p-password-info</td>
|
|
<td>Text to display strength</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<h5>Accessibility</h5>
|
|
<h6>Screen Reader</h6>
|
|
<p>
|
|
Value to describe the component can either be provided via <i>label</i> tag combined with <i>id</i> prop or using <i>aria-labelledby</i>, <i>aria-label</i> props. Screen reader is notified about the changes to the strength of the password
|
|
using a section that has <i>aria-live</i> while typing.
|
|
</p>
|
|
|
|
<pre v-code><code>
|
|
<label for="pwd1">Password</label>
|
|
<Password inputId="pwd1" />
|
|
|
|
<span id="pwd2">Password</span>
|
|
<Password aria-labelledby="pwd2" />
|
|
|
|
<Password aria-label="Password"/>
|
|
|
|
</code></pre>
|
|
|
|
<h6>Keyboard Support</h6>
|
|
<div class="doc-tablewrapper">
|
|
<table class="doc-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Key</th>
|
|
<th>Function</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><i>tab</i></td>
|
|
<td>Moves focus to the input.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><i>escape</i></td>
|
|
<td>Hides the strength meter if open.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<h5>Dependencies</h5>
|
|
<p>None.</p>
|
|
</AppDoc>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
return {
|
|
sources: {
|
|
'options-api': {
|
|
tabName: 'Options API Source',
|
|
content: `
|
|
<template>
|
|
<div>
|
|
<h5>Basic</h5>
|
|
<Password v-model="value1" :feedback="false" />
|
|
|
|
<h5>Password Meter</h5>
|
|
<Password v-model="value2" />
|
|
|
|
<h5>Show Password</h5>
|
|
<Password v-model="value3" toggleMask></Password>
|
|
|
|
<h5>Templating</h5>
|
|
<Password v-model="value4">
|
|
<template #header>
|
|
<h6>Pick a password</h6>
|
|
</template>
|
|
<template #footer="sp">
|
|
{{sp.level}}
|
|
<Divider />
|
|
<p class="mt-2">Suggestions</p>
|
|
<ul class="pl-2 ml-2 mt-0" style="line-height: 1.5">
|
|
<li>At least one lowercase</li>
|
|
<li>At least one uppercase</li>
|
|
<li>At least one numeric</li>
|
|
<li>Minimum 8 characters</li>
|
|
</ul>
|
|
</template>
|
|
</Password>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
return {
|
|
value1: null,
|
|
value2: null,
|
|
value3: null,
|
|
value4: null
|
|
}
|
|
}
|
|
}
|
|
<\\/script>
|
|
|
|
<style lang="scss" scoped>
|
|
::v-deep(.p-password input) {
|
|
width: 15rem
|
|
}
|
|
</style>
|
|
`
|
|
},
|
|
'composition-api': {
|
|
tabName: 'Composition API Source',
|
|
content: `
|
|
<template>
|
|
<div>
|
|
<h5>Basic</h5>
|
|
<Password v-model="value1" :feedback="false" />
|
|
|
|
<h5>Password Meter</h5>
|
|
<Password v-model="value2" />
|
|
|
|
<h5>Show Password</h5>
|
|
<Password v-model="value3" toggleMask></Password>
|
|
|
|
<h5>Templating</h5>
|
|
<Password v-model="value4">
|
|
<template #header>
|
|
<h6>Pick a password</h6>
|
|
</template>
|
|
<template #footer="sp">
|
|
{{sp.level}}
|
|
<Divider />
|
|
<p class="mt-2">Suggestions</p>
|
|
<ul class="pl-2 ml-2 mt-0" style="line-height: 1.5">
|
|
<li>At least one lowercase</li>
|
|
<li>At least one uppercase</li>
|
|
<li>At least one numeric</li>
|
|
<li>Minimum 8 characters</li>
|
|
</ul>
|
|
</template>
|
|
</Password>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import { ref } from 'vue';
|
|
|
|
export default {
|
|
setup() {
|
|
const value1 = ref();
|
|
const value2 = ref();
|
|
const value3 = ref();
|
|
const value4 = ref();
|
|
|
|
return { value1, value2, value3, value4 }
|
|
}
|
|
}
|
|
<\\/script>
|
|
|
|
<style lang="scss" scoped>
|
|
::v-deep(.p-password input) {
|
|
width: 15rem
|
|
}
|
|
</style>
|
|
`
|
|
},
|
|
'browser-source': {
|
|
tabName: 'Browser Source',
|
|
imports: `<script src="https://unpkg.com/primevue@^3/password/password.min.js"><\\/script>
|
|
<script src="https://unpkg.com/primevue@^3/divider/divider.min.js"><\\/script>`,
|
|
content: `<div id="app">
|
|
<h5>Basic</h5>
|
|
<p-password v-model="value1" :feedback="false"></p-password>
|
|
|
|
<h5>p-password Meter</h5>
|
|
<p-password v-model="value2"></p-password>
|
|
|
|
<h5>Show p-password</h5>
|
|
<p-password v-model="value3" toggle-mask></p-password>
|
|
|
|
<h5>Templating</h5>
|
|
<p-password v-model="value4">
|
|
<template #header>
|
|
<h6>Pick a password</h6>
|
|
</template>
|
|
<template #footer="sp">
|
|
{{sp.level}}
|
|
<p-divider></p-divider>
|
|
<p class="mt-2">Suggestions</p>
|
|
<ul class="pl-2 ml-2 mt-0" style="line-height: 1.5">
|
|
<li>At least one lowercase</li>
|
|
<li>At least one uppercase</li>
|
|
<li>At least one numeric</li>
|
|
<li>Minimum 8 characters</li>
|
|
</ul>
|
|
</template>
|
|
</p-password>
|
|
</div>
|
|
|
|
<script type="module">
|
|
const { createApp, ref } = Vue;
|
|
|
|
const App = {
|
|
setup() {
|
|
const value1 = ref();
|
|
const value2 = ref();
|
|
const value3 = ref();
|
|
const value4 = ref();
|
|
|
|
return { value1, value2, value3, value4 }
|
|
},
|
|
components: {
|
|
"p-password": primevue.password,
|
|
"p-divider": primevue.divider
|
|
}
|
|
};
|
|
|
|
createApp(App)
|
|
.use(primevue.config.default)
|
|
.mount("#app");
|
|
<\\/script>
|
|
|
|
<style>
|
|
.p-password input {
|
|
width: 15rem
|
|
}
|
|
</style>
|
|
`
|
|
}
|
|
}
|
|
};
|
|
}
|
|
};
|
|
</script>
|