mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 09:13:33 +00:00
Split jslib into multiple modules (#363)
* Split jslib into multiple modules
This commit is contained in:
54
angular/src/pipes/color-password.pipe.ts
Normal file
54
angular/src/pipes/color-password.pipe.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import {
|
||||
Pipe,
|
||||
PipeTransform,
|
||||
} from '@angular/core';
|
||||
|
||||
/*
|
||||
An updated pipe that sanitizes HTML, highlights numbers and special characters (in different colors each)
|
||||
and handles Unicode / Emoji characters correctly.
|
||||
*/
|
||||
@Pipe({ name: 'colorPassword' })
|
||||
export class ColorPasswordPipe implements PipeTransform {
|
||||
transform(password: string) {
|
||||
// Regex Unicode property escapes for checking if emoji in passwords.
|
||||
const regexpEmojiPresentation = /\p{Emoji_Presentation}/gu;
|
||||
// Convert to an array to handle cases that stings have special characters, ie: emoji.
|
||||
const passwordArray = Array.from(password);
|
||||
let colorizedPassword = '';
|
||||
for (let i = 0; i < passwordArray.length; i++) {
|
||||
let character = passwordArray[i];
|
||||
let isSpecial = false;
|
||||
// Sanitize HTML first.
|
||||
switch (character) {
|
||||
case '&':
|
||||
character = '&';
|
||||
isSpecial = true;
|
||||
break;
|
||||
case '<':
|
||||
character = '<';
|
||||
isSpecial = true;
|
||||
break;
|
||||
case '>':
|
||||
character = '>';
|
||||
isSpecial = true;
|
||||
break;
|
||||
case ' ':
|
||||
character = ' ';
|
||||
isSpecial = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
let type = 'letter';
|
||||
if (character.match(regexpEmojiPresentation)) {
|
||||
type = 'emoji';
|
||||
} else if (isSpecial || character.match(/[^\w ]/)) {
|
||||
type = 'special';
|
||||
} else if (character.match(/\d/)) {
|
||||
type = 'number';
|
||||
}
|
||||
colorizedPassword += '<span class="password-' + type + '">' + character + '</span>';
|
||||
}
|
||||
return colorizedPassword;
|
||||
}
|
||||
}
|
||||
17
angular/src/pipes/i18n.pipe.ts
Normal file
17
angular/src/pipes/i18n.pipe.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import {
|
||||
Pipe,
|
||||
PipeTransform,
|
||||
} from '@angular/core';
|
||||
|
||||
import { I18nService } from 'jslib-common/abstractions/i18n.service';
|
||||
|
||||
@Pipe({
|
||||
name: 'i18n',
|
||||
})
|
||||
export class I18nPipe implements PipeTransform {
|
||||
constructor(private i18nService: I18nService) { }
|
||||
|
||||
transform(id: string, p1?: string, p2?: string, p3?: string): string {
|
||||
return this.i18nService.t(id, p1, p2, p3);
|
||||
}
|
||||
}
|
||||
44
angular/src/pipes/search-ciphers.pipe.ts
Normal file
44
angular/src/pipes/search-ciphers.pipe.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
import {
|
||||
Pipe,
|
||||
PipeTransform,
|
||||
} from '@angular/core';
|
||||
|
||||
import { CipherView } from 'jslib-common/models/view/cipherView';
|
||||
|
||||
@Pipe({
|
||||
name: 'searchCiphers',
|
||||
})
|
||||
export class SearchCiphersPipe implements PipeTransform {
|
||||
transform(ciphers: CipherView[], searchText: string, deleted: boolean = false): CipherView[] {
|
||||
if (ciphers == null || ciphers.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (searchText == null || searchText.length < 2) {
|
||||
return ciphers.filter(c => {
|
||||
return deleted !== c.isDeleted;
|
||||
});
|
||||
}
|
||||
|
||||
searchText = searchText.trim().toLowerCase();
|
||||
return ciphers.filter(c => {
|
||||
if (deleted !== c.isDeleted) {
|
||||
return false;
|
||||
}
|
||||
if (c.name != null && c.name.toLowerCase().indexOf(searchText) > -1) {
|
||||
return true;
|
||||
}
|
||||
if (searchText.length >= 8 && c.id.startsWith(searchText)) {
|
||||
return true;
|
||||
}
|
||||
if (c.subTitle != null && c.subTitle.toLowerCase().indexOf(searchText) > -1) {
|
||||
return true;
|
||||
}
|
||||
if (c.login && c.login.uri != null && c.login.uri.toLowerCase().indexOf(searchText) > -1) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
33
angular/src/pipes/search.pipe.ts
Normal file
33
angular/src/pipes/search.pipe.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import {
|
||||
Pipe,
|
||||
PipeTransform,
|
||||
} from '@angular/core';
|
||||
|
||||
@Pipe({
|
||||
name: 'search',
|
||||
})
|
||||
export class SearchPipe implements PipeTransform {
|
||||
transform(items: any[], searchText: string, prop1?: string, prop2?: string, prop3?: string): any[] {
|
||||
if (items == null || items.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (searchText == null || searchText.length < 2) {
|
||||
return items;
|
||||
}
|
||||
|
||||
searchText = searchText.trim().toLowerCase();
|
||||
return items.filter(i => {
|
||||
if (prop1 != null && i[prop1] != null && i[prop1].toString().toLowerCase().indexOf(searchText) > -1) {
|
||||
return true;
|
||||
}
|
||||
if (prop2 != null && i[prop2] != null && i[prop2].toString().toLowerCase().indexOf(searchText) > -1) {
|
||||
return true;
|
||||
}
|
||||
if (prop3 != null && i[prop3] != null && i[prop3].toString().toLowerCase().indexOf(searchText) > -1) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user