diff --git a/web/projects/marketplace/src/pages/list/item/item.component.html b/web/projects/marketplace/src/pages/list/item/item.component.html index 33d3f7380..3b07610df 100644 --- a/web/projects/marketplace/src/pages/list/item/item.component.html +++ b/web/projects/marketplace/src/pages/list/item/item.component.html @@ -1,16 +1,13 @@
- {{ pkg.manifest.title }} Icon + {{ pkg.manifest.title }} Icon
{{ pkg.manifest.title }} Icon diff --git a/web/projects/shared/styles/shared.scss b/web/projects/shared/styles/shared.scss index 72a4962e5..c8b8d4bf8 100644 --- a/web/projects/shared/styles/shared.scss +++ b/web/projects/shared/styles/shared.scss @@ -369,7 +369,7 @@ a { } .buttons { - margin-top: 0.5rem; + margin-top: 1rem; :first-child { margin-right: 0.5rem; diff --git a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/menu.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/menu.component.ts index a900b3a21..188d8c366 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/menu.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/menu.component.ts @@ -34,6 +34,8 @@ import { MARKETPLACE_REGISTRY } from '../modals/registry.component' padding: 1.25rem; font-size: 1rem; line-height: 1.5rem; + background-color: transparent; + background-image: none; } `, ], diff --git a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts index 71439d651..7d9c9c7a1 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/sidebars.component.ts @@ -15,7 +15,6 @@ import { MarketplaceSidebarService } from '../services/sidebar.service' position: fixed; inset: 3.5rem 0 0; pointer-events: none; - transform: translate3d(0, 0, 0); } `, ], diff --git a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/tile.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/tile.component.ts index ab3d521bc..db689451b 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/tile.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/marketplace/components/tile.component.ts @@ -2,8 +2,8 @@ import { CommonModule } from '@angular/common' import { ChangeDetectionStrategy, Component, - Input, inject, + Input, } from '@angular/core' import { ActivatedRoute, Router } from '@angular/router' import { ItemModule, MarketplacePkg } from '@start9labs/marketplace' @@ -30,9 +30,8 @@ import { MarketplaceSidebarService } from '../services/sidebar.service' direction: 'right'; autoWidth: true " + [pkgId]="pkg.manifest.id" class="preview-wrapper" - [pkg]="pkg" - (tuiActiveZoneChange)="toggle($event)" > + + + + +
} - - - - - -
- - -
-
-
- + } `, styles: [ @@ -101,9 +114,9 @@ import { Router } from '@angular/router' .outer-container { display: grid; - justify-content: center; gap: 2rem; padding: 1.75rem; + min-width: 30rem; } .inner-container { @@ -115,6 +128,18 @@ import { Router } from '@angular/router' .additional-wrapper { margin-top: 1.5rem; } + + .versions { + border: 0; + border-top-width: 1px; + border-bottom-width: 1px; + border-color: rgb(113 113 122); + border-style: solid; + cursor: pointer; + ::ng-deep label { + cursor: pointer; + } + } `, ], standalone: true, @@ -132,20 +157,32 @@ import { Router } from '@angular/router' TuiStringifyContentPipeModule, MarketplaceAdditionalItemComponent, TuiRadioListModule, + TuiLoaderModule, ], }) export class MarketplacePreviewComponent { @Input({ required: true }) - pkg!: MarketplacePkg + pkgId!: string - @Output() - version = new EventEmitter() + loading = true readonly displayEmver = displayEmver private readonly router = inject(Router) - readonly url$ = inject(AbstractMarketplaceService) - .getSelectedHost$() - .pipe(map(({ url }) => url)) + private readonly marketplaceService = inject(AbstractMarketplaceService) + readonly url = + this.router.routerState.snapshot.root.queryParamMap.get('url') || undefined + + readonly loadVersion$ = new BehaviorSubject('*') + readonly hostInfo$ = this.marketplaceService.getSelectedHost$() + readonly pkg$ = this.loadVersion$.pipe( + switchMap(version => + this.marketplaceService.getPackage$(this.pkgId, version, this.url), + ), + tap(data => { + this.loading = false + return data + }), + ) constructor( private readonly dialogs: TuiDialogService, @@ -156,19 +193,27 @@ export class MarketplacePreviewComponent { this.router.navigate([], { queryParams: { id } }) } - presentAlertVersions(version: TemplateRef) { + constructDetailLink(info: StoreIdentity, id: string) { + const domain = new URL(info.url).hostname + return `https://marketplace.start9.com/${id}?api=${domain}&name=${info.name}` + } + + presentAlertVersions( + pkg: MarketplacePkg, + version: TemplateRef, + ) { this.dialogs .open(version, { label: 'Versions', size: 's', data: { - value: this.pkg.manifest.version, - items: [...new Set(this.pkg.versions)].sort( + value: pkg.manifest.version, + items: [...new Set(pkg.versions)].sort( (a, b) => -1 * (this.emver.compare(a, b) || 0), ), }, }) .pipe(filter(Boolean)) - .subscribe(version => this.version.emit(version)) + .subscribe(version => this.loadVersion$.next(version)) } } diff --git a/web/projects/ui/src/app/services/api/api.fixures.ts b/web/projects/ui/src/app/services/api/api.fixures.ts index d02e0aac2..003006fe0 100644 --- a/web/projects/ui/src/app/services/api/api.fixures.ts +++ b/web/projects/ui/src/app/services/api/api.fixures.ts @@ -9,12 +9,15 @@ import { RR, ServerNotifications, } from './api.types' -import { BTC_ICON, LND_ICON, PROXY_ICON } from './api-icons' import { DependencyMetadata, MarketplacePkg } from '@start9labs/marketplace' import { Log } from '@start9labs/shared' import { configBuilderToSpec } from 'src/app/util/configBuilderToSpec' import { CT, T, CB } from '@start9labs/start-sdk' +const BTC_ICON = '/assets/img/service-icons/bitcoind.svg' +const LND_ICON = '/assets/img/service-icons/lnd.png' +const PROXY_ICON = '/assets/img/service-icons/btc-rpc-proxy.png' + export module Mock { export const ServerUpdated: ServerStatusInfo = { currentBackup: null, @@ -319,8 +322,13 @@ export module Mock { }, } - export const MarketplacePkgsList: RR.GetMarketplacePackagesRes = - Object.values(Mock.MarketplacePkgs).map(service => service['latest']) + export const marketplacePkgsList = ( + version?: string, + ): RR.GetMarketplacePackagesRes => { + return Object.values(Mock.MarketplacePkgs).map(service => + version ? service[version] : service['latest'], + ) + } export const Notifications: ServerNotifications = [ { diff --git a/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts b/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts index 15639dc40..82493ae98 100644 --- a/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts +++ b/web/projects/ui/src/app/services/api/embassy-mock-api.service.ts @@ -462,7 +462,11 @@ export class MockApiService extends ApiService { } return info } else if (path === '/package/v0/index') { - return Mock.MarketplacePkgsList + const version = params['ids'] + ? (JSON.parse(params['ids']) as { version: string; id: string }[])[0] + .version + : undefined + return Mock.marketplacePkgsList(version) } else if (path.startsWith('/package/v0/release-notes')) { return Mock.ReleaseNotes } else if (path.includes('instructions') || path.includes('license')) {