67 Commits

Author SHA1 Message Date
renovate[bot] 3106ae57c1 Update dependency typescript to v7 2026-08-18 17:53:15 +00:00
Joel Wetzell 5d54ec8c5c Merge pull request #94 from jwetzell/renovate/vitest-monorepo
Update dependency vitest to v4.1.11
2026-08-18 12:52:17 -05:00
renovate[bot] 67b5001a14 Update dependency vitest to v4.1.11 2026-08-18 17:49:57 +00:00
Joel Wetzell bd162bd675 Merge pull request #91 from jwetzell/renovate/jsdom-30.x
Update dependency jsdom to v30
2026-08-18 12:49:14 -05:00
Joel Wetzell 2ff91356c6 Merge pull request #89 from jwetzell/renovate/js-yaml-5.x
Update dependency js-yaml to v5.3.0
2026-08-18 12:49:00 -05:00
Joel Wetzell 3df630a510 Merge pull request #90 from jwetzell/renovate/node-24.x
Update Node.js to v24.19.0
2026-08-18 12:48:40 -05:00
renovate[bot] b53c30c5e8 Update dependency jsdom to v30 2026-08-18 02:25:56 +00:00
renovate[bot] 0603e742c6 Update Node.js to v24.19.0 2026-08-17 22:56:02 +00:00
renovate[bot] 7330cdc956 Update dependency js-yaml to v5.3.0 2026-08-17 22:55:57 +00:00
Joel Wetzell afe37c9b58 Merge pull request #87 from jwetzell/renovate/angular-cli-monorepo
Update angular-cli monorepo to v22.1.4
2026-08-17 13:52:31 -05:00
Joel Wetzell 273f8c53d6 Merge pull request #88 from jwetzell/renovate/angularmaterial-monorepo
Update angularmaterial monorepo to v22.1.2
2026-08-17 13:52:21 -05:00
renovate[bot] 53c6f4341a Update angularmaterial monorepo to v22.1.2 2026-08-17 18:46:24 +00:00
renovate[bot] f2373ebcf1 Update angular-cli monorepo to v22.1.4 2026-08-17 18:46:15 +00:00
Joel Wetzell 02238d7d86 Merge pull request #85 from jwetzell/renovate/npm-11.x
Update npm to v11.19.0
2026-08-17 12:52:25 -05:00
Joel Wetzell 3a016f7b1c Merge pull request #84 from jwetzell/renovate/angular-monorepo
Update angular monorepo to v22.1.2
2026-08-17 12:52:03 -05:00
Joel Wetzell 840720420e sync package-lock file 2026-08-17 12:51:16 -05:00
renovate[bot] 75301bc9fa Update npm to v11.19.0 2026-08-17 17:48:01 +00:00
renovate[bot] a6ed43ca97 Update angular monorepo to v22.1.2 2026-08-17 17:47:15 +00:00
Joel Wetzell 2f757a1afc Merge pull request #83 from jwetzell/renovate/configure
Configure Renovate
2026-08-17 12:31:22 -05:00
renovate[bot] 4439a4e115 Add renovate.json 2026-08-17 17:30:21 +00:00
Joel Wetzell 2b28ef4f61 remove dependabot config 2026-08-17 12:28:47 -05:00
Joel Wetzell cf34c0ec1f bump playwright dependencies 2026-08-17 12:24:17 -05:00
Joel Wetzell e85446697b bump postcss 2026-08-11 21:11:26 -05:00
Joel Wetzell 283b28e8c1 bump version 2026-08-11 20:44:44 -05:00
Joel Wetzell cb4e011fea fix drag handle on route component 2026-08-11 20:31:18 -05:00
Joel Wetzell 08af66c378 bump dependencies 2026-08-11 19:52:26 -05:00
Joel Wetzell bb76c3b561 bump version 2026-08-11 19:47:27 -05:00
Joel Wetzell 8f9d2352c8 fix loop tracking for route and processors 2026-08-11 19:46:05 -05:00
Joel Wetzell 95b109de8f Merge pull request #68 from jwetzell/dependabot/npm_and_yarn/prettier-3.8.4
Bump prettier from 3.8.3 to 3.9.6
2026-08-06 09:08:38 -05:00
Joel Wetzell 53ec3b222a Bump prettier from 3.8.3 to 3.9.6
Bumps [prettier](https://github.com/prettier/prettier) from 3.8.3 to 3.9.6.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.8.3...3.9.6)

---
updated-dependencies:
- dependency-name: prettier
  dependency-version: 3.8.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-06 09:06:09 -05:00
Joel Wetzell a09824ca03 Merge pull request #67 from jwetzell/dependabot/npm_and_yarn/angular-79008909a5
Bump the angular group across 1 directory with 11 updates
2026-08-06 08:55:55 -05:00
Joel Wetzell f9695c19d6 Bump the angular group across 1 directory with 11 updates
Bumps the angular group with 11 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@angular/cdk](https://github.com/angular/components) | `22.0.0` | `22.1.0` |
| [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `22.0.0` | `22.1.0` |
| [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `22.0.0` | `22.1.0` |
| [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `22.0.0` | `22.1.0` |
| [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `22.0.0` | `22.1.0` |
| [@angular/material](https://github.com/angular/components) | `22.0.0` | `22.1.0` |
| [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `22.0.0` | `22.1.0` |
| [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `22.0.0` | `22.1.0` |
| [@angular/build](https://github.com/angular/angular-cli) | `22.0.0` | `22.1.2` |
| [@angular/cli](https://github.com/angular/angular-cli) | `22.0.0` | `22.1.2` |
| [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `22.0.0` | `22.1.0` |

Updates `@angular/cdk` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/components/releases)
- [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/components/compare/v22.0.0...v22.1.0)

Updates `@angular/common` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v22.1.0/packages/common)

Updates `@angular/compiler` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v22.1.0/packages/compiler)

Updates `@angular/core` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v22.1.0/packages/core)

Updates `@angular/forms` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v22.1.0/packages/forms)

Updates `@angular/material` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/components/releases)
- [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/components/compare/v22.0.0...v22.1.0)

Updates `@angular/platform-browser` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v22.1.0/packages/platform-browser)

Updates `@angular/router` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v22.1.0/packages/router)

Updates `@angular/build` from 22.0.0 to 22.1.2
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/v22.0.0...v22.1.2)

Updates `@angular/cli` from 22.0.0 to 22.1.2
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/v22.0.0...v22.1.2)

Updates `@angular/compiler-cli` from 22.0.0 to 22.1.0
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v22.1.0/packages/compiler-cli)

---
updated-dependencies:
- dependency-name: "@angular/build"
  dependency-version: 22.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/cdk"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/cli"
  dependency-version: 22.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/common"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/compiler"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/compiler-cli"
  dependency-version: 22.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/core"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/forms"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/material"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/platform-browser"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/router"
  dependency-version: 22.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-06 08:53:55 -05:00
Joel Wetzell 2396657fc8 Merge pull request #70 from jwetzell/dependabot/npm_and_yarn/vitest-4.1.8
Bump vitest from 4.1.7 to 4.1.8
2026-08-06 08:49:25 -05:00
Joel Wetzell 83469cc9f2 Bump vitest from 4.1.7 to 4.1.8
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.7 to 4.1.8.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.8/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-version: 4.1.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-06 08:48:22 -05:00
Joel Wetzell 18e1000da5 Merge pull request #69 from jwetzell/dependabot/npm_and_yarn/tailwindcss-4.3.1
Bump tailwindcss from 4.3.0 to 4.3.3
2026-08-06 08:45:31 -05:00
Joel Wetzell 17536deff1 Bump tailwindcss from 4.3.0 to 4.3.3
Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 4.3.0 to 4.3.3.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-version: 4.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-06 08:43:41 -05:00
Joel Wetzell 450c5d934d Merge pull request #63 from jwetzell/dependabot/npm_and_yarn/js-yaml-4.2.0
Bump js-yaml from 4.1.1 to 5.2.3
2026-08-06 08:39:14 -05:00
Joel Wetzell 088f278bb7 sync package-lock 2026-08-06 08:37:22 -05:00
dependabot[bot] 8db22220dd Bump js-yaml from 4.1.1 to 4.2.0
Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.1 to 4.2.0.
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/commits)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-06 08:36:28 -05:00
Joel Wetzell d72fc9726a sync package-lock.json 2026-08-06 08:33:06 -05:00
Joel Wetzell 0b86856a71 Merge pull request #72 from jwetzell/dependabot/github_actions/actions/setup-node-7.0.0
Bump actions/setup-node from 6.4.0 to 7.0.0
2026-08-06 08:14:07 -05:00
Joel Wetzell 2ed2418ae1 Merge pull request #73 from jwetzell/dependabot/github_actions/actions/checkout-7.0.1
Bump actions/checkout from 6.0.3 to 7.0.1
2026-08-06 08:13:52 -05:00
dependabot[bot] 2576e4902d Bump actions/checkout from 6.0.3 to 7.0.1
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/df4cb1c069e1874edd31b4311f1884172cec0e10...3d3c42e5aac5ba805825da76410c181273ba90b1)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-25 06:42:23 +00:00
dependabot[bot] fa2baa71f4 Bump actions/setup-node from 6.4.0 to 7.0.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 6.4.0 to 7.0.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e...820762786026740c76f36085b0efc47a31fe5020)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-18 06:42:30 +00:00
Joel Wetzell 3956290d3d sync package-lock 2026-06-07 21:18:15 -05:00
Joel Wetzell a00efa0c5c Merge pull request #62 from jwetzell/dependabot/github_actions/actions/checkout-6.0.3
Bump actions/checkout from 6.0.2 to 6.0.3
2026-06-07 21:14:36 -05:00
Joel Wetzell e309df8fe5 update angular material to v22 2026-06-07 21:11:47 -05:00
Joel Wetzell 6323dd1724 update angular to v22 2026-06-07 21:09:59 -05:00
Joel Wetzell 0aa3b23362 update node version 2026-06-07 21:05:31 -05:00
dependabot[bot] ac2ced53bf Bump actions/checkout from 6.0.2 to 6.0.3
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-06 06:42:16 +00:00
Joel Wetzell b9950c64e7 0.14.2 2026-06-01 19:28:54 -05:00
Joel Wetzell 31f42e696d rework config updates to fix drag and drop 2026-06-01 19:28:43 -05:00
Joel Wetzell 947fd14364 0.14.1 2026-06-01 18:56:44 -05:00
Joel Wetzell 0a738b5c01 Merge pull request #61 from jwetzell/dependabot/npm_and_yarn/angular-529e36d02c
Bump the angular group with 11 updates
2026-06-01 18:49:15 -05:00
dependabot[bot] 876f41f3c6 Bump the angular group with 11 updates
Bumps the angular group with 11 updates:

| Package | From | To |
| --- | --- | --- |
| [@angular/cdk](https://github.com/angular/components) | `21.2.12` | `21.2.13` |
| [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `21.2.14` | `21.2.15` |
| [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `21.2.14` | `21.2.15` |
| [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `21.2.14` | `21.2.15` |
| [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `21.2.14` | `21.2.15` |
| [@angular/material](https://github.com/angular/components) | `21.2.12` | `21.2.13` |
| [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `21.2.14` | `21.2.15` |
| [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `21.2.14` | `21.2.15` |
| [@angular/build](https://github.com/angular/angular-cli) | `21.2.12` | `21.2.13` |
| [@angular/cli](https://github.com/angular/angular-cli) | `21.2.12` | `21.2.13` |
| [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `21.2.14` | `21.2.15` |


Updates `@angular/cdk` from 21.2.12 to 21.2.13
- [Release notes](https://github.com/angular/components/releases)
- [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/components/compare/v21.2.12...v21.2.13)

Updates `@angular/common` from 21.2.14 to 21.2.15
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.15/packages/common)

Updates `@angular/compiler` from 21.2.14 to 21.2.15
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.15/packages/compiler)

Updates `@angular/core` from 21.2.14 to 21.2.15
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.15/packages/core)

Updates `@angular/forms` from 21.2.14 to 21.2.15
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.15/packages/forms)

Updates `@angular/material` from 21.2.12 to 21.2.13
- [Release notes](https://github.com/angular/components/releases)
- [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/components/compare/v21.2.12...v21.2.13)

Updates `@angular/platform-browser` from 21.2.14 to 21.2.15
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.15/packages/platform-browser)

Updates `@angular/router` from 21.2.14 to 21.2.15
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.15/packages/router)

Updates `@angular/build` from 21.2.12 to 21.2.13
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/v21.2.12...v21.2.13)

Updates `@angular/cli` from 21.2.12 to 21.2.13
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/v21.2.12...v21.2.13)

Updates `@angular/compiler-cli` from 21.2.14 to 21.2.15
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.15/packages/compiler-cli)

---
updated-dependencies:
- dependency-name: "@angular/cdk"
  dependency-version: 21.2.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/common"
  dependency-version: 21.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/compiler"
  dependency-version: 21.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/core"
  dependency-version: 21.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/forms"
  dependency-version: 21.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/material"
  dependency-version: 21.2.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/platform-browser"
  dependency-version: 21.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/router"
  dependency-version: 21.2.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/build"
  dependency-version: 21.2.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/cli"
  dependency-version: 21.2.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/compiler-cli"
  dependency-version: 21.2.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-30 06:43:50 +00:00
Joel Wetzell 903653e4b3 Merge pull request #58 from jwetzell/dependabot/npm_and_yarn/angular-ba26ebf674
Bump the angular group with 11 updates
2026-05-26 16:39:53 -05:00
Joel Wetzell 785c1b882c Merge pull request #59 from jwetzell/dependabot/npm_and_yarn/postcss-8.5.15
Bump postcss from 8.5.14 to 8.5.15
2026-05-26 16:38:39 -05:00
Joel Wetzell 4b1bd29487 Merge pull request #60 from jwetzell/dependabot/npm_and_yarn/vitest-4.1.7
Bump vitest from 4.1.6 to 4.1.7
2026-05-26 16:38:29 -05:00
dependabot[bot] 70d5578713 Bump vitest from 4.1.6 to 4.1.7
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.6 to 4.1.7.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.7/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-version: 4.1.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-23 06:44:30 +00:00
dependabot[bot] fca57b0302 Bump postcss from 8.5.14 to 8.5.15
Bumps [postcss](https://github.com/postcss/postcss) from 8.5.14 to 8.5.15.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.5.14...8.5.15)

---
updated-dependencies:
- dependency-name: postcss
  dependency-version: 8.5.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-23 06:44:15 +00:00
dependabot[bot] 69599e688c Bump the angular group with 11 updates
Bumps the angular group with 11 updates:

| Package | From | To |
| --- | --- | --- |
| [@angular/cdk](https://github.com/angular/components) | `21.2.11` | `21.2.12` |
| [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `21.2.13` | `21.2.14` |
| [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `21.2.13` | `21.2.14` |
| [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `21.2.13` | `21.2.14` |
| [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `21.2.13` | `21.2.14` |
| [@angular/material](https://github.com/angular/components) | `21.2.11` | `21.2.12` |
| [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `21.2.13` | `21.2.14` |
| [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `21.2.13` | `21.2.14` |
| [@angular/build](https://github.com/angular/angular-cli) | `21.2.11` | `21.2.12` |
| [@angular/cli](https://github.com/angular/angular-cli) | `21.2.11` | `21.2.12` |
| [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `21.2.13` | `21.2.14` |


Updates `@angular/cdk` from 21.2.11 to 21.2.12
- [Release notes](https://github.com/angular/components/releases)
- [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/components/compare/v21.2.11...v21.2.12)

Updates `@angular/common` from 21.2.13 to 21.2.14
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.14/packages/common)

Updates `@angular/compiler` from 21.2.13 to 21.2.14
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.14/packages/compiler)

Updates `@angular/core` from 21.2.13 to 21.2.14
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.14/packages/core)

Updates `@angular/forms` from 21.2.13 to 21.2.14
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.14/packages/forms)

Updates `@angular/material` from 21.2.11 to 21.2.12
- [Release notes](https://github.com/angular/components/releases)
- [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/components/compare/v21.2.11...v21.2.12)

Updates `@angular/platform-browser` from 21.2.13 to 21.2.14
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.14/packages/platform-browser)

Updates `@angular/router` from 21.2.13 to 21.2.14
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.14/packages/router)

Updates `@angular/build` from 21.2.11 to 21.2.12
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/v21.2.11...v21.2.12)

Updates `@angular/cli` from 21.2.11 to 21.2.12
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/v21.2.11...v21.2.12)

Updates `@angular/compiler-cli` from 21.2.13 to 21.2.14
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/v21.2.14/packages/compiler-cli)

---
updated-dependencies:
- dependency-name: "@angular/cdk"
  dependency-version: 21.2.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/common"
  dependency-version: 21.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/compiler"
  dependency-version: 21.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/core"
  dependency-version: 21.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/forms"
  dependency-version: 21.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/material"
  dependency-version: 21.2.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/platform-browser"
  dependency-version: 21.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/router"
  dependency-version: 21.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/build"
  dependency-version: 21.2.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/cli"
  dependency-version: 21.2.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/compiler-cli"
  dependency-version: 21.2.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-23 06:44:03 +00:00
Joel Wetzell 5e22cbfbdd work on e2e testability of things 2026-05-18 18:24:16 -05:00
Joel Wetzell 26631d3bc2 fix playwright test config 2026-05-18 18:23:47 -05:00
Joel Wetzell 0fc02a46d1 use cloneDeep when updating routes and modules 2026-05-17 22:34:33 -05:00
Joel Wetzell 55267ab4db 0.14.0 2026-05-17 22:12:41 -05:00
Joel Wetzell 0d09bd534a add drag and drop to rest of lists 2026-05-17 22:12:21 -05:00
Joel Wetzell a433b0e036 change job name 2026-05-17 21:01:23 -05:00
28 changed files with 2870 additions and 3378 deletions
-18
View File
@@ -1,18 +0,0 @@
version: 2
updates:
- package-ecosystem: 'npm'
directory: '/'
schedule:
interval: 'weekly'
groups:
angular:
applies-to: version-updates
patterns:
- '@angular*'
update-types:
- 'minor'
- 'patch'
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'weekly'
+2 -2
View File
@@ -9,10 +9,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: '.nvmrc'
cache: 'npm'
+3 -3
View File
@@ -4,14 +4,14 @@ on:
tags:
- 'v*'
jobs:
build-publish:
build-webui:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version-file: '.nvmrc'
cache: 'npm'
+1 -1
View File
@@ -1 +1 @@
v24.11.1
24.19.0
+15 -3
View File
@@ -1,8 +1,20 @@
import { test } from '@playwright/test';
import { expect, test } from '@playwright/test';
test('add module', async ({ page }) => {
await page.goto('/');
await page.locator('app-module-list').getByText('add').click();
await page.getByRole('button', { name: 'Add Module' }).click();
await page.getByRole('menuitem', { name: 'HTTP Server' }).click();
// TODO(jwetzell): test that the module gets added
const module = page.locator('#modules\\.0');
await expect(module).toBeVisible();
await expect(module).toContainText('HTTP Server');
});
test('remove module', async ({ page }) => {
await page.goto('/');
await page.getByRole('button', { name: 'Add Module' }).click();
await page.getByRole('menuitem', { name: 'HTTP Server' }).click();
const module = page.locator('#modules\\.0');
await expect(module).toBeVisible();
await module.getByRole('button', { name: 'Delete Module' }).click();
await expect(module).not.toBeVisible();
});
+19
View File
@@ -0,0 +1,19 @@
import { expect, test } from '@playwright/test';
test('add route', async ({ page }) => {
await page.goto('/');
await page.getByRole('button', { name: 'Add Route' }).click();
await page.getByRole('menuitem', { name: 'HTTP Server' }).click();
const route = page.locator('#routes\\.0');
await expect(route).toBeVisible();
await expect(route).toContainText('Route 0');
});
test('remove route', async ({ page }) => {
await page.goto('/');
await page.getByRole('button', { name: 'Add Route' }).click();
const route = page.locator('#routes\\.0');
await expect(route).toBeVisible();
await route.getByRole('button', { name: 'Delete Route' }).click();
await expect(route).not.toBeVisible();
});
+2269 -3227
View File
File diff suppressed because it is too large Load Diff
+24 -25
View File
@@ -1,6 +1,6 @@
{
"name": "@showbridge/webui",
"version": "0.13.1",
"version": "0.14.4",
"scripts": {
"ng": "ng",
"start": "ng serve",
@@ -26,37 +26,36 @@
"dist"
],
"license": "MIT",
"packageManager": "npm@11.6.2",
"packageManager": "npm@11.19.0",
"dependencies": {
"@angular/cdk": "21.2.11",
"@angular/common": "21.2.13",
"@angular/compiler": "21.2.13",
"@angular/core": "21.2.13",
"@angular/forms": "21.2.13",
"@angular/material": "21.2.11",
"@angular/platform-browser": "21.2.13",
"@angular/router": "21.2.13",
"@angular/cdk": "22.1.2",
"@angular/common": "22.1.2",
"@angular/compiler": "22.1.2",
"@angular/core": "22.1.2",
"@angular/forms": "22.1.2",
"@angular/material": "22.1.2",
"@angular/platform-browser": "22.1.2",
"@angular/router": "22.1.2",
"ajv": "8.20.0",
"js-yaml": "4.1.1",
"js-yaml": "5.3.0",
"lodash-es": "4.18.1",
"rxjs": "7.8.2",
"tslib": "2.8.1"
},
"devDependencies": {
"@angular/build": "21.2.11",
"@angular/cli": "21.2.11",
"@angular/compiler-cli": "21.2.13",
"@angular/material": "21.2.11",
"@playwright/test": "1.60.0",
"@tailwindcss/postcss": "4.3.0",
"@angular/build": "22.1.4",
"@angular/cli": "22.1.4",
"@angular/compiler-cli": "22.1.2",
"@playwright/test": "1.62.1",
"@tailwindcss/postcss": "4.3.3",
"@types/js-yaml": "4.0.9",
"@types/lodash-es": "4.17.12",
"jsdom": "29.1.1",
"playwright-ng-schematics": "^21.1.0",
"postcss": "8.5.14",
"prettier": "3.8.3",
"tailwindcss": "4.3.0",
"typescript": "5.9.3",
"vitest": "4.1.6"
"jsdom": "30.0.1",
"playwright-ng-schematics": "22.0.3",
"postcss": "8.5.26",
"prettier": "3.9.6",
"tailwindcss": "4.3.3",
"typescript": "7.0.2",
"vitest": "4.1.11"
}
}
}
+6 -1
View File
@@ -24,9 +24,13 @@ export default defineConfig({
webServer: [
{
name: 'showbridge',
command: 'showbridge --config config.yaml',
command: 'showbridge --config config.test.yaml',
url: 'http://localhost:8080/health',
timeout: 10000,
gracefulShutdown: {
signal: 'SIGTERM',
timeout: 5000,
},
},
],
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
@@ -36,6 +40,7 @@ export default defineConfig({
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
trace: 'on-first-retry',
video: 'retain-on-failure',
},
/* Configure projects for major browsers */
projects: [
+6
View File
@@ -0,0 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
]
}
+1 -1
View File
@@ -52,7 +52,7 @@
<div class="grow overflow-y-auto">
<app-module-list
[modules]="config()?.modules"
(modulesChange)="modulesUpdated($event)"
(updated)="modulesUpdated($event)"
></app-module-list>
<app-route-list
[routes]="config()?.routes"
+2 -1
View File
@@ -1,4 +1,4 @@
import { Component, computed, effect, inject } from '@angular/core';
import { Component, computed, effect, inject, ChangeDetectionStrategy } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
@@ -29,6 +29,7 @@ import { SettingsService } from './services/settings';
ConfigPreviewComponent,
],
templateUrl: './app.html',
changeDetection: ChangeDetectionStrategy.Eager,
styleUrl: './app.css',
})
export class App {
+2 -1
View File
@@ -1,5 +1,5 @@
import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';
import { Component, inject, Input, OnInit } from '@angular/core';
import { Component, inject, Input, OnInit, ChangeDetectionStrategy } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { MatIconModule } from '@angular/material/icon';
import { ParamInfo } from '../../models/form';
@@ -12,6 +12,7 @@ import { parseStringToArray } from '../../utils/params';
templateUrl: './array-form.html',
styleUrl: './array-form.css',
imports: [MatIconModule, FormsModule, CdkDrag, CdkDropList],
changeDetection: ChangeDetectionStrategy.Eager,
standalone: true,
})
export class ArrayFormComponent implements OnInit {
@@ -1,4 +1,4 @@
import { Component, computed, input } from '@angular/core';
import { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatTooltipModule } from '@angular/material/tooltip';
@@ -9,6 +9,7 @@ import { Config } from '../../models/config';
selector: 'app-config-preview',
imports: [MatIconModule, MatButtonModule, MatTooltipModule],
templateUrl: './config-preview.html',
changeDetection: ChangeDetectionStrategy.Eager,
styleUrl: './config-preview.css',
})
export class ConfigPreviewComponent {
@@ -5,6 +5,8 @@
matTooltip="Add Module"
class="flex items-center justify-center w-10 h-10 bg-transparent hover:bg-gray-700 hover:cursor-pointer text-blue-400"
[matMenuTriggerFor]="addModuleMenu"
role="button"
aria-label="Add Module"
>
<mat-icon>add</mat-icon>
</div>
@@ -18,14 +20,21 @@
}
<div class="text-white">Modules</div>
</div>
<div class="grow overflow-x-hidden overflow-y-auto gap-1.5">
<div
class="grow overflow-x-hidden overflow-y-auto gap-1.5"
cdkDropList
(cdkDropListDropped)="drop($event)"
[cdkDropListData]="modules()"
>
@for (module of modules(); track module.id; let i = $index) {
<div class="m-2">
<div class="m-2" cdkDrag>
<app-module
[id]="listService.pathToId(`modules/${i}`)"
[path]="`modules/${i}`"
(moduleChange)="moduleUpdated(i, $event)"
[module]="module"
(updated)="moduleUpdated(i, $event)"
(delete)="deleteModule(i)"
[inDragList]="true"
></app-module>
</div>
}
+50 -31
View File
@@ -1,22 +1,36 @@
import { Component, inject, model } from '@angular/core';
import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';
import { Component, inject, input, output, ChangeDetectionStrategy } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatTooltipModule } from '@angular/material/tooltip';
import { cloneDeep } from 'lodash-es';
import { ModuleConfig } from '../../models/config';
import { ListsService } from '../../services/lists';
import { SchemaService } from '../../services/schema';
import { ModuleComponent } from '../module/module';
@Component({
selector: 'app-module-list',
imports: [MatMenuModule, MatIconModule, MatButtonModule, MatTooltipModule, ModuleComponent],
imports: [
MatMenuModule,
MatIconModule,
MatButtonModule,
MatTooltipModule,
ModuleComponent,
CdkDrag,
CdkDropList,
],
templateUrl: './module-list.html',
changeDetection: ChangeDetectionStrategy.Eager,
styleUrl: './module-list.css',
})
export class ModuleListComponent {
modules = model<ModuleConfig[]>();
modules = input<ModuleConfig[]>();
updated = output<ModuleConfig[]>();
public schemaService = inject(SchemaService);
public listService = inject(ListsService);
private snackBar = inject(MatSnackBar);
@@ -25,46 +39,51 @@ export class ModuleListComponent {
console.error('module is undefined, not updating');
return;
}
this.modules.update((modules) => {
if (modules) {
modules[index].id = module.id;
modules[index].type = module.type;
if (module.params !== undefined) {
modules[index].params = module.params;
}
return [...modules];
}
return modules;
});
const currentModules = this.modules();
if (currentModules === undefined) {
console.error('modules is undefined, cannot update');
return;
}
currentModules[index] = cloneDeep(module);
this.updated.emit(cloneDeep(currentModules));
}
addModule(moduleType: string) {
const moduleTemplate = this.schemaService.getSkeletonForModule(moduleType);
this.modules.update((modules) => {
if (modules) {
if (!modules) {
modules = [];
}
modules?.push(moduleTemplate);
return [...modules];
}
return modules;
});
const currentModules = this.modules() || [];
if (currentModules === undefined) {
console.error('modules is undefined, cannot update');
return;
}
currentModules.push(moduleTemplate);
this.updated.emit(cloneDeep(currentModules));
this.snackBar.open('Module Added', 'Dismiss', {
duration: 3000,
});
}
deleteModule(index: number) {
this.modules.update((modules) => {
if (modules) {
modules?.splice(index, 1);
return [...modules];
}
return [];
});
const currentModules = this.modules();
if (currentModules === undefined) {
console.error('modules is undefined, cannot delete');
return;
}
currentModules.splice(index, 1);
this.updated.emit(cloneDeep(currentModules));
this.snackBar.open('Module Removed', 'Dismiss', {
duration: 3000,
});
}
drop(event: CdkDragDrop<ModuleConfig[] | undefined>) {
if (event.previousContainer === event.container) {
const currentModules = this.modules();
if (currentModules === undefined) {
console.error('modules is undefined, not updating');
return;
}
moveItemInArray(currentModules, event.previousIndex, event.currentIndex);
this.updated.emit(cloneDeep(currentModules));
}
}
}
+125
View File
@@ -5,6 +5,14 @@
}} border-solid w-full h-full"
>
<div class="flex items-center justify-center">
@if (inDragList()) {
<div
cdkDragHandle
class="flex items-center justify-center bg-transparent hover:bg-gray-700 hover:cursor-move text-blue-400"
>
<mat-icon>drag_indicator</mat-icon>
</div>
}
<div class="flex items-center">
<mat-icon [style.color]="inputIndicatorColor()" matTooltip="Input Indicator"
>keyboard_arrow_down</mat-icon
@@ -20,6 +28,8 @@
<div
class="flex items-center justify-center hover:bg-gray-700 hover:cursor-pointer"
(click)="delete.emit()"
role="button"
aria-label="Delete Module"
>
<mat-icon class="text-red-500!">close</mat-icon>
</div>
@@ -66,4 +76,119 @@
}
</div>
</div>
<div *cdkDragPreview class="flex items-start m-2 w-fit">
<div
class="flex flex-col bg-gray-800 border-2 {{
isInError() ? 'border-red-500' : 'border-gray-600'
}} border-solid w-full h-full"
>
<div class="flex items-center justify-center">
@if (inDragList()) {
<div
cdkDragHandle
class="flex items-center justify-center bg-transparent hover:bg-gray-700 hover:cursor-move text-blue-400"
>
<mat-icon>drag_indicator</mat-icon>
</div>
}
<div class="flex items-center">
<mat-icon [style.color]="inputIndicatorColor()" matTooltip="Input Indicator"
>keyboard_arrow_down</mat-icon
>
<mat-icon [style.color]="outputIndicatorColor()" matTooltip="Output Indicator"
>keyboard_arrow_up</mat-icon
>
</div>
<div class="text-white">
{{ schema().title || module()?.type }}
</div>
<div class="grow"></div>
<div
class="flex items-center justify-center hover:bg-gray-700 hover:cursor-pointer"
(click)="delete.emit()"
>
<mat-icon class="text-red-500!">close</mat-icon>
</div>
</div>
</div>
</div>
<div *cdkDragPlaceholder class="flex items-start m-2 w-fit">
<div
class="flex flex-col bg-gray-800 border-2 {{
isInError() ? 'border-red-500' : 'border-gray-600'
}} border-solid w-full h-full opacity-30"
>
<div class="flex items-center justify-center">
@if (inDragList()) {
<div
cdkDragHandle
class="flex items-center justify-center bg-transparent hover:bg-gray-700 hover:cursor-move text-blue-400"
>
<mat-icon>drag_indicator</mat-icon>
</div>
}
<div class="flex items-center">
<mat-icon [style.color]="inputIndicatorColor()" matTooltip="Input Indicator"
>keyboard_arrow_down</mat-icon
>
<mat-icon [style.color]="outputIndicatorColor()" matTooltip="Output Indicator"
>keyboard_arrow_up</mat-icon
>
</div>
<div class="text-white">
{{ schema().title || module()?.type }}
</div>
<div class="grow"></div>
<div
class="flex items-center justify-center hover:bg-gray-700 hover:cursor-pointer"
(click)="delete.emit()"
>
<mat-icon class="text-red-500!">close</mat-icon>
</div>
</div>
<hr class="bg-gray-600 h-0.5 border-0" />
<div>
<form [formGroup]="formGroup" class="h-full">
<div class="m-2">
<div class="flex items-center m-1">
<label class="mr-2 text-white"> ID: </label>
<input
type="text"
class="pl-1 border-2 border-gray-200 text-white border-solid rounded-sm"
[placeholder]="'module-1'"
[formControlName]="'id'"
/>
<mat-icon class="text-white!" matTooltip="String">abc</mat-icon>
@if (!formGroup.controls['id'].valid) {
<!-- TODO(jwetzell): better error displaying -->
<div class="ml-2 text-red-500">{{ formGroup.controls['id'].errors | json }}</div>
}
</div>
<app-params-form
[paramsSchema]="schema()?.properties?.params"
[data]="params()"
(updated)="paramsUpdated($event)"
></app-params-form>
</div>
</form>
</div>
<div>
@if (moduleConfigErrors().length > 0) {
<div class="m-2 p-2 border-2 border-red-500">
<div class="flex items-center mb-2 text-red-500">
<mat-icon>error</mat-icon>
<span class="ml-1">Module Errors</span>
</div>
@for (error of moduleConfigErrors(); track $index) {
<div class="ml-4 mb-1 text-white">
{{ error.error }}
</div>
}
</div>
}
</div>
</div>
</div>
}
+29 -24
View File
@@ -1,10 +1,20 @@
import { CdkDragHandle, CdkDragPlaceholder, CdkDragPreview } from '@angular/cdk/drag-drop';
import { JsonPipe } from '@angular/common';
import { Component, computed, inject, input, model, output, signal } from '@angular/core';
import {
Component,
computed,
inject,
input,
output,
signal,
ChangeDetectionStrategy,
} from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatTooltipModule } from '@angular/material/tooltip';
import { cloneDeep } from 'lodash-es';
import { debounceTime, tap } from 'rxjs';
import { ModuleConfig } from '../../models/config';
import { ConfigService } from '../../services/config';
@@ -22,8 +32,12 @@ import { ParamsFormComponent } from '../params-form/params-form';
MatMenuModule,
MatTooltipModule,
JsonPipe,
CdkDragHandle,
CdkDragPreview,
CdkDragPlaceholder,
],
templateUrl: './module.html',
changeDetection: ChangeDetectionStrategy.Eager,
styleUrl: './module.css',
})
export class ModuleComponent {
@@ -38,8 +52,10 @@ export class ModuleComponent {
return undefined;
});
module = model<ModuleConfig>();
inDragList = input<boolean>(false);
module = input<ModuleConfig>();
delete = output<void>();
updated = output<ModuleConfig>();
params = computed(() => this.module()!.params);
id = computed(() => this.module()!.id);
@@ -77,18 +93,12 @@ export class ModuleComponent {
});
this.formGroup.valueChanges.subscribe((value) => {
this.module.update((module) => {
if (module) {
module.id = value.id;
module.type = value.type;
return {
...module,
id: module.id,
type: module.type,
};
}
return undefined;
});
const currentModule = this.module();
if (currentModule) {
currentModule.id = value.id;
currentModule.type = value.type;
this.updated.emit(cloneDeep(currentModule));
}
});
if (this.id() !== undefined) {
this.eventsService
@@ -117,16 +127,11 @@ export class ModuleComponent {
}
paramsUpdated(params: any) {
this.module.update((module) => {
if (module !== undefined && module.params !== undefined) {
module.params = params;
return {
...module,
params: module.params,
};
}
return undefined;
});
const currentModule = this.module();
if (currentModule && currentModule.params !== undefined) {
currentModule.params = params;
this.updated.emit(cloneDeep(currentModule));
}
}
deleteMe() {
@@ -1,5 +1,12 @@
import { JsonPipe } from '@angular/common';
import { Component, effect, input, OnDestroy, output } from '@angular/core';
import {
Component,
effect,
input,
OnDestroy,
output,
ChangeDetectionStrategy,
} from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
@@ -26,6 +33,7 @@ import { ArrayFormComponent } from '../array-form/array-form';
ArrayFormComponent,
MatTabsModule,
],
changeDetection: ChangeDetectionStrategy.Eager,
standalone: true,
})
export class ParamsFormComponent implements OnDestroy {
+26 -2
View File
@@ -63,13 +63,37 @@
<div
class="flex flex-col bg-gray-800 border-2 {{
isInError() ? 'border-red-500' : 'border-gray-600'
}} border-dotted w-fit h-full"
}} border-solid w-fit h-full opacity-30"
>
<div class="flex items-center justify-center">
<div class="grow ml-1 mr-3 text-transparent">
@if (inDragList()) {
<div
cdkDragHandle
class="flex items-center justify-center bg-transparent hover:bg-gray-700 hover:cursor-move text-blue-400"
>
<mat-icon>drag_indicator</mat-icon>
</div>
}
<div class="grow ml-1 mr-3 text-white">
{{ schema()?.title || processor()?.type }}
</div>
<div
class="flex items-center justify-center hover:bg-gray-700 hover:cursor-pointer"
(click)="delete.emit()"
>
<mat-icon class="text-red-500!">close</mat-icon>
</div>
</div>
@if (hasParams()) {
<hr class="bg-gray-600 h-0.5 border-0" />
<div>
<app-params-form
[paramsSchema]="schema()?.properties?.params"
[data]="params()"
(updated)="paramsUpdated($event)"
></app-params-form>
</div>
}
</div>
</div>
}
+2 -1
View File
@@ -1,5 +1,5 @@
import { CdkDragHandle, CdkDragPlaceholder, CdkDragPreview } from '@angular/cdk/drag-drop';
import { Component, computed, inject, input, output } from '@angular/core';
import { Component, computed, inject, input, output, ChangeDetectionStrategy } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { MatIconModule } from '@angular/material/icon';
import { ProcessorConfig } from '../../models/config';
@@ -17,6 +17,7 @@ import { ParamsFormComponent } from '../params-form/params-form';
CdkDragPlaceholder,
],
templateUrl: './processor.html',
changeDetection: ChangeDetectionStrategy.Eager,
styleUrl: './processor.css',
})
export class ProcessorComponent {
+12 -3
View File
@@ -4,21 +4,30 @@
matTooltip="Add Route"
class="flex items-center justify-center w-10 h-10 bg-transparent hover:bg-gray-700 hover:cursor-pointer text-blue-400"
(click)="addRoute()"
role="button"
aria-label="Add Route"
>
<mat-icon>add</mat-icon>
</div>
<div class="text-white">Routes</div>
</div>
<div class="grow overflow-x-hidden overflow-y-auto gap-1.5">
@for (route of routes(); track $index; let i = $index) {
<div class="m-2">
<div
class="grow overflow-x-hidden overflow-y-auto gap-1.5"
cdkDropList
(cdkDropListDropped)="drop($event)"
[cdkDropListData]="routes()"
>
@for (route of routes(); track $index + (route.input || ''); let i = $index) {
<div class="m-2" cdkDrag>
<app-route
[id]="listService.pathToId(`routes/${i}`)"
[path]="`routes/${i}`"
(updated)="routeUpdated(i, $event)"
[route]="route"
[moduleIds]="moduleIds() || []"
(delete)="deleteRoute(i)"
(moveProcessor)="moveProcessorBetweenRoutes($event)"
[inDragList]="true"
></app-route>
</div>
}
+34 -3
View File
@@ -1,5 +1,12 @@
import { transferArrayItem } from '@angular/cdk/drag-drop';
import { Component, inject, input, output } from '@angular/core';
import { A11yModule } from '@angular/cdk/a11y';
import {
CdkDrag,
CdkDragDrop,
CdkDropList,
moveItemInArray,
transferArrayItem,
} from '@angular/cdk/drag-drop';
import { Component, inject, input, output, ChangeDetectionStrategy } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
@@ -7,13 +14,24 @@ import { MatSnackBar } from '@angular/material/snack-bar';
import { MatTooltipModule } from '@angular/material/tooltip';
import { cloneDeep } from 'lodash-es';
import { RouteConfig } from '../../models/config';
import { ListsService } from '../../services/lists';
import { SchemaService } from '../../services/schema';
import { RouteComponent } from '../route/route';
@Component({
selector: 'app-route-list',
imports: [RouteComponent, MatMenuModule, MatIconModule, MatButtonModule, MatTooltipModule],
imports: [
RouteComponent,
MatMenuModule,
MatIconModule,
MatButtonModule,
MatTooltipModule,
CdkDrag,
CdkDropList,
A11yModule,
],
templateUrl: './route-list.html',
changeDetection: ChangeDetectionStrategy.Eager,
styleUrl: './route-list.css',
})
export class RouteListComponent {
@@ -21,6 +39,7 @@ export class RouteListComponent {
moduleIds = input<string[]>();
updated = output<RouteConfig[]>();
public schemaService = inject(SchemaService);
public listService = inject(ListsService);
private snackBar = inject(MatSnackBar);
@@ -103,4 +122,16 @@ export class RouteListComponent {
this.updated.emit(cloneDeep(routes));
}
drop(event: CdkDragDrop<RouteConfig[] | undefined>) {
if (event.previousContainer === event.container) {
const currentRoutes = this.routes();
if (currentRoutes === undefined) {
console.error('routes is undefined, not updating');
return;
}
moveItemInArray(currentRoutes, event.previousIndex, event.currentIndex);
this.updated.emit(cloneDeep(currentRoutes));
}
}
}
+156 -2
View File
@@ -6,6 +6,14 @@
}} border-solid w-full"
>
<div class="flex items-center justify-end">
@if (inDragList()) {
<div
cdkDragHandle
class="flex items-center justify-center bg-transparent hover:bg-gray-700 hover:cursor-move text-blue-400"
>
<mat-icon>drag_indicator</mat-icon>
</div>
}
<div class="flex items-center">
<mat-icon [style.color]="indicatorColor()" matTooltip="Route Indicator"
>chevron_right</mat-icon
@@ -15,6 +23,8 @@
<div
class="flex items-center justify-center hover:bg-gray-700 hover:cursor-pointer"
(click)="delete.emit()"
role="button"
aria-label="Delete Route"
>
<mat-icon class="text-red-500!">close</mat-icon>
</div>
@@ -66,12 +76,12 @@
<div
class="border-2 border-gray-500 m-2"
cdkDropList
[id]="listsService.registerProcessorList(path() + '/processors')"
[id]="processorListId()"
[cdkDropListConnectedTo]="listsService.processorListIds"
(cdkDropListDropped)="drop($event)"
[cdkDropListData]="route()?.processors"
>
@for (processor of processors(); track $index; let i = $index) {
@for (processor of processors(); track $index + processor.type; let i = $index) {
<div cdkDrag>
<app-processor
[path]="path() + '/processors/' + i"
@@ -115,4 +125,148 @@
</div>
}
</ng-template>
<div *cdkDragPreview class="flex items-start m-2 w-fit">
<div
class="flex flex-col bg-gray-800 border-2 {{
isInError() ? 'border-red-500' : 'border-gray-600'
}} border-solid w-full"
>
<div class="flex items-center justify-end">
@if (inDragList()) {
<div
cdkDragHandle
class="flex items-center justify-center bg-transparent hover:bg-gray-700 hover:cursor-move text-blue-400"
>
<mat-icon>drag_indicator</mat-icon>
</div>
}
<div class="flex items-center">
<mat-icon [style.color]="indicatorColor()" matTooltip="Route Indicator"
>chevron_right</mat-icon
>
</div>
<div class="grow text-left ml-2 text-white">Route</div>
<div
class="flex items-center justify-center hover:bg-gray-700 hover:cursor-pointer"
(click)="delete.emit()"
>
<mat-icon class="text-red-500!">close</mat-icon>
</div>
</div>
</div>
</div>
<div *cdkDragPlaceholder class="flex items-start m-2 w-fit">
<div
class="flex flex-col bg-gray-800 border-2 {{
isInError() ? 'border-red-500' : 'border-gray-600'
}} border-solid w-full opacity-30"
>
<div class="flex items-center justify-end">
@if (inDragList()) {
<div
cdkDragHandle
class="flex items-center justify-center bg-transparent hover:bg-gray-700 hover:cursor-move text-blue-400"
>
<mat-icon>drag_indicator</mat-icon>
</div>
}
<div class="flex items-center">
<mat-icon [style.color]="indicatorColor()" matTooltip="Route Indicator"
>chevron_right</mat-icon
>
</div>
<div class="grow text-left ml-2 text-white">Route</div>
<div
class="flex items-center justify-center hover:bg-gray-700 hover:cursor-pointer"
(click)="delete.emit()"
>
<mat-icon class="text-red-500!">close</mat-icon>
</div>
</div>
<hr class="bg-gray-600 h-0.5 border-0" />
<div>
<form [formGroup]="formGroup">
<div class="m-2">
<div class="flex items-center m-1">
<label class="mr-2 text-white"> Input: </label>
<select
class="pl-1 border-2 border-gray-200 text-white border-solid rounded-sm w-full"
formControlName="input"
>
@for (option of moduleIds(); track option) {
<option [value]="option">
{{ option }}
</option>
}
</select>
@if (!formGroup.controls['input'].valid) {
<!-- TODO(jwetzell): better error displaying -->
<div class="ml-2 text-red-500">{{ formGroup.controls['input'].errors | json }}</div>
}
</div>
</div>
</form>
<div>
<div class="flex items-center">
@if (schemaService.processorTypes.length > 0) {
<div
matTooltip="Add Processor"
class="flex items-center justify-center w-10 h-10 bg-transparent hover:bg-gray-700 hover:cursor-pointer text-blue-400"
[matMenuTriggerFor]="addProcessorMenu"
>
<mat-icon>add</mat-icon>
</div>
<mat-menu #addProcessorMenu="matMenu">
@for (processorType of schemaService.processorTypes; track processorType) {
<button mat-menu-item (click)="addProcessor(processorType.type)">
<span>{{ processorType.name }}</span>
</button>
}
</mat-menu>
}
<div class="text-md text-white text-center">Processors</div>
</div>
@if (processors() !== undefined && processors()!.length > 0) {
<div
class="border-2 border-gray-500 m-2"
cdkDropList
[id]="processorListId()"
[cdkDropListConnectedTo]="listsService.processorListIds"
(cdkDropListDropped)="drop($event)"
[cdkDropListData]="route()?.processors"
>
@for (processor of processors(); track $index + processor.type; let i = $index) {
<div cdkDrag>
<app-processor
[path]="path() + '/processors/' + i"
(updated)="processorUpdated(i, $event)"
[processor]="processor"
(delete)="deleteProcessor(i)"
[inDragList]="true"
></app-processor>
</div>
}
</div>
}
</div>
</div>
<div>
@if (routeConfigErrors().length > 0) {
<div class="m-2 p-2 border-2 border-red-500">
<div class="flex items-center mb-2 text-red-500">
<mat-icon>error</mat-icon>
<span class="ml-1">Route Errors</span>
</div>
@for (error of routeConfigErrors(); track error.index) {
<div class="ml-4 mb-1 text-white">
{{ error.error }}
</div>
}
</div>
}
</div>
</div>
</div>
}
+30 -2
View File
@@ -1,6 +1,22 @@
import { CdkDrag, CdkDragDrop, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';
import {
CdkDrag,
CdkDragDrop,
CdkDragHandle,
CdkDragPlaceholder,
CdkDragPreview,
CdkDropList,
moveItemInArray,
} from '@angular/cdk/drag-drop';
import { JsonPipe } from '@angular/common';
import { Component, computed, inject, input, output, signal } from '@angular/core';
import {
Component,
computed,
inject,
input,
output,
signal,
ChangeDetectionStrategy,
} from '@angular/core';
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
@@ -27,9 +43,13 @@ import { ProcessorComponent } from '../processor/processor';
ProcessorComponent,
MatTooltipModule,
CdkDrag,
CdkDragHandle,
CdkDropList,
CdkDragPreview,
CdkDragPlaceholder,
],
templateUrl: './route.html',
changeDetection: ChangeDetectionStrategy.Eager,
styleUrl: './route.css',
})
export class RouteComponent {
@@ -45,6 +65,7 @@ export class RouteComponent {
return undefined;
});
inDragList = input<boolean>(false);
route = input<RouteConfig>();
moduleIds = input<string[]>([]);
delete = output<void>();
@@ -83,8 +104,14 @@ export class RouteComponent {
private configService = inject(ConfigService);
public listsService = inject(ListsService);
public processorListId = signal<string>('');
indicatorColor = signal<string>('gray');
ngOnDestroy(): void {
this.listsService.removeProcessorList(this.path() + '/processors');
}
ngOnInit(): void {
this.formGroup.patchValue({
input: this.route()?.input,
@@ -115,6 +142,7 @@ export class RouteComponent {
this.indicatorColor.set('gray');
});
}
this.processorListId.set(this.listsService.registerProcessorList(this.path() + '/processors'));
}
isInError(): boolean {
+15 -21
View File
@@ -17,17 +17,18 @@ import { SettingsService } from './settings';
})
export class ConfigService {
pendingConfigIsValid = computed(() => {
const config = this.currentlyShownConfig();
const config = this._currentlyShownConfig();
if (config === undefined) {
return false;
}
return this.schemaService.validate(this.schemaService.configSchemaId, config);
});
currentlyShownConfig = signal<Config | undefined>(undefined);
runningConfig = signal<Config | undefined>(undefined);
private runningConfig = signal<Config | undefined>(undefined);
private _currentlyShownConfig = signal<Config | undefined>(undefined);
readonly currentlyShownConfig = this._currentlyShownConfig.asReadonly();
configIsDirty = computed(() => {
const currentlyShown = this.currentlyShownConfig();
const currentlyShown = this._currentlyShownConfig();
const running = this.runningConfig();
if (currentlyShown === undefined || running === undefined) {
return false;
@@ -44,7 +45,7 @@ export class ConfigService {
constructor(private schemaService: SchemaService) {
effect(() => {
console.log('config state changed', this.currentlyShownConfig());
console.log('config state changed', this._currentlyShownConfig());
});
effect(() => {
@@ -124,36 +125,29 @@ export class ConfigService {
}
updateCurrentlyShownConfig(config: Config) {
if (isEqual(config, this.currentlyShownConfig())) {
// NOTE(jwetzell): no update
return;
}
this.currentlyShownConfig.set(cloneDeep(config));
this._currentlyShownConfig.set(cloneDeep(config));
}
updateModules(modules: ModuleConfig[]) {
const currentConfig = this.currentlyShownConfig();
if (!currentConfig) {
var newConfig = cloneDeep(this._currentlyShownConfig());
if (!newConfig) {
console.error('No currently shown config to update modules on');
return;
}
newConfig.modules = cloneDeep(modules);
this.currentlyShownConfig.set({
...currentConfig,
modules: modules,
});
this.updateCurrentlyShownConfig(newConfig);
}
updateRoutes(routes: RouteConfig[]) {
const currentConfig = this.currentlyShownConfig();
const currentConfig = this._currentlyShownConfig();
if (!currentConfig) {
console.error('No currently shown config to update routes on');
return;
}
this.currentlyShownConfig.set({
...currentConfig,
routes: routes,
});
currentConfig.routes = cloneDeep(routes);
this.updateCurrentlyShownConfig(currentConfig);
}
}
+9
View File
@@ -18,6 +18,15 @@ export class ListsService {
return id;
}
removeProcessorList(path: string | undefined) {
if (path === undefined) {
return;
}
const id = this.pathToId(path);
this.processorListIds = this.processorListIds.filter((listId) => listId !== id);
}
pathToId(path: string) {
return path.replaceAll('/', '.');
}
+9 -1
View File
@@ -7,5 +7,13 @@
"types": []
},
"include": ["src/**/*.ts"],
"exclude": ["src/**/*.spec.ts"]
"exclude": ["src/**/*.spec.ts"],
"angularCompilerOptions": {
"extendedDiagnostics": {
"checks": {
"nullishCoalescingNotNullable": "suppress",
"optionalChainNotNullable": "suppress"
}
}
}
}