The Authoring UI is an AngularJS-based single-page web application that powers the front-end of the SNOMED CT Authoring Platform. It provides concept search, editing, project management and review workflows for authors and reviewers while integrating with a rich ecosystem of backend services (Authoring Services, Snowstorm, CIS, ActiveMQ, AWS S3, Consul, Vault β¦).
This document explains how to run the UI locally and the engineering conventions you should follow when working on the code-base.
flowchart TD
Browser["Web Browser"] --> |HTTPS| Nginx[(Nginx)]
Nginx --> AuthoringUI["Authoring UI (AngularJS SPA)"]
AuthoringUI --> |REST & WebSocket| Gateway[(Authoring-Services)]
Gateway --> |REST| Snowstorm[(Snowstorm Term Server)]
Gateway --> |REST| CIS[(CIS)]
Gateway --> |REST| IMS[(IMS)]
Gateway --> |REST| Jira[(Jira)]
Gateway --> |JMS| ActiveMQ[(ActiveMQ)]
subgraph External Config & Secrets
Consul[(Consul)]
Vault[(Vault)]
end
AuthoringUI -. consumes .-> Consul
sequenceDiagram
participant Author as Author (browser)
participant UI as Authoring UI
participant Gateway as Authoring-Services
participant Snowstorm as Snowstorm
Author->>UI: Search concepts
UI->>Gateway: /api/search?term=heart
Gateway->>Snowstorm: /browser/β¦
Snowstorm-->>Gateway: JSON results
Gateway-->>UI: Normalised search results
Author->>UI: Open concept editor
UI-->>Gateway: WebSocket subscribe /concept/{id}
Author->>UI: Save changes
UI->>Gateway: PUT /concept/{id}
Gateway--)ActiveMQ: publish concept.updated
ActiveMQ-->>UI: WS event β live update
Key points:
- Stateless front-end β all state resides in backend services, enabling horizontal scaling.
- Grunt & NPMher drive the build pipeline; assets are bundled as a static site.
- WebSockets (STOMP) deliver live task/status updates without polling.
- Built artefacts are served via Nginx or any static web-server and can be cached aggressively.
- Component Search & Filter β powerful term + ECL search with language reference-set filters ( @https://github.com/IHTSDO/authoring-ui/blob/master/app/shared/search/search.js ).
- Concept Editing β full SNOMED CT concept editor with axioms, descriptions, relationships ( @https://github.com/IHTSDO/authoring-ui/blob/master/app/components/edit/edit.js ).
- Project & Task Management β create, merge and review authoring tasks ( @https://github.com/IHTSDO/authoring-ui/blob/master/app/components/project/project.js ).
- Batch Editing & Template Authoring β bulk operations and domain templates with validation ( @https://github.com/IHTSDO/authoring-ui/blob/master/app/shared/batch-editing/batchEditing.js ).
- Classification & Integrity Checks β client-side dashboards for Snowstorm classification runs ( @https://github.com/IHTSDO/authoring-ui/blob/master/app/shared/classification/classification.js ).
- Responsive Layout β Bootstrap 3 and custom SCSS for desktop & tablet workflows.
- End-to-End Tests with Cypress ( @https://github.com/IHTSDO/authoring-ui/blob/master/cypress/e2e/test.cy.js ) and unit tests with Karma/Jasmine ( @https://github.com/IHTSDO/authoring-ui/blob/master/test/karma.conf.js ).
- Structured Logging via
$logservice wrappers. - Consul & Vault support β runtime config and feature-flags fetched at start-up.
app/
index.html β entry-point & ng-view outlet
app.js β root module & route config
components/ β feature modules (edit, project, β¦)
shared/ β cross-cutting services & directives
styles/ β SCSS source
images/ fonts/ β static assets
cypress/ β e2e tests
Gruntfile.js β build & dev-server tasks
package.json β JS dependencies
Naming conventions:
components/**Feature-scoped MV* modules (HTML, JS, SCSS colocated).shared/**Reusable services, directives and filters.utilities/**Helper scripts consumed across components.
- Node 18+ with npm (use nvm).
- Grunt CLI β
npm install -g grunt-cli. - Backend services reachable on the default local URLs (Authoring-Gateway β
localhost:8080).
Hint: A lightweight docker-compose stack for the backend is under discussion β contributions welcome.
git clone @https://github.com/IHTSDO/authoring-ui.git
cd authoring-ui
npm install # installs node & bower dependenciesgrunt serve # opens http://localhost:9000 with LiveReload- Edits to HTML/JS/SCSS trigger automatic reloads.
- API calls are proxied to
localhost:8080β adjust inGruntfile.jsif required.
grunt build # outputs minified site to dist/Copy the contents of dist/ behind any static web-server (Nginx, S3, CloudFront β¦).
- Unit Tests β
npm testruns Karma/Jasmine suites located underapp/**/*.spec.js. - End-to-End β
npx cypress openlaunches Cypress with tests incypress/e2e/.
- Run
grunt buildto create the production bundle. - Upload the
dist/folder to your static hosting provider (Nginx root, S3 bucket, Azure Blob β¦). - Configure cache-busting headers β files are fingerprinted by
grunt-filerev. - Behind an Nginx ingress add:
location / { try_files $uri $uri/ /index.html; # SPA fallback }