@things-factory/ai-dashboard 10.1.213 → 10.1.215
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/client/components/card-dialogs.ts +24 -1
- package/client/components/dashboard-card.ts +24 -70
- package/client/index.ts +2 -0
- package/client/pages/my-dashboard-page.ts +6 -5
- package/client/utils/card-api.ts +3 -2
- package/client/utils/card-words.ts +11 -0
- package/client/utils/examples.ts +15 -0
- package/dist-client/components/card-dialogs.js +22 -1
- package/dist-client/components/card-dialogs.js.map +1 -1
- package/dist-client/components/dashboard-card.d.ts +6 -5
- package/dist-client/components/dashboard-card.js +23 -73
- package/dist-client/components/dashboard-card.js.map +1 -1
- package/dist-client/index.d.ts +1 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -1
- package/dist-client/pages/my-dashboard-page.js +6 -5
- package/dist-client/pages/my-dashboard-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/utils/card-api.d.ts +6 -1
- package/dist-client/utils/card-api.js +1 -1
- package/dist-client/utils/card-api.js.map +1 -1
- package/dist-client/utils/card-words.d.ts +14 -0
- package/dist-client/utils/card-words.js +9 -0
- package/dist-client/utils/card-words.js.map +1 -1
- package/dist-client/utils/examples.d.ts +3 -0
- package/dist-client/utils/examples.js +14 -0
- package/dist-client/utils/examples.js.map +1 -0
- package/dist-server/service/card/card-access.d.ts +8 -2
- package/dist-server/service/card/card-access.js +9 -3
- package/dist-server/service/card/card-access.js.map +1 -1
- package/dist-server/service/card/card-definition.d.ts +42 -6
- package/dist-server/service/card/card-definition.js +172 -18
- package/dist-server/service/card/card-definition.js.map +1 -1
- package/dist-server/service/card/card-names.d.ts +5 -0
- package/dist-server/service/card/card-names.js +6 -1
- package/dist-server/service/card/card-names.js.map +1 -1
- package/dist-server/service/card/card-proposal.d.ts +6 -0
- package/dist-server/service/card/card-proposal.js +9 -0
- package/dist-server/service/card/card-proposal.js.map +1 -1
- package/dist-server/service/card/card-resolver.js +24 -5
- package/dist-server/service/card/card-resolver.js.map +1 -1
- package/dist-server/service/card/card-run.js +5 -1
- package/dist-server/service/card/card-run.js.map +1 -1
- package/dist-server/service/card/card-tool.d.ts +66 -8
- package/dist-server/service/card/card-tool.js +88 -17
- package/dist-server/service/card/card-tool.js.map +1 -1
- package/dist-server/service/card/card-types.d.ts +1 -0
- package/dist-server/service/card/card-types.js +8 -4
- package/dist-server/service/card/card-types.js.map +1 -1
- package/dist-server/service/card/dashboard-card.d.ts +2 -0
- package/dist-server/service/card/dashboard-card.js +5 -3
- package/dist-server/service/card/dashboard-card.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/server/service/card/card-access.test.ts +62 -7
- package/server/service/card/card-access.ts +12 -5
- package/server/service/card/card-definition.ts +182 -18
- package/server/service/card/card-intent.test.ts +250 -0
- package/server/service/card/card-names.ts +5 -0
- package/server/service/card/card-proposal.ts +10 -1
- package/server/service/card/card-resolver.ts +26 -8
- package/server/service/card/card-run.ts +5 -1
- package/server/service/card/card-tool.ts +91 -20
- package/server/service/card/card-types.ts +7 -4
- package/server/service/card/dashboard-card.ts +5 -3
- package/test/card-menu.test.ts +34 -0
- package/test/translations.test.ts +1 -1
- package/translations/en.json +3 -3
- package/translations/es.json +3 -3
- package/translations/ja.json +3 -3
- package/translations/ko.json +3 -3
- package/translations/ms.json +3 -3
- package/translations/zh.json +3 -3
|
@@ -14,14 +14,22 @@ import { notify, openPopup } from '@operato/layout'
|
|
|
14
14
|
import { askAssistant } from '@things-factory/ai-assistant/dist-client/index.js'
|
|
15
15
|
|
|
16
16
|
import { cardApi, dashboardChanged, type CardItem, type CardShare } from '../utils/card-api.js'
|
|
17
|
+
import { cardSelection } from '../utils/card-words.js'
|
|
17
18
|
|
|
18
19
|
const t = (key: string, options: Record<string, unknown> = {}) => String(i18next.t(key, options))
|
|
19
20
|
|
|
20
21
|
const FormStyles = css`
|
|
22
|
+
/*
|
|
23
|
+
* The popup's body is as tall as the popup and clips what is past it: a form scrolls in its own height, and its
|
|
24
|
+
* buttons stay at its foot - a share list of three people pushed 저장 out of sight (2026-10-25).
|
|
25
|
+
*/
|
|
21
26
|
:host {
|
|
22
27
|
display: flex;
|
|
23
28
|
flex-direction: column;
|
|
24
29
|
gap: 14px;
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
height: 100%;
|
|
32
|
+
overflow-y: auto;
|
|
25
33
|
padding: 16px 20px 20px;
|
|
26
34
|
color: var(--ui-ink, var(--md-sys-color-on-surface));
|
|
27
35
|
font-size: var(--ui-t-body, 13px);
|
|
@@ -80,9 +88,15 @@ const FormStyles = css`
|
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
.actions {
|
|
91
|
+
position: sticky;
|
|
92
|
+
bottom: -20px;
|
|
83
93
|
display: flex;
|
|
84
94
|
justify-content: flex-end;
|
|
85
95
|
gap: 8px;
|
|
96
|
+
margin-top: auto;
|
|
97
|
+
padding: 10px 0 20px;
|
|
98
|
+
margin-bottom: -20px;
|
|
99
|
+
background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));
|
|
86
100
|
}
|
|
87
101
|
|
|
88
102
|
h5 {
|
|
@@ -227,7 +241,7 @@ export class CardAiForm extends localize(i18next)(LitElement) {
|
|
|
227
241
|
this.close()
|
|
228
242
|
askAssistant({
|
|
229
243
|
ask: t('ai-dashboard.ai.ask', { name: this.card.name, version: this.card.version, change: this.text.trim() }),
|
|
230
|
-
selection:
|
|
244
|
+
selection: cardSelection(this.card, t('ai-dashboard.title'))
|
|
231
245
|
})
|
|
232
246
|
}
|
|
233
247
|
}
|
|
@@ -327,6 +341,15 @@ export class CardShareForm extends localize(i18next)(LitElement) {
|
|
|
327
341
|
</label>`
|
|
328
342
|
)}`
|
|
329
343
|
: nothing}
|
|
344
|
+
${options.roles.length
|
|
345
|
+
? html`<h5>${t('ai-dashboard.share.roles')}</h5>
|
|
346
|
+
${options.roles.map(
|
|
347
|
+
one => html`<label class="option">
|
|
348
|
+
<input type="checkbox" .checked=${this.has('ROLE', one.id)} @change=${(e: any) => this.toggle({ scope: 'ROLE', targetId: one.id, targetName: one.name }, e.target.checked)} />
|
|
349
|
+
<md-icon>badge</md-icon>${one.name}<small>${t('ai-dashboard.share.role-holders')}</small>
|
|
350
|
+
</label>`
|
|
351
|
+
)}`
|
|
352
|
+
: nothing}
|
|
330
353
|
<h5>${t('ai-dashboard.share.people')}</h5>
|
|
331
354
|
${people.length
|
|
332
355
|
? html`<div class="people">
|
|
@@ -10,6 +10,8 @@ import { LitElement, css, html, nothing } from 'lit'
|
|
|
10
10
|
import { customElement, property, state } from 'lit/decorators.js'
|
|
11
11
|
|
|
12
12
|
import { i18next, localize } from '@operato/i18n'
|
|
13
|
+
import '@operato/popup/ox-popup-menu.js'
|
|
14
|
+
import { OxPopupMenu } from '@operato/popup/ox-popup-menu.js'
|
|
13
15
|
|
|
14
16
|
import { cardApi, type CardItem, type CardRun } from '../utils/card-api.js'
|
|
15
17
|
import { drawsNothing, issueLine, ownershipLine, partialLine, readLine, viewIcon } from '../utils/card-words.js'
|
|
@@ -148,50 +150,6 @@ export class AiDashboardCard extends localize(i18next)(LitElement) {
|
|
|
148
150
|
}
|
|
149
151
|
}
|
|
150
152
|
|
|
151
|
-
.menu {
|
|
152
|
-
position: absolute;
|
|
153
|
-
top: 44px;
|
|
154
|
-
right: 10px;
|
|
155
|
-
z-index: 2;
|
|
156
|
-
display: flex;
|
|
157
|
-
flex-direction: column;
|
|
158
|
-
min-width: 180px;
|
|
159
|
-
padding: 6px;
|
|
160
|
-
border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));
|
|
161
|
-
border-radius: 10px;
|
|
162
|
-
background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));
|
|
163
|
-
box-shadow: 0 12px 32px -12px rgb(0 0 0 / 40%);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
.menu button {
|
|
167
|
-
display: flex;
|
|
168
|
-
align-items: center;
|
|
169
|
-
gap: 10px;
|
|
170
|
-
padding: 8px 10px;
|
|
171
|
-
border: 0;
|
|
172
|
-
border-radius: 6px;
|
|
173
|
-
background: transparent;
|
|
174
|
-
color: var(--ui-ink, var(--md-sys-color-on-surface));
|
|
175
|
-
font: inherit;
|
|
176
|
-
font-size: var(--ui-t-body, 13px);
|
|
177
|
-
text-align: start;
|
|
178
|
-
cursor: pointer;
|
|
179
|
-
--md-icon-size: 18px;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
.menu button:hover,
|
|
183
|
-
.menu button:focus-visible {
|
|
184
|
-
background: var(--ui-hover, var(--md-sys-color-surface-container-high));
|
|
185
|
-
outline: none;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
.menu hr {
|
|
189
|
-
width: 100%;
|
|
190
|
-
margin: 4px 0;
|
|
191
|
-
border: 0;
|
|
192
|
-
border-top: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));
|
|
193
|
-
}
|
|
194
|
-
|
|
195
153
|
.body {
|
|
196
154
|
flex: 1;
|
|
197
155
|
min-height: 0;
|
|
@@ -325,23 +283,9 @@ export class AiDashboardCard extends localize(i18next)(LitElement) {
|
|
|
325
283
|
@state() private run?: CardRun
|
|
326
284
|
@state() private failed?: string
|
|
327
285
|
@state() private loading = false
|
|
328
|
-
@state() private menu = false
|
|
329
286
|
@state() private readAt?: Date
|
|
330
287
|
|
|
331
288
|
private readingFor?: string
|
|
332
|
-
private closeMenu = (event: Event) => {
|
|
333
|
-
if (!event.composedPath().includes(this)) this.menu = false
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
connectedCallback() {
|
|
337
|
-
super.connectedCallback()
|
|
338
|
-
document.addEventListener('click', this.closeMenu, true)
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
disconnectedCallback() {
|
|
342
|
-
document.removeEventListener('click', this.closeMenu, true)
|
|
343
|
-
super.disconnectedCallback()
|
|
344
|
-
}
|
|
345
289
|
|
|
346
290
|
updated(changes: Map<string, unknown>) {
|
|
347
291
|
/* A new card, or a new version of it, is read again; nothing else is. */
|
|
@@ -369,7 +313,6 @@ export class AiDashboardCard extends localize(i18next)(LitElement) {
|
|
|
369
313
|
}
|
|
370
314
|
|
|
371
315
|
private act(action: CardAction) {
|
|
372
|
-
this.menu = false
|
|
373
316
|
if (action === 'refresh') return this.refresh()
|
|
374
317
|
this.dispatchEvent(new CustomEvent('card-action', { detail: { action, card: this.card }, bubbles: true, composed: true }))
|
|
375
318
|
}
|
|
@@ -395,27 +338,38 @@ export class AiDashboardCard extends localize(i18next)(LitElement) {
|
|
|
395
338
|
${owner
|
|
396
339
|
? html`<button class="icon" title=${t('ai-dashboard.card.ai')} aria-label=${t('ai-dashboard.card.ai')} @click=${() => this.act('ai')}><md-icon>auto_awesome</md-icon></button>`
|
|
397
340
|
: nothing}
|
|
398
|
-
<button class="icon" title=${t('ai-dashboard.card.more')} aria-label=${t('ai-dashboard.card.more')} aria-
|
|
341
|
+
<button class="icon" title=${t('ai-dashboard.card.more')} aria-label=${t('ai-dashboard.card.more')} aria-haspopup="menu" @click=${(e: MouseEvent) => this.openMenu(e, owner)}>
|
|
399
342
|
<md-icon>more_vert</md-icon>
|
|
400
343
|
</button>
|
|
401
344
|
</div>
|
|
402
345
|
</header>
|
|
403
|
-
${this.menu ? this.renderMenu(owner) : nothing}
|
|
404
346
|
<div class="body">${this.renderBody()}</div>
|
|
405
347
|
${this.run && !this.run.issue ? this.renderFooter() : nothing}
|
|
406
348
|
${this.editing ? this.renderEdit() : nothing}
|
|
407
349
|
</article>`
|
|
408
350
|
}
|
|
409
351
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
352
|
+
/**
|
|
353
|
+
* The card's actions in the platform's popup menu, placed in the body under the button - a menu drawn inside the card
|
|
354
|
+
* was cut by the card's own edge and the grid's (2026-10-25).
|
|
355
|
+
*/
|
|
356
|
+
private openMenu(event: MouseEvent, owner: boolean) {
|
|
357
|
+
event.stopPropagation()
|
|
358
|
+
const at = (event.currentTarget as HTMLElement).getBoundingClientRect()
|
|
359
|
+
const item = (action: CardAction, icon: string, key: string) =>
|
|
360
|
+
html`<ox-popup-menuitem label=${t(key)} @select=${() => this.act(action)}><md-icon slot="icon">${icon}</md-icon></ox-popup-menuitem>`
|
|
361
|
+
OxPopupMenu.open({
|
|
362
|
+
template: html`
|
|
363
|
+
${owner ? item('ai', 'auto_awesome', 'ai-dashboard.card.ai') : nothing} ${owner ? item('rename', 'edit', 'ai-dashboard.card.rename') : nothing}
|
|
364
|
+
${owner ? item('share', 'share', 'ai-dashboard.card.share') : nothing} ${owner ? item('versions', 'history', 'ai-dashboard.card.versions') : nothing}
|
|
365
|
+
${item('copy', 'content_copy', owner ? 'ai-dashboard.card.duplicate' : 'ai-dashboard.card.copy')}
|
|
366
|
+
<div separator></div>
|
|
367
|
+
${item('unplace', 'remove_circle_outline', 'ai-dashboard.card.unplace')}
|
|
368
|
+
`,
|
|
369
|
+
top: at.bottom,
|
|
370
|
+
right: window.innerWidth - at.right,
|
|
371
|
+
parent: document.body
|
|
372
|
+
})
|
|
419
373
|
}
|
|
420
374
|
|
|
421
375
|
private renderBody() {
|
package/client/index.ts
CHANGED
|
@@ -20,13 +20,12 @@ import { askAssistant } from '@things-factory/ai-assistant/dist-client/index.js'
|
|
|
20
20
|
|
|
21
21
|
import { cardApi, DASHBOARD_CHANGED, dashboardChanged, type CardItem, type PlaceItem } from '../utils/card-api.js'
|
|
22
22
|
import { movedPlaces } from '../utils/card-words.js'
|
|
23
|
+
import { dashboardExamples } from '../utils/examples.js'
|
|
23
24
|
import { openCardAiPrompt, openCardRename, openCardShare, openCardVersions } from '../components/card-dialogs.js'
|
|
24
25
|
import type { CardAction } from '../components/dashboard-card.js'
|
|
25
26
|
|
|
26
27
|
const t = (key: string, options: Record<string, unknown> = {}) => String(i18next.t(key, options))
|
|
27
28
|
|
|
28
|
-
/** The requests the empty dashboard offers - each sent to the conversation beside the page as it is. */
|
|
29
|
-
const EXAMPLES = ['ai-dashboard.example.receivables', 'ai-dashboard.example.cash-trend', 'ai-dashboard.example.month-count']
|
|
30
29
|
|
|
31
30
|
@customElement('my-dashboard-page')
|
|
32
31
|
export class MyDashboardPage extends localize(i18next)(PageView) {
|
|
@@ -293,9 +292,11 @@ export class MyDashboardPage extends localize(i18next)(PageView) {
|
|
|
293
292
|
<span class="mark"><md-icon>auto_awesome</md-icon></span>
|
|
294
293
|
<h2>${t('ai-dashboard.page.empty-title')}</h2>
|
|
295
294
|
<p>${t('ai-dashboard.page.empty-text')}</p>
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
295
|
+
${dashboardExamples().length
|
|
296
|
+
? html`<div class="examples">
|
|
297
|
+
${dashboardExamples().map(key => html`<button @click=${() => this.askFor(t(key))}><md-icon>chat_bubble</md-icon><span>${t(key)}</span></button>`)}
|
|
298
|
+
</div>`
|
|
299
|
+
: nothing}
|
|
299
300
|
<button class="library" @click=${() => this.openLibrary()}><md-icon>collections_bookmark</md-icon>${t('ai-dashboard.page.from-library')}</button>
|
|
300
301
|
<p class="note">${t('ai-dashboard.page.no-tokens')}</p>
|
|
301
302
|
</div>`
|
package/client/utils/card-api.ts
CHANGED
|
@@ -7,7 +7,7 @@ import gql from 'graphql-tag'
|
|
|
7
7
|
import { client } from '@operato/graphql'
|
|
8
8
|
|
|
9
9
|
export interface CardShare {
|
|
10
|
-
scope: 'USER' | 'DEPARTMENT' | 'DOMAIN'
|
|
10
|
+
scope: 'USER' | 'DEPARTMENT' | 'ROLE' | 'DOMAIN'
|
|
11
11
|
targetId: string
|
|
12
12
|
targetName?: string | null
|
|
13
13
|
}
|
|
@@ -75,12 +75,13 @@ export const cardApi = {
|
|
|
75
75
|
createdAt?: string
|
|
76
76
|
}[],
|
|
77
77
|
shareOptions: async () =>
|
|
78
|
-
(await ask<any>(`query { dashboardShareOptions { domainId domainName departmentsAvailable departments { id name } peopleAvailable } }`)).dashboardShareOptions as {
|
|
78
|
+
(await ask<any>(`query { dashboardShareOptions { domainId domainName departmentsAvailable departments { id name } peopleAvailable roles { id name note } } }`)).dashboardShareOptions as {
|
|
79
79
|
domainId: string
|
|
80
80
|
domainName: string
|
|
81
81
|
departmentsAvailable: boolean
|
|
82
82
|
departments: { id: string; name: string }[]
|
|
83
83
|
peopleAvailable: boolean
|
|
84
|
+
roles: { id: string; name: string; note?: string | null }[]
|
|
84
85
|
},
|
|
85
86
|
people: async (text: string) => (await ask<any>(`query ($text: String!) { dashboardSharePeople(text: $text) { id name note } }`, { text })).dashboardSharePeople as { id: string; name: string; note?: string }[],
|
|
86
87
|
saveProposal: async (sessionId: string, proposalKey: string) =>
|
|
@@ -6,6 +6,17 @@ import type { CardItem, CardRun } from './card-api.js'
|
|
|
6
6
|
|
|
7
7
|
export type Translate = (key: string, options?: Record<string, unknown>) => string
|
|
8
8
|
|
|
9
|
+
/** The axis of a saved card - the server's `CARD_AXIS` (card-names.ts); a test holds the two equal. */
|
|
10
|
+
export const CARD_AXIS = 'dashboard-card'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A card picked to change, as the conversation is handed it (`askAssistant({ selection })`): its key
|
|
14
|
+
* `dashboard-card:<uuid>`, like any picked row - the bare uuid named no record, and the change failed on it (2026-10-25).
|
|
15
|
+
*/
|
|
16
|
+
export function cardSelection(card: Pick<CardItem, 'id' | 'name'>, title: string) {
|
|
17
|
+
return { title, list: 'dashboardCards', records: [{ id: `${CARD_AXIS}:${card.id}`, label: card.name }] }
|
|
18
|
+
}
|
|
19
|
+
|
|
9
20
|
/** The refusals a card names in the reader's words - others are said by their code. */
|
|
10
21
|
export const KNOWN_ISSUES = [
|
|
11
22
|
'door-closed',
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The requests an empty dashboard offers - the application's, in its own words (i18n keys), since only it knows what
|
|
3
|
+
* its reads hold: the receivables in an office, the output by operation in a plant. None: the dashboard offers only
|
|
4
|
+
* the library and the conversation beside it.
|
|
5
|
+
*/
|
|
6
|
+
let keys: string[] = []
|
|
7
|
+
|
|
8
|
+
/** Called once from the application's client bootstrap. */
|
|
9
|
+
export function setDashboardExamples(examples: readonly string[]): void {
|
|
10
|
+
keys = [...examples]
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function dashboardExamples(): readonly string[] {
|
|
14
|
+
return keys
|
|
15
|
+
}
|
|
@@ -12,12 +12,20 @@ import { i18next, localize } from '@operato/i18n';
|
|
|
12
12
|
import { notify, openPopup } from '@operato/layout';
|
|
13
13
|
import { askAssistant } from '@things-factory/ai-assistant/dist-client/index.js';
|
|
14
14
|
import { cardApi, dashboardChanged } from '../utils/card-api.js';
|
|
15
|
+
import { cardSelection } from '../utils/card-words.js';
|
|
15
16
|
const t = (key, options = {}) => String(i18next.t(key, options));
|
|
16
17
|
const FormStyles = css `
|
|
18
|
+
/*
|
|
19
|
+
* The popup's body is as tall as the popup and clips what is past it: a form scrolls in its own height, and its
|
|
20
|
+
* buttons stay at its foot - a share list of three people pushed 저장 out of sight (2026-10-25).
|
|
21
|
+
*/
|
|
17
22
|
:host {
|
|
18
23
|
display: flex;
|
|
19
24
|
flex-direction: column;
|
|
20
25
|
gap: 14px;
|
|
26
|
+
box-sizing: border-box;
|
|
27
|
+
height: 100%;
|
|
28
|
+
overflow-y: auto;
|
|
21
29
|
padding: 16px 20px 20px;
|
|
22
30
|
color: var(--ui-ink, var(--md-sys-color-on-surface));
|
|
23
31
|
font-size: var(--ui-t-body, 13px);
|
|
@@ -76,9 +84,15 @@ const FormStyles = css `
|
|
|
76
84
|
}
|
|
77
85
|
|
|
78
86
|
.actions {
|
|
87
|
+
position: sticky;
|
|
88
|
+
bottom: -20px;
|
|
79
89
|
display: flex;
|
|
80
90
|
justify-content: flex-end;
|
|
81
91
|
gap: 8px;
|
|
92
|
+
margin-top: auto;
|
|
93
|
+
padding: 10px 0 20px;
|
|
94
|
+
margin-bottom: -20px;
|
|
95
|
+
background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));
|
|
82
96
|
}
|
|
83
97
|
|
|
84
98
|
h5 {
|
|
@@ -221,7 +235,7 @@ let CardAiForm = class CardAiForm extends localize(i18next)(LitElement) {
|
|
|
221
235
|
this.close();
|
|
222
236
|
askAssistant({
|
|
223
237
|
ask: t('ai-dashboard.ai.ask', { name: this.card.name, version: this.card.version, change: this.text.trim() }),
|
|
224
|
-
selection:
|
|
238
|
+
selection: cardSelection(this.card, t('ai-dashboard.title'))
|
|
225
239
|
});
|
|
226
240
|
}
|
|
227
241
|
};
|
|
@@ -335,6 +349,13 @@ let CardShareForm = class CardShareForm extends localize(i18next)(LitElement) {
|
|
|
335
349
|
<md-icon>groups</md-icon>${one.name}<small>${t('ai-dashboard.share.department-members')}</small>
|
|
336
350
|
</label>`)}`
|
|
337
351
|
: nothing}
|
|
352
|
+
${options.roles.length
|
|
353
|
+
? html `<h5>${t('ai-dashboard.share.roles')}</h5>
|
|
354
|
+
${options.roles.map(one => html `<label class="option">
|
|
355
|
+
<input type="checkbox" .checked=${this.has('ROLE', one.id)} @change=${(e) => this.toggle({ scope: 'ROLE', targetId: one.id, targetName: one.name }, e.target.checked)} />
|
|
356
|
+
<md-icon>badge</md-icon>${one.name}<small>${t('ai-dashboard.share.role-holders')}</small>
|
|
357
|
+
</label>`)}`
|
|
358
|
+
: nothing}
|
|
338
359
|
<h5>${t('ai-dashboard.share.people')}</h5>
|
|
339
360
|
${people.length
|
|
340
361
|
? html `<div class="people">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-dialogs.js","sourceRoot":"","sources":["../../client/components/card-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The small forms a card opens - what to change with the assistant, a new name, whom to share it with, and its\n * versions (ADR-0160 decisions 7, 9). Each changes one card through its own door and tells an open dashboard.\n */\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\n\nimport { LitElement, css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { askAssistant } from '@things-factory/ai-assistant/dist-client/index.js'\n\nimport { cardApi, dashboardChanged, type CardItem, type CardShare } from '../utils/card-api.js'\n\nconst t = (key: string, options: Record<string, unknown> = {}) => String(i18next.t(key, options))\n\nconst FormStyles = css`\n :host {\n display: flex;\n flex-direction: column;\n gap: 14px;\n padding: 16px 20px 20px;\n color: var(--ui-ink, var(--md-sys-color-on-surface));\n font-size: var(--ui-t-body, 13px);\n line-height: 1.5;\n }\n\n p.lead {\n margin: 0;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n textarea,\n input[type='text'],\n input[type='search'] {\n box-sizing: border-box;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: 8px;\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n color: inherit;\n font: inherit;\n }\n\n textarea {\n min-height: 88px;\n resize: vertical;\n }\n\n textarea:focus,\n input:focus {\n outline: 2px solid color-mix(in srgb, var(--ui-accent, var(--md-sys-color-primary)) 40%, transparent);\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n }\n\n .hints {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .hints button {\n padding: 4px 10px;\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n background: transparent;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font: inherit;\n font-size: var(--ui-t-small, 12px);\n cursor: pointer;\n }\n\n .hints button:hover {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n color: var(--ui-accent, var(--md-sys-color-primary));\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n }\n\n h5 {\n margin: 6px 0 0;\n font-size: var(--ui-t-small, 12px);\n font-weight: 600;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n text-transform: none;\n }\n\n label.option {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 8px;\n cursor: pointer;\n }\n\n label.option small {\n margin-left: auto;\n color: var(--ui-faint, var(--md-sys-color-on-surface-variant));\n }\n\n .people {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .person {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n border-radius: 8px;\n background: var(--ui-panel-2, var(--md-sys-color-surface-container-low));\n --md-icon-size: 16px;\n }\n\n .person small {\n color: var(--ui-faint, var(--md-sys-color-on-surface-variant));\n }\n\n .person button,\n .found button {\n margin-left: auto;\n border: 0;\n background: transparent;\n color: var(--ui-accent, var(--md-sys-color-primary));\n font: inherit;\n cursor: pointer;\n }\n\n .found {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 8px;\n }\n\n .found div {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n }\n\n .found div + div {\n border-top: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n }\n\n .note {\n margin: 0;\n font-size: var(--ui-t-small, 12px);\n color: var(--ui-faint, var(--md-sys-color-on-surface-variant));\n }\n\n ol.versions {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n ol.versions li {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 8px;\n }\n\n ol.versions .v {\n flex: none;\n min-width: 36px;\n font-weight: 650;\n font-variant-numeric: tabular-nums;\n color: var(--ui-accent, var(--md-sys-color-primary));\n }\n\n ol.versions .what {\n flex: 1;\n min-width: 0;\n }\n\n ol.versions small {\n display: block;\n color: var(--ui-faint, var(--md-sys-color-on-surface-variant));\n }\n`\n\n/** What to change in a card - sent to the conversation beside the page with the card picked, as a screen request. */\n@customElement('ai-dashboard-card-ai-form')\nexport class CardAiForm extends localize(i18next)(LitElement) {\n static styles = FormStyles\n @property({ attribute: false }) card!: CardItem\n @state() private text = ''\n\n render() {\n const hints = ['ai-dashboard.ai.hint-period', 'ai-dashboard.ai.hint-top', 'ai-dashboard.ai.hint-line', 'ai-dashboard.ai.hint-table']\n return html`<p class=\"lead\">${t('ai-dashboard.ai.lead', { name: this.card.name })}</p>\n <textarea .value=${this.text} placeholder=${t('ai-dashboard.ai.placeholder')} @input=${(e: any) => (this.text = e.target.value)} @keydown=${(e: KeyboardEvent) => e.key === 'Enter' && (e.metaKey || e.ctrlKey) && this.send()}></textarea>\n <div class=\"hints\">${hints.map(key => html`<button @click=${() => (this.text = t(key))}>${t(key)}</button>`)}</div>\n <div class=\"actions\">\n <md-text-button @click=${() => this.close()}>${t('ai-dashboard.button.cancel')}</md-text-button>\n <md-filled-button ?disabled=${!this.text.trim()} @click=${() => this.send()}>${t('ai-dashboard.ai.send')}</md-filled-button>\n </div>`\n }\n\n private close() {\n this.dispatchEvent(new CustomEvent('done', { bubbles: true, composed: true }))\n }\n\n private send() {\n if (!this.text.trim()) return\n /* Closed first: the dock opens over the page, and a popup that is no longer the top one refuses to close. */\n this.close()\n askAssistant({\n ask: t('ai-dashboard.ai.ask', { name: this.card.name, version: this.card.version, change: this.text.trim() }),\n selection: { title: t('ai-dashboard.title'), list: 'dashboardCards', records: [{ id: this.card.id, label: this.card.name }] }\n })\n }\n}\n\n/** A card's new name - a new version. */\n@customElement('ai-dashboard-card-rename-form')\nexport class CardRenameForm extends localize(i18next)(LitElement) {\n static styles = FormStyles\n @property({ attribute: false }) card!: CardItem\n @state() private name = ''\n\n connectedCallback() {\n super.connectedCallback()\n this.name = this.card?.name ?? ''\n }\n\n render() {\n return html`<input type=\"text\" .value=${this.name} maxlength=\"100\" @input=${(e: any) => (this.name = e.target.value)} @keydown=${(e: KeyboardEvent) => e.key === 'Enter' && this.save()} />\n <div class=\"actions\">\n <md-text-button @click=${() => this.close()}>${t('ai-dashboard.button.cancel')}</md-text-button>\n <md-filled-button ?disabled=${!this.name.trim() || this.name.trim() === this.card.name} @click=${() => this.save()}>${t('ai-dashboard.button.save')}</md-filled-button>\n </div>`\n }\n\n private close() {\n this.dispatchEvent(new CustomEvent('done', { bubbles: true, composed: true }))\n }\n\n private async save() {\n try {\n await cardApi.rename(this.card.id, this.name.trim())\n dashboardChanged()\n this.close()\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n}\n\n/** Whom one's own card is shared with - the whole domain, one's own departments, people found by name. */\n@customElement('ai-dashboard-card-share-form')\nexport class CardShareForm extends localize(i18next)(LitElement) {\n static styles = FormStyles\n @property({ attribute: false }) card!: CardItem\n @state() private options?: Awaited<ReturnType<typeof cardApi.shareOptions>>\n @state() private shares: CardShare[] = []\n @state() private found: { id: string; name: string; note?: string }[] = []\n @state() private search = ''\n private searching?: ReturnType<typeof setTimeout>\n\n async connectedCallback() {\n super.connectedCallback()\n this.shares = [...(this.card?.shares ?? [])].map(({ scope, targetId, targetName }) => ({ scope, targetId, targetName }))\n try {\n this.options = await cardApi.shareOptions()\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n\n private has(scope: string, id: string) {\n return this.shares.some(one => one.scope === scope && one.targetId === id)\n }\n\n private toggle(share: CardShare, on: boolean) {\n this.shares = on ? [...this.shares.filter(one => !(one.scope === share.scope && one.targetId === share.targetId)), share] : this.shares.filter(one => !(one.scope === share.scope && one.targetId === share.targetId))\n }\n\n private find(text: string) {\n this.search = text\n clearTimeout(this.searching)\n this.searching = setTimeout(async () => {\n try {\n this.found = text.trim() ? await cardApi.people(text.trim()) : []\n } catch {\n this.found = []\n }\n }, 250)\n }\n\n render() {\n const options = this.options\n const people = this.shares.filter(one => one.scope === 'USER')\n return html`<p class=\"lead\">${t('ai-dashboard.share.lead')}</p>\n ${options\n ? html`<h5>${t('ai-dashboard.share.everyone-title')}</h5>\n <label class=\"option\">\n <input type=\"checkbox\" .checked=${this.has('DOMAIN', options.domainId)} @change=${(e: any) => this.toggle({ scope: 'DOMAIN', targetId: options.domainId, targetName: options.domainName }, e.target.checked)} />\n <md-icon>domain</md-icon>${t('ai-dashboard.share.everyone-in', { name: options.domainName })}\n </label>\n ${options.departmentsAvailable && options.departments.length\n ? html`<h5>${t('ai-dashboard.share.departments')}</h5>\n ${options.departments.map(\n one => html`<label class=\"option\">\n <input type=\"checkbox\" .checked=${this.has('DEPARTMENT', one.id)} @change=${(e: any) => this.toggle({ scope: 'DEPARTMENT', targetId: one.id, targetName: one.name }, e.target.checked)} />\n <md-icon>groups</md-icon>${one.name}<small>${t('ai-dashboard.share.department-members')}</small>\n </label>`\n )}`\n : nothing}\n <h5>${t('ai-dashboard.share.people')}</h5>\n ${people.length\n ? html`<div class=\"people\">\n ${people.map(one => html`<div class=\"person\"><md-icon>person</md-icon>${one.targetName ?? one.targetId}<button @click=${() => this.toggle(one, false)}>${t('ai-dashboard.share.remove')}</button></div>`)}\n </div>`\n : nothing}\n ${options.peopleAvailable\n ? html`<input type=\"search\" .value=${this.search} placeholder=${t('ai-dashboard.share.find-person')} @input=${(e: any) => this.find(e.target.value)} />\n ${this.found.length\n ? html`<div class=\"found\">\n ${this.found\n .filter(one => !this.has('USER', one.id))\n .map(one => html`<div><md-icon>person_add</md-icon>${one.name} ${one.note ? html`<small>${one.note}</small>` : nothing}<button @click=${() => this.toggle({ scope: 'USER', targetId: one.id, targetName: one.name }, true)}>${t('ai-dashboard.share.add')}</button></div>`)}\n </div>`\n : nothing}`\n : html`<p class=\"note\">${t('ai-dashboard.share.people-unavailable')}</p>`}\n <p class=\"note\">${t('ai-dashboard.share.rule')}</p>`\n : nothing}\n <div class=\"actions\">\n <md-text-button @click=${() => this.close()}>${t('ai-dashboard.button.cancel')}</md-text-button>\n <md-filled-button ?disabled=${!options} @click=${() => this.save()}>${t('ai-dashboard.button.save')}</md-filled-button>\n </div>`\n }\n\n private close() {\n this.dispatchEvent(new CustomEvent('done', { bubbles: true, composed: true }))\n }\n\n private async save() {\n try {\n await cardApi.share(this.card.id, this.shares)\n notify({ level: 'info', message: t(this.shares.length ? 'ai-dashboard.text.shared' : 'ai-dashboard.text.private', { name: this.card.name }) })\n dashboardChanged()\n this.close()\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n}\n\n/** One's own card's versions, newest first - an earlier one comes back as a new version. */\n@customElement('ai-dashboard-card-versions')\nexport class CardVersions extends localize(i18next)(LitElement) {\n static styles = FormStyles\n @property({ attribute: false }) card!: CardItem\n @state() private versions?: Awaited<ReturnType<typeof cardApi.versions>>\n\n async connectedCallback() {\n super.connectedCallback()\n try {\n this.versions = await cardApi.versions(this.card.id)\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n\n render() {\n const view = (definition: any) => t(`ai-dashboard.view.${definition?.view?.kind ?? 'table'}`)\n return html`<p class=\"lead\">${t('ai-dashboard.versions.lead')}</p>\n <ol class=\"versions\">\n ${(this.versions ?? []).map(\n one => html`<li>\n <span class=\"v\">v${one.version}</span>\n <span class=\"what\">${one.name}<small>${view(one.definition)} · ${one.creatorName ?? ''} · ${one.createdAt ? new Date(one.createdAt).toLocaleString(i18next.language) : ''}</small></span>\n ${one.version === this.card.version\n ? html`<small>${t('ai-dashboard.versions.current')}</small>`\n : html`<md-text-button @click=${() => this.restore(one.version)}>${t('ai-dashboard.versions.restore')}</md-text-button>`}\n </li>`\n )}\n </ol>`\n }\n\n private async restore(version: number) {\n try {\n await cardApi.restore(this.card.id, version)\n notify({ level: 'info', message: t('ai-dashboard.text.restored', { version }) })\n dashboardChanged()\n this.dispatchEvent(new CustomEvent('done', { bubbles: true, composed: true }))\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n}\n\nfunction open(template: unknown, title: string, size: 'small' | 'medium' = 'small') {\n const popup: any = openPopup(html`<div @done=${() => popup?.close?.()}>${template}</div>`, { backdrop: true, size, title })\n return popup\n}\n\nexport const openCardAiPrompt = (card: CardItem) => open(html`<ai-dashboard-card-ai-form .card=${card}></ai-dashboard-card-ai-form>`, t('ai-dashboard.card.ai'), 'medium')\nexport const openCardRename = (card: CardItem) => open(html`<ai-dashboard-card-rename-form .card=${card}></ai-dashboard-card-rename-form>`, t('ai-dashboard.card.rename'))\nexport const openCardShare = (card: CardItem) => open(html`<ai-dashboard-card-share-form .card=${card}></ai-dashboard-card-share-form>`, t('ai-dashboard.share.title', { name: card.name }), 'medium')\nexport const openCardVersions = (card: CardItem) => open(html`<ai-dashboard-card-versions .card=${card}></ai-dashboard-card-versions>`, t('ai-dashboard.card.versions'), 'medium')\n"]}
|
|
1
|
+
{"version":3,"file":"card-dialogs.js","sourceRoot":"","sources":["../../client/components/card-dialogs.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The small forms a card opens - what to change with the assistant, a new name, whom to share it with, and its\n * versions (ADR-0160 decisions 7, 9). Each changes one card through its own door and tells an open dashboard.\n */\nimport '@material/web/icon/icon.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\n\nimport { LitElement, css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { askAssistant } from '@things-factory/ai-assistant/dist-client/index.js'\n\nimport { cardApi, dashboardChanged, type CardItem, type CardShare } from '../utils/card-api.js'\nimport { cardSelection } from '../utils/card-words.js'\n\nconst t = (key: string, options: Record<string, unknown> = {}) => String(i18next.t(key, options))\n\nconst FormStyles = css`\n /*\n * The popup's body is as tall as the popup and clips what is past it: a form scrolls in its own height, and its\n * buttons stay at its foot - a share list of three people pushed 저장 out of sight (2026-10-25).\n */\n :host {\n display: flex;\n flex-direction: column;\n gap: 14px;\n box-sizing: border-box;\n height: 100%;\n overflow-y: auto;\n padding: 16px 20px 20px;\n color: var(--ui-ink, var(--md-sys-color-on-surface));\n font-size: var(--ui-t-body, 13px);\n line-height: 1.5;\n }\n\n p.lead {\n margin: 0;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n\n textarea,\n input[type='text'],\n input[type='search'] {\n box-sizing: border-box;\n width: 100%;\n padding: 9px 12px;\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: 8px;\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n color: inherit;\n font: inherit;\n }\n\n textarea {\n min-height: 88px;\n resize: vertical;\n }\n\n textarea:focus,\n input:focus {\n outline: 2px solid color-mix(in srgb, var(--ui-accent, var(--md-sys-color-primary)) 40%, transparent);\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n }\n\n .hints {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .hints button {\n padding: 4px 10px;\n border: 1px solid var(--ui-line, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n background: transparent;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font: inherit;\n font-size: var(--ui-t-small, 12px);\n cursor: pointer;\n }\n\n .hints button:hover {\n border-color: var(--ui-accent, var(--md-sys-color-primary));\n color: var(--ui-accent, var(--md-sys-color-primary));\n }\n\n .actions {\n position: sticky;\n bottom: -20px;\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n margin-top: auto;\n padding: 10px 0 20px;\n margin-bottom: -20px;\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n }\n\n h5 {\n margin: 6px 0 0;\n font-size: var(--ui-t-small, 12px);\n font-weight: 600;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n text-transform: none;\n }\n\n label.option {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 8px;\n cursor: pointer;\n }\n\n label.option small {\n margin-left: auto;\n color: var(--ui-faint, var(--md-sys-color-on-surface-variant));\n }\n\n .people {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .person {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n border-radius: 8px;\n background: var(--ui-panel-2, var(--md-sys-color-surface-container-low));\n --md-icon-size: 16px;\n }\n\n .person small {\n color: var(--ui-faint, var(--md-sys-color-on-surface-variant));\n }\n\n .person button,\n .found button {\n margin-left: auto;\n border: 0;\n background: transparent;\n color: var(--ui-accent, var(--md-sys-color-primary));\n font: inherit;\n cursor: pointer;\n }\n\n .found {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 8px;\n }\n\n .found div {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px;\n }\n\n .found div + div {\n border-top: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n }\n\n .note {\n margin: 0;\n font-size: var(--ui-t-small, 12px);\n color: var(--ui-faint, var(--md-sys-color-on-surface-variant));\n }\n\n ol.versions {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n ol.versions li {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 8px;\n }\n\n ol.versions .v {\n flex: none;\n min-width: 36px;\n font-weight: 650;\n font-variant-numeric: tabular-nums;\n color: var(--ui-accent, var(--md-sys-color-primary));\n }\n\n ol.versions .what {\n flex: 1;\n min-width: 0;\n }\n\n ol.versions small {\n display: block;\n color: var(--ui-faint, var(--md-sys-color-on-surface-variant));\n }\n`\n\n/** What to change in a card - sent to the conversation beside the page with the card picked, as a screen request. */\n@customElement('ai-dashboard-card-ai-form')\nexport class CardAiForm extends localize(i18next)(LitElement) {\n static styles = FormStyles\n @property({ attribute: false }) card!: CardItem\n @state() private text = ''\n\n render() {\n const hints = ['ai-dashboard.ai.hint-period', 'ai-dashboard.ai.hint-top', 'ai-dashboard.ai.hint-line', 'ai-dashboard.ai.hint-table']\n return html`<p class=\"lead\">${t('ai-dashboard.ai.lead', { name: this.card.name })}</p>\n <textarea .value=${this.text} placeholder=${t('ai-dashboard.ai.placeholder')} @input=${(e: any) => (this.text = e.target.value)} @keydown=${(e: KeyboardEvent) => e.key === 'Enter' && (e.metaKey || e.ctrlKey) && this.send()}></textarea>\n <div class=\"hints\">${hints.map(key => html`<button @click=${() => (this.text = t(key))}>${t(key)}</button>`)}</div>\n <div class=\"actions\">\n <md-text-button @click=${() => this.close()}>${t('ai-dashboard.button.cancel')}</md-text-button>\n <md-filled-button ?disabled=${!this.text.trim()} @click=${() => this.send()}>${t('ai-dashboard.ai.send')}</md-filled-button>\n </div>`\n }\n\n private close() {\n this.dispatchEvent(new CustomEvent('done', { bubbles: true, composed: true }))\n }\n\n private send() {\n if (!this.text.trim()) return\n /* Closed first: the dock opens over the page, and a popup that is no longer the top one refuses to close. */\n this.close()\n askAssistant({\n ask: t('ai-dashboard.ai.ask', { name: this.card.name, version: this.card.version, change: this.text.trim() }),\n selection: cardSelection(this.card, t('ai-dashboard.title'))\n })\n }\n}\n\n/** A card's new name - a new version. */\n@customElement('ai-dashboard-card-rename-form')\nexport class CardRenameForm extends localize(i18next)(LitElement) {\n static styles = FormStyles\n @property({ attribute: false }) card!: CardItem\n @state() private name = ''\n\n connectedCallback() {\n super.connectedCallback()\n this.name = this.card?.name ?? ''\n }\n\n render() {\n return html`<input type=\"text\" .value=${this.name} maxlength=\"100\" @input=${(e: any) => (this.name = e.target.value)} @keydown=${(e: KeyboardEvent) => e.key === 'Enter' && this.save()} />\n <div class=\"actions\">\n <md-text-button @click=${() => this.close()}>${t('ai-dashboard.button.cancel')}</md-text-button>\n <md-filled-button ?disabled=${!this.name.trim() || this.name.trim() === this.card.name} @click=${() => this.save()}>${t('ai-dashboard.button.save')}</md-filled-button>\n </div>`\n }\n\n private close() {\n this.dispatchEvent(new CustomEvent('done', { bubbles: true, composed: true }))\n }\n\n private async save() {\n try {\n await cardApi.rename(this.card.id, this.name.trim())\n dashboardChanged()\n this.close()\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n}\n\n/** Whom one's own card is shared with - the whole domain, one's own departments, people found by name. */\n@customElement('ai-dashboard-card-share-form')\nexport class CardShareForm extends localize(i18next)(LitElement) {\n static styles = FormStyles\n @property({ attribute: false }) card!: CardItem\n @state() private options?: Awaited<ReturnType<typeof cardApi.shareOptions>>\n @state() private shares: CardShare[] = []\n @state() private found: { id: string; name: string; note?: string }[] = []\n @state() private search = ''\n private searching?: ReturnType<typeof setTimeout>\n\n async connectedCallback() {\n super.connectedCallback()\n this.shares = [...(this.card?.shares ?? [])].map(({ scope, targetId, targetName }) => ({ scope, targetId, targetName }))\n try {\n this.options = await cardApi.shareOptions()\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n\n private has(scope: string, id: string) {\n return this.shares.some(one => one.scope === scope && one.targetId === id)\n }\n\n private toggle(share: CardShare, on: boolean) {\n this.shares = on ? [...this.shares.filter(one => !(one.scope === share.scope && one.targetId === share.targetId)), share] : this.shares.filter(one => !(one.scope === share.scope && one.targetId === share.targetId))\n }\n\n private find(text: string) {\n this.search = text\n clearTimeout(this.searching)\n this.searching = setTimeout(async () => {\n try {\n this.found = text.trim() ? await cardApi.people(text.trim()) : []\n } catch {\n this.found = []\n }\n }, 250)\n }\n\n render() {\n const options = this.options\n const people = this.shares.filter(one => one.scope === 'USER')\n return html`<p class=\"lead\">${t('ai-dashboard.share.lead')}</p>\n ${options\n ? html`<h5>${t('ai-dashboard.share.everyone-title')}</h5>\n <label class=\"option\">\n <input type=\"checkbox\" .checked=${this.has('DOMAIN', options.domainId)} @change=${(e: any) => this.toggle({ scope: 'DOMAIN', targetId: options.domainId, targetName: options.domainName }, e.target.checked)} />\n <md-icon>domain</md-icon>${t('ai-dashboard.share.everyone-in', { name: options.domainName })}\n </label>\n ${options.departmentsAvailable && options.departments.length\n ? html`<h5>${t('ai-dashboard.share.departments')}</h5>\n ${options.departments.map(\n one => html`<label class=\"option\">\n <input type=\"checkbox\" .checked=${this.has('DEPARTMENT', one.id)} @change=${(e: any) => this.toggle({ scope: 'DEPARTMENT', targetId: one.id, targetName: one.name }, e.target.checked)} />\n <md-icon>groups</md-icon>${one.name}<small>${t('ai-dashboard.share.department-members')}</small>\n </label>`\n )}`\n : nothing}\n ${options.roles.length\n ? html`<h5>${t('ai-dashboard.share.roles')}</h5>\n ${options.roles.map(\n one => html`<label class=\"option\">\n <input type=\"checkbox\" .checked=${this.has('ROLE', one.id)} @change=${(e: any) => this.toggle({ scope: 'ROLE', targetId: one.id, targetName: one.name }, e.target.checked)} />\n <md-icon>badge</md-icon>${one.name}<small>${t('ai-dashboard.share.role-holders')}</small>\n </label>`\n )}`\n : nothing}\n <h5>${t('ai-dashboard.share.people')}</h5>\n ${people.length\n ? html`<div class=\"people\">\n ${people.map(one => html`<div class=\"person\"><md-icon>person</md-icon>${one.targetName ?? one.targetId}<button @click=${() => this.toggle(one, false)}>${t('ai-dashboard.share.remove')}</button></div>`)}\n </div>`\n : nothing}\n ${options.peopleAvailable\n ? html`<input type=\"search\" .value=${this.search} placeholder=${t('ai-dashboard.share.find-person')} @input=${(e: any) => this.find(e.target.value)} />\n ${this.found.length\n ? html`<div class=\"found\">\n ${this.found\n .filter(one => !this.has('USER', one.id))\n .map(one => html`<div><md-icon>person_add</md-icon>${one.name} ${one.note ? html`<small>${one.note}</small>` : nothing}<button @click=${() => this.toggle({ scope: 'USER', targetId: one.id, targetName: one.name }, true)}>${t('ai-dashboard.share.add')}</button></div>`)}\n </div>`\n : nothing}`\n : html`<p class=\"note\">${t('ai-dashboard.share.people-unavailable')}</p>`}\n <p class=\"note\">${t('ai-dashboard.share.rule')}</p>`\n : nothing}\n <div class=\"actions\">\n <md-text-button @click=${() => this.close()}>${t('ai-dashboard.button.cancel')}</md-text-button>\n <md-filled-button ?disabled=${!options} @click=${() => this.save()}>${t('ai-dashboard.button.save')}</md-filled-button>\n </div>`\n }\n\n private close() {\n this.dispatchEvent(new CustomEvent('done', { bubbles: true, composed: true }))\n }\n\n private async save() {\n try {\n await cardApi.share(this.card.id, this.shares)\n notify({ level: 'info', message: t(this.shares.length ? 'ai-dashboard.text.shared' : 'ai-dashboard.text.private', { name: this.card.name }) })\n dashboardChanged()\n this.close()\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n}\n\n/** One's own card's versions, newest first - an earlier one comes back as a new version. */\n@customElement('ai-dashboard-card-versions')\nexport class CardVersions extends localize(i18next)(LitElement) {\n static styles = FormStyles\n @property({ attribute: false }) card!: CardItem\n @state() private versions?: Awaited<ReturnType<typeof cardApi.versions>>\n\n async connectedCallback() {\n super.connectedCallback()\n try {\n this.versions = await cardApi.versions(this.card.id)\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n\n render() {\n const view = (definition: any) => t(`ai-dashboard.view.${definition?.view?.kind ?? 'table'}`)\n return html`<p class=\"lead\">${t('ai-dashboard.versions.lead')}</p>\n <ol class=\"versions\">\n ${(this.versions ?? []).map(\n one => html`<li>\n <span class=\"v\">v${one.version}</span>\n <span class=\"what\">${one.name}<small>${view(one.definition)} · ${one.creatorName ?? ''} · ${one.createdAt ? new Date(one.createdAt).toLocaleString(i18next.language) : ''}</small></span>\n ${one.version === this.card.version\n ? html`<small>${t('ai-dashboard.versions.current')}</small>`\n : html`<md-text-button @click=${() => this.restore(one.version)}>${t('ai-dashboard.versions.restore')}</md-text-button>`}\n </li>`\n )}\n </ol>`\n }\n\n private async restore(version: number) {\n try {\n await cardApi.restore(this.card.id, version)\n notify({ level: 'info', message: t('ai-dashboard.text.restored', { version }) })\n dashboardChanged()\n this.dispatchEvent(new CustomEvent('done', { bubbles: true, composed: true }))\n } catch (error: any) {\n notify({ level: 'error', message: error?.message ?? String(error) })\n }\n }\n}\n\nfunction open(template: unknown, title: string, size: 'small' | 'medium' = 'small') {\n const popup: any = openPopup(html`<div @done=${() => popup?.close?.()}>${template}</div>`, { backdrop: true, size, title })\n return popup\n}\n\nexport const openCardAiPrompt = (card: CardItem) => open(html`<ai-dashboard-card-ai-form .card=${card}></ai-dashboard-card-ai-form>`, t('ai-dashboard.card.ai'), 'medium')\nexport const openCardRename = (card: CardItem) => open(html`<ai-dashboard-card-rename-form .card=${card}></ai-dashboard-card-rename-form>`, t('ai-dashboard.card.rename'))\nexport const openCardShare = (card: CardItem) => open(html`<ai-dashboard-card-share-form .card=${card}></ai-dashboard-card-share-form>`, t('ai-dashboard.share.title', { name: card.name }), 'medium')\nexport const openCardVersions = (card: CardItem) => open(html`<ai-dashboard-card-versions .card=${card}></ai-dashboard-card-versions>`, t('ai-dashboard.card.versions'), 'medium')\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '@material/web/icon/icon.js';
|
|
2
2
|
import '@things-factory/ai-assistant/dist-client/index.js';
|
|
3
3
|
import { LitElement, nothing } from 'lit';
|
|
4
|
+
import '@operato/popup/ox-popup-menu.js';
|
|
4
5
|
import { type CardItem } from '../utils/card-api.js';
|
|
5
6
|
export type CardAction = 'refresh' | 'ai' | 'rename' | 'share' | 'versions' | 'copy' | 'unplace' | 'left' | 'right' | 'wider' | 'narrower' | 'taller' | 'shorter';
|
|
6
7
|
declare const AiDashboardCard_base: (new (...args: any[]) => LitElement) & typeof LitElement;
|
|
@@ -16,18 +17,18 @@ export declare class AiDashboardCard extends AiDashboardCard_base {
|
|
|
16
17
|
private run?;
|
|
17
18
|
private failed?;
|
|
18
19
|
private loading;
|
|
19
|
-
private menu;
|
|
20
20
|
private readAt?;
|
|
21
21
|
private readingFor?;
|
|
22
|
-
private closeMenu;
|
|
23
|
-
connectedCallback(): void;
|
|
24
|
-
disconnectedCallback(): void;
|
|
25
22
|
updated(changes: Map<string, unknown>): void;
|
|
26
23
|
/** Draws the card again from the data - the server runs its definition as the viewer. */
|
|
27
24
|
refresh(): Promise<void>;
|
|
28
25
|
private act;
|
|
29
26
|
render(): import("lit-html").TemplateResult<1> | typeof nothing;
|
|
30
|
-
|
|
27
|
+
/**
|
|
28
|
+
* The card's actions in the platform's popup menu, placed in the body under the button - a menu drawn inside the card
|
|
29
|
+
* was cut by the card's own edge and the grid's (2026-10-25).
|
|
30
|
+
*/
|
|
31
|
+
private openMenu;
|
|
31
32
|
private renderBody;
|
|
32
33
|
private renderFooter;
|
|
33
34
|
private renderEdit;
|