Skip to content

Commit 73e9d36

Browse files
committed
Merge branch 'main' of github.com:dfpc-coe/CloudTAK into reactive-draw-tools
2 parents 1a15cf1 + 56bcf1b commit 73e9d36

136 files changed

Lines changed: 10098 additions & 3392 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
run: npm install -g npm@latest
2626

2727
- name: npm install
28-
run: cd api/web && npm install --legacy-peer-deps
28+
run: cd api/web && npm install
2929

3030
- name: Build Types
3131
run: cd api/web && npm run build:types

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ jobs:
181181

182182
- name: Install
183183
working-directory: ./api/web/
184-
run: npm install --legacy-peer-deps
184+
run: npm install
185185

186186
- name: Lint
187187
working-directory: ./api/web/

CHANGELOG.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,40 @@
1616

1717
### Pending Release
1818

19+
### v13.52.0 - 2026-07-18
20+
21+
- :tada: Add `GET /api/type/2525e` endpoint exposing the MIL-STD-2525E Symbol Sets & Symbols via the `milstandard-e` package
22+
- :tada: Add `GET /api/type/2525e/:sidc` endpoint returning metadata (name, remarks, symbolset) for a given numeric SIDC
23+
- :tada: Add a 2525B/2525E standard toggle to the Feature Type editor - 2525E symbols are selected by numeric SIDC & rendered via `milsymbol`
24+
- :tada: 2525E symbols are browsed as a drill-down tree (Symbol Set => Entity => Entity Type => Entity Subtype) with breadcrumb navigation - typing a filter switches to a flat search across all Symbol Sets
25+
- :rocket: `GET /api/type/2525e` is hierarchy-aware - a `parent` Entity Code query param lists children & items carry `children` counts and a leaf `title`
26+
- :rocket: Hide the 2525B tab in the Feature Type editor once a Feature carries a 2525E type
27+
- :tada: Treat 2525D/2525E numeric SIDCs on the Feature `type` property as first-class - `node-cot@14.47` maps them to a basic CoT type + `__milicon` detail at the CoT boundary
28+
- :tada: Surface the `milicon` SIDC of augmented CoTs as the Feature `type` in the Profile WebSocket feed & the Web Map
29+
- :tada: Render SIDC-typed Features as military symbols on the map & show Unit Information for them (replaces the previous numeric `milsym` rendering path)
30+
- :tada: Default point creation (Draw Point, Coordinate Entry, Default Point Type setting) to 2525E Land Unit SIDCs where possible - `u-d-p` Custom Points & Spotted Map Items retain their traditional CoT types
31+
- :rocket: Augment CoTs flowing through TAK Connections with a 2525D `__milicon` detail derived from their CoT type
32+
- :bug: Fix the Feature Type editor panel rendering with its top cut off under the type label - an autofocused filter input scrolled the collapsed slidedown content
33+
- :bug: Keep the Feature Type editor open when a type is selected - it was remounting (and collapsing) on every type change as it was keyed on the type property
34+
- :arrow_up: Update `@tak-ps/node-cot` to `^14.47.0`
35+
- :arrow_up: Update `@tak-ps/vue-tabler` to `^5.1.0` - the Feature Type editor slidedown now only collapses explicitly; other `clickAnywhereExpand` slidedowns opt into `clickAnywhereCollapse` to retain their previous toggle behavior
36+
37+
### v13.51.0 - 2026-07-18
38+
39+
- :tada: Implement the Video Wall - a full-page grid of a user's saved video streams with drag & drop re-ordering, dynamic resizing & removal
40+
- :tada: Add a "Push to Video Wall" button to the Floating Video Pane which saves the stream to the wall & opens (or notifies) the Video Wall tab
41+
- :tada: Persist Video Wall placement in the `profile_videos` table via a new `position` column & `PATCH /api/profile/video/:id` endpoint
42+
- :tada: `POST /api/profile/video` now accepts a raw stream `url` - resolving it to an existing Video Lease or creating a user-owned proxy lease
43+
- :rocket: Extract a unified `VideoPlayer` component (hls.js) shared by the Floating Video Pane & the Video Wall
44+
- :white_check_mark: Add tests covering Profile Video creation from leases & URLs, placement updates & deletion
45+
46+
### v13.50.0 - 2026-07-17
47+
48+
- :bug: Delete Connection Features related to a layer if the layer is deleted - Closes: https://github.com/dfpc-coe/CloudTAK/issues/1594
49+
- :bug: Increase event worker memory to handle PDF imports reliably
50+
- :bug: Surface OOM errors in shell calls more reliably
51+
- :bug: Fix other instances of DELETE endpoints throwing 5xx errors due to database relations
52+
1953
### v13.49.0 - 2026-07-16
2054

2155
- :rocket: Switch to using Filter Logs endpoint which allows displaying logs across log streams

api/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ COPY ./ $HOME/api
2626
RUN WEB_PLUGINS="$WEB_PLUGINS" node bin/plugin.ts
2727

2828
RUN cd web \
29-
&& npm install --legacy-peer-deps \
29+
&& npm install \
3030
&& npm run lint \
3131
&& npm run check \
3232
&& npm run build \

api/common/schema.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { sql } from 'drizzle-orm';
22
import { primaryKey } from 'drizzle-orm/pg-core';
33
import { Static } from '@sinclair/typebox';
4+
import type { ProfileVideoPosition } from './types.js';
45
import type { StyleContainer } from './style.js';
56
import type { FilterContainer } from './filter.js';
67
import type { PaletteFeatureStyle } from '../stateless/lib/palette.js';
@@ -224,6 +225,8 @@ export const ProfileVideo = pgTable('profile_videos', {
224225
updated: timestamp({ withTimezone: true, mode: 'string' }).notNull().default(sql`Now()`),
225226
lease: integer().notNull().references(() => VideoLease.id),
226227
username: text().notNull().references(() => Profile.username),
228+
229+
position: jsonb().$type<Static<typeof ProfileVideoPosition>>().notNull().default({ x: 0, y: 0, w: 4, h: 6 }),
227230
}, (table) => {
228231
return {
229232
username_idx: index('profile_videos_username_idx').on(table.username),

api/common/types.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,8 +342,16 @@ export const ProfilePagingResponse = Type.Object({
342342
updated: Type.String(),
343343
});
344344

345+
export const ProfileVideoPosition = Type.Object({
346+
x: Type.Integer({ minimum: 0, description: 'Column position on a 12 column grid' }),
347+
y: Type.Integer({ minimum: 0, description: 'Row position in grid units' }),
348+
w: Type.Integer({ minimum: 1, maximum: 12, description: 'Width in grid columns' }),
349+
h: Type.Integer({ minimum: 1, description: 'Height in grid rows' }),
350+
});
351+
345352
export const ProfileVideoResponse = createSelectSchema(schemas.ProfileVideo, {
346353
lease: Type.Integer(),
354+
position: ProfileVideoPosition,
347355
});
348356

349357
export const FeatureResponse = Type.Composite([Feature.Feature, Type.Object({

0 commit comments

Comments
 (0)