@coworkee/airworks 0.0.1023 → 0.0.1025

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/README.md CHANGED
@@ -21,4 +21,6 @@ Apps are hidden when the user lacks their permission, like the menu of the Blazo
21
21
 
22
22
  `coworkee new --airworks` creates an app with this client in the Aspire app host; it takes the packages from the tarballs inside the template, or with `--airworks-packages npm` the version of the Coworkee release on npm. Documentation: [AirWorks client](https://fgilde.github.io/CoworkeeLib/web/airworks/)
23
23
 
24
- License: MIT
24
+ `icons` holds white Material Symbols glyphs as `data:` URLs for apps where the AirWorks icon set has no fitting icon (`icon: icons.chat`); your own apps can use them too.
25
+
26
+ License: MIT. The glyphs in `icons` are from [Material Symbols / Material Icons](https://github.com/google/material-design-icons) by Google, licensed under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0).
@@ -1,6 +1,7 @@
1
1
  import { choices, crudApp } from "../../crud.js";
2
2
  import { display, esc } from "../../dom.js";
3
3
  import { formDialog, infoDialog } from "../../form.js";
4
+ import { icons } from "../../icons.js";
4
5
  const identity = '/api/v1/identity';
5
6
  const json = (method, body) => ({ method, body: body === undefined ? undefined : JSON.stringify(body) });
6
7
  const quiet = (promise, fallback) => promise.catch(() => fallback);
@@ -35,7 +36,7 @@ export async function editGrants(coworkee, providerType, key, title) {
35
36
  return false;
36
37
  }
37
38
  export const usersApp = crudApp({
38
- id: 'coworkee.admin.users', group: 'Identity', title: 'Users', icon: 'startmenu-user.png', accent: '#1565c0', width: 920,
39
+ id: 'coworkee.admin.users', group: 'Identity', title: 'Users', icon: icons.manageAccounts, accent: '#1565c0', width: 920,
39
40
  permissions: ['Identity.Users.View'],
40
41
  search: true, serverSearch: true,
41
42
  load: async ({ request }, { page, pageSize, search }) => {
@@ -114,7 +115,7 @@ export const usersApp = crudApp({
114
115
  live: () => ['tenant:users'],
115
116
  });
116
117
  export const groupsApp = crudApp({
117
- id: 'coworkee.admin.groups', group: 'Identity', title: 'Groups', icon: 'ratio-personal.png', accent: '#6a1b9a',
118
+ id: 'coworkee.admin.groups', group: 'Identity', title: 'Groups', icon: icons.groups, accent: '#6a1b9a',
118
119
  permissions: ['Identity.Groups.View'],
119
120
  search: true, serverSearch: true,
120
121
  load: async ({ request }, { page, pageSize, search }) => {
@@ -151,7 +152,7 @@ const roleFields = [
151
152
  { name: 'selectableForRegistration', label: 'Selectable for registration', type: 'bool' },
152
153
  ];
153
154
  export const rolesApp = crudApp({
154
- id: 'coworkee.admin.roles', group: 'Identity', title: 'Roles', icon: 'fn-abcAnalysis.png', accent: '#ad1457',
155
+ id: 'coworkee.admin.roles', group: 'Identity', title: 'Roles', icon: icons.roles, accent: '#ad1457',
155
156
  permissions: ['Identity.Roles.View'],
156
157
  search: true,
157
158
  load: async ({ request }) => ({ items: await request(`${identity}/roles`) }),
@@ -177,7 +178,7 @@ const showSecret = async (coworkee, result) => {
177
178
  await infoDialog(coworkee, coworkee.t('Client secret'), `<p>${esc(coworkee.t('Copy the secret now, it is not shown again:'))}</p><pre class="cw-secret">${esc(result.clientSecret)}</pre>`);
178
179
  };
179
180
  export const clientsApp = crudApp({
180
- id: 'coworkee.admin.clients', group: 'Identity', title: 'Applications', icon: 'fn-userweblink.png', accent: '#00695c', width: 940,
181
+ id: 'coworkee.admin.clients', group: 'Identity', title: 'Applications', icon: icons.apps, accent: '#00695c', width: 940,
181
182
  permissions: ['Identity.Clients.Manage'], hostOnly: true,
182
183
  search: true,
183
184
  load: async ({ request }) => ({ items: await request(`${identity}/clients`) }),
@@ -214,7 +215,7 @@ const scopeFields = [
214
215
  { name: 'description', label: 'Description', type: 'textarea' }, { name: 'resources', label: 'Resources', type: 'list', hint: 'Audiences of the access token, e.g. https://api.example' },
215
216
  ];
216
217
  export const scopesApp = crudApp({
217
- id: 'coworkee.admin.scopes', group: 'Identity', title: 'Scopes', icon: 'icon-percent.png', accent: '#4e342e',
218
+ id: 'coworkee.admin.scopes', group: 'Identity', title: 'Scopes', icon: icons.checklist, accent: '#4e342e',
218
219
  permissions: ['Identity.Clients.Manage'], hostOnly: true,
219
220
  search: true,
220
221
  load: async ({ request }) => ({ items: await request(`${identity}/scopes`) }),
@@ -228,7 +229,7 @@ export const scopesApp = crudApp({
228
229
  });
229
230
  const inDays = (days) => new Date(Date.now() + days * 86400000).toISOString();
230
231
  export const apiKeysApp = crudApp({
231
- id: 'coworkee.admin.api-keys', group: 'Identity', title: 'API keys', icon: 'login-password.png', accent: '#37474f', width: 900,
232
+ id: 'coworkee.admin.api-keys', group: 'Identity', title: 'API keys', icon: icons.key, accent: '#37474f', width: 900,
232
233
  permissions: ['ApiKeys.Manage'],
233
234
  load: async ({ request }) => ({ items: await request(`${identity}/api-keys`) }),
234
235
  columns: [
@@ -1,4 +1,5 @@
1
1
  import { esc } from "../../dom.js";
2
+ import { icons } from "../../icons.js";
2
3
  import { aiSettingsApp } from "../assistant.js";
3
4
  import { identityApps } from "./identity.js";
4
5
  import { mailApps } from "./mail.js";
@@ -11,7 +12,7 @@ const allowed = (coworkee) => coworkee.apps.filter((app) => app.group && !app.hi
11
12
  /** Every administration app the user may open, grouped like the administration menu of the web app. */
12
13
  export const administrationApp = (coworkee) => {
13
14
  const definition = (visible) => ({
14
- id: administrationAppId, title: coworkee.t('Administration'), icon: 'startmenu-settings.png', accent: '#35496b', width: 760, height: 560, singleInstance: true,
15
+ id: administrationAppId, title: coworkee.t('Administration'), icon: icons.adminPanel, accent: '#35496b', width: 760, height: 560, singleInstance: true,
15
16
  requiredPermissions: visible ? [] : [nobody],
16
17
  render: ({ host }) => {
17
18
  const { t } = coworkee;
@@ -1,6 +1,7 @@
1
1
  import { choices, crudApp, renderCrud } from "../../crud.js";
2
2
  import { display, errorText, esc } from "../../dom.js";
3
3
  import { confirmDialog, formDialog, infoDialog } from "../../form.js";
4
+ import { icons } from "../../icons.js";
4
5
  import { settingsPageApp } from "../settings.js";
5
6
  import { userLookup } from "./identity.js";
6
7
  const mail = '/api/v1/mail';
@@ -45,7 +46,7 @@ export async function previewRecipients(coworkee, source) {
45
46
  return false;
46
47
  }
47
48
  export const mailTemplatesApp = crudApp({
48
- id: 'coworkee.admin.mail-templates', group: 'Communication', title: 'Mail templates', icon: 'fn-ideaportal.png', accent: '#00838f',
49
+ id: 'coworkee.admin.mail-templates', group: 'Communication', title: 'Mail templates', icon: icons.drafts, accent: '#00838f',
49
50
  permissions: ['Mail.Templates.Manage'],
50
51
  search: true,
51
52
  load: async ({ request }) => ({ items: await request(`${mail}/templates`) }),
@@ -70,7 +71,7 @@ export const mailTemplatesApp = crudApp({
70
71
  });
71
72
  /** Subject and body of a template in one language with a live preview, a test mail to oneself and the way back to the default. */
72
73
  export const mailTemplateApp = (coworkee) => ({
73
- id: mailTemplateAppId, title: coworkee.t('Template'), icon: 'fn-ideaportal.png', accent: '#00838f', width: 1080, height: 680, hidden: true,
74
+ id: mailTemplateAppId, title: coworkee.t('Template'), icon: icons.drafts, accent: '#00838f', width: 1080, height: 680, hidden: true,
74
75
  requiredPermissions: ['Mail.Templates.Manage'],
75
76
  render: async ({ host, intent, setTitle }) => {
76
77
  const { t, request } = coworkee;
@@ -145,7 +146,7 @@ const campaignRequest = async (coworkee, values) => {
145
146
  };
146
147
  const editable = (campaign) => campaign.status === 'Draft';
147
148
  export const mailCampaignsApp = crudApp({
148
- id: 'coworkee.admin.mail-campaigns', group: 'Communication', title: 'Mail campaigns', icon: 'fn-dashboard.png', accent: '#d84315', width: 980,
149
+ id: 'coworkee.admin.mail-campaigns', group: 'Communication', title: 'Mail campaigns', icon: icons.campaign, accent: '#d84315', width: 980,
149
150
  permissions: ['Mail.Campaigns.Send'],
150
151
  search: true,
151
152
  load: async ({ request }) => ({ items: await request(`${mail}/campaigns`) }),
@@ -183,7 +184,7 @@ export const mailCampaignsApp = crudApp({
183
184
  ],
184
185
  });
185
186
  export const recipientListsApp = crudApp({
186
- id: 'coworkee.admin.recipient-lists', group: 'Communication', title: 'Recipient lists', icon: 'ratio-personal.png', accent: '#d84315',
187
+ id: 'coworkee.admin.recipient-lists', group: 'Communication', title: 'Recipient lists', icon: icons.contactMail, accent: '#d84315',
187
188
  permissions: ['Mail.Campaigns.Send'],
188
189
  search: true,
189
190
  load: async ({ request }) => ({ items: await request(`${mail}/recipient-lists`) }),
@@ -204,7 +205,7 @@ export const recipientListsApp = crudApp({
204
205
  const statuses = ['', 'Queued', 'Sending', 'Sent', 'Failed', 'Skipped'];
205
206
  /** The mails the app sent or queued; opened from a campaign it shows that campaign's mails. */
206
207
  export const mailLogApp = (coworkee) => ({
207
- id: mailLogAppId, group: 'Communication', title: coworkee.t('Mail log'), icon: 'fn-reporttable.png', accent: '#00838f', width: 980, height: 600,
208
+ id: mailLogAppId, group: 'Communication', title: coworkee.t('Mail log'), icon: icons.receiptLong, accent: '#00838f', width: 980, height: 600,
208
209
  requiredPermissions: ['Mail.Log.View'],
209
210
  render: ({ host, intent, onClose, setTitle }) => {
210
211
  const { t } = coworkee;
@@ -241,7 +242,7 @@ export const mailLogApp = (coworkee) => ({
241
242
  },
242
243
  });
243
244
  export const mailSettingsApp = settingsPageApp({
244
- id: 'coworkee.admin.mail-settings', group: 'Communication', title: 'Mail settings', icon: 'startmenu-settings.png', accent: '#00838f', page: '/admin/mail-settings',
245
+ id: 'coworkee.admin.mail-settings', group: 'Communication', title: 'Mail settings', icon: icons.mail, accent: '#00838f', page: '/admin/mail-settings',
245
246
  test: {
246
247
  title: 'Test connection',
247
248
  run: async (coworkee, _, changed) => {
@@ -2,6 +2,7 @@ import { odataPage } from '@coworkee/client';
2
2
  import { choices, crudApp, renderCrud } from "../../crud.js";
3
3
  import { esc } from "../../dom.js";
4
4
  import { confirmDialog, formDialog, infoDialog } from "../../form.js";
5
+ import { icons } from "../../icons.js";
5
6
  const json = (method, body) => ({ method, body: body === undefined ? undefined : JSON.stringify(body) });
6
7
  const check = (value) => value ? '&#x2713;' : '';
7
8
  const paged = (page, pageSize, extra = {}) => new URLSearchParams({ Page: String(page), PageSize: String(pageSize), ...Object.fromEntries(Object.entries(extra).filter(([, value]) => value)) });
@@ -10,7 +11,7 @@ const languageFields = [
10
11
  { name: 'isEnabled', label: 'Enabled', type: 'bool' }, { name: 'isDefault', label: 'Default', type: 'bool' },
11
12
  ];
12
13
  export const languagesApp = crudApp({
13
- id: 'coworkee.admin.languages', group: 'Localization', title: 'Languages', icon: 'icon-balancesheet.png', accent: '#0277bd',
14
+ id: 'coworkee.admin.languages', group: 'Localization', title: 'Languages', icon: icons.language, accent: '#0277bd',
14
15
  permissions: ['Localization.Manage'],
15
16
  search: true,
16
17
  load: async ({ request }) => ({ items: await request('/api/v1/localization/languages/all') }),
@@ -33,7 +34,7 @@ export const languagesApp = crudApp({
33
34
  });
34
35
  /** The texts of one language: the English text, the language's default and the own translation, editable; missing ones machine translated. */
35
36
  export const translationsApp = (coworkee) => ({
36
- id: 'coworkee.admin.translations', group: 'Localization', title: coworkee.t('Translations'), icon: 'fn-help.png', accent: '#0277bd', width: 980, height: 620,
37
+ id: 'coworkee.admin.translations', group: 'Localization', title: coworkee.t('Translations'), icon: icons.translate, accent: '#0277bd', width: 980, height: 620,
37
38
  requiredPermissions: ['Localization.Manage'],
38
39
  render: async ({ host, onClose }) => {
39
40
  const { t, request } = coworkee;
@@ -115,7 +116,7 @@ export const themesApp = crudApp({
115
116
  ],
116
117
  });
117
118
  export const backupsApp = crudApp({
118
- id: 'coworkee.admin.backups', group: 'System', title: 'Backups', icon: 'fn-planning.png', accent: '#455a64',
119
+ id: 'coworkee.admin.backups', group: 'System', title: 'Backups', icon: icons.backup, accent: '#455a64',
119
120
  permissions: ['Backups.Manage'], hostOnly: true,
120
121
  load: async ({ request }) => ({ items: await request('/api/v1/backups') }),
121
122
  columns: [
@@ -134,7 +135,7 @@ export const backupsApp = crudApp({
134
135
  ],
135
136
  });
136
137
  export const servicesApp = crudApp({
137
- id: 'coworkee.admin.services', group: 'System', title: 'Services', icon: 'fn-workflow.png', accent: '#2e7d32',
138
+ id: 'coworkee.admin.services', group: 'System', title: 'Services', icon: icons.dns, accent: '#2e7d32',
138
139
  permissions: ['Settings.Manage'], hostOnly: true,
139
140
  load: async ({ request }) => ({ items: (await request('/api/v1/services')).services }),
140
141
  columns: [
@@ -169,7 +170,7 @@ const tenantFields = [
169
170
  { name: 'isActive', label: 'Active', type: 'bool' }, { name: 'acceptsRegistrations', label: 'Registration', type: 'bool' },
170
171
  ];
171
172
  export const tenantsApp = crudApp({
172
- id: 'coworkee.admin.tenants', group: 'System', title: 'Tenants', icon: 'icon-desktop.png', accent: '#283593',
173
+ id: 'coworkee.admin.tenants', group: 'System', title: 'Tenants', icon: icons.domain, accent: '#283593',
173
174
  permissions: ['Features.Tenants'], hostOnly: true,
174
175
  search: true,
175
176
  load: async (_, { page, pageSize }) => {
@@ -211,7 +212,7 @@ export const tenantsApp = crudApp({
211
212
  const changesTable = (coworkee, changes) => `<table class="cw-table"><thead><tr><th>${esc(coworkee.t('Field'))}</th>
212
213
  <th>${esc(coworkee.t('Changes'))}</th></tr></thead><tbody>${changes.map((change) => `<tr><td>${esc(change.property)}</td><td>${esc(change.oldValue)} &rarr; ${esc(change.newValue)}</td></tr>`).join('')}</tbody></table>`;
213
214
  export const auditApp = crudApp({
214
- id: 'coworkee.admin.audit', group: 'Monitoring', title: 'Audit log', icon: 'fn-reporttable.png', accent: '#5d4037', width: 960,
215
+ id: 'coworkee.admin.audit', group: 'Monitoring', title: 'Audit log', icon: icons.history, accent: '#5d4037', width: 960,
215
216
  permissions: ['Audit.View'],
216
217
  search: true, serverSearch: true,
217
218
  load: async ({ request }, { page, pageSize, search }) => {
@@ -228,7 +229,7 @@ export const auditApp = crudApp({
228
229
  }],
229
230
  });
230
231
  export const aiToolCallsApp = crudApp({
231
- id: 'coworkee.admin.ai-tool-calls', group: 'Monitoring', title: 'AI tool calls', icon: 'pilot2.png', accent: '#6a1b9a', width: 960,
232
+ id: 'coworkee.admin.ai-tool-calls', group: 'Monitoring', title: 'AI tool calls', icon: icons.build, accent: '#6a1b9a', width: 960,
232
233
  permissions: ['Ai.Audit'], probe: '/api/v1/ai/status',
233
234
  search: true, serverSearch: true,
234
235
  load: async ({ request }, { page, pageSize, search }) => {
@@ -1,6 +1,7 @@
1
1
  import { postNdjson } from '@coworkee/client';
2
2
  import { display, errorText, esc } from "../dom.js";
3
3
  import { confirmDialog } from "../form.js";
4
+ import { icons } from "../icons.js";
4
5
  import { settingsPageApp } from "./settings.js";
5
6
  const ai = '/api/v1/ai';
6
7
  const json = (method, body) => ({ method, body: body === undefined ? undefined : JSON.stringify(body) });
@@ -15,7 +16,7 @@ function messageHtml(coworkee, message, last) {
15
16
  }
16
17
  /** The AI assistant: sessions, answers streamed as they arrive, tool calls and confirmations for tools that change data. */
17
18
  export const assistantApp = (coworkee) => ({
18
- id: 'coworkee.assistant', title: coworkee.t('Assistant'), icon: 'pilot.png', accent: '#6a1b9a', width: 900, height: 640,
19
+ id: 'coworkee.assistant', title: coworkee.t('Assistant'), icon: icons.sparkles, accent: '#6a1b9a', width: 900, height: 640,
19
20
  requiredPermissions: ['Ai.Chat'], probe: `${ai}/status`,
20
21
  render: async ({ host, setState, intent }) => {
21
22
  const { t, request, culture } = coworkee;
@@ -110,7 +111,7 @@ export const assistantApp = (coworkee) => ({
110
111
  const aiFields = ['Provider', 'Model', 'Endpoint', 'ApiKey', 'Headers', 'AuthHeader'];
111
112
  /** Provider, model and key of the assistant, with a test call to the model. */
112
113
  export const aiSettingsApp = settingsPageApp({
113
- id: 'coworkee.admin.ai-settings', group: 'System', title: 'AI', icon: 'pilot2.png', accent: '#6a1b9a', page: '/admin/ai-settings', hostOnly: true, scopes: ['Global'], probe: `${ai}/status`,
114
+ id: 'coworkee.admin.ai-settings', group: 'System', title: 'AI', icon: icons.smartToy, accent: '#6a1b9a', page: '/admin/ai-settings', hostOnly: true, scopes: ['Global'], probe: `${ai}/status`,
114
115
  test: {
115
116
  title: 'Test connection',
116
117
  run: async (coworkee, values, changed) => {
package/dist/apps/chat.js CHANGED
@@ -1,10 +1,11 @@
1
1
  import { realtimeEvents, realtimeTopics } from '@coworkee/client';
2
2
  import { display, errorText, esc } from "../dom.js";
3
+ import { icons } from "../icons.js";
3
4
  const chat = '/api/v1/chat';
4
5
  const json = (method, body) => ({ method, body: body === undefined ? undefined : JSON.stringify(body) });
5
6
  /** Direct messages with the people of the organisation: who is online, unread counts, messages arriving live. */
6
7
  export const chatApp = (coworkee) => ({
7
- id: 'coworkee.chat', title: coworkee.t('Chat'), icon: 'fn-userweblink.png', accent: '#00897b', width: 860, height: 600,
8
+ id: 'coworkee.chat', title: coworkee.t('Chat'), icon: icons.chat, accent: '#00897b', width: 860, height: 600,
8
9
  requiredPermissions: ['Chat.Use'], probe: `${chat}/unread-count`,
9
10
  render: async ({ host, intent, setState, onClose }) => {
10
11
  const { t, request, culture, user, realtime } = coworkee;
package/dist/apps/data.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { entitySets } from '@coworkee/client';
2
2
  import { errorText, esc } from "../dom.js";
3
+ import { icons } from "../icons.js";
3
4
  import { renderEntityTable } from "../table.js";
4
5
  /** Every OData entity set of the app the user may read, each as a table. */
5
6
  export const dataApp = (coworkee) => ({
@@ -40,7 +41,7 @@ export const dataApp = (coworkee) => ({
40
41
  export const entityApp = (options) => (coworkee) => ({
41
42
  id: `coworkee.entity.${options.entitySet}`,
42
43
  title: coworkee.t(options.title ?? options.entitySet),
43
- icon: options.icon ?? 'fn-analysis.png',
44
+ icon: options.icon ?? icons.table,
44
45
  accent: options.accent ?? '#35496b',
45
46
  width: 900,
46
47
  height: 580,
@@ -1,11 +1,12 @@
1
1
  import { esc } from "../dom.js";
2
+ import { icons } from "../icons.js";
2
3
  import { mudExFrame } from "../mudex.js";
3
4
  export const filePreviewAppId = 'coworkee.file-preview';
4
5
  /** One file in a window, shown by MudEx's file display (pdf, images, office documents, archives, markdown, audio, video) in its own frame. */
5
6
  export const filePreviewApp = (coworkee) => ({
6
7
  id: filePreviewAppId,
7
8
  title: coworkee.t('Preview'),
8
- icon: 'fn-analysis.png',
9
+ icon: icons.description,
9
10
  accent: '#b26a00',
10
11
  width: 900,
11
12
  height: 640,
@@ -1,10 +1,11 @@
1
1
  import { realtimeEvents, realtimeTopics, unwrap } from '@coworkee/client';
2
2
  import { display, errorText, esc } from "../dom.js";
3
+ import { icons } from "../icons.js";
3
4
  /** The user's notifications: unread first in bold, mark read, mark all read, delete. */
4
5
  export const notificationsApp = (coworkee) => ({
5
6
  id: 'coworkee.notifications',
6
7
  title: coworkee.t('Notifications'),
7
- icon: 'fn-ideaportal.png',
8
+ icon: icons.notifications,
8
9
  accent: '#a2273b',
9
10
  width: 560,
10
11
  height: 600,
@@ -63,7 +64,7 @@ export const notificationsApp = (coworkee) => ({
63
64
  export const apiDocsApp = (coworkee) => ({
64
65
  id: 'coworkee.api-docs',
65
66
  title: coworkee.t('API documentation'),
66
- icon: 'fn-workflow.png',
67
+ icon: icons.dataObject,
67
68
  accent: '#447d1c',
68
69
  width: 1000,
69
70
  height: 680,
@@ -4,7 +4,7 @@ import { errorText, esc } from "../dom.js";
4
4
  export const profileApp = (coworkee) => ({
5
5
  id: 'coworkee.profile',
6
6
  title: coworkee.t('Profile'),
7
- icon: 'startmenu-user.png',
7
+ icon: 'ratio-personal.png',
8
8
  accent: '#00777a',
9
9
  width: 520,
10
10
  height: 520,
@@ -1,5 +1,6 @@
1
1
  import { errorText, esc } from "../dom.js";
2
2
  import { formDialog } from "../form.js";
3
+ import { icons } from "../icons.js";
3
4
  import { createWidget, hasData, isNumber, place, presets, reportIcons } from "./report-model.js";
4
5
  import { humanize, rangeSelect, renderGrid, renderWidget, reportAppId, reportDesignerAppId } from "./reports.js";
5
6
  const reports = '/api/v1/reports';
@@ -88,7 +89,7 @@ export function setPath(widget, path, value) {
88
89
  }
89
90
  /** Creates and changes reports: widgets on the 12 column grid (drag to move, the corner to resize), their data, filter and display, the report's settings. */
90
91
  export const reportDesignerApp = (coworkee) => ({
91
- id: reportDesignerAppId, title: coworkee.t('New report'), icon: 'fn-dashboard.png', accent: '#1565c0', width: 1280, height: 800, hidden: true,
92
+ id: reportDesignerAppId, title: coworkee.t('New report'), icon: icons.dashboardCustomize, accent: '#1565c0', width: 1280, height: 800, hidden: true,
92
93
  requiredPermissions: ['Reports.Manage'],
93
94
  render: async ({ host, intent, setTitle, setState, onClose }) => {
94
95
  const { t, request } = coworkee;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Icons for apps where the small AirWorks set has none that fits. Each is a data URL AirWorks accepts as the icon of an app,
3
+ * sized to fill a tile like the AirWorks icons: `icon: icons.notifications` in the definition of an app.
4
+ */
5
+ export declare const icons: {
6
+ readonly chat: string;
7
+ readonly smartToy: string;
8
+ readonly notifications: string;
9
+ readonly dataObject: string;
10
+ readonly adminPanel: string;
11
+ readonly groups: string;
12
+ readonly roles: string;
13
+ readonly apps: string;
14
+ readonly checklist: string;
15
+ readonly key: string;
16
+ readonly language: string;
17
+ readonly translate: string;
18
+ readonly backup: string;
19
+ readonly dns: string;
20
+ readonly domain: string;
21
+ readonly history: string;
22
+ readonly drafts: string;
23
+ readonly campaign: string;
24
+ readonly contactMail: string;
25
+ readonly receiptLong: string;
26
+ readonly mail: string;
27
+ readonly build: string;
28
+ readonly table: string;
29
+ readonly description: string;
30
+ readonly dashboardCustomize: string;
31
+ readonly manageAccounts: string;
32
+ readonly sparkles: string;
33
+ };
package/dist/icons.js ADDED
@@ -0,0 +1,39 @@
1
+ /*
2
+ * White glyphs of Google's Material Symbols (filled, weight 400; "sparkles" is Material Icons "auto_awesome"),
3
+ * licensed under the Apache License 2.0: https://www.apache.org/licenses/LICENSE-2.0
4
+ * Source: https://github.com/google/material-design-icons
5
+ */
6
+ const glyph = (box, path) => `data:image/svg+xml,${encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="${box}"><path fill="#fff" d="${path}"/></svg>`)}`;
7
+ /**
8
+ * Icons for apps where the small AirWorks set has none that fits. Each is a data URL AirWorks accepts as the icon of an app,
9
+ * sized to fill a tile like the AirWorks icons: `icon: icons.notifications` in the definition of an app.
10
+ */
11
+ export const icons = {
12
+ chat: glyph('35.6 -924.4 888.9 888.9', 'M80-80v-740q0-24 18-42t42-18h680q24 0 42 18t18 42v520q0 24-18 42t-42 18H240L80-80Zm160-319h313v-60H240v60Zm0-130h480v-60H240v60Zm0-130h480v-60H240v60Z'),
13
+ smartToy: glyph('-8.9 -988.9 977.8 977.8', 'M147-376q-45 0-76-31.21T40-483q0-44.58 31.21-75.79Q102.42-590 147-590v-123q0-24 18-42t42-18h166q0-45 31-76t76-31q45 0 76 31.21T587-773h166q24 0 42 18t18 42v123q45 0 76 31.21T920-483q0 44.58-31.21 75.79Q857.58-376 813-376v196q0 24-18 42t-42 18H207q-24 0-42-18t-18-42v-196Zm224.5-111.74q11.5-11.73 11.5-28.5 0-16.76-11.74-28.26-11.73-11.5-28.5-11.5-16.76 0-28.26 11.74-11.5 11.73-11.5 28.5 0 16.76 11.74 28.26 11.73 11.5 28.5 11.5 16.76 0 28.26-11.74Zm274 0q11.5-11.73 11.5-28.5 0-16.76-11.74-28.26-11.73-11.5-28.5-11.5-16.76 0-28.26 11.74-11.5 11.73-11.5 28.5 0 16.76 11.74 28.26 11.73 11.5 28.5 11.5 16.76 0 28.26-11.74ZM312-285h336v-60H312v60Z'),
14
+ notifications: glyph('35.6 -924.4 888.9 888.9', 'M160-200v-60h80v-304q0-84 49.5-150.5T420-798v-22q0-25 17.5-42.5T480-880q25 0 42.5 17.5T540-820v22q81 17 130.5 83.5T720-564v304h80v60H160ZM480-80q-33 0-56.5-23.5T400-160h160q0 33-23.5 56.5T480-80Z'),
15
+ dataObject: glyph('35.6 -924.4 888.9 888.9', 'M570-160v-60h120q21 0 35.5-14.38Q740-248.75 740-270v-100q0-37 22.5-66t57.5-40v-8q-35-10-57.5-39.5T740-590v-100q0-21.25-14.37-35.63Q711.25-740 690-740H570v-60h120q46 0 78 32.08 32 32.09 32 77.92v100q0 21.25 14.38 35.62Q828.75-540 850-540h30v120h-30q-21.25 0-35.62 14.37Q800-391.25 800-370v100q0 45.83-32.08 77.92Q735.83-160 690-160H570Zm-300 0q-46 0-78-32.08-32-32.09-32-77.92v-100q0-21.25-14.37-35.63Q131.25-420 110-420H80v-120h30q21.25 0 35.63-14.38Q160-568.75 160-590v-100q0-45.83 32.08-77.92Q224.17-800 270-800h120v60H270q-21 0-35.5 14.37Q220-711.25 220-690v100q0 37-22.5 66.5T140-484v8q35 11 57.5 40t22.5 66v100q0 21.25 14.38 35.62Q248.75-220 270-220h120v60H270Z'),
16
+ adminPanel: glyph('75.5 -925.5 890 890', 'M693-80q-78 0-133-55.5T505-267q0-78 55-133.5T693-456q77 0 132.5 55.5T881-267q0 76-55.5 131.5T693-80Zm-213 0q-138-32-229-156.5T160-522v-239l320-120 320 120v270q-25-12-52-18.5t-55-6.5q-103 0-175.5 73T445-267q0 48 19.5 94T518-93q-9 5-19 7.5T480-80Zm255-209q18-19 18-45t-18-44q-18-18-44-18t-45 18q-19 18-19 44t19 45q19 19 45 19t44-19Zm-45 144q33 0 60-14t46-40q-26-14-52-21t-54-7q-28 0-54.5 7T584-199q19 26 45.5 40t60.5 14Z'),
17
+ groups: glyph('-53.3 -1013.3 1066.7 1066.7', 'M0-240v-53q0-38.57 41.5-62.78Q83-380 150.38-380q12.16 0 23.39.5t22.23 2.15q-8 17.35-12 35.17-4 17.81-4 37.18v65H0Zm240 0v-65q0-32 17.5-58.5T307-410q32-20 76.5-30t96.5-10q53 0 97.5 10t76.5 30q32 20 49 46.5t17 58.5v65H240Zm540 0v-65q0-19.86-3.5-37.43T765-377.27q11-1.73 22.17-2.23 11.17-.5 22.83-.5 67.5 0 108.75 23.77T960-293v53H780ZM149.57-410q-28.57 0-49.07-20.56Q80-451.13 80-480q0-29 20.56-49.5Q121.13-550 150-550q29 0 49.5 20.5t20.5 49.93q0 28.57-20.5 49.07T149.57-410Zm660 0q-28.57 0-49.07-20.56Q740-451.13 740-480q0-29 20.56-49.5Q781.13-550 810-550q29 0 49.5 20.5t20.5 49.93q0 28.57-20.5 49.07T809.57-410ZM480-480q-50 0-85-35t-35-85q0-51 35-85.5t85-34.5q51 0 85.5 34.5T600-600q0 50-34.5 85T480-480Z'),
18
+ roles: glyph('35.6 -925.4 888.9 888.9', 'M577-490.17q40-40.17 40-97T576.83-684q-40.17-40-97-40T383-683.83q-40 40.17-40 97T383.17-490q40.17 40 97 40T577-490.17ZM480-81q-148-38-234-162.54Q160-368.08 160-523v-238l320-120 320 120v238q0 154.92-86 279.46Q628-119 480-81Zm0-62q60-20 108-59.5t83-90.5q-44.67-21.02-92.97-32.01Q529.72-336 479.86-336t-98.07 10.99Q333.58-314.02 289-293q35 51 83 90.5T480-143Z'),
19
+ apps: glyph('124.4 -835.6 711.1 711.1', 'M179-179q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19Zm254 0q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19Zm254 0q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19ZM179-433q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19Zm254 0q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19Zm254 0q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19ZM179-687q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19Zm254 0q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19Zm254 0q-19-19-19-47t19-47q19-19 47-19t47 19q19 19 19 47t-19 47q-19 19-47 19t-47-19Z'),
20
+ checklist: glyph('35.6 -950.4 888.9 888.9', 'M222-214 80-356l42-42 100 99 179-179 42 43-221 221Zm0-320L80-676l42-42 100 99 179-179 42 43-221 221Zm298 244v-60h360v60H520Zm0-320v-60h360v60H520Z'),
21
+ key: glyph('-8.9 -968.9 977.8 977.8', 'M371.5-388.5Q409-426 409-480t-37.5-91.5Q334-609 280-609t-91.5 37.5Q151-534 151-480t37.5 91.5Q226-351 280-351t91.5-37.5ZM280-240q-100 0-170-70T40-480q0-100 70-170t170-70q85 0 142.5 46.5T503-555h344l73 73-127 146-103-84-84 84-71-71h-32q-19 75-80.5 121T280-240Z'),
22
+ language: glyph('35.6 -924.4 888.9 888.9', 'M323-111.5Q250-143 196-197t-85-127.5Q80-398 80-482t31-156.5Q142-711 196-765t127-84.5Q396-880 480-880t157 30.5Q710-819 764-765t85 126.5Q880-566 880-482t-31 157.5Q818-251 764-197t-127 85.5Q564-80 480-80t-157-31.5ZM480-138q35-36 58.5-82.5T577-331H384q14 60 37.5 108t58.5 85Zm-85-12q-25-38-43-82t-30-99H172q38 71 88 111.5T395-150Zm171-1q72-23 129.5-69T788-331H639q-13 54-30.5 98T566-151ZM152-391h159q-3-27-3.5-48.5T307-482q0-25 1-44.5t4-43.5H152q-7 24-9.5 43t-2.5 45q0 26 2.5 46.5T152-391Zm221 0h215q4-31 5-50.5t1-40.5q0-20-1-38.5t-5-49.5H373q-4 31-5 49.5t-1 38.5q0 21 1 40.5t5 50.5Zm275 0h160q7-24 9.5-44.5T820-482q0-26-2.5-45t-9.5-43H649q3 35 4 53.5t1 34.5q0 22-1.5 41.5T648-391Zm-10-239h150q-33-69-90.5-115T565-810q25 37 42.5 80T638-630Zm-254 0h194q-11-53-37-102.5T480-820q-32 27-54 71t-42 119Zm-212 0h151q11-54 28-96.5t43-82.5q-75 19-131 64t-91 115Z'),
23
+ translate: glyph('-9.1 -971.1 982.2 982.2', 'm475-80 185-480h79L924-80h-65l-45-117H584L539-80h-64ZM162-201l-42-42 201-201q-51-53-85.5-107.5T183-660h65q16 43 43.5 85t72.5 88q46-48 85-117.5T505-740H40v-60h290v-80h60v80h290v60H567q-17 78-61.5 159.5T406-443l102 104-24 63-121-125-201 200Zm443-51h188l-94-248-94 248Z'),
24
+ backup: glyph('-8.9 -968.4 977.8 977.8', 'M450-160H251q-88 0-149.5-61.5T40-371q0-78 50-137t127-71q20-97 94-158.5T482-799q112 0 189 81.5T748-522v24q72-2 122 46.5T920-329q0 69-50 119t-119 50H510v-318l83 83 43-43-156-156-156 156 43 43 83-83v318Z'),
25
+ dns: glyph('58.3 -881.2 843.3 843.3', 'M286.88-717q-20.88 0-35.38 14.62-14.5 14.62-14.5 35.5 0 20.88 14.62 35.38 14.62 14.5 35.5 14.5 20.88 0 35.38-14.62 14.5-14.62 14.5-35.5 0-20.88-14.62-35.38-14.62-14.5-35.5-14.5Zm0 414q-20.88 0-35.38 14.62-14.5 14.62-14.5 35.5 0 20.88 14.62 35.38 14.62 14.5 35.5 14.5 20.88 0 35.38-14.62 14.5-14.62 14.5-35.5 0-20.88-14.62-35.38-14.62-14.5-35.5-14.5ZM154-839h651q16 0 25.5 9.5t9.5 25.81V-535q0 17.42-9.5 29.21T805-494H154q-15 0-24.5-11.79T120-535v-268.69q0-16.31 9.5-25.81T154-839Zm0 413h647q15 0 27 12.5t12 28.53V-121q0 20-12 30.5T801-80H159q-16 0-27.5-10.5T120-121v-263.97q0-16.03 9.5-28.53T154-426Z'),
26
+ domain: glyph('35.6 -924.4 888.9 888.9', 'M80-120v-720h390v165h410v555H80Zm60-60h105v-105H140v105Zm0-165h105v-105H140v105Zm0-165h105v-105H140v105Zm0-165h105v-105H140v105Zm165 495h105v-105H305v105Zm0-165h105v-105H305v105Zm0-165h105v-105H305v105Zm0-165h105v-105H305v105Zm165 495h350v-435H470v105h80v60h-80v105h80v60h-80v105Zm185-270v-60h60v60h-60Zm0 165v-60h60v60h-60Z'),
27
+ history: glyph('80 -880 800 800', 'M477-120q-149 0-253-105.5T120-481h60q0 125 86 213t211 88q127 0 215-89t88-216q0-124-89-209.5T477-780q-68 0-127.5 31T246-667h105v60H142v-208h60v106q52-61 123.5-96T477-840q75 0 141 28t115.5 76.5Q783-687 811.5-622T840-482q0 75-28.5 141t-78 115Q684-177 618-148.5T477-120Zm128-197L451-469v-214h60v189l137 134-43 43Z'),
28
+ drafts: glyph('35.6 -964.4 888.9 888.9', 'm480-920 371 222q17 9 23 24.5t6 30.5v463q0 24-18 42t-42 18H140q-24 0-42-18t-18-42v-463q0-15 6.5-30.5T109-698l371-222Zm0 466 336-197-336-202-336 202 336 197Z'),
29
+ campaign: glyph('35.6 -924.4 888.9 888.9', 'M730-450v-60h150v60H730Zm50 290-121-90 36-48 121 90-36 48Zm-82-503-36-48 118-89 36 48-118 89ZM210-200v-160h-70q-25 0-42.5-17.5T80-420v-120q0-25 17.5-42.5T140-600h180l200-120v480L320-360h-50v160h-60Zm350-146v-268q27 24 43.5 58.5T620-480q0 41-16.5 75.5T560-346Z'),
30
+ contactMail: glyph('-54.4 -1013.9 1067.8 1067.8', 'M562-524h268v-186H562v186Zm135-37-105-79v-40l104 79 104-79v40l-103 79ZM59-120q-24 0-42-18t-18-42v-600q0-24 18-42t42-18h841q24 0 42 18t18 42v600q0 24-18 42t-42 18H59Zm355-315q35-35 35-85t-35-85q-35-35-85-35t-85 35q-35 35-35 85t35 85q35 35 85 35t85-35ZM66-180h525q-45-69-113-109t-149-40q-80 0-149.5 40T66-180Z'),
31
+ receiptLong: glyph('35.6 -924.4 888.9 888.9', 'M222-80q-43.75 0-74.37-30.63Q117-141.25 117-185v-125h127v-570l59.8 60 59.8-60 59.8 60 59.8-60 59.8 60 60-60 60 60 60-60 60 60 60-60v695q0 43.75-30.62 74.37Q781.75-80 738-80H222Zm514.5-60q19.5 0 31.5-12.5t12-32.5v-611H307v536h390v75q0 20 10 32.5t29.5 12.5ZM360-642v-60h240v60H360Zm0 134v-60h240v60H360Zm333-134q-12 0-21-9t-9-21q0-12 9-21t21-9q12 0 21 9t9 21q0 12-9 21t-21 9Zm0 129q-12 0-21-9t-9-21q0-12 9-21t21-9q12 0 21 9t9 21q0 12-9 21t-21 9Z'),
32
+ mail: glyph('35.6 -924.4 888.9 888.9', 'M140-160q-24 0-42-18t-18-42v-520q0-24 18-42t42-18h680q24 0 42 18t18 42v520q0 24-18 42t-42 18H140Zm340-302 340-223v-55L480-522 140-740v55l340 223Z'),
33
+ build: glyph('80.8 -880.2 803.3 803.3', 'M705-128 447-388q-23 8-46 13t-47 5q-97 0-165-67.5T121-602q0-31 8-60.5t23-55.5l145 145 92-86-149-149q26-15 55-23.5t59-8.5q99 0 168.5 69.5T592-602q0 24-5 47t-13 46l259 258q11 11 11 26.5T833-198l-76 70q-11 11-26 11t-26-11Z'),
34
+ table: glyph('80 -880 800 800', 'M450-340H120v160q0 24.75 17.63 42.37Q155.25-120 180-120h270v-220Zm60 0v220h270q24.75 0 42.38-17.63Q840-155.25 840-180v-160H510Zm-60-60v-220H120v220h330Zm60 0h330v-220H510v220ZM120-680h720v-100q0-24.75-17.62-42.38Q804.75-840 780-840H180q-24.75 0-42.37 17.62Q120-804.75 120-780v100Z'),
35
+ description: glyph('35.6 -924.4 888.9 888.9', 'M319-250h322v-60H319v60Zm0-170h322v-60H319v60ZM220-80q-24 0-42-18t-18-42v-680q0-24 18-42t42-18h361l219 219v521q0 24-18 42t-42 18H220Zm331-554h189L551-820v186Z'),
36
+ dashboardCustomize: glyph('80 -880 800 800', 'M120-840h330v330H120v-330Zm390 0h330v330H510v-330ZM120-450h330v330H120v-330Zm525 0h60v135h135v60H705v135h-60v-135H510v-60h135v-135Z'),
37
+ manageAccounts: glyph('35.8 -894.2 883.3 883.3', 'm667-120-10-66q-17-5-34.5-14.5T593-222l-55 12-25-42 47-44q-2-9-2-25t2-25l-47-44 25-42 55 12q12-12 29.5-21.5T657-456l10-66h54l10 66q17 5 34.5 14.5T795-420l55-12 25 42-47 44q2 9 2 25t-2 25l47 44-25 42-55-12q-12 12-29.5 21.5T731-186l-10 66h-54ZM80-164v-94q0-35 17.5-63t50.5-43q72-32 133.5-46T400-424h23q-21 51-19 134.5T438-164H80Zm672-99q22-22 22-58t-22-58q-22-22-58-22t-58 22q-22 22-22 58t22 58q22 22 58 22t58-22ZM292-527q-42-42-42-108t42-108q42-42 108-42t108 42q42 42 42 108t-42 108q-42 42-108 42t-108-42Z'),
38
+ sparkles: glyph('-0.2 -0.2 24.4 24.4', 'm19 9-1.25-2.75L15 5l2.75-1.25L19 1l1.25 2.75L23 5l-2.75 1.25Zm0 14-1.25-2.75L15 19l2.75-1.25L19 15l1.25 2.75L23 19l-2.75 1.25ZM9 20l-2.5-5.5L1 12l5.5-2.5L9 4l2.5 5.5L17 12l-5.5 2.5Z'),
39
+ };
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import type { AppFactory } from './coworkee.ts';
2
2
  export { useCoworkee, type AirWorksApi, type AppFactory, type Coworkee, type CoworkeeApp, type CoworkeeOptions } from './coworkee.ts';
3
3
  export { bffAuthProvider, sessionOf } from './auth.ts';
4
4
  export { loadMudEx, defaultMudExFrameUrl, defaultMudExUrl, mudExFrame } from './mudex.ts';
5
+ export { icons } from './icons.ts';
5
6
  export { bytes, display, esc, toast } from './dom.ts';
6
7
  export { confirmDialog, fieldHtml, formDialog, infoDialog, promptDialog, readFields, type Field, type FieldType, type FormOptions, type Values } from './form.ts';
7
8
  export { choices, crudApp, renderCrud, type CrudAction, type CrudColumn, type CrudOptions, type CrudQuery, type CrudToolbarAction } from './crud.ts';
package/dist/index.js CHANGED
@@ -11,6 +11,7 @@ import { settingsApp } from "./apps/settings.js";
11
11
  export { useCoworkee } from "./coworkee.js";
12
12
  export { bffAuthProvider, sessionOf } from "./auth.js";
13
13
  export { loadMudEx, defaultMudExFrameUrl, defaultMudExUrl, mudExFrame } from "./mudex.js";
14
+ export { icons } from "./icons.js";
14
15
  export { bytes, display, esc, toast } from "./dom.js";
15
16
  export { confirmDialog, fieldHtml, formDialog, infoDialog, promptDialog, readFields } from "./form.js";
16
17
  export { choices, crudApp, renderCrud } from "./crud.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coworkee/airworks",
3
- "version": "0.0.1023",
3
+ "version": "0.0.1025",
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/",
@@ -39,7 +39,7 @@
39
39
  "test": "node --test \"test/**/*.test.ts\""
40
40
  },
41
41
  "dependencies": {
42
- "@coworkee/client": "0.0.1023"
42
+ "@coworkee/client": "0.0.1025"
43
43
  },
44
44
  "peerDependencies": {
45
45
  "@fgilde/airworks": ">=0.4.0"