@design.estate/dees-catalog 6.6.0 → 6.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_bundle/bundle.js +1481 -657
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +41 -2
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +100 -2
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +816 -28
- package/dist_ts_web/elements/00group-harness/interfaces.d.ts +56 -0
- package/package.json +1 -1
- package/readme.hints.md +3 -0
- package/readme.md +49 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +123 -1
- package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +922 -28
- package/ts_web/elements/00group-harness/interfaces.ts +67 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@design.estate/dees-catalog',
|
|
6
|
-
version: '6.
|
|
6
|
+
version: '6.7.0',
|
|
7
7
|
description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsNkJBQTZCO0lBQ25DLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxzSkFBc0o7Q0FDcEssQ0FBQSJ9
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
-
import type { IHarnessSessionGroup, IHarnessSessionMeta } from '../interfaces.js';
|
|
2
|
+
import type { IHarnessResourceAssociation, IHarnessResourceMeta, IHarnessSessionGroup, IHarnessSessionMeta, THarnessResourceAssociationInteractionSource } from '../interfaces.js';
|
|
3
3
|
import '../../00group-utility/dees-icon/dees-icon.js';
|
|
4
4
|
declare global {
|
|
5
5
|
interface HTMLElementTagNameMap {
|
|
@@ -23,7 +23,9 @@ interface IDropSlot {
|
|
|
23
23
|
* `harness-group-context` — the host persists changes and passes fresh
|
|
24
24
|
* `groups` back in. Sessions in no group render in the trailing ungrouped
|
|
25
25
|
* section with pinned entries first, then explicit order, then new sessions by
|
|
26
|
-
* recency. While a search query is active the list is flat.
|
|
26
|
+
* recency. While a search query is active the list is flat. Generic resources
|
|
27
|
+
* project as controlled child rows or into a trailing unattached Resources
|
|
28
|
+
* section; association interactions only emit host requests.
|
|
27
29
|
*/
|
|
28
30
|
export declare class DeesHarnessSessionList extends DeesElement {
|
|
29
31
|
static demo: () => TemplateResult<1>;
|
|
@@ -36,8 +38,15 @@ export declare class DeesHarnessSessionList extends DeesElement {
|
|
|
36
38
|
accessor enableGrouping: boolean;
|
|
37
39
|
/** Explicit order for sortable sessions outside user-defined groups. */
|
|
38
40
|
accessor ungroupedSessionIds: string[];
|
|
41
|
+
accessor resources: IHarnessResourceMeta[];
|
|
42
|
+
accessor resourceAssociations: IHarnessResourceAssociation[];
|
|
43
|
+
accessor selectedResourceId: string;
|
|
44
|
+
/** Serializable attach/reassign targets. A missing resource entry means no eligible targets. */
|
|
45
|
+
accessor eligibleSessionIdsByResourceId: Record<string, string[]>;
|
|
39
46
|
accessor search: string;
|
|
40
47
|
accessor draggingSessionId: string;
|
|
48
|
+
accessor draggingResourceId: string;
|
|
49
|
+
accessor resourceDropTargetSessionId: string;
|
|
41
50
|
accessor dropSlot: IDropSlot | undefined;
|
|
42
51
|
accessor draggedItemHeight: number;
|
|
43
52
|
accessor expandedSessionIds: ReadonlySet<string>;
|
|
@@ -45,9 +54,14 @@ export declare class DeesHarnessSessionList extends DeesElement {
|
|
|
45
54
|
private accessor topScrollShadowVisible;
|
|
46
55
|
private accessor bottomScrollShadowVisible;
|
|
47
56
|
private accessor moveAnnouncement;
|
|
57
|
+
private accessor resourceContextResourceId;
|
|
48
58
|
private reflowGeneration;
|
|
49
59
|
private readonly reflowAnimations;
|
|
50
60
|
private pointerDragGesture;
|
|
61
|
+
private pendingResourceAssociationRequest;
|
|
62
|
+
private resourceContextFocusTarget;
|
|
63
|
+
private resourceContextFocusClass;
|
|
64
|
+
private resourceContextGeneration;
|
|
51
65
|
private keyboardMoveFocus;
|
|
52
66
|
private scrollResizeObserver;
|
|
53
67
|
private observedScrollContainer;
|
|
@@ -59,11 +73,20 @@ export declare class DeesHarnessSessionList extends DeesElement {
|
|
|
59
73
|
private dragAutoScrollLastFrame;
|
|
60
74
|
static styles: import("@design.estate/dees-element").CSSResult[];
|
|
61
75
|
private get sessionsById();
|
|
76
|
+
private get resourcesById();
|
|
77
|
+
/** First valid record wins; unknown and duplicate records remain untouched but are not projected. */
|
|
78
|
+
private get acceptedResourceAssociations();
|
|
79
|
+
private get acceptedResources();
|
|
80
|
+
private resourceMatchesSearch;
|
|
81
|
+
private sessionMatchesSearch;
|
|
82
|
+
private resourcesForSession;
|
|
83
|
+
private get unattachedResources();
|
|
62
84
|
private get groupedSessionIds();
|
|
63
85
|
/** Pinned entries first, followed by explicitly ordered sortable sessions. */
|
|
64
86
|
private get ungroupedSessions();
|
|
65
87
|
private get filteredSessions();
|
|
66
88
|
focusSearch(): void;
|
|
89
|
+
requestResourceAssociation(resourceIdArg: string, toSessionIdArg: string | null, sourceArg?: THarnessResourceAssociationInteractionSource): boolean;
|
|
67
90
|
updated(changedProperties: Map<PropertyKey, unknown>): void;
|
|
68
91
|
connectedCallback(): Promise<void>;
|
|
69
92
|
disconnectedCallback(): Promise<void>;
|
|
@@ -73,14 +96,18 @@ export declare class DeesHarnessSessionList extends DeesElement {
|
|
|
73
96
|
private renderSection;
|
|
74
97
|
private renderDropPlaceholder;
|
|
75
98
|
private renderItem;
|
|
99
|
+
private renderUnattachedResources;
|
|
100
|
+
private renderResource;
|
|
76
101
|
private eventTargetsExpandToggle;
|
|
77
102
|
private eventTargetsDragHandle;
|
|
103
|
+
private eventTargetsResourceControl;
|
|
78
104
|
private sessionStateLabel;
|
|
79
105
|
private toggleSessionExpanded;
|
|
80
106
|
private toggleGroupCollapsed;
|
|
81
107
|
private sortableSessions;
|
|
82
108
|
private sessionsForGroup;
|
|
83
109
|
private handlePointerDown;
|
|
110
|
+
private handleResourcePointerDown;
|
|
84
111
|
private readonly handlePointerMove;
|
|
85
112
|
private readonly handlePointerUp;
|
|
86
113
|
private readonly handlePointerCancel;
|
|
@@ -88,7 +115,10 @@ export declare class DeesHarnessSessionList extends DeesElement {
|
|
|
88
115
|
private readonly handleDragKeyDown;
|
|
89
116
|
private readonly handleDragWindowBlur;
|
|
90
117
|
private startPointerDrag;
|
|
118
|
+
private startResourcePointerDrag;
|
|
91
119
|
private moveDragPreview;
|
|
120
|
+
private moveResourceDragPreview;
|
|
121
|
+
private updateResourceDropTargetFromPointer;
|
|
92
122
|
private setDropSlot;
|
|
93
123
|
private clearDropSlot;
|
|
94
124
|
private updateDragAutoScrollVelocity;
|
|
@@ -102,6 +132,15 @@ export declare class DeesHarnessSessionList extends DeesElement {
|
|
|
102
132
|
private handleKeyboardMove;
|
|
103
133
|
private captureCardRects;
|
|
104
134
|
private restoreKeyboardMoveFocus;
|
|
135
|
+
private eligibleSessionIds;
|
|
136
|
+
private isResourceTargetEligible;
|
|
137
|
+
private emitResource;
|
|
138
|
+
private handleResourceContextKey;
|
|
139
|
+
private emitResourceContext;
|
|
140
|
+
private closeResourceContext;
|
|
141
|
+
private clearResourceContextState;
|
|
142
|
+
private reconcilePendingResourceAssociation;
|
|
143
|
+
private resourceAssociationAnnouncement;
|
|
105
144
|
private animateCardReflow;
|
|
106
145
|
private cancelReflowAnimations;
|
|
107
146
|
private finishPointerDrag;
|
|
@@ -20,6 +20,38 @@ const demoGroups = [
|
|
|
20
20
|
{ id: 'active', name: 'Active work', sessionIds: ['session-0', 'session-1', 'session-2'] },
|
|
21
21
|
{ id: 'review', name: 'Review', sessionIds: ['session-3', 'session-4'] },
|
|
22
22
|
];
|
|
23
|
+
const demoResources = [
|
|
24
|
+
{
|
|
25
|
+
id: 'terminal:build',
|
|
26
|
+
kind: 'terminal',
|
|
27
|
+
title: 'Build shell',
|
|
28
|
+
icon: 'lucide:Terminal',
|
|
29
|
+
preview: 'pnpm run build',
|
|
30
|
+
updatedAt: Date.now() - 90_000,
|
|
31
|
+
state: 'ready',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 'file:release-notes',
|
|
35
|
+
kind: 'file',
|
|
36
|
+
title: 'Release notes',
|
|
37
|
+
icon: 'lucide:FileText',
|
|
38
|
+
preview: '6.7.0 controlled resource draft',
|
|
39
|
+
updatedAt: Date.now() - 180_000,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'browser:preview',
|
|
43
|
+
kind: 'browser',
|
|
44
|
+
title: 'Documentation preview',
|
|
45
|
+
icon: 'lucide:Globe',
|
|
46
|
+
preview: 'localhost:3000',
|
|
47
|
+
updatedAt: Date.now() - 240_000,
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
const demoResourceAssociations = [
|
|
51
|
+
{ resourceId: 'terminal:build', sessionId: 'session-0' },
|
|
52
|
+
{ resourceId: 'file:release-notes', sessionId: 'session-0' },
|
|
53
|
+
];
|
|
54
|
+
const demoResourceEligibleSessionIds = Object.fromEntries(demoResources.map((resource) => [resource.id, ['session-0', 'session-1', 'session-2']]));
|
|
23
55
|
const handleSessionSelect = (event) => {
|
|
24
56
|
const list = event.currentTarget;
|
|
25
57
|
list.selectedSessionId = event.detail.session.id;
|
|
@@ -42,6 +74,61 @@ const handleSessionMove = (event) => {
|
|
|
42
74
|
list.groups = groups;
|
|
43
75
|
list.ungroupedSessionIds = ungroupedSessionIds;
|
|
44
76
|
};
|
|
77
|
+
const handleResourceAssociation = (event) => {
|
|
78
|
+
const list = event.currentTarget;
|
|
79
|
+
const next = list.resourceAssociations.filter((association) => association.resourceId !== event.detail.resource.id);
|
|
80
|
+
if (event.detail.toSessionId) {
|
|
81
|
+
next.push({
|
|
82
|
+
resourceId: event.detail.resource.id,
|
|
83
|
+
sessionId: event.detail.toSessionId,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
list.resourceAssociations = next;
|
|
87
|
+
};
|
|
88
|
+
const handleResourceContext = async (event) => {
|
|
89
|
+
const list = event.currentTarget;
|
|
90
|
+
const { DeesContextmenu } = await import('../../00group-overlay/dees-contextmenu/dees-contextmenu.js');
|
|
91
|
+
const currentSessionId = event.detail.sessionId;
|
|
92
|
+
const eligibleSessionIds = ['session-0', 'session-1', 'session-2'];
|
|
93
|
+
const menu = await DeesContextmenu.openContextMenuWithOptions(new MouseEvent('contextmenu', {
|
|
94
|
+
clientX: event.detail.clientX,
|
|
95
|
+
clientY: event.detail.clientY,
|
|
96
|
+
}), [
|
|
97
|
+
...eligibleSessionIds
|
|
98
|
+
.filter((sessionId) => sessionId !== currentSessionId)
|
|
99
|
+
.map((sessionId) => ({
|
|
100
|
+
name: `${currentSessionId ? 'Reassign' : 'Attach'} to ${demoSessions.find((session) => session.id === sessionId)?.title}`,
|
|
101
|
+
iconName: 'lucide:Link',
|
|
102
|
+
action: async () => {
|
|
103
|
+
event.detail.requestAssociation(sessionId);
|
|
104
|
+
event.detail.close();
|
|
105
|
+
},
|
|
106
|
+
})),
|
|
107
|
+
...(currentSessionId
|
|
108
|
+
? [{
|
|
109
|
+
name: 'Detach',
|
|
110
|
+
iconName: 'lucide:Unlink',
|
|
111
|
+
action: async () => {
|
|
112
|
+
event.detail.requestAssociation(null);
|
|
113
|
+
event.detail.close();
|
|
114
|
+
},
|
|
115
|
+
}]
|
|
116
|
+
: []),
|
|
117
|
+
]);
|
|
118
|
+
if (!menu) {
|
|
119
|
+
event.detail.close();
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const observer = new MutationObserver(() => {
|
|
123
|
+
if (menu.isConnected)
|
|
124
|
+
return;
|
|
125
|
+
observer.disconnect();
|
|
126
|
+
event.detail.close();
|
|
127
|
+
});
|
|
128
|
+
observer.observe(document.body, { childList: true });
|
|
129
|
+
}
|
|
130
|
+
list.selectedResourceId = event.detail.resource.id;
|
|
131
|
+
};
|
|
45
132
|
const openModal = async () => {
|
|
46
133
|
const { DeesModal } = await import('../../00group-overlay/dees-modal/dees-modal.js');
|
|
47
134
|
const content = document.createElement('dees-harness-session-list');
|
|
@@ -79,16 +166,27 @@ export const demoFunc = () => html `
|
|
|
79
166
|
</style>
|
|
80
167
|
<div class="sessionDemo">
|
|
81
168
|
<dees-button @clicked=${openModal}>Open in a DeesModal</dees-button>
|
|
82
|
-
<div class="demoHint">
|
|
169
|
+
<div class="demoHint">
|
|
170
|
+
Use a conversation grip to reorder sessions. Use a resource grip to associate it with a
|
|
171
|
+
session, or open Actions with click, ContextMenu, or Shift+F10 for attach, reassign, and detach.
|
|
172
|
+
</div>
|
|
83
173
|
<dees-harness-session-list
|
|
84
174
|
.sessions=${demoSessions}
|
|
85
175
|
.groups=${demoGroups}
|
|
86
176
|
.ungroupedSessionIds=${demoSessions.slice(5).map((session) => session.id)}
|
|
177
|
+
.resources=${demoResources}
|
|
178
|
+
.resourceAssociations=${demoResourceAssociations}
|
|
179
|
+
.eligibleSessionIdsByResourceId=${demoResourceEligibleSessionIds}
|
|
87
180
|
.enableGrouping=${true}
|
|
88
181
|
selectedSessionId="session-2"
|
|
89
182
|
@harness-session-select=${handleSessionSelect}
|
|
90
183
|
@harness-session-move=${handleSessionMove}
|
|
184
|
+
@harness-resource-select=${(event) => {
|
|
185
|
+
event.currentTarget.selectedResourceId = event.detail.resource.id;
|
|
186
|
+
}}
|
|
187
|
+
@harness-resource-context=${handleResourceContext}
|
|
188
|
+
@harness-resource-association-request=${handleResourceAssociation}
|
|
91
189
|
></dees-harness-session-list>
|
|
92
190
|
</div>
|
|
93
191
|
`;
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oYXJuZXNzLXNlc3Npb24tbGlzdC5kZW1vLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaGFybmVzcy9kZWVzLWhhcm5lc3Mtc2Vzc2lvbi1saXN0L2RlZXMtaGFybmVzcy1zZXNzaW9uLWxpc3QuZGVtby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFZbkQsTUFBTSxZQUFZLEdBQTBCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLEVBQUUsRUFBRSxXQUFXLEtBQUssRUFBRTtJQUN0QixLQUFLLEVBQUU7UUFDTCx1QkFBdUI7UUFDdkIsc0NBQXNDO1FBQ3RDLDJCQUEyQjtRQUMzQiw2QkFBNkI7UUFDN0IsZ0JBQWdCO1FBQ2hCLHFDQUFxQztLQUN0QyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDWixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVM7SUFDL0MsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTO0lBQy9DLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sRUFBRSx3RUFBd0U7SUFDakYsS0FBSyxFQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDcEYsT0FBTyxFQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQztDQUN6QixDQUFDLENBQUMs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
|