mirror of
https://github.com/bitwarden/browser
synced 2026-03-02 19:41:26 +00:00
* [EC-974] feat: scaffold new vault-items component * [EC-974] feat: add basic mocked data to story * [EC-974] feat: add initial table version * [EC-974] chore: split rows into separate components * [EC-974] chore: rename item row to cipher row * [EC-974] feat: create common vault item interface * [EC-974] feat: use cdk virtual scrolling * [EC-974] fix: tweak `itemSize` * [EC-974] chore: move vault-items component to app/vault folder * [EC-974] feat: initial support for extra column * [EC-974] feat: start adding org badge Having issues with modules import * [EC-974] feat: add working owner column on collections row * [EC-974] feat: add owner to ciphers * [EC-974] fix: org name badge bugs when reused * [EC-974] feat: fix and translate columns * [EC-974] feat: allow collections to be non-editable * [EC-974] feat: use data source * [EC-974] fix: remove profile name from vault items * [EC-974] feat: add events * [EC-974] feat: add support for copy event * [EC-974] feat: add support for collections column * [EC-974] feat: add support for group badges * [EC-974] chore: rename for consistency * [EC-974] feat: change story to use template * [EC-974] feat: add support for launching * [EC-974] feat: add support for attachements * [EC-974] feat: add stories for all use-cases * [EC-974] feat: add support for cloning * [EC-974] feat: add support for moving to organization * [EC-974] feat: add support for editing cipher collections * [EC-974] feat: add support for event logs * [EC-974] feat: add support for trash/delete/restore * [EC-974] feat: add support for editing collections * [EC-974] feat: add support for access and delete collections * [EC-974] feat: don't show menu if it's empty * [EC-974] feat: initial buggy implementation of selection * [EC-974] feat: implement bulk move * [EC-974] feat: add support for bulk moving to org * [EC-974] feat: add support for bulk restore * [EC-974] feat: add support for bulk delete * [EC-974] feat: add ability to disable the table * [EC-974] feat: create new filter function based on routed model * [EC-974] wip: start replacing vault items component * [EC-974] feat: add support for fetching ciphers * [EC-974] feat: hide trash by default * [EC-974] feat: add support for the rest of the data * [EC-974] feat: implement organization filtering using org badge * [EC-974] feat: fix navigation to "my vault" * [EC-974] feat: don't show bulk move options when filtering on org items * [EC-974] feat: prepare for disabling table * [EC-974] fix: add missing router link to collections * [EC-974] feat: connect all outputs * [EC-974] fix: list not properly refreshing after delete * [EC-974] feat: limit selection to top 500 items * [EC-974] feat: implement refresh tracker * [EC-974] feat: use refresh tracker to disable vault items * [EC-974] feat: add empty list message * [AC-974] feat: add initial load with spinner and fix empty -> show list bug * [EC-974] feat: replace action promise with simple loading boolean * [EC-974] feat: refactor individual vault header * [EC-974] feat: cache and make observables long lived * [EC-974] feat: implement searching * [EC-974] feat: add support for showing collections * [EC-974] feat: add ciphers to org vault list * [EC-974] feat: show group column * [EC-974] feat: tweak settings for org vault * [EC-974] feat: implement search using query params * [EC-974] feat: add support for events that are common with individual vault * [EC-974] feat: add support for all events * [EC-974] feat: add support for empty list message and no permission message * [EC-974] feat: always show table * [EC-974] feat: fix layout issues due to incorrect row height * [EC-974] feat: disable list if empty * [EC-974] feat: improve sync handling * [EC-974] feat: improve initial loading sequence * [EC-974] feat: improve initial load sequence in org vault * [EC-974] refactor: simplify and optimize data fetching * [EC-974] feat: use observables from org service * [EC-974] feat: refactor org vault header * [EC-974] fix: data not refreshing properly * [EC-974] fix: avoid collection double fetching * [EC-974] chore: clean up refresh tracker * [EC-974] chore: clean up old vault-items components * [EC-974] chore: clean up old code in vault component * [EC-974] fix: reduce rows in story The story ends up too big for chromatic. * [EC-974] docs: tweak and typo fixes of asyncToObservable docs comment * [EC-974] fix: `attachements` typo * [EC-974] chore: remove review question comment * [EC-974] chore: remove unused `securityCode` if statement * [EC-974] fix: use `takeUntill` for legacy dialogs * [EC-974] fix: use CollectionDialogTabType instead of custom strings * [EC-974] fix: copy implementation * [EC-974] fix: use `useTotp` to check for premium features * [EC-974] fix: use `tw-sr-only` * [EC-974] chore: remove unecessary eslint disable * [EC-974] fix: clarify vault item event naming * [EC-974] fix: remove `new` from `app-new-vault-items` * [EC-974] fix: collection row not disabled during loading * [EC-974] chore: simplify router links without path changes * [EC-974] feat: invert filter function to get rid of `cipherPassesFilter` * [EC-974] fix: move `NestingDelimiter` to collection view Nesting is currently only a presentational construct, and the concept does not exist in our domain. * [EC-974] fix: org vault header not updating when switching org * [EC-974] fix: table sizing jumping around * [EC-974] fix: list not refreshing after restoring item * [EC-974] fix: re-add missing unassigned collection * [EC-974] fix don't show new item button in unassigned collection * [EC-974] fix: navigations always leading to individual vault * [EC-974] fix: remove checkbox when collections are not editable * [EC-974] fix: null reference blocking collections from refreshing after delete * [EC-974] fix: don't show checbox for collections that user does not have permissions to delete * [EC-974] fix: navigate away from deleted folder * [EC-974] chore: clean up un-used output * [EC-974] fix: org badge changing color randomly * [EC-974] fix: lint issues after merge * [EC-974] fix: lower amount of ciphers in story chromatic doesn't like large snapshots * [EC-974] fix: "all collections" not taking `organizationId` filter into account * [EC-974] fix: make sure unassigned appears in table too * [EC-974] feat: add unassigned to storybook * [EC-974] fix: forced row height not being applied properly * [EC-974] fix: hopefully fix table jumping once and for all * [EC-974] fix: attachemnts getting hidden * [EC-974] feat: extract collection editable logic to parent component * [EC-974] feat: separately track editable items * [EC-974] feat: optimize permission checks * [EC-974] fix: bulk menu hidden on chrome :lolcry: * [EC-974] fix: don't show groups column if org doesnt use groups * [EC-974] feat: make entire row clickable * [EC-974] fix: typo resulting in non-editable collections
118 lines
3.7 KiB
TypeScript
118 lines
3.7 KiB
TypeScript
import { ITreeNodeObject, TreeNode } from "../models/domain/tree-node";
|
|
|
|
export class ServiceUtils {
|
|
/**
|
|
* Recursively adds a node to nodeTree
|
|
* @param {TreeNode<ITreeNodeObject>[]} nodeTree - An array of TreeNodes that the node will be added to
|
|
* @param {number} partIndex - Index of the `parts` array that is being processed
|
|
* @param {string[]} parts - Array of strings that represent the path to the `obj` node
|
|
* @param {ITreeNodeObject} obj - The node to be added to the tree
|
|
* @param {ITreeNodeObject} parent - The parent node of the `obj` node
|
|
* @param {string} delimiter - The delimiter used to split the path string, will be used to combine the path for missing nodes
|
|
*/
|
|
static nestedTraverse(
|
|
nodeTree: TreeNode<ITreeNodeObject>[],
|
|
partIndex: number,
|
|
parts: string[],
|
|
obj: ITreeNodeObject,
|
|
parent: TreeNode<ITreeNodeObject> | undefined,
|
|
delimiter: string
|
|
) {
|
|
if (parts.length <= partIndex) {
|
|
return;
|
|
}
|
|
|
|
const end: boolean = partIndex === parts.length - 1;
|
|
const partName: string = parts[partIndex];
|
|
|
|
for (let i = 0; i < nodeTree.length; i++) {
|
|
if (nodeTree[i].node.name !== partName) {
|
|
continue;
|
|
}
|
|
if (end && nodeTree[i].node.id !== obj.id) {
|
|
// Another node exists with the same name as the node being added
|
|
nodeTree.push(new TreeNode(obj, parent, partName));
|
|
return;
|
|
}
|
|
// Move down the tree to the next level
|
|
ServiceUtils.nestedTraverse(
|
|
nodeTree[i].children,
|
|
partIndex + 1,
|
|
parts,
|
|
obj,
|
|
nodeTree[i],
|
|
delimiter
|
|
);
|
|
return;
|
|
}
|
|
|
|
// If there's no node here with the same name...
|
|
if (nodeTree.filter((n) => n.node.name === partName).length === 0) {
|
|
// And we're at the end of the path given, add the node
|
|
if (end) {
|
|
nodeTree.push(new TreeNode(obj, parent, partName));
|
|
return;
|
|
}
|
|
// And we're not at the end of the path, combine the current name with the next name
|
|
// 1, *1.2, 1.2.1 becomes
|
|
// 1, *1.2/1.2.1
|
|
const newPartName = partName + delimiter + parts[partIndex + 1];
|
|
ServiceUtils.nestedTraverse(
|
|
nodeTree,
|
|
0,
|
|
[newPartName, ...parts.slice(partIndex + 2)],
|
|
obj,
|
|
parent,
|
|
delimiter
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Searches a tree for a node with a matching `id`
|
|
* @param {TreeNode<T>} nodeTree - A single TreeNode branch that will be searched
|
|
* @param {string} id - The id of the node to be found
|
|
* @returns {TreeNode<T>} The node with a matching `id`
|
|
*/
|
|
static getTreeNodeObject<T extends ITreeNodeObject>(
|
|
nodeTree: TreeNode<T>,
|
|
id: string
|
|
): TreeNode<T> {
|
|
if (nodeTree.node.id === id) {
|
|
return nodeTree;
|
|
}
|
|
for (let i = 0; i < nodeTree.children.length; i++) {
|
|
if (nodeTree.children[i].children != null) {
|
|
const node = ServiceUtils.getTreeNodeObject(nodeTree.children[i], id);
|
|
if (node !== null) {
|
|
return node;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Searches an array of tree nodes for a node with a matching `id`
|
|
* @param {TreeNode<T>} nodeTree - An array of TreeNode branches that will be searched
|
|
* @param {string} id - The id of the node to be found
|
|
* @returns {TreeNode<T>} The node with a matching `id`
|
|
*/
|
|
static getTreeNodeObjectFromList<T extends ITreeNodeObject>(
|
|
nodeTree: TreeNode<T>[],
|
|
id: string
|
|
): TreeNode<T> {
|
|
for (let i = 0; i < nodeTree.length; i++) {
|
|
if (nodeTree[i].node.id === id) {
|
|
return nodeTree[i];
|
|
} else if (nodeTree[i].children != null) {
|
|
const node = ServiceUtils.getTreeNodeObjectFromList(nodeTree[i].children, id);
|
|
if (node !== null) {
|
|
return node;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|