diff --git a/frontend/projects/marketplace/src/pipes/filter-packages.pipe.ts b/frontend/projects/marketplace/src/pipes/filter-packages.pipe.ts index 464c33c71..0ca8ae602 100644 --- a/frontend/projects/marketplace/src/pipes/filter-packages.pipe.ts +++ b/frontend/projects/marketplace/src/pipes/filter-packages.pipe.ts @@ -3,6 +3,7 @@ import Fuse from 'fuse.js' import { MarketplacePkg } from '../types/marketplace-pkg' import { MarketplaceManifest } from '../types/marketplace-manifest' +import { Emver } from '@start9labs/shared' const defaultOps = { isCaseSensitive: false, @@ -29,6 +30,8 @@ const defaultOps = { name: 'filterPackages', }) export class FilterPackagesPipe implements PipeTransform { + constructor(private readonly emver: Emver) {} + transform( packages: MarketplacePkg[] | null, query: string, @@ -49,7 +52,10 @@ export class FilterPackagesPipe implements PipeTransform { return packages.filter( ({ manifest }) => local[manifest.id] && - manifest.version !== local[manifest.id].manifest.version, + this.emver.compare( + manifest.version, + local[manifest.id].manifest.version, + ) === 1, ) } diff --git a/frontend/projects/shared/src/pipes/emver/emver.pipe.ts b/frontend/projects/shared/src/pipes/emver/emver.pipe.ts index 4b82ff80f..5c32f1675 100644 --- a/frontend/projects/shared/src/pipes/emver/emver.pipe.ts +++ b/frontend/projects/shared/src/pipes/emver/emver.pipe.ts @@ -31,6 +31,7 @@ export class EmverComparesPipe implements PipeTransform { } } } +// left compared to right - if 1, version on left is higher; if 0, values the same; if -1, version on left is lower type SemverResult = 0 | 1 | -1 | 'comparison-impossible' @Pipe({ diff --git a/frontend/projects/ui/src/app/components/form-object/form-error.component.html b/frontend/projects/ui/src/app/components/form-object/form-error.component.html index 7980b910c..9321fed43 100644 --- a/frontend/projects/ui/src/app/components/form-object/form-error.component.html +++ b/frontend/projects/ui/src/app/components/form-object/form-error.component.html @@ -1,4 +1,4 @@ -
+

{{ spec.name }} is required

diff --git a/frontend/projects/ui/src/app/components/form-object/form-label.component.html b/frontend/projects/ui/src/app/components/form-object/form-label.component.html index dd555d560..1e70f50e2 100644 --- a/frontend/projects/ui/src/app/components/form-object/form-label.component.html +++ b/frontend/projects/ui/src/app/components/form-object/form-label.component.html @@ -1,24 +1,12 @@ - - - - - {{ data.spec.name }}  (New) diff --git a/frontend/projects/ui/src/app/components/form-object/form-object.component.html b/frontend/projects/ui/src/app/components/form-object/form-object.component.html index 28b59501b..2b3888511 100644 --- a/frontend/projects/ui/src/app/components/form-object/form-object.component.html +++ b/frontend/projects/ui/src/app/components/form-object/form-object.component.html @@ -47,7 +47,10 @@ -

+

+ - + @@ -235,6 +250,12 @@ Add + +
- +

+ + - -

diff --git a/frontend/projects/ui/src/app/components/form-object/form-object.component.scss b/frontend/projects/ui/src/app/components/form-object/form-object.component.scss index 3ffa22fb3..66309fbb6 100644 --- a/frontend/projects/ui/src/app/components/form-object/form-object.component.scss +++ b/frontend/projects/ui/src/app/components/form-object/form-object.component.scss @@ -1,6 +1,13 @@ .slot-start { display: inline-block; vertical-align: middle; + --padding-start: 0; + --padding-end: 7px; +} + +.error-border { + border-color: var(--ion-color-danger-shade); + --border-color: var(--ion-color-danger-shade); } ion-input { @@ -17,11 +24,16 @@ ion-item-divider { } .nested-wrapper { - padding: 0 0 24px 24px; + padding: 0 0 16px 24px; } .validation-error { + opacity: 1; +} + +.error-message { p { + margin-bottom: 4px; font-size: small; color: var(--ion-color-danger); } diff --git a/frontend/projects/ui/src/app/components/form-object/form-object.component.ts b/frontend/projects/ui/src/app/components/form-object/form-object.component.ts index cc3fb8599..643414a43 100644 --- a/frontend/projects/ui/src/app/components/form-object/form-object.component.ts +++ b/frontend/projects/ui/src/app/components/form-object/form-object.component.ts @@ -168,7 +168,7 @@ export class FormObjectComponent { ] this.objectListDisplay[key].push({ height: '0px', - expanded: true, + expanded: false, displayAs: displayAs ? Mustache.render(displayAs, newItem.value) : '', }) } @@ -372,7 +372,6 @@ interface HeaderData { edited: boolean new: boolean newOptions?: boolean - invalid?: boolean } @Component({ diff --git a/frontend/projects/ui/src/app/components/logs/logs.page.html b/frontend/projects/ui/src/app/components/logs/logs.page.html index de07608b2..26295e118 100644 --- a/frontend/projects/ui/src/app/components/logs/logs.page.html +++ b/frontend/projects/ui/src/app/components/logs/logs.page.html @@ -1,19 +1,30 @@ - - - + +
-
+
-
+
Load More @@ -22,18 +33,29 @@
- +
- diff --git a/frontend/projects/ui/src/app/modals/app-config/app-config.page.ts b/frontend/projects/ui/src/app/modals/app-config/app-config.page.ts index 6aa0de6c7..3c8c2645d 100644 --- a/frontend/projects/ui/src/app/modals/app-config/app-config.page.ts +++ b/frontend/projects/ui/src/app/modals/app-config/app-config.page.ts @@ -14,7 +14,6 @@ import { isObject, } from '@start9labs/shared' import { DependentInfo } from 'src/app/types/dependent-info' -import { WizardDefs } from 'src/app/components/app-wizard/wizard-defs' import { ConfigSpec } from 'src/app/pkg-config/config-types' import { PackageDataEntry } from 'src/app/services/patch-db/data-model' import { PatchDbService } from 'src/app/services/patch-db/patch-db.service' @@ -134,7 +133,7 @@ export class AppConfigPage { if (this.configForm.invalid) { document .getElementsByClassName('validation-error')[0] - ?.parentElement?.parentElement?.scrollIntoView({ behavior: 'smooth' }) + ?.scrollIntoView({ behavior: 'smooth' }) return } diff --git a/frontend/projects/ui/src/app/modals/generic-form/generic-form.page.ts b/frontend/projects/ui/src/app/modals/generic-form/generic-form.page.ts index 4356ebe4f..26ed6f4ff 100644 --- a/frontend/projects/ui/src/app/modals/generic-form/generic-form.page.ts +++ b/frontend/projects/ui/src/app/modals/generic-form/generic-form.page.ts @@ -50,7 +50,7 @@ export class GenericFormPage { this.formGroup.markAllAsTouched() document .getElementsByClassName('validation-error')[0] - ?.parentElement?.parentElement?.scrollIntoView({ behavior: 'smooth' }) + ?.scrollIntoView({ behavior: 'smooth' }) return } diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.ts b/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.ts index b0254ef13..dc69a06f0 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.ts +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-show/app-show.page.ts @@ -33,13 +33,6 @@ export class AppShowPage { private readonly pkgId = getPkgId(this.route) readonly pkg$ = this.patch.watch$('package-data', this.pkgId).pipe( - filter( - (p: PackageDataEntry) => - !( - p.installed?.status.main.status === PackageMainStatus.Starting && - p.installed?.status.main.restarting - ), - ), map(pkg => { // if package disappears, navigate to list page if (!pkg) { @@ -49,6 +42,15 @@ export class AppShowPage { return { ...pkg } }), startWith(this.patch.getData()['package-data'][this.pkgId]), + filter( + (p: PackageDataEntry | undefined) => + // will be undefined when sideloading + p !== undefined && + !( + p.installed?.status.main.status === PackageMainStatus.Starting && + p.installed?.status.main.restarting + ), + ), ) readonly connectionFailure$ = this.connectionService @@ -60,7 +62,7 @@ export class AppShowPage { private readonly navCtrl: NavController, private readonly patch: PatchDbService, private readonly connectionService: ConnectionService, - ) {} + ) { } isInstalled( { state }: PackageDataEntry, diff --git a/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.html b/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.html index ac90fc240..e0f432850 100644 --- a/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.html +++ b/frontend/projects/ui/src/app/pages/apps-routes/app-show/components/app-show-status/app-show-status.component.html @@ -23,7 +23,7 @@ diff --git a/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/developer-menu.page.html b/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/developer-menu.page.html index f27a3deb8..ab93252e6 100644 --- a/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/developer-menu.page.html +++ b/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/developer-menu.page.html @@ -11,7 +11,11 @@ - +

Basic Info

diff --git a/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/developer-menu.page.ts b/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/developer-menu.page.ts index 4a8072a70..9b5194655 100644 --- a/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/developer-menu.page.ts +++ b/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/developer-menu.page.ts @@ -6,10 +6,8 @@ import { BasicInfo, getBasicInfoSpec } from './form-info' import { PatchDbService } from 'src/app/services/patch-db/patch-db.service' import { ApiService } from 'src/app/services/api/embassy-api.service' import { ErrorToastService, DestroyService } from '@start9labs/shared' -import { takeUntil } from 'rxjs/operators' -import { DevProjectData } from 'src/app/services/patch-db/data-model' import { getProjectId } from 'src/app/util/get-project-id' -import * as yaml from 'js-yaml' +import { DevProjectData } from 'src/app/services/patch-db/data-model' @Component({ selector: 'developer-menu', @@ -19,7 +17,7 @@ import * as yaml from 'js-yaml' }) export class DeveloperMenuPage { readonly projectId = getProjectId(this.route) - projectData: DevProjectData + projectData$ = this.patch.watch$('ui', 'dev', this.projectId) constructor( private readonly route: ActivatedRoute, @@ -27,29 +25,19 @@ export class DeveloperMenuPage { private readonly loadingCtrl: LoadingController, private readonly api: ApiService, private readonly errToast: ErrorToastService, - private readonly destroy$: DestroyService, - private readonly patchDb: PatchDbService, - ) {} + private readonly patch: PatchDbService, + ) { } get name(): string { - return this.patchDb.getData().ui?.dev?.[this.projectId]?.name || '' + return this.patch.getData().ui?.dev?.[this.projectId]?.name || '' } - ngOnInit() { - this.patchDb - .watch$('ui', 'dev', this.projectId) - .pipe(takeUntil(this.destroy$)) - .subscribe(pd => { - this.projectData = pd - }) - } - - async openBasicInfoModal() { + async openBasicInfoModal(data: DevProjectData) { const modal = await this.modalCtrl.create({ component: GenericFormPage, componentProps: { title: 'Basic Info', - spec: getBasicInfoSpec(this.projectData), + spec: getBasicInfoSpec(data), buttons: [ { text: 'Save', diff --git a/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/form-info.ts b/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/form-info.ts index 2525a8b07..e0627d684 100644 --- a/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/form-info.ts +++ b/frontend/projects/ui/src/app/pages/developer-routes/developer-menu/form-info.ts @@ -44,7 +44,7 @@ export function getBasicInfoSpec(devData: DevProjectData): ConfigSpec { }, 'service-version-number': { type: 'string', - name: 'Service Version Number', + name: 'Service Version', description: 'Service version - accepts up to four digits, where the last confirms to revisions necessary for EmbassyOS - see documentation: https://github.com/Start9Labs/emver-rs. This value will change with each release of the service', placeholder: 'e.g. 0.1.2.3', diff --git a/frontend/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts b/frontend/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts index fee14ed47..44b706f54 100644 --- a/frontend/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts +++ b/frontend/projects/ui/src/app/pages/server-routes/server-show/server-show.page.ts @@ -327,8 +327,8 @@ export class ServerShowPage { disabled: of(false), }, { - title: 'Manually Install A Service', - description: `Install a service by drag and drop`, + title: 'Sideload Service', + description: `Manually install any service package`, icon: 'push-outline', action: () => this.navCtrl.navigateForward(['sideload'], { diff --git a/frontend/projects/ui/src/app/pages/server-routes/sideload/sideload.page.html b/frontend/projects/ui/src/app/pages/server-routes/sideload/sideload.page.html index e320fae31..d6d99b5de 100644 --- a/frontend/projects/ui/src/app/pages/server-routes/sideload/sideload.page.html +++ b/frontend/projects/ui/src/app/pages/server-routes/sideload/sideload.page.html @@ -3,7 +3,7 @@ - Manually Install A Service + Sideload Service @@ -21,7 +21,7 @@ color="dark" style="font-size: 42px" > -

To install a service manually, upload the s9pk here

+

Manually upload a service package

Tip: switch to LAN for faster uploads. { + let clonedParams = { ...params } if (params.query) delete params.category - if (params.ids) params.ids = JSON.stringify(params.ids) + if (clonedParams.ids) clonedParams.ids = JSON.stringify(clonedParams.ids) const qp: RR.GetMarketplacePackagesReq = { - ...params, + ...clonedParams, 'eos-version-compat': eosVersionCompat, } diff --git a/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts b/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts index 264d73d1c..68043ffab 100644 --- a/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts +++ b/frontend/projects/ui/src/app/services/pkg-status-rendering.service.ts @@ -144,7 +144,7 @@ export const PrimaryRendering: Record = { }, [PrimaryStatus.Restarting]: { display: 'Restarting', - color: 'warning', + color: 'tertiary', showDots: true, }, [PrimaryStatus.Stopped]: {