Skip to content

Commit 03a854f

Browse files
committed
Added ability to provide function to find to find by other than id
1 parent 8b6481d commit 03a854f

12 files changed

+31
-21
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ dockMove(source: TabData | PanelData, target: string | TabData | PanelData | Box
122122
find PanelData or TabData by id
123123

124124
```typescript
125-
find(id: string): PanelData | TabData;
125+
find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined;
126126
```
127127

128128
### updateTab [🗎](https://ticlo.github.io/rc-dock/classes/docklayout.docklayout-1.html#updatetab)

es/Algorithm.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export declare enum Filter {
1616
AnyTabPanel = 123,
1717
All = 127
1818
}
19-
export declare function find(layout: LayoutData, id: string, filter?: Filter): PanelData | TabData | BoxData | undefined;
19+
export declare function find(layout: LayoutData, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined;
2020
export declare function addNextToTab(layout: LayoutData, source: TabData | PanelData, target: TabData, direction: DropDirection): LayoutData;
2121
export declare function addTabToPanel(layout: LayoutData, source: TabData | PanelData, panel: PanelData, idx?: number): LayoutData;
2222
export declare function converToPanel(source: TabData | PanelData): PanelData;

es/Algorithm.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,16 @@ export function nextZIndex(current) {
6060
}
6161
return ++_zCount;
6262
}
63+
function compareFindId(item, id) {
64+
return item && (typeof id === 'function' ? id(item) : item.id === id);
65+
}
6366
function findInPanel(panel, id, filter) {
64-
if (panel.id === id && (filter & Filter.Panel)) {
67+
if (compareFindId(panel, id) && (filter & Filter.Panel)) {
6568
return panel;
6669
}
6770
if (filter & Filter.Tab) {
6871
for (let tab of panel.tabs) {
69-
if (tab.id === id) {
72+
if (compareFindId(tab, id)) {
7073
return tab;
7174
}
7275
}
@@ -75,7 +78,7 @@ function findInPanel(panel, id, filter) {
7578
}
7679
function findInBox(box, id, filter) {
7780
let result;
78-
if ((filter | Filter.Box) && (box === null || box === void 0 ? void 0 : box.id) === id) {
81+
if ((filter | Filter.Box) && compareFindId(box, id)) {
7982
return box;
8083
}
8184
if (!(box === null || box === void 0 ? void 0 : box.children)) {

es/DockData.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ export interface DockContext {
290290
/**
291291
* Find PanelData or TabData by id
292292
*/
293-
find(id: string, filter?: Filter): PanelData | TabData | BoxData | undefined;
293+
find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined;
294294
/**
295295
* Update a tab with new TabData
296296
* @param id tab id to update

es/DockLayout.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export declare class DockLayout extends DockPortalManager implements DockContext
111111
*/
112112
dockMove(source: TabData | PanelData, target: string | TabData | PanelData | BoxData | null, direction: DropDirection, floatPosition?: FloatPosition): void;
113113
/** @inheritDoc */
114-
find(id: string, filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined;
114+
find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined;
115115
/** @ignore */
116116
getLayoutSize(): LayoutSize;
117117
/** @inheritDoc */

lib/Algorithm.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export declare enum Filter {
1616
AnyTabPanel = 123,
1717
All = 127
1818
}
19-
export declare function find(layout: LayoutData, id: string, filter?: Filter): PanelData | TabData | BoxData | undefined;
19+
export declare function find(layout: LayoutData, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined;
2020
export declare function addNextToTab(layout: LayoutData, source: TabData | PanelData, target: TabData, direction: DropDirection): LayoutData;
2121
export declare function addTabToPanel(layout: LayoutData, source: TabData | PanelData, panel: PanelData, idx?: number): LayoutData;
2222
export declare function converToPanel(source: TabData | PanelData): PanelData;

lib/Algorithm.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,16 @@ function nextZIndex(current) {
6666
return ++_zCount;
6767
}
6868
exports.nextZIndex = nextZIndex;
69+
function compareFindId(item, id) {
70+
return item && (typeof id === 'function' ? id(item) : item.id === id);
71+
}
6972
function findInPanel(panel, id, filter) {
70-
if (panel.id === id && (filter & Filter.Panel)) {
73+
if (compareFindId(panel, id) && (filter & Filter.Panel)) {
7174
return panel;
7275
}
7376
if (filter & Filter.Tab) {
7477
for (let tab of panel.tabs) {
75-
if (tab.id === id) {
78+
if (compareFindId(tab, id)) {
7679
return tab;
7780
}
7881
}
@@ -81,7 +84,7 @@ function findInPanel(panel, id, filter) {
8184
}
8285
function findInBox(box, id, filter) {
8386
let result;
84-
if ((filter | Filter.Box) && (box === null || box === void 0 ? void 0 : box.id) === id) {
87+
if ((filter | Filter.Box) && compareFindId(box, id)) {
8588
return box;
8689
}
8790
if (!(box === null || box === void 0 ? void 0 : box.children)) {

lib/DockData.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ export interface DockContext {
290290
/**
291291
* Find PanelData or TabData by id
292292
*/
293-
find(id: string, filter?: Filter): PanelData | TabData | BoxData | undefined;
293+
find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined;
294294
/**
295295
* Update a tab with new TabData
296296
* @param id tab id to update

lib/DockLayout.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export declare class DockLayout extends DockPortalManager implements DockContext
111111
*/
112112
dockMove(source: TabData | PanelData, target: string | TabData | PanelData | BoxData | null, direction: DropDirection, floatPosition?: FloatPosition): void;
113113
/** @inheritDoc */
114-
find(id: string, filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined;
114+
find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined;
115115
/** @ignore */
116116
getLayoutSize(): LayoutSize;
117117
/** @inheritDoc */

src/Algorithm.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -79,24 +79,28 @@ export function nextZIndex(current?: number): number {
7979
return ++_zCount;
8080
}
8181

82+
function compareFindId(item: PanelData | TabData | BoxData, id: string | ((item: PanelData | TabData | BoxData) => boolean)): boolean {
83+
return item && (typeof id === 'function' ? id(item) : item.id === id);
84+
}
85+
8286

83-
function findInPanel(panel: PanelData, id: string, filter: Filter): PanelData | TabData | undefined {
84-
if (panel.id === id && (filter & Filter.Panel)) {
87+
function findInPanel(panel: PanelData, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter: Filter): PanelData | TabData | undefined {
88+
if (compareFindId(panel, id) && (filter & Filter.Panel)) {
8589
return panel;
8690
}
8791
if (filter & Filter.Tab) {
8892
for (let tab of panel.tabs) {
89-
if (tab.id === id) {
93+
if (compareFindId(tab, id)) {
9094
return tab;
9195
}
9296
}
9397
}
9498
return undefined;
9599
}
96100

97-
function findInBox(box: BoxData | undefined, id: string, filter: Filter): PanelData | TabData | BoxData | undefined {
101+
function findInBox(box: BoxData | undefined, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter: Filter): PanelData | TabData | BoxData | undefined {
98102
let result: PanelData | TabData | BoxData | undefined;
99-
if ((filter | Filter.Box) && box?.id === id) {
103+
if ((filter | Filter.Box) && compareFindId(box, id)) {
100104
return box;
101105
}
102106
if (!box?.children) {
@@ -133,7 +137,7 @@ export enum Filter {
133137
}
134138

135139

136-
export function find(layout: LayoutData, id: string, filter: Filter = Filter.AnyTabPanel): PanelData | TabData | BoxData | undefined {
140+
export function find(layout: LayoutData, id: string | ((item: PanelData | TabData | BoxData) => boolean), filter: Filter = Filter.AnyTabPanel): PanelData | TabData | BoxData | undefined {
137141
let result: PanelData | TabData | BoxData | undefined;
138142

139143
if (filter & Filter.Docked) {

src/DockData.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ export interface DockContext {
369369
/**
370370
* Find PanelData or TabData by id
371371
*/
372-
find(id: string, filter?: Filter): PanelData | TabData | BoxData | undefined;
372+
find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Filter): PanelData | TabData | BoxData | undefined;
373373

374374
/**
375375
* Update a tab with new TabData

src/DockLayout.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ export class DockLayout extends DockPortalManager implements DockContext {
277277
}
278278

279279
/** @inheritDoc */
280-
find(id: string, filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined {
280+
find(id: string | ((item: PanelData | TabData | BoxData) => boolean), filter?: Algorithm.Filter): PanelData | TabData | BoxData | undefined {
281281
return Algorithm.find(this.getLayout(), id, filter);
282282
}
283283

0 commit comments

Comments
 (0)