diff --git a/CLAUDE.md b/CLAUDE.md index a46519c9fd0..360955383ee 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -183,7 +183,7 @@ Client `.java` under `/registry/public//...` is synchronized by `JavaSy A single `app.intent` YAML file at a project root is the source of truth one altitude above the model files. **The intent is an authoring artifact, not a runtime artifact** — like the `.edm` it has an editor and an explicit Generate, and (like the `.edm`) it has **no synchronizer**. Double-clicking any `*.intent` file opens the Intent Editor (`components/ui/editor-intent`): editable YAML left, live read-only diagram right (mxGraph ER + per-process flowcharts, the same engine the EDM/schema/mapping modelers use), validation inline; the Generate button runs six generators that write `.edm`/`.model`, `.bpmn`, `.form`, `.report`, `.roles` and `.csvim`/`.csv` **into the developer's workspace project at the project root** (the layout of real-world Dirigible application projects) — nothing touches the registry until normal publish, after which the per-artefact synchronizers bring the runtime live as for any project. Services: `POST /services/ide/intent/parse` and `POST /services/ide/intent/generate`. A third editor pane is a **Claude AI assistant** (`POST /services/ide/intent/agent`): it proposes the complete updated `app.intent` via the Anthropic API (key server-side in `DirigibleConfig.INTENT_AI_*`, never sent to the browser), the editor shows a Monaco diff, and Accept merges it into the buffer — the agent never writes disk or runs Generate. Developed on PR [#6017](https://github.com/eclipse-dirigible/dirigible/pull/6017). -**Detailed guide:** [`components/engine/engine-intent/CLAUDE.md`](components/engine/engine-intent/CLAUDE.md). Read it before changing anything under that module — it covers the editor-first architecture and altitude contract (model files only, never code), the YAML schema and its semantics (integer-only primary keys, `composition: true` to-one = DEPENDENT master-detail while `required` alone is just a NOT NULL FK, PascalCase property names with UPPER_SNAKE columns, decision `then`/`else`, intent-prefixed table names via `IntentNaming`), the `writeModelFile`-only write surface with the stale-output scrub, the wrong turns already made (wrong altitude, template-output paths, registry-relative vs repository-absolute paths, the `JsonHelper` Gson pitfall, **and the synchronizer-based first incarnation — do not reintroduce it**), and the follow-up list (chaining model-to-code via `.gen` descriptors, `/custom/` escape hatch). Process triggers (`trigger: { onCreate: }`) are wired: the EDM adds a `ProcessId` field + a `triggers` collection to the `.model`, and the `template-application-events-java` template generates a `gen/events//Trigger.java` listener (module-scoped package `gen.events.` — two modules authoring same-named reactions no longer collide by FQN; generated beans/entities carry module-qualified names for the same reason) that starts the process on create. That persisted `ProcessId` is in turn **consumed by the generated entity-view UI**: a shared `ProcessTasks` module (`components/resources/resources-dashboard/.../dashboard/services/process-tasks.js`) surfaces the record's actionable BPM user tasks inline via an `` directive (correlating `entity.ProcessId === task.processInstanceId`), wired into every generated view gated on a `hasProcess` flag; the task form completes via the permission-checked `/services/inbox/tasks/{id}` and self-closes (#6074). `IntentEngineIT` is the HTTP-only end-to-end test (~1 minute, no sync cycles). The editor's diagram pane is **mxGraph** (replacing Mermaid, which had unfixable light/dark theming bugs) with a fixed brand-colour palette that reads on both themes — see the module guide's "Intent Editor diagram = mxGraph" section before touching `editor-intent/js/editor.js`. +**Detailed guide:** [`components/engine/engine-intent/CLAUDE.md`](components/engine/engine-intent/CLAUDE.md). Read it before changing anything under that module — it covers the editor-first architecture and altitude contract (model files only, never code), the YAML schema and its semantics (integer-only primary keys, `composition: true` to-one = DEPENDENT master-detail while `required` alone is just a NOT NULL FK, PascalCase property names with UPPER_SNAKE columns, decision `then`/`else`, intent-prefixed table names via `IntentNaming`), the `writeModelFile`-only write surface with the stale-output scrub, the wrong turns already made (wrong altitude, template-output paths, registry-relative vs repository-absolute paths, the `JsonHelper` Gson pitfall, **and the synchronizer-based first incarnation — do not reintroduce it**), and the follow-up list (chaining model-to-code via `.gen` descriptors, `/custom/` escape hatch). Process triggers (`trigger: { onCreate: }`) are wired: the EDM adds a `ProcessId` field + a `triggers` collection to the `.model`, and the `template-application-events-java` template generates a `gen/events//Trigger.java` listener (module-scoped package `gen.events.` — two modules authoring same-named reactions no longer collide by FQN; generated beans/entities carry module-qualified names for the same reason) that starts the process on create. That persisted `ProcessId` is in turn **consumed by the generated entity-view UI**: the shared Harmonia runtime's `processTasks` store (`components/resources/application-core/.../application-core/shell/js/stores/processTasks.js`) surfaces the record's actionable BPM user tasks inline (correlating `entity.ProcessId === task.processInstanceId`), wired into every generated view gated on a `hasProcess` flag; the task form completes via the permission-checked `/services/inbox/tasks/{id}` and self-closes (#6074). `IntentEngineIT` is the HTTP-only end-to-end test (~1 minute, no sync cycles). The editor's diagram pane is **mxGraph** (replacing Mermaid, which had unfixable light/dark theming bugs) with a fixed brand-colour palette that reads on both themes — see the module guide's "Intent Editor diagram = mxGraph" section before touching `editor-intent/js/editor.js`. **Multi-model + layout additions (PRs [#6089](https://github.com/eclipse-dirigible/dirigible/pull/6089)-[#6092](https://github.com/eclipse-dirigible/dirigible/pull/6092)):** the DSL now supports building an app from **several intent models that reference each other cross-model** - a top-level `uses:` block names other models, and a relation gains an optional `model:` alias; a cross-model `manyToOne`/`oneToOne` is emitted as a read-only **PROJECTION** entity + integer FK + dropdown (the codbex cross-project pattern - no local table/DAO/controller for the target), resolved against the owner's already-generated `.model` (leaf-first generation; convention fallback otherwise). **n:m** is an explicit **intermediate entity** (composition to one side + `manyToOne` to the other, which may be cross-model, plus bridge fields like `amount`) - `manyToMany` is parsed but never materialized. New field attributes: `unique`, `precision`/`scale`, `calculatedOnCreate`/`calculatedOnUpdate` (a neutral arithmetic expression for numeric totals, else emitted verbatim into the runtime), `calculatedActionOnCreate`/`calculatedActionOnUpdate` (server-side call-out to a hand-written `@Component implements org.eclipse.dirigible.sdk.db.CalculatedField`, invoked as `Beans.get(.class).calculate(entity)`, taking precedence over the expression — for logic too custom to model, e.g. number generation); field `readOnly: true` (not editable; rendered in the Harmonia form's read-only details block — Label:Value above the buttons — via `isReadOnlyProperty`; `ProcessId`/audit columns/`uuid` are auto-flagged read-only, `status`-style fields opt in); field `major: false` (kept off the entity **list** table — the model's `widgetIsMajor="false"` — still shown in forms + the record details pane; defaults true); entity `imports:` (Java `import` lines injected into the generated repository so a calculated action can be referenced by simple name — Base64-encoded into the `.model`'s `importsCode`, which the Java DAO template emits; the editor's entity-level Imports tab is the model-editor equivalent); entity `audit: true` (the four standard audit columns); entity `group:` (the perspective's nav-group id in the shared application shell). **Depends-On** is exposed as `dependsOn: { relation, valueFrom?, filterBy? }` on a to-one relation (cascading/narrowed dropdown) or a field (auto-populated value) — emitted as the EDM `widgetDependsOn*` attributes (the AngularJS stacks consume them as-is; the Harmonia runtime — form/document watchers + the metadata-driven item-dialog cascade — was added alongside); defaults are the respective primary keys, names are the target's authored property names, cross-model triggers/targets supported. **Multi-language data** (the TS-era `multilingual` port): entity `multilingual: true` → the schema layer generates a sibling `_LANG` table (`GUID, Id, , Language` — the codbex-uoms-data convention) and the generated Java repository overlays translated values on every read for the request's `Accept-Language` (SDK `Translator`, name-based merge); the supported language set is a PLATFORM concern (`DIRIGIBLE_APPLICATION_LANGUAGES`, default `en`, tenant-overridable via the tenant configuration) — the Harmonia **Region & Language** Settings entry always offers that set (an Alpine `locale` store, localStorage `codbex.harmonia.language`, sent as `Accept-Language` by the shared fetch client — one flag drives UI, data, and the Print default), while the top-level `languages: [en, bg]` only declares which languages the module PROVIDES translations for; the application shell warns about modules missing a platform language, and untranslated content falls back to the default; translations are authored as seeds with `language: bg`, and large data sets reference an authored CSV via seed `file: data/x.csv` (subfolder mandatory — root `.csv` is scrub-owned) instead of inline rows. A master owning an `*Item` composition child renders as the **document (header-items) layout** (`MANAGE_DOCUMENT` + `documentItemsEntity`, `uiDocumentModels`), with `aggregate: true` fields shown in the totals footer. `IntentNaming.upperSnake` collapses kebab/space/`.`/`/` separators so a hyphenated model name yields a valid SQL identifier (`sales-invoices` -> `SALES_INVOICES`). Worked example: `dirigiblelabs/sample-intent-multi-model` (six interdependent projects + a navigation-groups project). @@ -193,7 +193,7 @@ A single `app.intent` YAML file at a project root is the source of truth one alt ## Harmonia runtime UI (`template-application-ui-harmonia-java` + `template-form-builder-harmonia`) -The runtime UI stack for generated applications: they render as a self-contained **Alpine.js + Harmonia SPA** (client-routed by Pinecone in hash mode, no iframes/`postMessage` hubs), served at `/services/web//gen//index.html`, talking to the **reused** generated Java REST controllers over a `fetch` client. The AngularJS IDE is untouched; the application layer now ships this stack only. `template-application-ui-harmonia-java` (registered on `platform-templates` as "Application - UI (Harmonia) - Java") emits the view types (list, manage, setting, master-detail, reports) + built-in **Process Inbox** (`/inbox`) and **Documents** (`/documents`) shell sections + inline process-task surfacing; `template-form-builder-harmonia` ("Harmonia Generator from Form Model", extension `form`) is the runtime form generator. The whole stack — Alpine 3.15.11, Harmonia 2.6.0, Lucide 1.8.0 — is embedded as **webjars** via `components/resources/application-core` (report charts use Harmonia's own native `x-h-chart-*` SVG charts; the `chart.js` webjar remains only for the AngularJS dashboard shell) (incl. Pinecone Router — `org.webjars.npm:pinecone-router`, served version-less at `/webjars/pinecone-router/dist/router.min.js`; it was vendored until the 7.5.2 webjar existed). Developed on PR [#6078](https://github.com/eclipse-dirigible/dirigible/pull/6078). +The runtime UI stack for generated applications: they render as a self-contained **Alpine.js + Harmonia SPA** (client-routed by Pinecone in hash mode, no iframes/`postMessage` hubs), served at `/services/web//gen//index.html`, talking to the **reused** generated Java REST controllers over a `fetch` client. The AngularJS IDE is untouched; the application layer now ships this stack only. `template-application-ui-harmonia-java` (registered on `platform-templates` as "Application - UI (Harmonia) - Java") emits the view types (list, manage, setting, master-detail, reports) + built-in **Process Inbox** (`/inbox`) and **Documents** (`/documents`) shell sections + inline process-task surfacing; `template-form-builder-harmonia` ("Harmonia Generator from Form Model", extension `form`) is the runtime form generator. The whole stack — Alpine 3.15.11, Harmonia 2.6.0, Lucide 1.8.0 — is embedded as **webjars** via `components/resources/application-core` (report charts use Harmonia's own native `x-h-chart-*` SVG charts; the `chart.js` webjar was dropped with the AngularJS dashboard shell) (incl. Pinecone Router — `org.webjars.npm:pinecone-router`, served version-less at `/webjars/pinecone-router/dist/router.min.js`; it was vendored until the 7.5.2 webjar existed). Developed on PR [#6078](https://github.com/eclipse-dirigible/dirigible/pull/6078). **Component reference:** the full codbex-harmonia directive catalog (all `x-h-*` components incl. the `x-h-select` combobox contract, theming, layout) lives **upstream** — the docs site and the agent-readable skill (formerly mirrored in-repo under `reference/harmonia/`; that copy was removed to avoid drift — always consult the upstream, version-matched to `harmonia.version` in the root `pom.xml`). [`.../reference/alpinejs/`](components/template/template-application-ui-harmonia-java/reference/alpinejs/) still covers the Alpine patterns (routing, page components), mirrored from `codbex-athena-app`, the reference app this stack was adopted from. Read them before changing Harmonia markup. @@ -205,7 +205,7 @@ The runtime UI stack for generated applications: they render as a self-contained - **Master-detail is registry-driven.** A master page renders one `detailPanel` per `App.detailsFor()` entry; each detail self-registers via `App.registerDetail(...)` (relative `apiPath`), so masters never enumerate details at generation time. The detail list filters via the controller's `?=` query (built into the reused rest-java controller for `*_DETAILS` layouts). - **The `.form` runs the existing AngularJS `code` via compat shims, and the page is self-contained.** `template-form-builder-harmonia` runs the `.form` `code` as the body of `formController(ctx)` (`ctx.{model, params, http, task, notify, close}`) and defines `$scope`/`$http`/`NotificationHub`/`DialogHub` shims so intent-generated AngularJS `.form` code runs **unchanged** (no migration needed). The page loads only `form.js` + its own minimal fetch client (no `window.App`), because a BPM task form opens standalone in an iframe where the SPA shell assets are absent — an earlier `../../js/...` reference 404'd and left `App` undefined. - **Intent glue handlers are self-describing `@Component`s, not class-level `@Listener`/`@Scheduled`.** Those SDK annotations are `@Target(METHOD)`; the rollup/notification/integration/job templates in `template-application-events-java` were converted to `@Component implements MessageHandler/JobHandler` with `destination()`/`kind()`/`cron()` (matching the Trigger template) — class-level use fails `javac` with "annotation interface not applicable". -- **The full-stack model template MUST merge the schema layer.** `template.js` = `template-application-schema` + REST-java + Harmonia UI (like the AngularJS full-stack). The client-Java `JavaEntityManager` only *registers* an `@Entity` against an existing table — it never CREATES one; `TableCreateProcessor` (the schema sync) does. Drop the schema and a freshly generated app has **no tables** → CRUD + CSVIM seeds fail ("Table metadata was not found for table [...]"). It only *looked* fine when a prior AngularJS/schema generation had already created them ("table kept in place"). +- **The full-stack model template MUST merge the schema layer.** `template.js` = `template-application-schema` + REST-java + Harmonia UI. The client-Java `JavaEntityManager` only *registers* an `@Entity` against an existing table — it never CREATES one; `TableCreateProcessor` (the schema sync) does. Drop the schema and a freshly generated app has **no tables** → CRUD + CSVIM seeds fail ("Table metadata was not found for table [...]"). It only *looked* fine when a prior AngularJS/schema generation had already created them ("table kept in place"). - **Process trigger writes ProcessId via a targeted single-column update (no event, no full row).** Starting a process on `onCreate` writes the instance id back; doing it through the normal `update()` republishes `-updated` and spuriously fires every onUpdate reaction (e.g. the member-email notification fired the instant a loan was created) — and even the silent `updateWithoutEvent()` was a **full-row merge of the trigger's stale snapshot**, which raced concurrent writes (line items recalculating the header totals milliseconds after create, a start-step status set) and silently reverted them. The trigger now uses `repository.updateProperty(id, "ProcessId", processId)` — an SDK `JavaRepository`/`JavaEntityStore` HQL mutation touching only the named column (same for a minted `businessKeyStrategy` field); no audit stamping, no events, nothing else to clobber. `updateProperty` is the sanctioned workflow/system write-back primitive — reserve it for system columns; user data keeps going through the generated repository's normal write path. The trigger guard is `ProcessId != null && !isBlank()` (an empty string from a form must not count as "already started"). - **Documents/CMS path contract (`/services/documents`, `engine-cms`'s `DocumentsEndpoint`).** Java since the GraalJS backend was retired — the old `/services/js/documents/api/documents.js` is **gone**, and with it the `?path=/` 400 quirk (`/` now lists the root, as does omitting the parameter). Still true: the CMS query layer does **not** decode an encoded slash, so build `?path=` with **literal slashes** — encode each segment, not the whole path (`p.split('/').map(encodeURIComponent).join('/')`); a blanket `encodeURIComponent` turns `/`→`%2F` and every subfolder/file 400s. Rename is `PUT {path,name}`; delete is `DELETE` with a JSON body of absolute paths; create a folder with `POST /folder {parentFolder,name}`; upload is multipart under the part name `file`; preview/download are `GET /preview|/download?path=`; zip is `GET|POST /zip?path=`. `__internal` is never listed or addressable (403), and `__EXPORTS` needs ADMINISTRATOR/OPERATOR. Both UIs (the AngularJS `documents/js/documents.js` perspective and the shared Harmonia `application-core/shell/.../documentsPage.js`) speak exactly this contract; content types can be overridden by contributing a `DocumentContentTypeResolver` bean (the Java replacement for the `ui-documents-content-type` extension point). - **Edit forms: match the value to the input shape (dates + comboboxes).** The Java REST controller serializes `java.time` via Jackson as **arrays** (`LocalDate` → `[y,m,d]`, `LocalDateTime` → `[y,m,d,h,mi,s,ns]`) and `Instant` as a **numeric epoch** — NOT ISO strings — so the form's `toDateInput()` handles arrays/numbers/strings (a naive `String(v).slice()` yields garbage → empty date controls on edit). And a relationship FK comes back as a **number** while an option's `data-value` is a string (HTML attribute), so the value must be **stringified on load** (`form.X = String(record.X)`) or the `x-h-select` matches no option and renders empty on edit — the same `String(...)` the codbex-athena-app edit pages use. @@ -219,13 +219,13 @@ The runtime UI stack for generated applications: they render as a self-contained - **Split-panel sizing is `data-size` (a `%` or px), NOT `data-default-size`** — `data-default-size` isn't referenced anywhere in harmonia 2.1.0 (silently 50/50). Both panes need it (`data-size="60%"` + `data-size="40%"`). To collapse a pane until needed (detail-pane-until-selection), bind `:data-hidden="!selected"` on the panel — the same mechanism the sidebar's collapse uses. - **`x-h-toolbar-title` bakes in `whitespace-nowrap text-ellipsis overflow-hidden`** — in a flex toolbar an entity title shrank to "Bo…"/"Mem…". Add `class="shrink-0"` to entity-name titles (list/manage/master/form/report) so they keep their natural width; leave the *dynamic* inbox titles truncating. - **The shell is richer than the original skeleton (all model/runtime-driven):** a **home Dashboard** (`/` and `/dashboard`, `dashboardPage` + `_dashboard.html`) with report-attached KPI widget tiles (`reports[].widget`) + custom widget tiles (`widgets:`) and a per-report preview tile (the report page in `?preview=1` mode — toolbar/pagination hidden, 5 rows) — there are no auto per-entity record-count tiles; **sidebar sections** Application / Entities / **Reports** (one entry per runtime-discovered report, selecting sets `$store.reports.selected` and opens it embedded on `/reports`); a route-derived **breadcrumb** (`navLabels` from a generated `window.__harmoniaNav` map so the entity crumb matches the sidebar); and a top-right **user menu** (name from `/services/js/platform-core/services/user-name.js`, logout → `/logout`), **notifications bell** (the `notifications` store; `processTasks.syncTasks()` surfaces BPM tasks as bell items, the store polls every 30s + on `pinecone:end` so they appear without a manual refresh), and the **theme** switch. Settings still pinned to the sidebar footer. -- **`widgetSize` is now a plain integer column count (3/4/6/12), not a Fundamental CSS class.** The entity editor stores the number; Harmonia maps it to `grid-column: span N` (12 → `col-span-full`) on a 12-col form grid; the AngularJS stacks map it to `fd-col-md--N`. Migration caveat: old `.edm` files with the legacy `fd-col-md--2 fd-col--3` string render a broken width class. +- **`widgetSize` is now a plain integer column count (3/4/6/12), not a Fundamental CSS class.** The entity editor stores the number; Harmonia maps it to `grid-column: span N` (12 → `col-span-full`) on a 12-col form grid. Migration caveat: old `.edm` files with the legacy `fd-col-md--2 fd-col--3` string render a broken width class. - **Form typography conventions (generated views).** Read-only / system fields (`isReadOnlyProperty` — `ProcessId`, audit columns, `uuid`, any `readOnly: true` field — and audit) render in a headerless **`x-h-card`** above the action buttons (a framed details block like the master-detail card, no title), NOT as editable inputs: `x-h-card` > `x-h-card-content` with a `grid-cols-1 sm:grid-cols-2 gap-x-4 gap-y-2`; each field a `vbox gap-0` with label `class="text-xs text-muted-foreground"` and value `class="text-sm"`, shown on edit and only when the value is populated. Wired in `manage/form-view` + `document/document-view` (master-detail reuses the manage form). **Document layout roles.** In a document (header-items) entity, a field with intent `documentTitle: true` → `widgetType="DOCUMENT_NUMBER"` renders in the form **title** (`''.toUpperCase() + ' ' + form.`, e.g. "SALES INVOICE 00001231"), and a to-one relation with `documentStatus: true` → `widgetType="DOCUMENT_STATUS"` renders as a read-only **`x-h-badge` pill** in the title bar (text resolved from its dropdown options, colour from `statusVariant(text)` — a keyword→variant map: draft→outline, approved/accepted/active→positive, issued/sent→information, cancel/reject→negative, pending→warning). Both are pulled from the editable grid; the status keeps its dropdown lookup metadata so the pill can resolve the id→name. For secondary/muted labels (e.g. the document totals footer) use **`text-secondary-foreground`**, not `text-secondary` (the bare token is the surface colour, not the on-surface text colour — labels using it render near-invisible). - **The model-independent shell runtime is SHARED, not copied per project.** It lives once at `/services/web/application-core/shell/` (`components/resources/application-core/.../application-core/shell/`: `app.js`, `services/*`, `stores/*`, `components/layout/appShell.js`, base/page components, `css/app.css`, and the Inbox/Documents/Reports/notfound views). The generated per-project shell and the application shell both load it from there by absolute URL; `template-application-ui-harmonia-java` only **generates** the model-specific files (`index.html`, `config.js`, `dashboardPage.js`, `_settings.html`, `_dashboard.html`, per-entity pages). Do NOT re-add per-project copies of the shared files (`shell.js` no longer emits them). PR [#6094](https://github.com/eclipse-dirigible/dirigible/pull/6094). ### Application shell (`resources-application`) — the pure-Harmonia app launchpad -`components/resources/resources-application` (`dirigible-components-resources-application`), served at **`/services/web/application/`**, is the Harmonia counterpart to the AngularJS dashboard **for the application layer** — the IDE stays AngularJS + BlimpKit, but the app layer is going pure Java + Harmonia. It reuses the shared runtime for the built-in Dashboard/Inbox/Documents/Reports pages (Pinecone routes into `#app`) and aggregates the **`application-perspectives`** extension point for the domain apps, hosting each one's generated SPA in an embedded iframe (`?embedded`). It shows **named perspective groups only**, so the platform's AngularJS *utility* perspectives (e.g. `platformSettings` → `/services/web/perspective-settings/settings.html`, `ng-app="settings"`) are excluded — **never iframe an AngularJS perspective into the Harmonia shell, it won't bootstrap standalone**. Each generated app contributes one per-entity perspective to `application-perspectives` whose `groupId` is the intent entity's `group:`; the groups are defined once in a dedicated navigation-groups project (the codbex pattern). Wired into `components/pom.xml` (modules + dependencyManagement) and `group-ui`. +`components/resources/resources-application` (`dirigible-components-resources-application`), served at **`/services/web/application/`**, is the shell **for the application layer** — the IDE stays AngularJS + BlimpKit, but the app layer is pure Java + Harmonia (the AngularJS Dashboard shell it replaced, `resources-dashboard`, was removed in #6589). It reuses the shared runtime for the built-in Dashboard/Inbox/Documents/Reports pages (Pinecone routes into `#app`) and aggregates the **`application-perspectives`** extension point for the domain apps, hosting each one's generated SPA in an embedded iframe (`?embedded`). It shows **named perspective groups only**, so the platform's AngularJS *utility* perspectives (e.g. `platformSettings` → `/services/web/perspective-settings/settings.html`, `ng-app="settings"`) are excluded — **never iframe an AngularJS perspective into the Harmonia shell, it won't bootstrap standalone**. Each generated app contributes one per-entity perspective to `application-perspectives` whose `groupId` is the intent entity's `group:`; the groups are defined once in a dedicated navigation-groups project (the codbex pattern). Wired into `components/pom.xml` (modules + dependencyManagement) and `group-ui`. ### Builder shell (`resources-builder`) — the conversational AI intent builder diff --git a/CLAUDE_FEATURES.md b/CLAUDE_FEATURES.md index 0c2c57b0b5f..4cf3f15df3d 100644 --- a/CLAUDE_FEATURES.md +++ b/CLAUDE_FEATURES.md @@ -553,7 +553,7 @@ First-class designers, each writing one of the modeler artefacts from §2.4: | Integrations Modeler (Karavan) | `*.camel` | Apache Camel route (`resources-karavan-libs`). | #### Underlying libraries -Monaco (editor), mxGraph (Schema/EDM diagrams), bpmn-visualization-js (BPMN viewer), Flowable BPMN (modeler), Karavan (Camel route designer), AngularJS + GoldenLayout (legacy layout), AG Grid (tables), Chart.js (charts), jsTree (trees), Xterm.js (terminal). +Monaco (editor), mxGraph (Schema/EDM diagrams), bpmn-visualization-js (BPMN viewer), Flowable BPMN (modeler), Karavan (Camel route designer), AngularJS + GoldenLayout (legacy layout), AG Grid (tables), jsTree (trees), Xterm.js (terminal). ### 7.3 Views (`components/ui/view-*`) Side / bottom panels: `view-artefacts`, `view-configurations`, `view-console`, `view-databases`, `view-data-structures`, `view-debugger` (JS), `view-java-debug`, `view-extensions`, `view-git`, `view-import`, `view-jobs`, `view-listeners`, `view-loggers`, `view-logs`, `view-preview`, `view-problems`, `view-projects`, `view-properties`, `view-registry`, `view-repository`, `view-search`, `view-security`, `view-sql`, `view-swagger`, `view-terminal`, `view-transfer`, `view-translation`, `view-websockets`, `view-welcome`. @@ -662,7 +662,7 @@ For doc generation: the full list of `@RestController`-annotated classes is in ` ### 10.2 Frontend toolchain - Node 22.x with global `typescript` and `esbuild`. WebJar modules under `components/ide/` and `components/ui/` are transpiled / bundled at Maven build time. -- Monaco editor, mxGraph, BlimpKit theme, BPMN visualization, AG Grid, Chart.js, Xterm.js, jsTree. +- Monaco editor, mxGraph, BlimpKit theme, BPMN visualization, AG Grid, Xterm.js, jsTree. ### 10.3 CLI (`cli/`) Standalone helper that starts the Dirigible jar against a given user project path; produces `cli/target/dirigible-cli-*-executable.jar`. See `cli/README.md`. diff --git a/HARMONIA_2_MIGRATION.md b/HARMONIA_2_MIGRATION.md index 34ddbe495de..57a1ead0ad2 100644 --- a/HARMONIA_2_MIGRATION.md +++ b/HARMONIA_2_MIGRATION.md @@ -177,6 +177,9 @@ compatible (verify each on the running app). in `components/resources/resources-resources/pom.xml` (`chart.js.version` in root `pom.xml`); only droppable if both report surfaces fully migrate. Do this as a separate, coordinated PR. + **Done (#6590):** the Harmonia reports run on the native `x-h-chart-*` charts and + the AngularJS report surface was removed with the Dashboard shell (#6589), so the + Chart.js webjar and its version property are gone. ## Verification diff --git a/HARMONIA_RUNTIME_PLAN.md b/HARMONIA_RUNTIME_PLAN.md index defc31a5c4d..66c7442f328 100644 --- a/HARMONIA_RUNTIME_PLAN.md +++ b/HARMONIA_RUNTIME_PLAN.md @@ -3,6 +3,13 @@ Research and implementation plan for a parallel, fully-embedded runtime UI stack. Framework swap only; behaviour parity. +> **Status: done — and no longer parallel.** The AngularJS/TypeScript application templates +> ([#6588](https://github.com/eclipse-dirigible/dirigible/issues/6588)) and the AngularJS Dashboard +> shell `resources-dashboard` ([#6589](https://github.com/eclipse-dirigible/dirigible/issues/6589)) +> have been removed, so Harmonia + client Java is the platform's only application stack. The +> "parallel stack", "parity with the AngularJS views" and "replaces `resources-dashboard`" framing +> below is the historical plan, kept as the design record. + ## Goal Keep the **IDE** (Workbench, Monaco editors, entity/form/intent modelers) on **AngularJS + BlimpKit**. diff --git a/README.md b/README.md index 154e39dbd3e..8db35d3acfb 100644 --- a/README.md +++ b/README.md @@ -505,7 +505,6 @@ Monaco Editor by Microsoft: [https://github.com/microsoft/monaco-editor](https:/ mxGraph: [https://github.com/jgraph/mxgraph](https://github.com/jgraph/mxgraph) Xterm.js: [https://github.com/xtermjs/xterm.js](https://github.com/xtermjs/xterm.js) Flowable: [https://github.com/flowable](https://github.com/flowable) -Chart.js: [https://github.com/chartjs/Chart.js](https://github.com/chartjs/Chart.js) AG Grid: [https://github.com/ag-grid/ag-grid](https://github.com/ag-grid/ag-grid) BlimpKit: [https://github.com/blimpkit/blimpkit.github.io](https://github.com/blimpkit/blimpkit.github.io) diff --git a/components/engine/engine-intent/CLAUDE.md b/components/engine/engine-intent/CLAUDE.md index 900ef031d02..ecb4a9a8c56 100644 --- a/components/engine/engine-intent/CLAUDE.md +++ b/components/engine/engine-intent/CLAUDE.md @@ -552,7 +552,7 @@ Implemented and generating annotated client-Java off the shared `EventBinding` / - Reports rewritten to the Dirigible `.report` shape with a materialised SQL `query` (was empty), `relation.field` -> `INNER JOIN`, `filter` -> qualified `WHERE`, and default-role `security`. Covered by `IntentEngineIT` (aggregate + join/filter reports). - Cross-artefact PascalCase: the `.form` control `model`/`id` bind to the PascalCase EDM property name; a bare to-one relation report dimension auto-joins and shows the target's `name`-like field instead of the raw FK id. - Process triggers (`trigger: { onCreate: }`) fully wired in Java: validated by the parser; the new `template-application-events-java` ("Application - Glue Code - Java") template generates a `gen/events//Trigger.java` self-describing `MessageHandler` that starts the process on the entity's create event; the Java DAO template publishes that event. The EDM keeps only the persisted `ProcessId` column (`EdmIntentGenerator`). Covered by `IntentEngineIT` end-to-end (verified live: create → trigger → process start → ProcessId written back). -- **`ProcessId` consumed by the generated entity-view UI** (in-context BPM task surfacing). The `ProcessId` the trigger writes back is read by the generated views: a shared `ProcessTasks` AngularJS module (`components/resources/resources-dashboard/.../dashboard/services/process-tasks.js` — service + `` directive) fetches the current user's Inbox tasks once, buckets them by `processInstanceId`, and a record shows its actionable tasks inline by matching `entity.ProcessId === task.processInstanceId`. Wired into every generated view (`list`, `manage`, `master-list`/`master-manage` `detail` and `main-details`) gated on a `hasProcess` flag that `parameterUtils.js` sets when an entity has a `ProcessId` property — so non-process entities generate unchanged. The generated task form (`FormIntentGenerator`) completes via the per-task **permission-checked** `/services/inbox/tasks/{id}` (not the role-guarded `/services/bpm/bpm-processes/tasks/{id}`, which blocks candidate-group users) and self-closes on completion via both `DialogHub.closeWindow()` (dialog/inbox) and `window.close()` (standalone window). (#6074 + refinements #6075.) +- **`ProcessId` consumed by the generated entity-view UI** (in-context BPM task surfacing). The `ProcessId` the trigger writes back is read by the generated views: the shared Harmonia runtime's `processTasks` store (`components/resources/application-core/.../application-core/shell/js/stores/processTasks.js`) fetches the current user's Inbox tasks, buckets them by `processInstanceId`, and a record shows its actionable tasks inline by matching `entity.ProcessId === task.processInstanceId`. Wired into every generated view gated on a `hasProcess` flag that `parameterUtils.js` sets when an entity has a `ProcessId` property — so non-process entities generate unchanged. The generated task form (`FormIntentGenerator`) completes via the per-task **permission-checked** `/services/inbox/tasks/{id}` (not the role-guarded `/services/bpm/bpm-processes/tasks/{id}`, which blocks candidate-group users) and self-closes on completion via both `DialogHub.closeWindow()` (dialog/inbox) and `window.close()` (standalone window). (#6074 + refinements #6075.) - **Process glue externalized to `.glue`** (the precedent: `.report`/`.form` were lifted out of the EDM). The `triggers` + `resolvers` collections live in `.glue` (`GlueIntentGenerator`), NOT the `.model` - the EDM describes entities, the BPMN describes flow, neither owns "who starts a process / how its context is populated". The Glue-Code template binds to `extension: "glue"`; `generateUtils.js` has `triggers` + `resolvers` collection cases. (Supersedes the older "triggers in the .model" wiring.) - **`setField` service tasks + `next` routing (declarative status/field set):** a `serviceTask` with `setField`/`value` sets a string/text field of the trigger entity via a generated `gen/events//.java` `JavaDelegate` (`SetFieldSupport` → the `setters` glue collection + `SetField.java.template` + the `setters` case in `generateUtils.js`), persisting with the targeted single-column `updateProperty`; a `next: ` arg overrides a step's linear successor so a decision's two branches converge instead of falling through. Replaces the `custom.` scaffold for the approve→ACTIVE / reject→REJECTED pattern. See the "Decision steps" / `setField` semantics bullet above. Covered by `IntentEngineIT.set_field_glue_sets_entity_status_on_approve_reject_branches`. - **`setRelationField` (set a relation-FK status):** the generic, relation-valued sibling of `setField` — `args: { setRelationField: , value: }` sets a to-one relation's FK to a seed id (unquoted), via the same `setters` glue + `SetField.java.template` (a `relation` flag branches the template). Allowed on a serviceTask (bound directly) and on a userTask (setter inserted after the task, like the Writer). See the `setRelationField` semantics bullet above. diff --git a/components/group/group-ui/pom.xml b/components/group/group-ui/pom.xml index 6a3d374fbf2..4d4ded343d0 100644 --- a/components/group/group-ui/pom.xml +++ b/components/group/group-ui/pom.xml @@ -27,10 +27,6 @@ org.eclipse.dirigible dirigible-components-ui-settings-locale - - org.eclipse.dirigible - dirigible-components-resources-dashboard - org.eclipse.dirigible dirigible-components-resources-application diff --git a/components/pom.xml b/components/pom.xml index 5d89708fd62..edb751a39d8 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -248,7 +248,6 @@ resources/resources-theme-classic resources/resources-theme-high-contrast resources/resources-theme-mystic - resources/resources-dashboard resources/resources-application resources/resources-home resources/resources-personal @@ -1349,11 +1348,6 @@ dirigible-components-resources-locale ${project.version} - - org.eclipse.dirigible - dirigible-components-resources-dashboard - ${project.version} - org.eclipse.dirigible dirigible-components-resources-application diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/dashboard-widgets.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/dashboard-widgets.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/dashboard-widgets.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/dashboard-widgets.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/locale.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/locale.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/locale.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/locale.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/menu.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/menu.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/menu.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/menu.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/perspective.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/perspective.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/perspective.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/perspective.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/reports.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/reports.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/reports.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/reports.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/settings.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/settings.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/settings.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/settings.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/shell.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/shell.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/shell.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/shell.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/subview.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/subview.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/subview.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/subview.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/theme.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/theme.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/theme.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/theme.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/tile.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/tile.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/tile.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/tile.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/view.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/view.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/view.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/view.extensionpoint diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/window.extensionpoint b/components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/window.extensionpoint similarity index 100% rename from components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extension-points/window.extensionpoint rename to components/resources/resources-application/src/main/resources/META-INF/dirigible/application/extension-points/window.extensionpoint diff --git a/components/resources/resources-dashboard/.gitignore b/components/resources/resources-dashboard/.gitignore deleted file mode 100644 index 686cef860bd..00000000000 --- a/components/resources/resources-dashboard/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -# folders -dist/ -.settings/ -target/ -derby/ -dirigible_local/ - -# files -.DS_Store -.project -.classpath -*.bak -*.class -*.jar -derby.log -/bin/ -/target/ \ No newline at end of file diff --git a/components/resources/resources-dashboard/about.html b/components/resources/resources-dashboard/about.html deleted file mode 100644 index bcb03d59e0f..00000000000 --- a/components/resources/resources-dashboard/about.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -About - - -

About This Content

- -

April 25, 2020

-

License

- -

The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise -indicated below, the Content is provided to you under the terms and conditions of the -Eclipse Public License Version 2.0 ("EPL"). A copy of the EPL is available -at http://www.eclipse.org/legal/epl-v20.html. -For purposes of the EPL, "Program" will mean the Content.

- -

If you did not receive this Content directly from the Eclipse Foundation, the Content is -being redistributed by another party ("Redistributor") and different terms and conditions may -apply to your use of any object code in the Content. Check the Redistributor's license that was -provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise -indicated below, the terms and conditions of the EPL still apply to any source code in the Content -and such source code may be obtained at http://www.eclipse.org.

- - - diff --git a/components/resources/resources-dashboard/pom.xml b/components/resources/resources-dashboard/pom.xml deleted file mode 100644 index 26e7887b744..00000000000 --- a/components/resources/resources-dashboard/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - 4.0.0 - - - org.eclipse.dirigible - dirigible-components-parent - 15.0.0-SNAPSHOT - ../../pom.xml - - - Components - Resources - Portal - dirigible-components-resources-dashboard - jar - - - - org.eclipse.dirigible - dirigible-components-ui-perspective-settings - ${project.version} - - - - - ../../../licensing-header.txt - ../../../ - - - \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/bg-BG.js b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/bg-BG.js deleted file mode 100644 index 363a661f686..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/bg-BG.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2010-2026 Eclipse Dirigible contributors - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v20.html - * - * SPDX-FileCopyrightText: Eclipse Dirigible contributors - * SPDX-License-Identifier: EPL-2.0 - */ -exports.getLocale = () => ({ - id: 'bg-BG', - label: 'Bulgarian', - secondary: 'Български', - common: '/dashboard/i18n/bg-BG/common.json' -}); \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/dashboard-perspective.js b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/dashboard-perspective.js deleted file mode 100644 index 7dc7fee8237..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/dashboard-perspective.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2010-2026 Eclipse Dirigible contributors - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v20.html - * - * SPDX-FileCopyrightText: Eclipse Dirigible contributors - * SPDX-License-Identifier: EPL-2.0 - */ -const perspectiveData = { - id: 'dashboard', - label: 'Dashboard', - translation: { - key: 'dashboard:dashboard', - }, - path: '/services/web/dashboard/perspectives/dashboard.html', - order: -3, - lazyLoad: true, - icon: '/services/web/dashboard/images/dashboard.svg', -}; -if (typeof exports !== 'undefined') { - exports.getPerspective = () => perspectiveData; -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/dashboard.js b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/dashboard.js deleted file mode 100644 index 3cad1d517ef..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/dashboard.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2026 Eclipse Dirigible contributors - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v20.html - * - * SPDX-FileCopyrightText: Eclipse Dirigible contributors - * SPDX-License-Identifier: EPL-2.0 - */ -const shellData = { - id: 'dashboardShell', - path: '/services/web/dashboard/index.html', - label: 'Dashboard', - icon: 'layout-dashboard', - description: 'Charts and widgets at a glance.', - order: 50, - translation: { - key: 'dashboard:dashboard', - }, -}; -if (typeof exports !== 'undefined') { - exports.getShell = () => shellData; -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/reports-perspective.js b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/reports-perspective.js deleted file mode 100644 index be723c71edf..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/configs/reports-perspective.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2026 Eclipse Dirigible contributors - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v20.html - * - * SPDX-FileCopyrightText: Eclipse Dirigible contributors - * SPDX-License-Identifier: EPL-2.0 - */ -const perspectiveData = { - id: 'Reports', - label: 'Reports', - translation: { - key: 'dashboard:reports', - }, - path: '/services/web/dashboard/perspectives/reports.html', - order: 10, - icon: '/services/web/dashboard/images/reports.svg', -}; -if (typeof exports !== 'undefined') { - exports.getUtilityPerspective = () => perspectiveData; -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/bg-BG.extension b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/bg-BG.extension deleted file mode 100644 index 3f5bb1741fd..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/bg-BG.extension +++ /dev/null @@ -1,5 +0,0 @@ -{ - "description": "Platform Locale - Bulgarian", - "extensionPoint": "application-locales", - "module": "dashboard/configs/bg-BG.js" -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/dashboard-perspective.extension b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/dashboard-perspective.extension deleted file mode 100644 index 26b3b5b2e9f..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/dashboard-perspective.extension +++ /dev/null @@ -1,5 +0,0 @@ -{ - "module": "dashboard/configs/dashboard-perspective.js", - "extensionPoint": "application-perspectives", - "description": "Dashboard Perspective" -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/reports-perspective.extension b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/reports-perspective.extension deleted file mode 100644 index b9734c8c502..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/extensions/reports-perspective.extension +++ /dev/null @@ -1,5 +0,0 @@ -{ - "module": "dashboard/configs/reports-perspective.js", - "extensionPoint": "application-perspectives", - "description": "Application reports perspective" -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/bg-BG/common.json b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/bg-BG/common.json deleted file mode 100644 index 1c1132153c4..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/bg-BG/common.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "aria": { - "headerMenu": "заглавно меню", - "headerMainMenuBtn": "бутон за главно меню", - "headerMenuBtn": "бутон за меню", - "headerMenuWindow": "заглавно меню прозорец", - "headerMenuHelp": "заглавно меню помощ", - "windowMenuDdBtn": "бутон с падащо меню за меню прозорец", - "helpMenuDdBtn": "бутон с падащо меню за меню помощ", - "ntfListButton": "бутон за списък с известия", - "exportsListButton": "бутон за списък с експорти", - "delNtf": "изтриване на известие", - "usrMenuBtn": "бутон на потребителското меню", - "usrMenu": "потребителското меню", - "perspectiveNav": "перспективна навигация", - "perspectiveList": "Списък с перспективи", - "utilityNav": "навигация с помощни перспективи", - "expandPerGrp": "разширяване на перспективната група" - }, - "exports": { - "title": "Eкспорти ({{num}})", - "empty": "Няма експорти", - "finished": "Експортирането е завършено", - "exporting": "Eкспортиране...", - "error": { - "fetchTitle": "Неуспешно получаване на списъка с експорти", - "delTitle": "Експортът не можа да бъде изтрит", - "delAllTitle": "Експортите не можаха да бъдат изтрити" - } - }, - "yes": "Да", - "no": "Не", - "ok": "Добре", - "select": "Избери", - "cancel": "Отказ", - "add": "Добави", - "edit": "Редактирай", - "delete": "Изтрий", - "remove": "Премахни", - "help": "Помощ", - "new": "Нов", - "region": "Регион", - "language": "Език", - "window": "Прозорец", - "shells": "Фасади", - "perspectives": "Перспективи", - "views": "Изгледи", - "notificationsNum": "Известия ({{num}})", - "noNotifications": "Няма известия", - "close": "Затвори", - "clear": "Изчисти", - "clearAll": "Изчисти всичко", - "deleteAll": "$t(delete) всичко", - "clearFilter": "Изчисти филтъра", - "name": "Име", - "username": "Потребител", - "logout": "Изход", - "search": "Търсене", - "loading": "Зареждане", - "folder": "Папка", - "file": "Файл", - "rename": "Преименуване", - "refresh": "Опресняване", - "settings": "Настройки", - "reset": "Нулиране", - "about": "Относно", - "status": "Статус", - "download": "Изтегли", - "other": "Друго", - "unknown": "Неизвестен", - "unknownError": "Неизвестна Грешка", - "unknownErrorMsg": "Моля, проверете лога на конзолата за повече информация." -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/bg-BG/translation.json b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/bg-BG/translation.json deleted file mode 100644 index b8e7098917b..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/bg-BG/translation.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "dashboard": "Табло", - "reports": "Отчети", - "metrics": "Метрики", - "performance": "Производителност", - "statistics": "Статистика", - "emptyState": { - "title": "Няма нищо за показване", - "subtitle": "Уиджетите ще се покажат тук, след като бъдат регистрирани.", - "hint": "Ако това ви се струва неочаквано, свържете се с вашия администратор." - }, - "errMsg": { - "genericTitle": "Възникна грешка при зареждането таблото!", - "widgetList": "Зареждането на списъка с джаджи не бе успешно", - "reportLoadTitle": "Зареждането на отчетите не бе успешно", - "reportLoad": "Възникна грешка при опит за зареждане на списъка с отчети." - } -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/en-US/translation.json b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/en-US/translation.json deleted file mode 100644 index 582f49e21a6..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/i18n/en-US/translation.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "dashboard": "Dashboard", - "reports": "Reports", - "metrics": "Metrics", - "performance": "Performance", - "statistics": "Statistics", - "emptyState": { - "title": "Nothing to see here", - "subtitle": "Widgets will show up here once they've been registered.", - "hint": "If this seems unexpected, contact your administrator." - }, - "errMsg": { - "genericTitle": "Dashboard encountered an error!", - "widgetList": "Failed to load widget list", - "reportLoadTitle": "Failed to load reports", - "reportLoad": "There was an error while trying to load the reports list." - } -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/breeze.svg b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/breeze.svg deleted file mode 100644 index e4c4e069b66..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/breeze.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/dashboard.svg b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/dashboard.svg deleted file mode 100644 index 3d4fc5896a0..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/dashboard.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/reports.svg b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/reports.svg deleted file mode 100644 index f84da7c78fd..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/images/reports.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/index.html b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/index.html deleted file mode 100644 index d472f5df7ca..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/js/dashboard-controller.js b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/js/dashboard-controller.js deleted file mode 100644 index b3d994af22b..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/js/dashboard-controller.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2010-2026 Eclipse Dirigible contributors - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v20.html - * - * SPDX-FileCopyrightText: Eclipse Dirigible contributors - * SPDX-License-Identifier: EPL-2.0 - */ -const dashboard = angular.module('dashboard', ['blimpKit', 'platformView', 'platformLocale']); -dashboard.controller('DashboardController', ($scope, Extensions, LocaleService) => { - $scope.loadingLabel = 'Loading...'; - $scope.errorMessage = 'Failed to load widget list'; - LocaleService.onInit(() => { - $scope.loadingLabel = `${LocaleService.t('loading')}...`; - $scope.errorMessage = LocaleService.t('dashboard:errMsg.widgetList'); - }); - $scope.state = { - isBusy: true, - error: false, - busyText: $scope.loadingLabel, - }; - - $scope.smallWidgets = []; - $scope.mediumWidgets = []; - $scope.largeWidgets = []; - - $scope.hasWidgets = () => { - return $scope.smallWidgets.length || $scope.mediumWidgets.length || $scope.largeWidgets.length; - }; - - Extensions.getSubviews(['dashboard-widgets']).then((response) => { - response.data.forEach(widget => { - if (widget.size === 'small') { - $scope.smallWidgets.push(widget); - } else if (widget.size === 'medium') { - $scope.mediumWidgets.push(widget); - } else { - $scope.largeWidgets.push(widget); - } - }); - $scope.state.isBusy = false; - }).catch((error) => { - console.error('Error fetching widget list:', error); - $scope.state.error = true; - }); -}); \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/js/reports-controller.js b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/js/reports-controller.js deleted file mode 100644 index 64cc41cf160..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/js/reports-controller.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2026 Eclipse Dirigible contributors - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v20.html - * - * SPDX-FileCopyrightText: Eclipse Dirigible contributors - * SPDX-License-Identifier: EPL-2.0 - */ -const reports = angular.module('reports', ['platformView', 'platformSplit', 'blimpKit', 'platformLocale']); -reports.controller('ReportsController', ($scope, Extensions, LocaleService) => { - const Dialog = new DialogHub(); - $scope.search = { text: '' }; - $scope.reports = []; - - $scope.switchReport = (id) => { - $scope.activeId = id; - }; - - $scope.clearSearch = () => { - $scope.search.text = ''; - for (let i = 0; i < $scope.reports.length; i++) { - $scope.reports[i].hide = false; - } - }; - - $scope.filter = () => { - for (let i = 0; i < $scope.reports.length; i++) { - if ($scope.reports[i].label.toLocaleLowerCase().includes($scope.search.text.toLocaleLowerCase())) { - $scope.reports[i].hide = false; - } else $scope.reports[i].hide = true; - } - }; - - let to = 0; - $scope.searchContent = () => { - if (to) { clearTimeout(to); } - to = setTimeout(() => { - $scope.$evalAsync(() => { - $scope.filter(); - }); - }, 150); - }; - - Extensions.getViews(['application-reports']).then((response) => { - $scope.reports.push(...response.data); - if ($scope.reports.length) $scope.activeId = $scope.reports[0].id; - }, (error) => { - console.log(error); - Dialog.showAlert({ - title: LocaleService.t('dashboard:errMsg.reportLoadTitle', 'Failed to load reports'), - message: LocaleService.t('dashboard:errMsg.reportLoad', 'There was an error while trying to load the reports list.'), - type: AlertTypes.Error, - preformatted: false, - }); - }); -}); \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/perspectives/dashboard.html b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/perspectives/dashboard.html deleted file mode 100644 index c90b096582c..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/perspectives/dashboard.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - {{state.busyText}} - - - - - - -

{{'dashboard:metrics' | t:'Metrics'}}

-
- -
-
- - - -
-
-
-
- - - -

{{'dashboard:performance' | t:'Performance'}}

-
- -
-
- - - -
-
-
-
- - - -

{{'dashboard:statistics' | t:'Statistics'}}

-
- -
-
- - - -
-
-
-
-
- -
-
- - - -

{{'dashboard:emptyState.title' | t:'Nothing to see here'}}

-

{{'dashboard:emptyState.subtitle' | t:'Widgets will show up here once they`ve been registered.'}}

-

{{'dashboard:emptyState.hint' | t:'If this seems unexpected, contact your administrator.'}}

-
-
- - - {{'dashboard:errMsg.genericTitle' | t:'Dashboard encounterd an error!'}} - {{errorMessage}} - - - - - diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/perspectives/reports.html b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/perspectives/reports.html deleted file mode 100644 index 745fc3e0a53..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/perspectives/reports.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{report.translation.key | t:report.translation.options:report.label}} - - - - - - - - - - - diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/project.json b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/project.json deleted file mode 100644 index bb5d9b3508c..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/project.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "guid": "dashboard", - "dependencies": [], - "actions": [] -} \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/services/entity.js b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/services/entity.js deleted file mode 100644 index a68764bd049..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/services/entity.js +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2010-2026 Eclipse Dirigible contributors - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v20.html - * - * SPDX-FileCopyrightText: Eclipse Dirigible contributors - * SPDX-License-Identifier: EPL-2.0 - */ -angular.module('EntityService', []).provider('EntityService', function EntityServiceProvider() { - this.baseUrl = ''; - this.$get = ['$http', function entityApiFactory($http) { - - const count = function (idOrFilter) { - let url = `${this.baseUrl}/count`; - let bodyFilter = idOrFilter && typeof idOrFilter === 'object' && idOrFilter.$filter ? idOrFilter : undefined; - - if (!bodyFilter && idOrFilter != null && typeof idOrFilter === 'object') { - const query = Object.keys(idOrFilter).map(e => idOrFilter[e] ? `${e}=${idOrFilter[e]}` : null).filter(e => e !== null).join('&'); - if (query) { - url = `${this.baseUrl}/count?${query}`; - } - } else if (!bodyFilter && idOrFilter) { - url = `${this.baseUrl}/count/${idOrFilter}`; - } else if (bodyFilter && bodyFilter.$filter && bodyFilter.$filter.conditions) { - bodyFilter = bodyFilter.$filter; - } - - if (bodyFilter) { - return $http.post(url, JSON.stringify(bodyFilter), { headers: { 'describe': 'application/json' } }); - } - return $http.get(url, { headers: { 'describe': 'application/json' } }); - }.bind(this); - - const list = function (offsetOrFilter, limit) { - let url = this.baseUrl; - if (offsetOrFilter != null && typeof offsetOrFilter === 'object') { - const query = Object.keys(offsetOrFilter).map(e => offsetOrFilter[e] ? `${e}=${offsetOrFilter[e]}` : null).filter(e => e !== null).join('&'); - if (query) { - url = `${this.baseUrl}?${query}`; - } - } else if (offsetOrFilter != null && limit != null) { - url = `${url}?$offset=${offsetOrFilter}&$limit=${limit}`; - } - return $http.get(url, { headers: { 'describe': 'application/json' } }); - }.bind(this); - - const filter = function (query, offset, limit) { - const url = `${this.baseUrl}?${query}&$offset=${offset}&$limit=${limit}`; - return $http.get(url, { headers: { 'describe': 'application/json' } }); - }.bind(this); - - const search = function (entity) { - const url = `${this.baseUrl}/search`; - if (entity && entity.$filter && entity.$filter.conditions) { - entity = entity.$filter; - } - const body = JSON.stringify(entity); - return $http.post(url, body); - }.bind(this); - - const exportCsv = function () { - const url = `${this.baseUrl}/export`; - return $http.post(url); - }.bind(this); - - const create = function (entity) { - const url = this.baseUrl; - const body = JSON.stringify(entity); - return $http.post(url, body); - }.bind(this); - - const update = function (id, entity) { - const url = `${this.baseUrl}/${id}`; - const body = JSON.stringify(entity); - return $http.put(url, body); - }.bind(this); - - const deleteEntity = function (id) { - const url = `${this.baseUrl}/${id}`; - return $http.delete(url, { headers: { 'describe': 'application/json' } }); - }.bind(this); - - return { - count: count, - list: list, - filter: filter, - search: search, - create: create, - update: update, - 'delete': deleteEntity, - exportCsv: exportCsv, - }; - }]; -}); \ No newline at end of file diff --git a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/services/process-tasks.js b/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/services/process-tasks.js deleted file mode 100644 index a5983e3bf14..00000000000 --- a/components/resources/resources-dashboard/src/main/resources/META-INF/dirigible/dashboard/services/process-tasks.js +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 2010-2026 Eclipse Dirigible contributors - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v2.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v20.html - * - * SPDX-FileCopyrightText: Eclipse Dirigible contributors - * SPDX-License-Identifier: EPL-2.0 - */ -/** - * Shared support for surfacing a record's BPM user tasks as in-context actions on generated entity - * views. A process-aware entity carries a system-managed ProcessId (the started process-instance id, - * written back by the intent process trigger); the current user's actionable inbox tasks are fetched - * once and bucketed by processInstanceId, so any view - list, manage, or a master-detail pane - can - * surface the tasks for a given record regardless of its layout. - * - * Usage in a generated view: depend on the 'ProcessTasks' module and drop - * next to the record's actions. - */ -angular.module('ProcessTasks', ['platformLocale']) - .factory('ProcessTasks', ['$http', 'LocaleService', function ($http, LocaleService) { - const Dialogs = new DialogHub(); - let byProcessId = {}; - let loadPromise = null; - - const bucket = (responses) => { - const map = {}; - const seen = new Set(); - const collect = (tasks, mine) => (tasks || []).forEach((task) => { - if (!task.processInstanceId || seen.has(task.id)) return; - seen.add(task.id); - task.mine = mine; - (map[task.processInstanceId] = map[task.processInstanceId] || []).push(task); - }); - collect(responses[0].data, true); - collect(responses[1].data, false); - return map; - }; - - const load = () => { - loadPromise = Promise.all([ - $http.get('/services/inbox/tasks?type=assignee', { params: { limit: 100 } }), - $http.get('/services/inbox/tasks?type=groups', { params: { limit: 100 } }) - ]).then((responses) => { - byProcessId = bucket(responses); - return byProcessId; - }, (error) => { - byProcessId = {}; - console.error('ProcessTasks: unable to load inbox tasks', error); - return byProcessId; - }); - return loadPromise; - }; - - const openForm = (task) => { - if (!task.formKey) { - Dialogs.showAlert({ - title: task.name, - message: LocaleService.t('dashboard.processTasks.noForm', {}, 'This task has no form to display.'), - type: AlertTypes.Information - }); - return; - } - const separator = task.formKey.indexOf('?') >= 0 ? '&' : '?'; - const formUrl = task.formKey + separator + 'taskId=' + encodeURIComponent(task.id) + '&processInstanceId=' + encodeURIComponent(task.processInstanceId); - // The generated task form completes the task and closes this window itself (DialogHub.closeWindow); - // we just re-fetch when it closes so the originating view's badge drops the completed task. - const closeTopic = 'dashboard.processTasks.window.' + task.id; - const closeListener = Dialogs.addMessageListener({ - topic: closeTopic, - handler: () => { - Dialogs.removeMessageListener(closeListener); - load(); - } - }); - Dialogs.showWindow({ - hasHeader: true, - title: task.name, - path: formUrl, - closeButton: true, - callbackTopic: closeTopic - }); - }; - - return { - /** Force a re-fetch of the current user's tasks (call after a list reload / record change). */ - refresh: () => load(), - /** Fetch once if not already loaded; subsequent calls reuse the in-flight / cached result. */ - ensureLoaded: () => loadPromise || load(), - /** The cached actionable tasks for a record, matched by entity.ProcessId === task.processInstanceId. */ - getTasks: (entity) => (entity && entity.ProcessId && byProcessId[entity.ProcessId]) || [], - /** Open a task's form; a candidate (not-yet-assigned) task is claimed for the user first. */ - openTask: (task) => { - if (task.mine) { - openForm(task); - return; - } - $http.post('/services/inbox/tasks/' + task.id, { action: 'CLAIM' }).then(() => { - task.mine = true; - openForm(task); - load(); - }, (error) => { - const message = error.data ? error.data.message : ''; - Dialogs.showAlert({ - title: task.name, - message: LocaleService.t('dashboard.processTasks.unableToClaim', { message: message }, `Unable to claim task: '${message}'`), - type: AlertTypes.Error - }); - console.error('ProcessTasks: unable to claim task', error); - }); - } - }; - }]) - .directive('entityProcessTasks', ['ProcessTasks', 'LocaleService', function (ProcessTasks, LocaleService) { - return { - restrict: 'E', - scope: { entity: '<' }, - template: ` - - - - - - - - -`, - link: (scope) => { - scope.ariaLabel = LocaleService.t('dashboard.processTasks.pending', {}, 'Pending tasks'); - scope.tasks = () => ProcessTasks.getTasks(scope.entity); - // Surface the current step inline: a single actionable task shows its name (answers - // "why is there a task here?" at a glance), several collapse to a count. - scope.label = () => { - const open = scope.tasks(); - return open.length === 1 ? open[0].name : LocaleService.t('dashboard.processTasks.count', { count: open.length }, open.length + ' tasks'); - }; - scope.openTask = (task) => ProcessTasks.openTask(task); - ProcessTasks.ensureLoaded().then(() => scope.$applyAsync()); - } - }; - }]); diff --git a/components/resources/resources-resources/pom.xml b/components/resources/resources-resources/pom.xml index 41099e71f58..3f5b91f9009 100644 --- a/components/resources/resources-resources/pom.xml +++ b/components/resources/resources-resources/pom.xml @@ -13,14 +13,6 @@ dirigible-components-resources-resources jar - - - org.webjars.npm - chart.js - ${chart.js.version} - - - diff --git a/pom.xml b/pom.xml index 9115f350cb7..f8182bab027 100644 --- a/pom.xml +++ b/pom.xml @@ -221,7 +221,6 @@ 2.3.1 11.18.2 - 4.4.3 1.15.7 0.38.0 1.8.2