@coworkee/airworks 0.0.1032 → 0.0.1033
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/apps/admin/mail.d.ts +3 -1
- package/dist/apps/admin/mail.js +6 -1
- package/dist/apps/admin/system.d.ts +5 -1
- package/dist/apps/admin/system.js +14 -1
- package/dist/apps/record.d.ts +3 -1
- package/dist/apps/record.js +40 -11
- package/dist/apps/web.d.ts +6 -3
- package/dist/apps/web.js +2 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/style.css +1 -1
- package/package.json +4 -3
|
@@ -16,5 +16,7 @@ export declare const recipientListsApp: (coworkee: Coworkee) => CoworkeeApp;
|
|
|
16
16
|
/** The mails the app sent or queued; opened from a campaign it shows that campaign's mails. */
|
|
17
17
|
export declare const mailLogApp: (coworkee: Coworkee) => CoworkeeApp;
|
|
18
18
|
export declare const mailSettingsApp: (coworkee: Coworkee) => CoworkeeApp;
|
|
19
|
-
|
|
19
|
+
/** The template editor of the web client where the BFF knows it, the plain editor here otherwise. */
|
|
20
|
+
export declare const mailTemplateEditorApp: import("../../coworkee.ts").AppFactory;
|
|
21
|
+
export declare const mailApps: import("../../coworkee.ts").AppFactory[];
|
|
20
22
|
export {};
|
package/dist/apps/admin/mail.js
CHANGED
|
@@ -3,6 +3,7 @@ import { display, errorText, esc } from "../../dom.js";
|
|
|
3
3
|
import { confirmDialog, formDialog, infoDialog } from "../../form.js";
|
|
4
4
|
import { icons } from "../../icons.js";
|
|
5
5
|
import { settingsPageApp } from "../settings.js";
|
|
6
|
+
import { embedOr } from "../web.js";
|
|
6
7
|
import { userLookup } from "./identity.js";
|
|
7
8
|
const mail = '/api/v1/mail';
|
|
8
9
|
const json = (method, body) => ({ method, body: body === undefined ? undefined : JSON.stringify(body) });
|
|
@@ -253,4 +254,8 @@ export const mailSettingsApp = settingsPageApp({
|
|
|
253
254
|
},
|
|
254
255
|
},
|
|
255
256
|
});
|
|
256
|
-
|
|
257
|
+
/** The template editor of the web client where the BFF knows it, the plain editor here otherwise. */
|
|
258
|
+
export const mailTemplateEditorApp = embedOr({
|
|
259
|
+
id: 'coworkee.admin.mail-templates', group: 'Communication', title: 'Mail templates', icon: icons.drafts, accent: '#00838f', path: '/admin/mail/templates', requiredPermissions: ['Mail.Templates.Manage'],
|
|
260
|
+
}, mailTemplatesApp);
|
|
261
|
+
export const mailApps = [mailTemplateEditorApp, mailTemplateApp, mailCampaignsApp, recipientListsApp, mailLogApp, mailSettingsApp];
|
|
@@ -11,4 +11,8 @@ export declare const auditApp: (coworkee: Coworkee) => CoworkeeApp;
|
|
|
11
11
|
export declare const aiToolCallsApp: (coworkee: Coworkee) => CoworkeeApp;
|
|
12
12
|
/** The API documentation (Swagger UI) of the app in a window. */
|
|
13
13
|
export declare const apiDocsApp: (coworkee: Coworkee) => CoworkeeApp;
|
|
14
|
-
|
|
14
|
+
/** Elsa Studio is a host of its own that other origins may not frame: the app only leads into a browser tab. No one holds the permission without Coworkee.Workflows.Elsa. */
|
|
15
|
+
export declare const workflowDesignerApp: (coworkee: Coworkee) => CoworkeeApp;
|
|
16
|
+
/** The theme editor of the web client where the BFF knows it, the JSON form here otherwise. */
|
|
17
|
+
export declare const themeEditorApp: import("../../coworkee.ts").AppFactory;
|
|
18
|
+
export declare const systemApps: import("../../coworkee.ts").AppFactory[];
|
|
@@ -4,6 +4,7 @@ import { esc } from "../../dom.js";
|
|
|
4
4
|
import { confirmDialog, formDialog, infoDialog } from "../../form.js";
|
|
5
5
|
import { icons } from "../../icons.js";
|
|
6
6
|
import { recordAppId } from "../record.js";
|
|
7
|
+
import { embedOr } from "../web.js";
|
|
7
8
|
const json = (method, body) => ({ method, body: body === undefined ? undefined : JSON.stringify(body) });
|
|
8
9
|
const check = (value) => value ? '✓' : '';
|
|
9
10
|
const paged = (page, pageSize, extra = {}) => new URLSearchParams({ Page: String(page), PageSize: String(pageSize), ...Object.fromEntries(Object.entries(extra).filter(([, value]) => value)) });
|
|
@@ -267,4 +268,16 @@ export const apiDocsApp = (coworkee) => ({
|
|
|
267
268
|
id: 'coworkee.api-docs', group: 'Monitoring', title: coworkee.t('API documentation'), icon: icons.dataObject, accent: '#447d1c', width: 1000, height: 680,
|
|
268
269
|
requiredPermissions: ['ApiDocs.View'], url: '/swagger/index.html',
|
|
269
270
|
});
|
|
270
|
-
|
|
271
|
+
/** Elsa Studio is a host of its own that other origins may not frame: the app only leads into a browser tab. No one holds the permission without Coworkee.Workflows.Elsa. */
|
|
272
|
+
export const workflowDesignerApp = (coworkee) => ({
|
|
273
|
+
id: 'coworkee.admin.workflow-designer', group: 'System', title: coworkee.t('Workflow designer'), icon: icons.build, accent: '#2e7d32', width: 420, height: 200,
|
|
274
|
+
requiredPermissions: ['Workflows.Elsa.Manage'],
|
|
275
|
+
render: ({ host }) => {
|
|
276
|
+
host.classList.add('cw-host');
|
|
277
|
+
// the BFF of this page forwards the call with the user's token; the api answers with a redirect to the designer
|
|
278
|
+
host.innerHTML = `<div class="cw-app"><p><a class="cw-primary" href="/api/v1/workflows/elsa/studio" target="_blank" rel="noopener">${esc(coworkee.t('Open in a new tab'))} ↗</a></p></div>`;
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
/** The theme editor of the web client where the BFF knows it, the JSON form here otherwise. */
|
|
282
|
+
export const themeEditorApp = embedOr({ id: 'coworkee.admin.themes', group: 'System', title: 'Themes', icon: 'icon-palette.png', accent: '#c2185b', path: '/admin/themes', requiredPermissions: ['Themes.Manage'] }, themesApp);
|
|
283
|
+
export const systemApps = [languagesApp, translationsApp, themeEditorApp, workflowDesignerApp, backupsApp, servicesApp, editionsApp, tenantsApp, auditApp, aiToolCallsApp, apiDocsApp];
|
package/dist/apps/record.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { Coworkee, CoworkeeApp } from '../coworkee.ts';
|
|
2
2
|
export declare const recordAppId = "coworkee.record";
|
|
3
|
+
/** The record's page in the web client, as the global search links it (its own page or the list searched for it); undefined without a web client or a search of the set. */
|
|
4
|
+
export declare function recordPage(coworkee: Coworkee, set: string, id: string): Promise<string | undefined>;
|
|
3
5
|
/** Approves or rejects an approval with an optional comment; false when the user cancelled. */
|
|
4
6
|
export declare function decide(coworkee: Coworkee, id: string, approve: boolean): Promise<boolean>;
|
|
5
7
|
/** Renders one record of an OData entity set: its fields, its history with undo and restore, its workflow with steps and approvals. */
|
|
6
8
|
export declare function renderRecord(coworkee: Coworkee, host: HTMLElement, set: string, id: string, onTitle?: (title: string) => void): () => void;
|
|
7
|
-
/** One record in a window, opened from the records, the search, the inbox and the audit log with the intent { set, id }. */
|
|
9
|
+
/** One record in a window, opened from the records, the search, the inbox and the audit log with the intent { set, id }; "Open in the web app" leads to its page there. */
|
|
8
10
|
export declare const recordApp: (coworkee: Coworkee) => CoworkeeApp;
|
package/dist/apps/record.js
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import { literal, odataPage } from '@coworkee/client';
|
|
1
|
+
import { ApiError, literal, odataPage } from '@coworkee/client';
|
|
2
2
|
import { display, errorText, esc, humanize, isNoise, recordTitle } from "../dom.js";
|
|
3
3
|
import { formDialog } from "../form.js";
|
|
4
4
|
import { icons } from "../icons.js";
|
|
5
|
+
import { openWebPage } from "./web.js";
|
|
5
6
|
export const recordAppId = 'coworkee.record';
|
|
6
7
|
const json = (method, body) => ({ method, body: body === undefined ? undefined : JSON.stringify(body) });
|
|
7
8
|
const quietly = (load) => load.catch(() => undefined);
|
|
8
9
|
const guid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
10
|
+
/** The record's page in the web client, as the global search links it (its own page or the list searched for it); undefined without a web client or a search of the set. */
|
|
11
|
+
export async function recordPage(coworkee, set, id) {
|
|
12
|
+
if (!coworkee.user.appUrl || !guid.test(id))
|
|
13
|
+
return undefined;
|
|
14
|
+
const { hits } = await coworkee.request(`/api/v1/search?${new URLSearchParams({ q: id, limit: '5' })}`);
|
|
15
|
+
return hits.find((hit) => hit.entitySet === set && hit.id?.toLowerCase() === id.toLowerCase())?.url ?? undefined;
|
|
16
|
+
}
|
|
9
17
|
/** The record's fields for people: simple values in the user's format, images as images. */
|
|
10
18
|
function fieldsHtml(coworkee, row) {
|
|
11
19
|
const { t, culture } = coworkee;
|
|
@@ -60,16 +68,31 @@ export async function decide(coworkee, id, approve) {
|
|
|
60
68
|
void coworkee.refreshBadges();
|
|
61
69
|
return true;
|
|
62
70
|
}
|
|
63
|
-
/** Shows what a restore changes and runs it once the user agrees; false when cancelled. */
|
|
71
|
+
/** Shows what a restore changes and runs it once the user agrees; false when cancelled. A record changed in between is previewed again. */
|
|
64
72
|
async function restore(coworkee, set, id, request) {
|
|
65
|
-
const { t } = coworkee;
|
|
66
73
|
const base = `/api/v1/history/${encodeURIComponent(set)}/${id}`;
|
|
67
|
-
|
|
74
|
+
for (let changedMeanwhile = false;; changedMeanwhile = true) {
|
|
75
|
+
const preview = await coworkee.request(`${base}/preview`, json('POST', request));
|
|
76
|
+
if (!await confirmRestore(coworkee, preview, changedMeanwhile))
|
|
77
|
+
return false;
|
|
78
|
+
try {
|
|
79
|
+
await coworkee.request(`${base}/restore`, json('POST', { ...request, version: preview.version }));
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (!(error instanceof ApiError) || error.status !== 409)
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function confirmRestore(coworkee, preview, changedMeanwhile) {
|
|
89
|
+
const { t } = coworkee;
|
|
68
90
|
const changed = preview.fields.some((field) => field.changedLater);
|
|
69
|
-
|
|
91
|
+
return new Promise((resolve) => {
|
|
70
92
|
const dialog = document.createElement('dialog');
|
|
71
93
|
dialog.className = 'cw-app cw-dialog cw-wide';
|
|
72
94
|
dialog.innerHTML = `<form method="dialog"><h2>${esc(t('Restore'))}</h2><div class="cw-dialog-body">
|
|
95
|
+
${changedMeanwhile ? `<p class="cw-note" data-changed-meanwhile>${esc(t('The record changed in the meantime. Check the new preview.'))}</p>` : ''}
|
|
73
96
|
${preview.undeletes ? `<p class="cw-note">${esc(t('The deleted record comes back.'))}</p>` : ''}
|
|
74
97
|
${changed ? `<p class="cw-note">${esc(t('Some of these fields were changed after this entry. The restore replaces the newer values.'))}</p>` : ''}
|
|
75
98
|
<table class="cw-table"><thead><tr><th>${esc(t('Field'))}</th><th>${esc(t('Now'))}</th><th>${esc(t('After the restore'))}</th></tr></thead><tbody>
|
|
@@ -80,25 +103,28 @@ async function restore(coworkee, set, id, request) {
|
|
|
80
103
|
dialog.addEventListener('close', () => { dialog.remove(); resolve(dialog.returnValue === 'ok'); });
|
|
81
104
|
dialog.showModal();
|
|
82
105
|
});
|
|
83
|
-
if (ok)
|
|
84
|
-
await coworkee.request(`${base}/restore`, json('POST', request));
|
|
85
|
-
return ok;
|
|
86
106
|
}
|
|
87
107
|
/** Renders one record of an OData entity set: its fields, its history with undo and restore, its workflow with steps and approvals. */
|
|
88
108
|
export function renderRecord(coworkee, host, set, id, onTitle) {
|
|
89
109
|
const { t } = coworkee;
|
|
90
|
-
host.innerHTML = `<div class="cw-record"><nav class="cw-tabs" role="tablist"></nav><
|
|
110
|
+
host.innerHTML = `<div class="cw-record"><div class="cw-toolbar" hidden><nav class="cw-tabs" role="tablist"></nav><span class="cw-spacer"></span>
|
|
111
|
+
<button data-web hidden>${esc(t('Open in the web app'))} ↗</button></div><section class="cw-panel"><p class="cw-muted">${esc(t('MudDataGrid_Loading'))}</p></section></div>`;
|
|
112
|
+
const toolbar = host.querySelector('.cw-toolbar');
|
|
91
113
|
const tabs = host.querySelector('nav');
|
|
114
|
+
const web = host.querySelector('[data-web]');
|
|
92
115
|
const panel = host.querySelector('.cw-panel');
|
|
93
116
|
let current = 'Details';
|
|
94
117
|
let row;
|
|
95
118
|
let history;
|
|
96
119
|
let workflow;
|
|
120
|
+
let page;
|
|
97
121
|
const show = (tab = current) => {
|
|
98
122
|
current = tab;
|
|
99
123
|
const available = [['Details', row], ['History', history], ['Workflow', workflow]].filter(([, data]) => data).map(([name]) => name);
|
|
100
124
|
tabs.innerHTML = available.map((name) => `<button role="tab" data-tab="${name}" aria-selected="${name === current}">${esc(t(name))}</button>`).join('');
|
|
101
125
|
tabs.hidden = available.length < 2;
|
|
126
|
+
web.hidden = !page;
|
|
127
|
+
toolbar.hidden = tabs.hidden && web.hidden;
|
|
102
128
|
panel.innerHTML = current === 'History' && history ? historyHtml(coworkee, history)
|
|
103
129
|
: current === 'Workflow' && workflow ? workflowHtml(coworkee, workflow)
|
|
104
130
|
: row ? fieldsHtml(coworkee, row)
|
|
@@ -107,10 +133,11 @@ export function renderRecord(coworkee, host, set, id, onTitle) {
|
|
|
107
133
|
const load = async () => {
|
|
108
134
|
try {
|
|
109
135
|
const filter = guid.test(id) ? `Id eq ${id}` : `Id eq ${literal(id)}`;
|
|
110
|
-
[row, history, workflow] = await Promise.all([
|
|
136
|
+
[row, history, workflow, page] = await Promise.all([
|
|
111
137
|
quietly(odataPage(set, { filter, top: 1 }).then((page) => page.items[0])),
|
|
112
138
|
quietly(coworkee.request(`/api/v1/history/${encodeURIComponent(set)}/${id}`)),
|
|
113
139
|
quietly(coworkee.request(`/api/v1/workflows/${encodeURIComponent(set)}/${id}`)),
|
|
140
|
+
page ? Promise.resolve(page) : quietly(recordPage(coworkee, set, id)),
|
|
114
141
|
]);
|
|
115
142
|
if (row)
|
|
116
143
|
onTitle?.(recordTitle(row));
|
|
@@ -138,6 +165,8 @@ export function renderRecord(coworkee, host, set, id, onTitle) {
|
|
|
138
165
|
const { tab, restore: entryId, mode, property, transition, decide: approval, approve } = target.dataset;
|
|
139
166
|
if (tab)
|
|
140
167
|
show(tab);
|
|
168
|
+
else if (target === web && page)
|
|
169
|
+
openWebPage(coworkee, page, row ? recordTitle(row) : undefined);
|
|
141
170
|
else if (entryId)
|
|
142
171
|
void run(() => restore(coworkee, set, id, { entryId, mode: mode, property: property ?? null }));
|
|
143
172
|
else if (approval)
|
|
@@ -157,7 +186,7 @@ export function renderRecord(coworkee, host, set, id, onTitle) {
|
|
|
157
186
|
// steps and decisions of others arrive live
|
|
158
187
|
return coworkee.realtime.subscribe(`workflow:${set}:${id}`, () => void load());
|
|
159
188
|
}
|
|
160
|
-
/** One record in a window, opened from the records, the search, the inbox and the audit log with the intent { set, id }. */
|
|
189
|
+
/** One record in a window, opened from the records, the search, the inbox and the audit log with the intent { set, id }; "Open in the web app" leads to its page there. */
|
|
161
190
|
export const recordApp = (coworkee) => ({
|
|
162
191
|
id: recordAppId, title: coworkee.t('Details'), icon: icons.table, accent: '#167d79', width: 720, height: 620, hidden: true, probe: '/odata',
|
|
163
192
|
render: ({ host, intent, onIntent, setTitle, setState, onClose }) => {
|
package/dist/apps/web.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Coworkee, CoworkeeApp } from '../coworkee.ts';
|
|
1
|
+
import type { AppFactory, Coworkee, CoworkeeApp } from '../coworkee.ts';
|
|
2
2
|
export declare const webPageAppId = "coworkee.web-page";
|
|
3
3
|
/** The address of a page of the app's web client in the embedded shell (no app bar, no menu); undefined while the BFF does not know the web client. */
|
|
4
4
|
export declare function embedUrl(appUrl: string | null | undefined, path: string): string | undefined;
|
|
@@ -6,7 +6,8 @@ export declare function embedUrl(appUrl: string | null | undefined, path: string
|
|
|
6
6
|
* A page of the web client as a desktop app, e.g. embedApp({ id: "shop.orders", title: "Sales orders", path: "/sales/orders" }):
|
|
7
7
|
* the Blazor page with all its tools (facets, query builder, history) in a window instead of a rebuild. Left out while the BFF does not know the web client.
|
|
8
8
|
*/
|
|
9
|
-
export declare const embedApp: (options:
|
|
9
|
+
export declare const embedApp: (options: EmbedOptions) => (coworkee: Coworkee) => CoworkeeApp[];
|
|
10
|
+
export type EmbedOptions = {
|
|
10
11
|
id: string;
|
|
11
12
|
title: string;
|
|
12
13
|
path: string;
|
|
@@ -16,7 +17,9 @@ export declare const embedApp: (options: {
|
|
|
16
17
|
height?: number;
|
|
17
18
|
requiredPermissions?: string[];
|
|
18
19
|
group?: string;
|
|
19
|
-
}
|
|
20
|
+
};
|
|
21
|
+
/** The page of the web client (the full editor) while the BFF knows the web client, otherwise the lighter app built here. */
|
|
22
|
+
export declare const embedOr: (options: EmbedOptions, fallback: AppFactory) => AppFactory;
|
|
20
23
|
/** Any page of the web client in a window, opened with the intent { path, title }: links of notifications and approvals. */
|
|
21
24
|
export declare const webPageApp: (coworkee: Coworkee) => CoworkeeApp[];
|
|
22
25
|
/** Opens a page of the web client (a local path like /catalog/products) in a window, or in a browser tab without the embedded shell. */
|
package/dist/apps/web.js
CHANGED
|
@@ -25,6 +25,8 @@ export const embedApp = (options) => (coworkee) => coworkee.user.appUrl ? [{
|
|
|
25
25
|
width: options.width ?? 1100, height: options.height ?? 700, requiredPermissions: options.requiredPermissions, group: options.group,
|
|
26
26
|
render: ({ host }) => frame(coworkee, host, options.path, coworkee.t(options.title)),
|
|
27
27
|
}] : [];
|
|
28
|
+
/** The page of the web client (the full editor) while the BFF knows the web client, otherwise the lighter app built here. */
|
|
29
|
+
export const embedOr = (options, fallback) => (coworkee) => coworkee.user.appUrl ? embedApp(options)(coworkee) : fallback(coworkee);
|
|
28
30
|
/** Any page of the web client in a window, opened with the intent { path, title }: links of notifications and approvals. */
|
|
29
31
|
export const webPageApp = (coworkee) => coworkee.user.appUrl ? [{
|
|
30
32
|
id: webPageAppId, title: coworkee.title, icon: icons.web, accent: '#35496b', width: 1100, height: 700, hidden: true,
|
package/dist/index.d.ts
CHANGED
|
@@ -9,9 +9,9 @@ export { choices, crudApp, renderCrud, type CrudAction, type CrudColumn, type Cr
|
|
|
9
9
|
export { columnsOf, nextOrder, renderEntityTable, type Column, type EntityTableOptions } from './table.ts';
|
|
10
10
|
export { changes, groupsFor, isEnabled, valuesOf } from './settings-model.ts';
|
|
11
11
|
export { dataApp, entityApp, openRecord, type EntityAppOptions } from './apps/data.ts';
|
|
12
|
-
export { decide, recordApp, recordAppId, renderRecord } from './apps/record.ts';
|
|
12
|
+
export { decide, recordApp, recordAppId, recordPage, renderRecord } from './apps/record.ts';
|
|
13
13
|
export { inboxApp, inboxAppId } from './apps/inbox.ts';
|
|
14
|
-
export { embedApp, embedUrl, openWebPage, webPageApp, webPageAppId } from './apps/web.ts';
|
|
14
|
+
export { embedApp, embedOr, embedUrl, openWebPage, webPageApp, webPageAppId, type EmbedOptions } from './apps/web.ts';
|
|
15
15
|
export { filePreviewApp, filePreviewAppId } from './apps/file-preview.ts';
|
|
16
16
|
export { fileContentUrl, filesApp, uploadFile } from './apps/files.ts';
|
|
17
17
|
export { renderProfile } from './apps/profile.ts';
|
package/dist/index.js
CHANGED
|
@@ -19,9 +19,9 @@ export { choices, crudApp, renderCrud } from "./crud.js";
|
|
|
19
19
|
export { columnsOf, nextOrder, renderEntityTable } from "./table.js";
|
|
20
20
|
export { changes, groupsFor, isEnabled, valuesOf } from "./settings-model.js";
|
|
21
21
|
export { dataApp, entityApp, openRecord } from "./apps/data.js";
|
|
22
|
-
export { decide, recordApp, recordAppId, renderRecord } from "./apps/record.js";
|
|
22
|
+
export { decide, recordApp, recordAppId, recordPage, renderRecord } from "./apps/record.js";
|
|
23
23
|
export { inboxApp, inboxAppId } from "./apps/inbox.js";
|
|
24
|
-
export { embedApp, embedUrl, openWebPage, webPageApp, webPageAppId } from "./apps/web.js";
|
|
24
|
+
export { embedApp, embedOr, embedUrl, openWebPage, webPageApp, webPageAppId } from "./apps/web.js";
|
|
25
25
|
export { filePreviewApp, filePreviewAppId } from "./apps/file-preview.js";
|
|
26
26
|
export { fileContentUrl, filesApp, uploadFile } from "./apps/files.js";
|
|
27
27
|
export { renderProfile } from "./apps/profile.js";
|
package/dist/style.css
CHANGED
|
@@ -193,7 +193,7 @@ dialog.cw-dialog h2 { margin: 0 0 10px; font-size: 18px; }
|
|
|
193
193
|
|
|
194
194
|
/* inbox */
|
|
195
195
|
.cw-inbox { display: flex; flex-direction: column; }
|
|
196
|
-
.cw-inbox .cw-toolbar .cw-tabs { margin: 0; border: 0; }
|
|
196
|
+
.cw-inbox .cw-toolbar .cw-tabs, .cw-record .cw-toolbar .cw-tabs { margin: 0; border: 0; }
|
|
197
197
|
.cw-inbox .cw-feed { flex: 1; overflow: auto; }
|
|
198
198
|
.cw-inbox .cw-feed li { align-items: center; padding: 10px 4px; }
|
|
199
199
|
.cw-decide { display: flex; gap: 6px; flex: none; }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coworkee/airworks",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1033",
|
|
4
4
|
"description": "AirWorks web desktop for Coworkee apps: sign-in through the app's BFF, theme, texts, realtime and apps for settings, files, data, chat, reports, the assistant and the administration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://fgilde.github.io/CoworkeeLib/web/airworks/",
|
|
@@ -35,17 +35,18 @@
|
|
|
35
35
|
"*.css"
|
|
36
36
|
],
|
|
37
37
|
"scripts": {
|
|
38
|
+
"prebuild": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
38
39
|
"build": "tsc -p tsconfig.json && node -e \"for (const f of ['style.css','mudex-frame.html']) require('node:fs').copyFileSync('src/'+f,'dist/'+f)\"",
|
|
39
40
|
"test": "node --test \"test/**/*.test.ts\""
|
|
40
41
|
},
|
|
41
42
|
"dependencies": {
|
|
42
|
-
"@coworkee/client": "0.0.
|
|
43
|
+
"@coworkee/client": "0.0.1033"
|
|
43
44
|
},
|
|
44
45
|
"peerDependencies": {
|
|
45
46
|
"@fgilde/airworks": ">=0.4.0"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|
|
48
|
-
"@fgilde/airworks": "git+https://github.com/fgilde/AirWorks.git#
|
|
49
|
+
"@fgilde/airworks": "git+https://github.com/fgilde/AirWorks.git#12e8507b22f11f99bba2c093fb81f617e751ff1f",
|
|
49
50
|
"typescript": "^5.9.3"
|
|
50
51
|
}
|
|
51
52
|
}
|