a7d5efc764
The self-service API-token UI was inconsistent across all 3 apps (sso-manager-node/proxy used a card grid with Edit/Rotate/Revoke and a description field; jump-host used a bare table with no Edit action, no description field anywhere in the UI, and icon-only buttons -- even though its model and PUT route already fully supported both). jump-host is first since it needed the least backend work (none -- description and the PUT handler already existed, just unexposed) and the most view work, proving the pattern before porting it to proxy/sso-manager-node. - Card grid (jq-repeat="apiTokenCard") replacing the table, matching sso-manager-node's exact template: name + truncated token-id, optional description, a <dl> of Token ID/Created/Last used/Expires, and labeled Edit/Rotate/Revoke buttons. - New Edit modal (app.modal, footer shows "Created by X on Y" via the token's existing created_by/created_on) -- net-new UI on top of the already-existing PUT /:id route. - Create modal gained a Description field and now uses app.modal.footerButtons() for its Cancel/Create pair. - Standardized status badges on Bootstrap 5's text-bg-* classes. - Bumped @simpleworkjs/frontend to ^0.2.6 (footer/footerButtons support; this app was still on ^0.2.5) and added the missing app.apiToken.update() client wrapper (list/add/remove/rotate already existed). Found and fixed a real bug along the way: the planned "flash a checkmark on copy" touch (porting sso-manager-node's copyField pattern) silently does nothing once FontAwesome replaces <i> icons with inline <svg> -- there's no <i> left to swap classes on. Renamed the existing copySshCommand() (already used by the Quick Jump feature, toast-based, unaffected by that FA behavior) to copyFieldValue() and reused it for the token-reveal copy button instead of introducing a second, broken copy mechanism. Verified live: card grid renders with truncated token ID; Edit modal shows real created-by/on data, saves a description change, and the card refreshes; Create modal's new description field round-trips; secret-reveal copy button fires the toast correctly for a real (non-programmatic) click.
55 lines
1.6 KiB
JSON
55 lines
1.6 KiB
JSON
{
|
|
"name": "t42-jump-host",
|
|
"version": "1.9.0",
|
|
"description": "SSH jump host for the theta42 stack — LDAP-authenticated, directory-driven host bridging with audit and metrics",
|
|
"author": [
|
|
{
|
|
"name": "William Mantly",
|
|
"email": "wmantly@gmail.com"
|
|
}
|
|
],
|
|
"engines": {
|
|
"node": ">=20.14"
|
|
},
|
|
"scripts": {
|
|
"start": "node ./bin/www",
|
|
"dev": "npx nodemon --ignore public/ ./bin/www",
|
|
"test": "NODE_ENV=test node --test --test-force-exit test/unit/*.test.js test/integration/*.test.js",
|
|
"test:unit": "NODE_ENV=test node --test --test-force-exit test/unit/*.test.js",
|
|
"test:integration": "NODE_ENV=test node --test --test-force-exit test/integration/*.test.js"
|
|
},
|
|
"dependencies": {
|
|
"@fortawesome/fontawesome-free": "^7.3.0",
|
|
"@simpleworkjs/app-stack": "^1.0.0",
|
|
"@simpleworkjs/conf": "^1.2.0",
|
|
"@simpleworkjs/directory-schema": "^1.0.0",
|
|
"@simpleworkjs/frontend": "^0.2.6",
|
|
"@simpleworkjs/ldap": "^1.0.1",
|
|
"@simpleworkjs/oidc-client": "^1.0.0",
|
|
"@simpleworkjs/orm": "^0.2.8",
|
|
"bcrypt": "^6.0.0",
|
|
"bootstrap": "^5.3.8",
|
|
"compression": "^1.8.1",
|
|
"ejs": "^3.1.10",
|
|
"express": "^5.2.1",
|
|
"express-rate-limit": "^8.5.2",
|
|
"jq-repeat": "^2.2.0",
|
|
"jquery": "^4.0.0",
|
|
"ldapts": "^8.1.8",
|
|
"model-redis": "^1.6.0",
|
|
"moment": "^2.30.1",
|
|
"mustache": "^4.2.0",
|
|
"redis": "^6.1.0",
|
|
"socket.io": "^4.8.3",
|
|
"ssh2": "^1.16.0"
|
|
},
|
|
"devDependencies": {
|
|
"nodemon": "^3.1.11"
|
|
},
|
|
"license": "MIT",
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/theta42/jump-host.git"
|
|
}
|
|
}
|