@shepai/cli 1.162.0 → 1.163.0-pr505.35c41df
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apis/json-schema/FabLayoutConfig.yaml +11 -0
- package/apis/json-schema/Settings.yaml +3 -0
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +20 -0
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.d.ts +13 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.js +35 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +13 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +6 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.d.ts +15 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.js +20 -0
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +20 -0
- package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/repo/add.command.js +3 -1
- package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts +5 -2
- package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -1
- package/dist/src/presentation/tui/wizards/github-import.wizard.js +38 -6
- package/dist/src/presentation/web/app/actions/list-github-organizations.d.ts +6 -0
- package/dist/src/presentation/web/app/actions/list-github-organizations.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/list-github-organizations.js +17 -0
- package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts +1 -0
- package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts.map +1 -1
- package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts +6 -0
- package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts.map +1 -0
- package/dist/src/presentation/web/app/features/feature-tree-page-client.js +13 -0
- package/dist/src/presentation/web/app/features/get-feature-tree-data.d.ts +3 -0
- package/dist/src/presentation/web/app/features/get-feature-tree-data.d.ts.map +1 -0
- package/dist/src/presentation/web/app/features/get-feature-tree-data.js +40 -0
- package/dist/src/presentation/web/app/features/page.d.ts +4 -0
- package/dist/src/presentation/web/app/features/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/features/page.js +9 -0
- package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
- package/dist/src/presentation/web/app/layout.js +3 -1
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts +8 -1
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +37 -7
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.js +35 -0
- package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/ChatSheet.js +22 -2
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +15 -1
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts +28 -0
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.js +176 -0
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.stories.d.ts +11 -0
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.stories.js +140 -0
- package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts +3 -0
- package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/feature-tree-table/index.js +1 -0
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +9 -2
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
- package/dist/src/presentation/web/hooks/fab-layout-context.d.ts +18 -0
- package/dist/src/presentation/web/hooks/fab-layout-context.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/fab-layout-context.js +19 -0
- package/dist/src/presentation/web/lib/fab-layout.d.ts +11 -0
- package/dist/src/presentation/web/lib/fab-layout.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/fab-layout.js +21 -0
- package/dist/translations/ar/web.json +8 -0
- package/dist/translations/de/web.json +8 -0
- package/dist/translations/en/web.json +8 -0
- package/dist/translations/es/web.json +8 -0
- package/dist/translations/fr/web.json +8 -0
- package/dist/translations/he/web.json +8 -0
- package/dist/translations/pt/web.json +8 -0
- package/dist/translations/ru/web.json +8 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +5 -5
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +71 -56
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +73 -58
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/chat/page.js +3 -3
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +73 -58
- package/web/.next/server/app/(dashboard)/create/page.js +3 -3
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/page.js +3 -3
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +3 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +25 -10
- package/web/.next/server/app/_not-found/page.js +2 -2
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route.js +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/features/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/features/page/build-manifest.json +18 -0
- package/web/.next/server/app/features/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/features/page/react-loadable-manifest.json +8 -0
- package/web/.next/server/app/features/page/server-reference-manifest.json +95 -0
- package/web/.next/server/app/features/page.js +18 -0
- package/web/.next/server/app/features/page.js.map +5 -0
- package/web/.next/server/app/features/page.js.nft.json +1 -0
- package/web/.next/server/app/features/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/settings/page/build-manifest.json +3 -3
- package/web/.next/server/app/settings/page/server-reference-manifest.json +31 -16
- package/web/.next/server/app/settings/page.js +3 -3
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/build-manifest.json +3 -3
- package/web/.next/server/app/skills/page/server-reference-manifest.json +35 -20
- package/web/.next/server/app/skills/page.js +2 -2
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/build-manifest.json +3 -3
- package/web/.next/server/app/tools/page/server-reference-manifest.json +35 -20
- package/web/.next/server/app/tools/page.js +2 -2
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/build-manifest.json +3 -3
- package/web/.next/server/app/version/page/server-reference-manifest.json +25 -10
- package/web/.next/server/app/version/page.js +2 -2
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__ea653642._.js → [root-of-the-server]__a5879003._.js} +2 -2
- package/web/.next/server/chunks/{[root-of-the-server]__ea653642._.js.map → [root-of-the-server]__a5879003._.js.map} +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b062b383._.js → [root-of-the-server]__0c5452c3._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0c5452c3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2b3d5020._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2b3d5020._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__dffa13c5._.js → [root-of-the-server]__69dd3217._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__dffa13c5._.js.map → [root-of-the-server]__69dd3217._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7ffd3598._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7ffd3598._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__248ee887._.js → [root-of-the-server]__851f6adb._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__851f6adb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e88da4ee._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e88da4ee._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_9495d50b._.js → _0727935d._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_9495d50b._.js.map → _0727935d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_075fae20._.js +4 -0
- package/web/.next/server/chunks/ssr/_075fae20._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0dc06d07._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_125c55af._.js +4 -0
- package/web/.next/server/chunks/ssr/_125c55af._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_bcaea66b._.js → _1879404a._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1879404a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_b9ba2473._.js → _1e08a336._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1e08a336._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_73e1eb5f._.js → _20356a51._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_73e1eb5f._.js.map → _20356a51._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js +4 -0
- package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_4a4709c5._.js +4 -0
- package/web/.next/server/chunks/ssr/_4a4709c5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_560f2971._.js +3 -0
- package/web/.next/server/chunks/ssr/_560f2971._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_07635b7c._.js → _5cc74284._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_07635b7c._.js.map → _5cc74284._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_628621c7._.js +4 -0
- package/web/.next/server/chunks/ssr/_628621c7._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_68996e5b._.js +3 -0
- package/web/.next/server/chunks/ssr/_68996e5b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_8ea88281._.js +3 -0
- package/web/.next/server/chunks/ssr/_8ea88281._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_9412b27f._.js +4 -0
- package/web/.next/server/chunks/ssr/_9412b27f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a5a5901d._.js +4 -0
- package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_ac4a3873._.js → _ae8cf39a._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_ac4a3873._.js.map → _ae8cf39a._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js +4 -0
- package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_1c309165._.js → _ce97386b._.js} +2 -2
- package/web/.next/server/chunks/ssr/_ce97386b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js +6 -0
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f33cd07e._.js +6 -0
- package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f535d854._.js +3 -0
- package/web/.next/server/chunks/ssr/_f535d854._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f79e241b._.js +3 -0
- package/web/.next/server/chunks/ssr/{_3bcda5d7._.js.map → _f79e241b._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js +4 -0
- package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -0
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +10 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js.map +1 -0
- package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js +1 -1
- package/web/.next/server/chunks/ssr/translations_23dd5e7e._.js.map +1 -1
- package/web/.next/server/middleware-build-manifest.js +3 -3
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +678 -495
- package/web/.next/static/chunks/20f7cc98a013b11c.js +1 -0
- package/web/.next/static/chunks/28ae5046faef6cec.js +1 -0
- package/web/.next/static/chunks/{d0613380bbaa9a8e.js → 36fc775163f18b69.js} +1 -1
- package/web/.next/static/chunks/399a4ab11438b3e3.js +7 -0
- package/web/.next/static/chunks/3a5e170cb1cd1e3d.css +1 -0
- package/web/.next/static/chunks/3e393d6a78b2ade4.js +1 -0
- package/web/.next/static/chunks/4cec255f2754e5ec.js +1 -0
- package/web/.next/static/chunks/4d13818d3eb8ef71.js +1 -0
- package/web/.next/static/chunks/52355f60ea8362fa.js +8 -0
- package/web/.next/static/chunks/5d4a8552d5b6a4a8.js +1 -0
- package/web/.next/static/chunks/802cc08a7ad04826.js +1 -0
- package/web/.next/static/chunks/83970faa05406450.js +3 -0
- package/web/.next/static/chunks/{a81350e847797ff8.js → 9094d63b7dce7929.js} +1 -1
- package/web/.next/static/chunks/{2770aabb38d76609.js → 92d2ff419c6808f1.js} +1 -1
- package/web/.next/static/chunks/{5281c5a2011132bc.js → 9b00d85b51431418.js} +2 -2
- package/web/.next/static/chunks/{192dd30a464572ef.js → a805fe4541d3ddab.js} +1 -1
- package/web/.next/static/chunks/bbd04e5805d9f654.js +5 -0
- package/web/.next/static/chunks/c3a67566f78b5bc3.js +1 -0
- package/web/.next/static/chunks/e779296e738a812b.css +1 -0
- package/web/.next/static/chunks/{1db4dfa35a1637ed.js → e854f587f29f8864.js} +1 -1
- package/web/.next/static/chunks/{7cd7aef397d53b94.js → f10cbed0a4fe0e76.js} +1 -1
- package/web/.next/static/chunks/f998b42b5cddafd6.js +1 -0
- package/web/.next/static/chunks/fce43a228cc9b455.js +1 -0
- package/web/.next/static/chunks/{turbopack-432ef324fc27240c.js → turbopack-62782e656a49f322.js} +1 -1
- package/web/package.json +2 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__248ee887._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b062b383._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1c309165._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3a0b989f._.js +0 -6
- package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3bcda5d7._.js +0 -3
- package/web/.next/server/chunks/ssr/_5f69c13f._.js +0 -4
- package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js +0 -4
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js +0 -4
- package/web/.next/server/chunks/ssr/_82c57f10._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_9c5bd84a._.js +0 -3
- package/web/.next/server/chunks/ssr/_9c5bd84a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +0 -4
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_b5fc318a._.js +0 -3
- package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_b9ba2473._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_bcaea66b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +0 -4
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js +0 -4
- package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js +0 -4
- package/web/.next/server/chunks/ssr/_d86175ae._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js +0 -4
- package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d90b0a06._.js +0 -3
- package/web/.next/server/chunks/ssr/_d90b0a06._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_fa7efce3._.js +0 -6
- package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +0 -1
- package/web/.next/static/chunks/04b3e8b2c0b2a310.js +0 -3
- package/web/.next/static/chunks/1d980f961818ff68.js +0 -1
- package/web/.next/static/chunks/2c9404cf96b0a5a0.js +0 -1
- package/web/.next/static/chunks/3deefc76ea55047c.js +0 -1
- package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +0 -1
- package/web/.next/static/chunks/4864ff06a738d58b.js +0 -1
- package/web/.next/static/chunks/63b4954715fc3423.js +0 -1
- package/web/.next/static/chunks/672e3da3ad26005b.js +0 -1
- package/web/.next/static/chunks/83928a921868a809.js +0 -1
- package/web/.next/static/chunks/86c476f04ff32e7b.css +0 -1
- package/web/.next/static/chunks/c7e793951b20a67f.js +0 -1
- package/web/.next/static/chunks/cb41e1da2ce3a710.js +0 -7
- package/web/.next/static/chunks/d2cbeefbc8967b16.js +0 -1
- package/web/.next/static/chunks/d6e702c209c413ce.js +0 -5
- /package/web/.next/static/{GXMtXdKTjklQ1IkrOohzE → Smr7Fl4Z08vMkbdUva14p}/_buildManifest.js +0 -0
- /package/web/.next/static/{GXMtXdKTjklQ1IkrOohzE → Smr7Fl4Z08vMkbdUva14p}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{GXMtXdKTjklQ1IkrOohzE → Smr7Fl4Z08vMkbdUva14p}/_ssgManifest.js +0 -0
package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef, useCallback } from 'react';
|
|
4
|
+
import { TabulatorFull as Tabulator } from 'tabulator-tables';
|
|
5
|
+
import { cn } from '../../../lib/utils.js';
|
|
6
|
+
import './feature-tree-table.css';
|
|
7
|
+
const STATUS_COLORS = {
|
|
8
|
+
'action-needed': '#f59e0b',
|
|
9
|
+
'in-progress': '#3b82f6',
|
|
10
|
+
pending: '#94a3b8',
|
|
11
|
+
blocked: '#9ca3af',
|
|
12
|
+
error: '#ef4444',
|
|
13
|
+
done: '#10b981',
|
|
14
|
+
};
|
|
15
|
+
const STATUS_LABELS = {
|
|
16
|
+
'action-needed': 'Action Needed',
|
|
17
|
+
'in-progress': 'In Progress',
|
|
18
|
+
pending: 'Pending',
|
|
19
|
+
blocked: 'Blocked',
|
|
20
|
+
error: 'Error',
|
|
21
|
+
done: 'Done',
|
|
22
|
+
};
|
|
23
|
+
function statusFormatter(cell) {
|
|
24
|
+
const row = cell.getRow().getData();
|
|
25
|
+
if (row._isRepoGroup)
|
|
26
|
+
return '';
|
|
27
|
+
const value = cell.getValue();
|
|
28
|
+
const color = STATUS_COLORS[value] ?? '#94a3b8';
|
|
29
|
+
const label = STATUS_LABELS[value] ?? value;
|
|
30
|
+
return `<span style="display:inline-flex;align-items:center;gap:6px;"><span style="width:8px;height:8px;border-radius:50%;background:${color};display:inline-block;"></span>${label}</span>`;
|
|
31
|
+
}
|
|
32
|
+
function buildColumns(onFeatureClick) {
|
|
33
|
+
return [
|
|
34
|
+
{
|
|
35
|
+
title: 'Name',
|
|
36
|
+
field: 'name',
|
|
37
|
+
widthGrow: 3,
|
|
38
|
+
...(onFeatureClick && {
|
|
39
|
+
cellClick: (_e, cell) => {
|
|
40
|
+
const data = cell.getRow().getData();
|
|
41
|
+
if (data._isRepoGroup)
|
|
42
|
+
return;
|
|
43
|
+
onFeatureClick(data.id);
|
|
44
|
+
},
|
|
45
|
+
cssClass: 'cursor-pointer',
|
|
46
|
+
}),
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: 'Status',
|
|
50
|
+
field: 'status',
|
|
51
|
+
widthGrow: 1.5,
|
|
52
|
+
formatter: statusFormatter,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
title: 'Lifecycle',
|
|
56
|
+
field: 'lifecycle',
|
|
57
|
+
widthGrow: 1.5,
|
|
58
|
+
formatter: (cell) => {
|
|
59
|
+
const row = cell.getRow().getData();
|
|
60
|
+
if (row._isRepoGroup)
|
|
61
|
+
return '';
|
|
62
|
+
return cell.getValue();
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
title: 'Branch',
|
|
67
|
+
field: 'branch',
|
|
68
|
+
widthGrow: 2,
|
|
69
|
+
formatter: (cell) => {
|
|
70
|
+
const row = cell.getRow().getData();
|
|
71
|
+
if (row._isRepoGroup)
|
|
72
|
+
return '';
|
|
73
|
+
return cell.getValue();
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Build tree-structured data grouped by repository.
|
|
80
|
+
* Each repository becomes a parent node with its features as children.
|
|
81
|
+
* Features that have parent-child relationships are nested within their repository group.
|
|
82
|
+
*/
|
|
83
|
+
export function buildTreeData(flatData) {
|
|
84
|
+
if (flatData.length === 0)
|
|
85
|
+
return [];
|
|
86
|
+
// Group features by repository
|
|
87
|
+
const byRepo = new Map();
|
|
88
|
+
for (const item of flatData) {
|
|
89
|
+
const repoName = item.repositoryName || 'Unknown';
|
|
90
|
+
if (!byRepo.has(repoName)) {
|
|
91
|
+
byRepo.set(repoName, []);
|
|
92
|
+
}
|
|
93
|
+
byRepo.get(repoName).push(item);
|
|
94
|
+
}
|
|
95
|
+
const roots = [];
|
|
96
|
+
for (const [repoName, features] of byRepo) {
|
|
97
|
+
// Build parent-child relationships within this repo group
|
|
98
|
+
const lookup = new Map();
|
|
99
|
+
const repoChildren = [];
|
|
100
|
+
for (const item of features) {
|
|
101
|
+
lookup.set(item.id, { ...item, _children: [] });
|
|
102
|
+
}
|
|
103
|
+
for (const item of features) {
|
|
104
|
+
const node = lookup.get(item.id);
|
|
105
|
+
if (item.parentId && lookup.has(item.parentId)) {
|
|
106
|
+
lookup.get(item.parentId)._children.push(node);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
repoChildren.push(node);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Clean up empty _children arrays
|
|
113
|
+
for (const node of lookup.values()) {
|
|
114
|
+
if (node._children?.length === 0) {
|
|
115
|
+
delete node._children;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// If there's only one repo, skip the group wrapper
|
|
119
|
+
if (byRepo.size === 1) {
|
|
120
|
+
roots.push(...repoChildren);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Create a repo group node
|
|
124
|
+
const repoGroup = {
|
|
125
|
+
id: `repo-${repoName}`,
|
|
126
|
+
name: repoName,
|
|
127
|
+
status: 'pending',
|
|
128
|
+
lifecycle: '',
|
|
129
|
+
branch: '',
|
|
130
|
+
repositoryName: repoName,
|
|
131
|
+
_isRepoGroup: true,
|
|
132
|
+
_children: repoChildren,
|
|
133
|
+
};
|
|
134
|
+
roots.push(repoGroup);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return roots;
|
|
138
|
+
}
|
|
139
|
+
export function FeatureTreeTable({ data, className, onFeatureClick }) {
|
|
140
|
+
const containerRef = useRef(null);
|
|
141
|
+
const tabulatorRef = useRef(null);
|
|
142
|
+
const onFeatureClickRef = useRef(onFeatureClick);
|
|
143
|
+
onFeatureClickRef.current = onFeatureClick;
|
|
144
|
+
const stableOnFeatureClick = useCallback((featureId) => {
|
|
145
|
+
onFeatureClickRef.current?.(featureId);
|
|
146
|
+
}, []);
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
if (!containerRef.current)
|
|
149
|
+
return;
|
|
150
|
+
const treeData = buildTreeData(data);
|
|
151
|
+
const columns = buildColumns(stableOnFeatureClick);
|
|
152
|
+
const table = new Tabulator(containerRef.current, {
|
|
153
|
+
data: treeData,
|
|
154
|
+
columns,
|
|
155
|
+
dataTree: true,
|
|
156
|
+
dataTreeStartExpanded: true,
|
|
157
|
+
layout: 'fitColumns',
|
|
158
|
+
height: '100%',
|
|
159
|
+
placeholder: 'No features found',
|
|
160
|
+
headerSortClickElement: 'icon',
|
|
161
|
+
rowHeight: 40,
|
|
162
|
+
rowFormatter: (row) => {
|
|
163
|
+
const rowData = row.getData();
|
|
164
|
+
if (rowData._isRepoGroup) {
|
|
165
|
+
row.getElement().classList.add('tabulator-row-repo-group');
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
tabulatorRef.current = table;
|
|
170
|
+
return () => {
|
|
171
|
+
table.destroy();
|
|
172
|
+
tabulatorRef.current = null;
|
|
173
|
+
};
|
|
174
|
+
}, [data, stableOnFeatureClick]);
|
|
175
|
+
return (_jsx("div", { "data-testid": "feature-tree-table", className: cn('h-full w-full', className), ref: containerRef }));
|
|
176
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { FeatureTreeTable } from './feature-tree-table.js';
|
|
3
|
+
declare const meta: Meta<typeof FeatureTreeTable>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof meta>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const SingleRepository: Story;
|
|
8
|
+
export declare const Empty: Story;
|
|
9
|
+
export declare const WithClickHandler: Story;
|
|
10
|
+
export declare const DeeplyNested: Story;
|
|
11
|
+
//# sourceMappingURL=feature-tree-table.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-tree-table.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/feature-tree-table.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAcvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAmEnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAI9B,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAK9B,CAAC;AAwCF,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { FeatureTreeTable } from './feature-tree-table.js';
|
|
3
|
+
const meta = {
|
|
4
|
+
title: 'Features/FeatureTreeTable',
|
|
5
|
+
component: FeatureTreeTable,
|
|
6
|
+
parameters: {
|
|
7
|
+
layout: 'padded',
|
|
8
|
+
},
|
|
9
|
+
tags: ['autodocs'],
|
|
10
|
+
decorators: [
|
|
11
|
+
(Story) => (_jsx("div", { style: { height: '500px', width: '100%' }, children: _jsx(Story, {}) })),
|
|
12
|
+
],
|
|
13
|
+
};
|
|
14
|
+
export default meta;
|
|
15
|
+
const singleRepoFeatures = [
|
|
16
|
+
{
|
|
17
|
+
id: 'feat-1',
|
|
18
|
+
name: 'Authentication System',
|
|
19
|
+
status: 'done',
|
|
20
|
+
lifecycle: 'Maintain',
|
|
21
|
+
branch: 'feat/auth-system',
|
|
22
|
+
repositoryName: 'my-app',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'feat-2',
|
|
26
|
+
name: 'OAuth2 Provider',
|
|
27
|
+
status: 'in-progress',
|
|
28
|
+
lifecycle: 'Implementation',
|
|
29
|
+
branch: 'feat/oauth2-provider',
|
|
30
|
+
repositoryName: 'my-app',
|
|
31
|
+
parentId: 'feat-1',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: 'feat-3',
|
|
35
|
+
name: 'JWT Token Refresh',
|
|
36
|
+
status: 'pending',
|
|
37
|
+
lifecycle: 'Planning',
|
|
38
|
+
branch: 'feat/jwt-refresh',
|
|
39
|
+
repositoryName: 'my-app',
|
|
40
|
+
parentId: 'feat-1',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 'feat-4',
|
|
44
|
+
name: 'Payment Integration',
|
|
45
|
+
status: 'action-needed',
|
|
46
|
+
lifecycle: 'Review',
|
|
47
|
+
branch: 'feat/payments',
|
|
48
|
+
repositoryName: 'my-app',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
const multiRepoFeatures = [
|
|
52
|
+
...singleRepoFeatures,
|
|
53
|
+
{
|
|
54
|
+
id: 'feat-5',
|
|
55
|
+
name: 'Dashboard Widgets',
|
|
56
|
+
status: 'blocked',
|
|
57
|
+
lifecycle: 'Blocked',
|
|
58
|
+
branch: 'feat/dashboard-widgets',
|
|
59
|
+
repositoryName: 'admin-portal',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'feat-6',
|
|
63
|
+
name: 'Stripe Checkout',
|
|
64
|
+
status: 'error',
|
|
65
|
+
lifecycle: 'Implementation',
|
|
66
|
+
branch: 'feat/stripe-checkout',
|
|
67
|
+
repositoryName: 'admin-portal',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'feat-7',
|
|
71
|
+
name: 'API Gateway',
|
|
72
|
+
status: 'in-progress',
|
|
73
|
+
lifecycle: 'Implementation',
|
|
74
|
+
branch: 'feat/api-gateway',
|
|
75
|
+
repositoryName: 'infrastructure',
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
export const Default = {
|
|
79
|
+
args: {
|
|
80
|
+
data: multiRepoFeatures,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
export const SingleRepository = {
|
|
84
|
+
args: {
|
|
85
|
+
data: singleRepoFeatures,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
export const Empty = {
|
|
89
|
+
args: {
|
|
90
|
+
data: [],
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
export const WithClickHandler = {
|
|
94
|
+
args: {
|
|
95
|
+
data: multiRepoFeatures,
|
|
96
|
+
onFeatureClick: (id) => alert(`Clicked feature: ${id}`),
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
const deeplyNestedFeatures = [
|
|
100
|
+
{
|
|
101
|
+
id: 'root-1',
|
|
102
|
+
name: 'Platform Overhaul',
|
|
103
|
+
status: 'in-progress',
|
|
104
|
+
lifecycle: 'Implementation',
|
|
105
|
+
branch: 'feat/platform-overhaul',
|
|
106
|
+
repositoryName: 'platform',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
id: 'child-1',
|
|
110
|
+
name: 'API Redesign',
|
|
111
|
+
status: 'in-progress',
|
|
112
|
+
lifecycle: 'Implementation',
|
|
113
|
+
branch: 'feat/api-redesign',
|
|
114
|
+
repositoryName: 'platform',
|
|
115
|
+
parentId: 'root-1',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: 'grandchild-1',
|
|
119
|
+
name: 'REST to GraphQL Migration',
|
|
120
|
+
status: 'pending',
|
|
121
|
+
lifecycle: 'Planning',
|
|
122
|
+
branch: 'feat/graphql-migration',
|
|
123
|
+
repositoryName: 'platform',
|
|
124
|
+
parentId: 'child-1',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: 'child-2',
|
|
128
|
+
name: 'Database Migration',
|
|
129
|
+
status: 'done',
|
|
130
|
+
lifecycle: 'Maintain',
|
|
131
|
+
branch: 'feat/db-migration',
|
|
132
|
+
repositoryName: 'platform',
|
|
133
|
+
parentId: 'root-1',
|
|
134
|
+
},
|
|
135
|
+
];
|
|
136
|
+
export const DeeplyNested = {
|
|
137
|
+
args: {
|
|
138
|
+
data: deeplyNestedFeatures,
|
|
139
|
+
},
|
|
140
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { FeatureTreeTable, buildTreeData } from './feature-tree-table.js';
|
package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA8B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA+QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAi3CzB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useTransition, useRef, useEffect, useCallback } from 'react';
|
|
4
|
-
import { Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Globe, Minus, Plus, ExternalLink, Settings2, Timer, MessageSquare, } from 'lucide-react';
|
|
4
|
+
import { Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Globe, Minus, Plus, ExternalLink, Settings2, Timer, MessageSquare, LayoutGrid, } from 'lucide-react';
|
|
5
5
|
import { toast } from 'sonner';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
|
7
7
|
import { cn } from '../../../lib/utils.js';
|
|
@@ -36,6 +36,7 @@ const SECTIONS = [
|
|
|
36
36
|
{ id: 'notifications', labelKey: 'settings.sections.notifications', icon: Bell },
|
|
37
37
|
{ id: 'feature-flags', labelKey: 'settings.sections.flags', icon: Flag },
|
|
38
38
|
{ id: 'interactive-agent', labelKey: 'settings.sections.chat', icon: MessageSquare },
|
|
39
|
+
{ id: 'fab-layout', labelKey: 'settings.sections.layout', icon: LayoutGrid },
|
|
39
40
|
{ id: 'database', labelKey: 'settings.sections.database', icon: Database },
|
|
40
41
|
];
|
|
41
42
|
function useSaveIndicator() {
|
|
@@ -190,6 +191,9 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
190
191
|
const [interactiveEnabled, setInteractiveEnabled] = useState(interactiveAgentConfig.enabled);
|
|
191
192
|
const [interactiveTimeout, setInteractiveTimeout] = useState(String(interactiveAgentConfig.autoTimeoutMinutes));
|
|
192
193
|
const [interactiveSessions, setInteractiveSessions] = useState(String(interactiveAgentConfig.maxConcurrentSessions));
|
|
194
|
+
// FAB layout state
|
|
195
|
+
const fabLayoutConfig = settings.fabLayout ?? { swapPosition: false };
|
|
196
|
+
const [fabSwapPosition, setFabSwapPosition] = useState(fabLayoutConfig.swapPosition);
|
|
193
197
|
// Notification state
|
|
194
198
|
const [inApp, setInApp] = useState(settings.notifications.inApp.enabled);
|
|
195
199
|
const [events, setEvents] = useState({ ...settings.notifications.events });
|
|
@@ -588,7 +592,10 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
|
|
|
588
592
|
maxConcurrentSessions: clamped,
|
|
589
593
|
},
|
|
590
594
|
});
|
|
591
|
-
} }) })] }), _jsx(SectionHint, { children: t('settings.interactiveAgent.hint') })] }), _jsxs("div", { id: "section-
|
|
595
|
+
} }) })] }), _jsx(SectionHint, { children: t('settings.interactiveAgent.hint') })] }), _jsxs("div", { id: "section-fab-layout", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: LayoutGrid, title: t('settings.fabLayout.title'), description: t('settings.fabLayout.description'), testId: "fab-layout-settings-section", children: _jsx(SwitchRow, { label: t('settings.fabLayout.swapPosition'), description: t('settings.fabLayout.swapPositionDescription'), id: "fab-swap-position", testId: "switch-fab-swap-position", checked: fabSwapPosition, onChange: (v) => {
|
|
596
|
+
setFabSwapPosition(v);
|
|
597
|
+
save({ fabLayout: { swapPosition: v } });
|
|
598
|
+
} }) }), _jsx(SectionHint, { children: t('settings.fabLayout.hint') })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: t('settings.database.title'), description: t('settings.database.sectionDescription'), testId: "database-settings-section", children: [_jsx(SettingsRow, { label: t('settings.database.location'), description: t('settings.database.locationDescription'), children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: t('settings.database.size'), children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
|
|
592
599
|
{
|
|
593
600
|
label: t('settings.database.links.settingsService'),
|
|
594
601
|
href: 'https://github.com/shep-ai/shep/blob/main/docs/architecture/settings-service.md',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,GACf,EAAE,eAAe,2CAmPjB"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
4
|
import { usePathname } from 'next/navigation';
|
|
5
|
-
import { Home, Moon, Sun, Volume2, VolumeOff, Wrench, Puzzle, Settings } from 'lucide-react';
|
|
5
|
+
import { Home, Moon, Sun, Volume2, VolumeOff, Wrench, Puzzle, Settings, TableProperties, } from 'lucide-react';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
|
7
7
|
import { Sidebar, SidebarHeader, SidebarContent, SidebarFooter, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarRail, useSidebar, } from '../../ui/sidebar.js';
|
|
8
8
|
import { ScrollArea } from '../../ui/scroll-area.js';
|
|
@@ -62,7 +62,7 @@ export function AppSidebar({ features, featureFlags, onFeatureClick, }) {
|
|
|
62
62
|
'flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2',
|
|
63
63
|
'transition-opacity duration-200 ease-out',
|
|
64
64
|
expandedVisible ? 'opacity-100' : 'opacity-0',
|
|
65
|
-
].join(' '), "aria-hidden": !expandedVisible, children: [_jsx(ShepLogo, { className: "shrink-0", size: 20, variant: versionData.isDev ? 'dev' : 'default' }), _jsx("span", { className: "truncate text-sm font-semibold tracking-tight", children: "Shep" }), _jsx(VersionBadge, { version: versionData.version, branch: versionData.branch || undefined, commitHash: versionData.commitHash || undefined, isDev: versionData.isDev, packageName: versionData.packageName, description: versionData.description, instancePath: versionData.instancePath || undefined })] })) : null, _jsx(SidebarCollapseToggle, { className: "shrink-0 transition-all duration-200" })] }) }), _jsx(SidebarNavItem, { icon: Home, label: t('navigation.controlCenter'), href: "/", active: pathname === '/' }), _jsx(SidebarNavItem, { icon: Wrench, label: t('navigation.tools'), href: "/tools", active: pathname === '/tools' }), featureFlags.skills ? (_jsx(SidebarNavItem, { icon: Puzzle, label: t('navigation.skills'), href: "/skills", active: pathname === '/skills' })) : null, _jsx(SidebarNavItem, { icon: Settings, label: t('navigation.settings'), href: "/settings", active: pathname === '/settings' })] }) }), _jsx(SidebarContent, { children: showExpanded ? (_jsxs("div", { className: [
|
|
65
|
+
].join(' '), "aria-hidden": !expandedVisible, children: [_jsx(ShepLogo, { className: "shrink-0", size: 20, variant: versionData.isDev ? 'dev' : 'default' }), _jsx("span", { className: "truncate text-sm font-semibold tracking-tight", children: "Shep" }), _jsx(VersionBadge, { version: versionData.version, branch: versionData.branch || undefined, commitHash: versionData.commitHash || undefined, isDev: versionData.isDev, packageName: versionData.packageName, description: versionData.description, instancePath: versionData.instancePath || undefined })] })) : null, _jsx(SidebarCollapseToggle, { className: "shrink-0 transition-all duration-200" })] }) }), _jsx(SidebarNavItem, { icon: Home, label: t('navigation.controlCenter'), href: "/", active: pathname === '/' }), _jsx(SidebarNavItem, { icon: TableProperties, label: t('navigation.features'), href: "/features", active: pathname === '/features' }), _jsx(SidebarNavItem, { icon: Wrench, label: t('navigation.tools'), href: "/tools", active: pathname === '/tools' }), featureFlags.skills ? (_jsx(SidebarNavItem, { icon: Puzzle, label: t('navigation.skills'), href: "/skills", active: pathname === '/skills' })) : null, _jsx(SidebarNavItem, { icon: Settings, label: t('navigation.settings'), href: "/settings", active: pathname === '/settings' })] }) }), _jsx(SidebarContent, { children: showExpanded ? (_jsxs("div", { className: [
|
|
66
66
|
'flex min-h-0 flex-1 flex-col overflow-hidden transition-opacity duration-200 ease-out',
|
|
67
67
|
'[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
|
|
68
68
|
expandedVisible ? 'opacity-100' : 'opacity-0',
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { FabLayoutState } from '../lib/fab-layout.js';
|
|
3
|
+
interface FabLayoutProviderProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
layout: FabLayoutState;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Provides server-resolved FAB layout configuration to all client components.
|
|
9
|
+
* Initialized in the root layout with values from the DB singleton.
|
|
10
|
+
*/
|
|
11
|
+
export declare function FabLayoutProvider({ children, layout }: FabLayoutProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
/**
|
|
13
|
+
* Read FAB layout config from context. Returns default (not swapped)
|
|
14
|
+
* when used outside a FabLayoutProvider (e.g., Storybook, tests).
|
|
15
|
+
*/
|
|
16
|
+
export declare function useFabLayout(): FabLayoutState;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=fab-layout-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fab-layout-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/fab-layout-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,sBAAsB,2CAE7E;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,cAAc,CAE7C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext } from 'react';
|
|
4
|
+
const defaultLayout = { swapPosition: false };
|
|
5
|
+
const FabLayoutContext = createContext(defaultLayout);
|
|
6
|
+
/**
|
|
7
|
+
* Provides server-resolved FAB layout configuration to all client components.
|
|
8
|
+
* Initialized in the root layout with values from the DB singleton.
|
|
9
|
+
*/
|
|
10
|
+
export function FabLayoutProvider({ children, layout }) {
|
|
11
|
+
return _jsx(FabLayoutContext.Provider, { value: layout, children: children });
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Read FAB layout config from context. Returns default (not swapped)
|
|
15
|
+
* when used outside a FabLayoutProvider (e.g., Storybook, tests).
|
|
16
|
+
*/
|
|
17
|
+
export function useFabLayout() {
|
|
18
|
+
return useContext(FabLayoutContext);
|
|
19
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FAB layout configuration for the web UI.
|
|
3
|
+
*
|
|
4
|
+
* Reads from Settings.fabLayout when available, defaulting to
|
|
5
|
+
* swapPosition = false (Create FAB on start side, Chat FAB on end side).
|
|
6
|
+
*/
|
|
7
|
+
export interface FabLayoutState {
|
|
8
|
+
swapPosition: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function getFabLayout(): FabLayoutState;
|
|
11
|
+
//# sourceMappingURL=fab-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fab-layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/fab-layout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,IAAI,cAAc,CAa7C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FAB layout configuration for the web UI.
|
|
3
|
+
*
|
|
4
|
+
* Reads from Settings.fabLayout when available, defaulting to
|
|
5
|
+
* swapPosition = false (Create FAB on start side, Chat FAB on end side).
|
|
6
|
+
*/
|
|
7
|
+
import { hasSettings, getSettings } from '../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
8
|
+
export function getFabLayout() {
|
|
9
|
+
try {
|
|
10
|
+
if (hasSettings()) {
|
|
11
|
+
const fabLayout = getSettings().fabLayout;
|
|
12
|
+
if (fabLayout) {
|
|
13
|
+
return { swapPosition: fabLayout.swapPosition };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
// Settings not initialized (e.g., during build/SSG or client-side hydration)
|
|
19
|
+
}
|
|
20
|
+
return { swapPosition: false };
|
|
21
|
+
}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"notifications": "الإشعارات",
|
|
15
15
|
"flags": "العلامات",
|
|
16
16
|
"chat": "المحادثة",
|
|
17
|
+
"layout": "التخطيط",
|
|
17
18
|
"database": "قاعدة البيانات"
|
|
18
19
|
},
|
|
19
20
|
"language": {
|
|
@@ -212,6 +213,13 @@
|
|
|
212
213
|
"maxConcurrentSessionsDescription": "الحد الأقصى لعدد جلسات الوكيل التفاعلية النشطة في وقت واحد (1–10)",
|
|
213
214
|
"hint": "علامة المحادثة تُنشئ عملية وكيل مستمرة لكل ميزة. المهلة التلقائية تُوقف الجلسات الخاملة تلقائيًا لتوفير الموارد. حد الجلسات المتزامنة يمنع الاستخدام المفرط للموارد على أجهزة المطورين."
|
|
214
215
|
},
|
|
216
|
+
"fabLayout": {
|
|
217
|
+
"title": "التخطيط",
|
|
218
|
+
"description": "التحكم في موضع أزرار الإجراء العائمة في مركز التحكم",
|
|
219
|
+
"swapPosition": "تبديل مواضع الأزرار العائمة",
|
|
220
|
+
"swapPositionDescription": "نقل زر المحادثة إلى اليسار وزر الإنشاء إلى اليمين",
|
|
221
|
+
"hint": "يوجد زران عائمان (إنشاء ومحادثة) في الزوايا السفلية لمركز التحكم. قم بتفعيل هذا الخيار لتبديل مواضعهما."
|
|
222
|
+
},
|
|
215
223
|
"database": {
|
|
216
224
|
"title": "قاعدة البيانات",
|
|
217
225
|
"description": "مسار قاعدة البيانات وإدارتها",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"notifications": "Benachrichtigungen",
|
|
15
15
|
"flags": "Flags",
|
|
16
16
|
"chat": "Chat",
|
|
17
|
+
"layout": "Layout",
|
|
17
18
|
"database": "Datenbank"
|
|
18
19
|
},
|
|
19
20
|
"language": {
|
|
@@ -198,6 +199,13 @@
|
|
|
198
199
|
"maxConcurrentSessionsDescription": "Maximale Anzahl aktiver interaktiver Agenten-Sitzungen gleichzeitig (1–10)",
|
|
199
200
|
"hint": "Der Chat-Tab startet einen persistenten Agentenprozess pro Feature. Das Auto-Zeitlimit stoppt inaktive Sitzungen automatisch, um Ressourcen zu sparen. Das Limit für gleichzeitige Sitzungen verhindert unkontrollierten Ressourcenverbrauch auf Entwicklermaschinen."
|
|
200
201
|
},
|
|
202
|
+
"fabLayout": {
|
|
203
|
+
"title": "Layout",
|
|
204
|
+
"description": "Position der schwebenden Aktionsschaltflächen im Kontrollzentrum steuern",
|
|
205
|
+
"swapPosition": "FAB-Positionen tauschen",
|
|
206
|
+
"swapPositionDescription": "Chat-Button nach links und Erstellen-Button nach rechts verschieben",
|
|
207
|
+
"hint": "Die zwei schwebenden Aktionsschaltflächen (Erstellen und Chat) befinden sich in den unteren Ecken des Kontrollzentrums. Aktivieren Sie diese Option, um ihre Positionen zu tauschen."
|
|
208
|
+
},
|
|
201
209
|
"database": {
|
|
202
210
|
"title": "Datenbank",
|
|
203
211
|
"description": "Datenbankpfad und -verwaltung",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"notifications": "Notifications",
|
|
15
15
|
"flags": "Flags",
|
|
16
16
|
"chat": "Chat",
|
|
17
|
+
"layout": "Layout",
|
|
17
18
|
"database": "Database"
|
|
18
19
|
},
|
|
19
20
|
"language": {
|
|
@@ -212,6 +213,13 @@
|
|
|
212
213
|
"maxConcurrentSessionsDescription": "Maximum number of active interactive agent sessions at once (1–10)",
|
|
213
214
|
"hint": "The Chat tab spawns a persistent agent process per feature. Auto-timeout stops idle sessions automatically to conserve resources. The concurrent session cap prevents runaway resource usage on developer machines."
|
|
214
215
|
},
|
|
216
|
+
"fabLayout": {
|
|
217
|
+
"title": "Layout",
|
|
218
|
+
"description": "Control the position of floating action buttons in the control center",
|
|
219
|
+
"swapPosition": "Swap FAB positions",
|
|
220
|
+
"swapPositionDescription": "Move the Chat button to the left and the Create button to the right",
|
|
221
|
+
"hint": "The two floating action buttons (Create and Chat) sit in the bottom corners of the control center. Enable this toggle to swap their positions."
|
|
222
|
+
},
|
|
215
223
|
"database": {
|
|
216
224
|
"title": "Database",
|
|
217
225
|
"description": "Database path and management",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"notifications": "Notificaciones",
|
|
15
15
|
"flags": "Opciones",
|
|
16
16
|
"chat": "Chat",
|
|
17
|
+
"layout": "Diseño",
|
|
17
18
|
"database": "Base de datos"
|
|
18
19
|
},
|
|
19
20
|
"language": {
|
|
@@ -212,6 +213,13 @@
|
|
|
212
213
|
"maxConcurrentSessionsDescription": "Número máximo de sesiones de agente interactivo activas a la vez (1-10)",
|
|
213
214
|
"hint": "La pestaña de chat genera un proceso de agente persistente por funcionalidad. El tiempo de espera automático detiene las sesiones inactivas automáticamente para conservar recursos. El límite de sesiones concurrentes previene el uso excesivo de recursos en las máquinas de los desarrolladores."
|
|
214
215
|
},
|
|
216
|
+
"fabLayout": {
|
|
217
|
+
"title": "Diseño",
|
|
218
|
+
"description": "Controlar la posición de los botones de acción flotantes en el centro de control",
|
|
219
|
+
"swapPosition": "Intercambiar posiciones de FAB",
|
|
220
|
+
"swapPositionDescription": "Mover el botón de Chat a la izquierda y el de Crear a la derecha",
|
|
221
|
+
"hint": "Los dos botones de acción flotantes (Crear y Chat) se ubican en las esquinas inferiores del centro de control. Active esta opción para intercambiar sus posiciones."
|
|
222
|
+
},
|
|
215
223
|
"database": {
|
|
216
224
|
"title": "Base de datos",
|
|
217
225
|
"description": "Ruta de la base de datos y administración",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"notifications": "Notifications",
|
|
15
15
|
"flags": "Drapeaux",
|
|
16
16
|
"chat": "Chat",
|
|
17
|
+
"layout": "Disposition",
|
|
17
18
|
"database": "Base de données"
|
|
18
19
|
},
|
|
19
20
|
"language": {
|
|
@@ -212,6 +213,13 @@
|
|
|
212
213
|
"maxConcurrentSessionsDescription": "Nombre maximum de sessions d'agent interactif actives simultanément (1-10)",
|
|
213
214
|
"hint": "L'onglet Chat lance un processus d'agent persistant par fonctionnalité. Le délai d'inactivité automatique arrête les sessions inactives pour économiser les ressources. Le plafond de sessions simultanées empêche l'utilisation incontrôlée des ressources sur les machines de développement."
|
|
214
215
|
},
|
|
216
|
+
"fabLayout": {
|
|
217
|
+
"title": "Disposition",
|
|
218
|
+
"description": "Contrôler la position des boutons d'action flottants dans le centre de contrôle",
|
|
219
|
+
"swapPosition": "Inverser les positions des FAB",
|
|
220
|
+
"swapPositionDescription": "Déplacer le bouton Chat à gauche et le bouton Créer à droite",
|
|
221
|
+
"hint": "Les deux boutons d'action flottants (Créer et Chat) se trouvent dans les coins inférieurs du centre de contrôle. Activez cette option pour inverser leurs positions."
|
|
222
|
+
},
|
|
215
223
|
"database": {
|
|
216
224
|
"title": "Base de données",
|
|
217
225
|
"description": "Chemin et gestion de la base de données",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"notifications": "התראות",
|
|
15
15
|
"flags": "דגלים",
|
|
16
16
|
"chat": "צ'אט",
|
|
17
|
+
"layout": "פריסה",
|
|
17
18
|
"database": "מסד נתונים"
|
|
18
19
|
},
|
|
19
20
|
"language": {
|
|
@@ -212,6 +213,13 @@
|
|
|
212
213
|
"maxConcurrentSessionsDescription": "מספר מרבי של סשנים אינטראקטיביים פעילים בו-זמנית (1-10)",
|
|
213
214
|
"hint": "לשונית הצ'אט מפעילה תהליך סוכן מתמשך לכל פיצ'ר. תפוגת זמן אוטומטית עוצרת סשנים לא פעילים כדי לחסוך במשאבים. מגבלת הסשנים המקבילים מונעת שימוש מופרז במשאבים על מכונות מפתחים."
|
|
214
215
|
},
|
|
216
|
+
"fabLayout": {
|
|
217
|
+
"title": "פריסה",
|
|
218
|
+
"description": "שליטה במיקום כפתורי הפעולה הצפים במרכז הבקרה",
|
|
219
|
+
"swapPosition": "החלפת מיקומי כפתורים צפים",
|
|
220
|
+
"swapPositionDescription": "העברת כפתור הצ'אט לשמאל וכפתור היצירה לימין",
|
|
221
|
+
"hint": "שני כפתורי הפעולה הצפים (יצירה וצ'אט) נמצאים בפינות התחתונות של מרכז הבקרה. הפעל את האפשרות הזו כדי להחליף את מיקומיהם."
|
|
222
|
+
},
|
|
215
223
|
"database": {
|
|
216
224
|
"title": "מסד נתונים",
|
|
217
225
|
"description": "נתיב מסד הנתונים וניהול",
|