drew updates

This commit is contained in:
Matt Hill
2021-06-23 11:34:54 -06:00
committed by Aiden McClelland
parent a350e759c7
commit 4cb1e8522a
21 changed files with 257 additions and 33 deletions

View File

@@ -59,7 +59,9 @@
<ion-icon name="aperture-outline"></ion-icon> <ion-icon name="aperture-outline"></ion-icon>
<ion-icon name="arrow-back"></ion-icon> <ion-icon name="arrow-back"></ion-icon>
<ion-icon name="arrow-up"></ion-icon> <ion-icon name="arrow-up"></ion-icon>
<ion-icon name="briefcase-outline"></ion-icon>
<ion-icon name="bookmark-outline"></ion-icon> <ion-icon name="bookmark-outline"></ion-icon>
<ion-icon name="checkmark-outline"></ion-icon>
<ion-icon name="chevron-down"></ion-icon> <ion-icon name="chevron-down"></ion-icon>
<ion-icon name="chevron-up"></ion-icon> <ion-icon name="chevron-up"></ion-icon>
<ion-icon name="chevron-forward"></ion-icon> <!-- needed for detail="true" on ion-item button --> <ion-icon name="chevron-forward"></ion-icon> <!-- needed for detail="true" on ion-item button -->
@@ -71,31 +73,40 @@
<ion-icon name="construct-outline"></ion-icon> <ion-icon name="construct-outline"></ion-icon>
<ion-icon name="copy-outline"></ion-icon> <ion-icon name="copy-outline"></ion-icon>
<ion-icon name="cube-outline"></ion-icon> <ion-icon name="cube-outline"></ion-icon>
<ion-icon name="desktop-outline"></ion-icon>
<ion-icon name="download-outline"></ion-icon> <ion-icon name="download-outline"></ion-icon>
<ion-icon name="ellipse"></ion-icon> <ion-icon name="ellipse"></ion-icon>
<ion-icon name="eye-off-outline"></ion-icon> <ion-icon name="eye-off-outline"></ion-icon>
<ion-icon name="eye-outline"></ion-icon> <ion-icon name="eye-outline"></ion-icon>
<ion-icon name="file-tray-stacked-outline"></ion-icon> <ion-icon name="file-tray-stacked-outline"></ion-icon>
<ion-icon name="finger-print-outline"></ion-icon>
<ion-icon name="flash-outline"></ion-icon> <ion-icon name="flash-outline"></ion-icon>
<ion-icon name="grid-outline"></ion-icon> <ion-icon name="grid-outline"></ion-icon>
<ion-icon name="help-circle-outline"></ion-icon> <ion-icon name="help-circle-outline"></ion-icon>
<ion-icon name="home-outline"></ion-icon> <ion-icon name="home-outline"></ion-icon>
<ion-icon name="information-circle-outline"></ion-icon> <ion-icon name="information-circle-outline"></ion-icon>
<ion-icon name="list-outline"></ion-icon> <ion-icon name="list-outline"></ion-icon>
<ion-icon name="logo-bitcoin"></ion-icon>
<ion-icon name="medkit-outline"></ion-icon>
<ion-icon name="newspaper-outline"></ion-icon> <ion-icon name="newspaper-outline"></ion-icon>
<ion-icon name="notifications-outline"></ion-icon> <ion-icon name="notifications-outline"></ion-icon>
<ion-icon name="rocket-outline"></ion-icon> <ion-icon name="rocket-outline"></ion-icon>
<ion-icon name="power"></ion-icon> <ion-icon name="power"></ion-icon>
<ion-icon name="pulse"></ion-icon> <ion-icon name="pulse"></ion-icon>
<ion-icon name="qr-code-outline"></ion-icon> <ion-icon name="qr-code-outline"></ion-icon>
<ion-icon name="reload-outline"></ion-icon> <ion-icon name="receipt-outline"></ion-icon>
<ion-icon name="refresh-outline"></ion-icon> <ion-icon name="refresh-outline"></ion-icon>
<ion-icon name="reload-outline"></ion-icon>
<ion-icon name="remove-outline"></ion-icon>
<ion-icon name="save-outline"></ion-icon> <ion-icon name="save-outline"></ion-icon>
<ion-icon name="sync-circle-outline"></ion-icon>
<ion-icon name="storefront-outline"></ion-icon> <ion-icon name="storefront-outline"></ion-icon>
<ion-icon name="terminal-outline"></ion-icon> <ion-icon name="terminal-outline"></ion-icon>
<ion-icon name="timer-outline"></ion-icon>
<ion-icon name="trash-outline"></ion-icon> <ion-icon name="trash-outline"></ion-icon>
<ion-icon name="warning-outline"></ion-icon> <ion-icon name="warning-outline"></ion-icon>
<ion-icon name="wifi"></ion-icon> <ion-icon name="wifi"></ion-icon>
<!-- Ionic components --> <!-- Ionic components -->
<ion-action-sheet></ion-action-sheet> <ion-action-sheet></ion-action-sheet>
<ion-alert></ion-alert> <ion-alert></ion-alert>
@@ -149,3 +160,4 @@
</section> </section>
</ion-app> </ion-app>

View File

@@ -0,0 +1,10 @@
<div class="slide-content">
<div style="margin-top: 25px;">
<div style="margin: 15px; display: flex; justify-content: center; align-items: center;">
<ion-label [color]="params.titleColor" style="font-size: xx-large; font-weight: bold;">
{{ params.title }}
</ion-label>
</div>
<div class="long-message" [innerHTML]="params.notes | markdown"></div>
</div>
</div>

View File

@@ -0,0 +1,20 @@
import { NgModule } from '@angular/core'
import { CommonModule } from '@angular/common'
import { AlertComponent } from './alert.component'
import { IonicModule } from '@ionic/angular'
import { RouterModule } from '@angular/router'
import { SharingModule } from 'src/app/modules/sharing.module'
@NgModule({
declarations: [
AlertComponent,
],
imports: [
CommonModule,
IonicModule,
RouterModule.forChild([]),
SharingModule,
],
exports: [AlertComponent],
})
export class AlertComponentModule { }

View File

@@ -0,0 +1,24 @@
import { Component, Input, OnInit } from '@angular/core'
import { BehaviorSubject, Subject } from 'rxjs'
import { Loadable } from '../loadable'
@Component({
selector: 'alert',
templateUrl: './alert.component.html',
styleUrls: ['../install-wizard.component.scss'],
})
export class AlertComponent implements OnInit, Loadable {
@Input() params: {
alert: string
title: string
titleColor: string
}
loading$ = new BehaviorSubject(false)
cancel$ = new Subject<void>()
load () { }
constructor () { }
ngOnInit () { }
}

View File

@@ -7,6 +7,7 @@ import { SharingModule } from 'src/app/modules/sharing.module'
import { DependentsComponentModule } from './dependents/dependents.component.module' import { DependentsComponentModule } from './dependents/dependents.component.module'
import { CompleteComponentModule } from './complete/complete.component.module' import { CompleteComponentModule } from './complete/complete.component.module'
import { NotesComponentModule } from './notes/notes.component.module' import { NotesComponentModule } from './notes/notes.component.module'
import { AlertComponentModule } from './alert/alert.component.module'
@NgModule({ @NgModule({
declarations: [ declarations: [
@@ -20,6 +21,7 @@ import { NotesComponentModule } from './notes/notes.component.module'
DependentsComponentModule, DependentsComponentModule,
CompleteComponentModule, CompleteComponentModule,
NotesComponentModule, NotesComponentModule,
AlertComponentModule,
], ],
exports: [InstallWizardComponent], exports: [InstallWizardComponent],
}) })

View File

@@ -4,6 +4,7 @@ import { BehaviorSubject } from 'rxjs'
import { capitalizeFirstLetter, pauseFor } from 'src/app/util/misc.util' import { capitalizeFirstLetter, pauseFor } from 'src/app/util/misc.util'
import { CompleteComponent } from './complete/complete.component' import { CompleteComponent } from './complete/complete.component'
import { DependentsComponent } from './dependents/dependents.component' import { DependentsComponent } from './dependents/dependents.component'
import { AlertComponent } from './alert/alert.component'
import { NotesComponent } from './notes/notes.component' import { NotesComponent } from './notes/notes.component'
import { Loadable } from './loadable' import { Loadable } from './loadable'
import { WizardAction } from './wizard-types' import { WizardAction } from './wizard-types'
@@ -92,6 +93,7 @@ export interface SlideDefinition {
slide: slide:
{ selector: 'dependents', params: DependentsComponent['params'] } | { selector: 'dependents', params: DependentsComponent['params'] } |
{ selector: 'complete', params: CompleteComponent['params'] } | { selector: 'complete', params: CompleteComponent['params'] } |
{ selector: 'alert', params: AlertComponent['params'] } |
{ selector: 'notes', params: NotesComponent['params'] } { selector: 'notes', params: NotesComponent['params'] }
bottomBar: { bottomBar: {
cancel: { cancel: {

View File

@@ -2,9 +2,12 @@
<div style="margin-top: 25px;"> <div style="margin-top: 25px;">
<div style="margin: 15px; display: flex; justify-content: center; align-items: center;"> <div style="margin: 15px; display: flex; justify-content: center; align-items: center;">
<ion-label [color]="params.titleColor" style="font-size: xx-large; font-weight: bold;"> <ion-label [color]="params.titleColor" style="font-size: xx-large; font-weight: bold;">
{{params.title}} {{ params.title }}
</ion-label> </ion-label>
</div> </div>
<div class="long-message" [innerHTML]="params.notes | markdown"></div> <div *ngFor="let note of params.notes | keyvalue : asIsOrder">
<h2>{{ note.key }}</h2>
<div class="long-message" [innerHTML]="note.value | markdown"></div>
</div>
</div> </div>
</div> </div>

View File

@@ -9,7 +9,7 @@ import { Loadable } from '../loadable'
}) })
export class NotesComponent implements OnInit, Loadable { export class NotesComponent implements OnInit, Loadable {
@Input() params: { @Input() params: {
notes: string notes: { [version: string]: string }
title: string title: string
titleColor: string titleColor: string
} }
@@ -21,4 +21,8 @@ export class NotesComponent implements OnInit, Loadable {
constructor () { } constructor () { }
ngOnInit () { } ngOnInit () { }
asIsOrder () {
return 0
}
} }

View File

@@ -27,9 +27,9 @@ export class WizardBaker {
const slideDefinitions: SlideDefinition[] = [ const slideDefinitions: SlideDefinition[] = [
installAlert ? { installAlert ? {
slide: { slide: {
selector: 'notes', selector: 'alert',
params: { params: {
notes: installAlert, alert: installAlert,
title: 'Warning', title: 'Warning',
titleColor: 'warning', titleColor: 'warning',
}, },
@@ -72,9 +72,9 @@ export class WizardBaker {
const slideDefinitions: SlideDefinition[] = [ const slideDefinitions: SlideDefinition[] = [
installAlert ? { installAlert ? {
slide: { slide: {
selector: 'notes', selector: 'alert',
params: { params: {
notes: installAlert, alert: installAlert,
title: 'Warning', title: 'Warning',
titleColor: 'warning', titleColor: 'warning',
}, },
@@ -120,7 +120,7 @@ export class WizardBaker {
} }
updateOS (values: { updateOS (values: {
version: string, releaseNotes: string version: string, releaseNotes: { [version: string]: string }
}): InstallWizardComponent['params'] { }): InstallWizardComponent['params'] {
const { version, releaseNotes } = values const { version, releaseNotes } = values
@@ -176,9 +176,9 @@ export class WizardBaker {
const slideDefinitions: SlideDefinition[] = [ const slideDefinitions: SlideDefinition[] = [
installAlert ? { installAlert ? {
slide: { slide: {
selector: 'notes', selector: 'alert',
params: { params: {
notes: installAlert, alert: installAlert,
title: 'Warning', title: 'Warning',
titleColor: 'warning', titleColor: 'warning',
}, },
@@ -232,9 +232,9 @@ export class WizardBaker {
const slideDefinitions: SlideDefinition[] = [ const slideDefinitions: SlideDefinition[] = [
{ {
slide: { slide: {
selector: 'notes', selector: 'alert',
params: { params: {
notes: uninstallAlert || defaultUninstallationWarning(title), alert: uninstallAlert || defaultUninstallationWarning(title),
title: 'Warning', title: 'Warning',
titleColor: 'warning', titleColor: 'warning',
}, },

View File

@@ -255,18 +255,19 @@ export enum PackageMainStatus {
Restoring = 'restoring', Restoring = 'restoring',
} }
export type HealthCheckResult = HealthCheckResultWarmingUp | HealthCheckResultDisabled | HealthCheckResultSuccess | HealthCheckResultFailure export type HealthCheckResult = HealthCheckResultStarting | HealthCheckResultLoading | HealthCheckResultDisabled | HealthCheckResultSuccess | HealthCheckResultFailure
export enum HealthResult { export enum HealthResult {
WarmingUp = 'warming-up', Starting = 'starting',
Loading = 'loading',
Disabled = 'disabled', Disabled = 'disabled',
Success = 'success', Success = 'success',
Failure = 'failure', Failure = 'failure',
} }
export interface HealthCheckResultWarmingUp { export interface HealthCheckResultStarting {
time: string // UTC date string time: string // UTC date string
result: HealthResult.WarmingUp result: HealthResult.Starting
} }
export interface HealthCheckResultDisabled { export interface HealthCheckResultDisabled {
@@ -279,6 +280,12 @@ export interface HealthCheckResultSuccess {
result: HealthResult.Success result: HealthResult.Success
} }
export interface HealthCheckResultLoading {
time: string // UTC date string
result: HealthResult.Loading
message: string
}
export interface HealthCheckResultFailure { export interface HealthCheckResultFailure {
time: string // UTC date string time: string // UTC date string
result: HealthResult.Failure result: HealthResult.Failure

View File

@@ -73,7 +73,7 @@ export class AppAvailableListPage {
this.modalCtrl, this.modalCtrl,
this.wizardBaker.updateOS({ this.wizardBaker.updateOS({
version: this.eos.version, version: this.eos.version,
releaseNotes: this.eos.notes, releaseNotes: this.eos['release-notes'],
}), }),
) )
} }

View File

@@ -97,10 +97,16 @@
<ion-item-group> <ion-item-group>
<!-- release notes --> <!-- release notes -->
<ion-item-divider style="color: var(--ion-color-dark); font-weight: bold;">New in {{ pkg.manifest.version | displayEmver }}</ion-item-divider> <ion-item-divider style="color: var(--ion-color-dark); font-weight: bold;">
New in {{ pkg.manifest.version | displayEmver }}
<ion-button [routerLink]="['notes']" style="position: absolute; right: 10px;" fill="clear" color="primary" >
Version History
<ion-icon slot="end" name="arrow-forward-outline"></ion-icon>
</ion-button>
</ion-item-divider>
<ion-item lines="none"> <ion-item lines="none">
<ion-label style="display: flex; align-items: center; justify-content: space-between;" class="ion-text-wrap" > <ion-label style="display: flex; align-items: center; justify-content: space-between;" class="ion-text-wrap" >
<div id='release-notes' color="dark" [innerHTML]="pkg.manifest['release-notes'] | markdown"></div> <div id='release-notes' [innerHTML]="pkg.manifest['release-notes'] | markdown"></div>
</ion-label> </ion-label>
</ion-item> </ion-item>
<!-- description --> <!-- description -->

View File

@@ -23,7 +23,8 @@
<ion-label> <ion-label>
<div *ngFor="let health of pkg.installed.status.main.health | keyvalue : asIsOrder" class="align" style="margin-left: 12px;"> <div *ngFor="let health of pkg.installed.status.main.health | keyvalue : asIsOrder" class="align" style="margin-left: 12px;">
<ion-icon *ngIf="health.value.result === 'success'" name="checkmark-outline" color="success"></ion-icon> <ion-icon *ngIf="health.value.result === 'success'" name="checkmark-outline" color="success"></ion-icon>
<ion-icon *ngIf="health.value.result === 'warming-up'" name="timer-outline" color="warning"></ion-icon> <ion-icon *ngIf="health.value.result === 'starting'" name="timer-outline" color="warning"></ion-icon>
<ion-icon *ngIf="health.value.result === 'loading'" name="sync-circle-outline" color="warning"></ion-icon>
<ion-icon *ngIf="health.value.result === 'failure'" name="close-outline" color="danger"></ion-icon> <ion-icon *ngIf="health.value.result === 'failure'" name="close-outline" color="danger"></ion-icon>
<ion-icon *ngIf="health.value.result === 'disabled'" name="remove-outline" color="medium"></ion-icon> <ion-icon *ngIf="health.value.result === 'disabled'" name="remove-outline" color="medium"></ion-icon>
<h2>{{ health.key }}</h2> <h2>{{ health.key }}</h2>

View File

@@ -0,0 +1,26 @@
import { NgModule } from '@angular/core'
import { CommonModule } from '@angular/common'
import { Routes, RouterModule } from '@angular/router'
import { IonicModule } from '@ionic/angular'
import { AppReleaseNotesList } from './app-release-notes-list.page'
import { PwaBackComponentModule } from 'src/app/components/pwa-back-button/pwa-back.component.module'
import { SharingModule } from 'src/app/modules/sharing.module'
const routes: Routes = [
{
path: '',
component: AppReleaseNotesList,
},
]
@NgModule({
imports: [
CommonModule,
IonicModule,
RouterModule.forChild(routes),
PwaBackComponentModule,
SharingModule,
],
declarations: [AppReleaseNotesList],
})
export class AppReleaseNotesListModule { }

View File

@@ -0,0 +1,12 @@
<ion-header>
<ion-toolbar>
<ion-buttons slot="start">
<pwa-back-button></pwa-back-button>
</ion-buttons>
<ion-title>Version History</ion-title>
</ion-toolbar>
</ion-header>
<ion-content *ngIf="pkg">
hello
</ion-content>

View File

@@ -0,0 +1,3 @@
.metric-note {
font-size: 16px;
}

View File

@@ -0,0 +1,42 @@
import { Component } from '@angular/core'
import { ActivatedRoute } from '@angular/router'
import { PackageDataEntry } from 'src/app/models/patch-db/data-model'
import { AvailableShow } from 'src/app/services/api/api-types'
import { ApiService } from 'src/app/services/api/api.service'
@Component({
selector: 'app-release-notes-list',
templateUrl: './app-release-notes-list.page.html',
styleUrls: ['./app-release-notes-list.page.scss'],
})
export class AppReleaseNotesList {
loading = true
pkgId: string
pkg: AvailableShow
constructor (
private readonly route: ActivatedRoute,
private readonly apiService: ApiService,
) { }
ngOnInit () {
this.pkgId = this.route.snapshot.paramMap.get('pkgId')
}
async getPkg (version?: string): Promise<void> {
this.loading = true
try {
this.pkg = await this.apiService.getAvailableShow({ id: this.pkgId, version })
} catch (e) {
console.error(e)
this.error = e.message
} finally {
this.loading = false
}
}
asIsOrder (a: any, b: any) {
return 0
}
}

View File

@@ -63,6 +63,10 @@ const routes: Routes = [
path: 'marketplace/:pkgId', path: 'marketplace/:pkgId',
loadChildren: () => import('./app-available-show/app-available-show.module').then(m => m.AppAvailableShowPageModule), loadChildren: () => import('./app-available-show/app-available-show.module').then(m => m.AppAvailableShowPageModule),
}, },
{
path: 'marketplace/:pkgId/notes',
loadChildren: () => import('./app-release-notes-list/app-release-notes-list.module').then(m => m.AppReleaseNotesListModule),
},
] ]
@NgModule({ @NgModule({

View File

@@ -174,7 +174,7 @@ export interface MarketplaceData {
export interface MarketplaceEOS { export interface MarketplaceEOS {
version: string version: string
headline: string headline: string
notes: string 'release-notes': { [version: string]: string }
} }
export interface AvailablePreview { export interface AvailablePreview {
@@ -195,7 +195,8 @@ export interface AvailableShow {
title: string title: string
icon: URL icon: URL
} }
} },
'release-notes': { [version: string]: string }
} }
export interface Breakages { export interface Breakages {

View File

@@ -7,7 +7,7 @@ export module Mock {
export const MarketplaceEos: RR.GetMarketplaceEOSRes = { export const MarketplaceEos: RR.GetMarketplaceEOSRes = {
version: '1.0.0', version: '1.0.0',
headline: 'Our biggest release ever.', headline: 'Our biggest release ever.',
notes: markdown, 'release-notes': { '1.0.0': markdown },
} }
export const AvailableList: RR.GetAvailableListRes = [ export const AvailableList: RR.GetAvailableListRes = [
@@ -400,45 +400,66 @@ export module Mock {
} }
} = { } = {
'bitcoind': { 'bitcoind': {
'0.19.0': { '0.19.2': {
icon: 'assets/img/service-icons/bitcoind.png', icon: 'assets/img/service-icons/bitcoind.png',
manifest: { manifest: {
...Mock.MockManifestBitcoind, ...Mock.MockManifestBitcoind,
version: '0.19.0', version: '0.19.0',
'release-notes': 'release notes for Bitcoin 0.19.0',
}, },
categories: ['bitcoin', 'cryptocurrency'], categories: ['bitcoin', 'cryptocurrency'],
versions: ['0.19.0', '0.20.0', '0.21.0'], versions: ['0.19.0', '0.20.0', '0.21.0'],
'dependency-metadata': { }, 'dependency-metadata': { },
'release-notes': {
'0.19.0': 'release notes for Bitcoin 0.19.0',
'0.19.1': 'release notes for Bitcoin 0.19.1',
'0.19.2': 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.',
},
}, },
'0.20.0': { '0.20.0': {
icon: 'assets/img/service-icons/bitcoind.png', icon: 'assets/img/service-icons/bitcoind.png',
manifest: { manifest: {
...Mock.MockManifestBitcoind, ...Mock.MockManifestBitcoind,
version: '0.20.0', version: '0.20.0',
'release-notes': 'release notes for Bitcoin 0.20.0',
}, },
categories: ['bitcoin', 'cryptocurrency'], categories: ['bitcoin', 'cryptocurrency'],
versions: ['0.19.0', '0.20.0', '0.21.0'], versions: ['0.19.0', '0.20.0', '0.21.0'],
'dependency-metadata': { }, 'dependency-metadata': { },
'release-notes': {
'0.19.0': 'release notes for Bitcoin 0.19.0',
'0.19.1': 'release notes for Bitcoin 0.19.1',
'0.19.2': 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.',
},
}, },
'0.21.0': { '0.21.0': {
icon: 'assets/img/service-icons/bitcoind.png', icon: 'assets/img/service-icons/bitcoind.png',
manifest: { manifest: {
...Mock.MockManifestBitcoind, ...Mock.MockManifestBitcoind,
version: '0.21.0', version: '0.21.0',
'release-notes': 'release notes for Bitcoin 0.20.0', 'release-notes': 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.',
}, },
categories: ['bitcoin', 'cryptocurrency'], categories: ['bitcoin', 'cryptocurrency'],
versions: ['0.19.0', '0.20.0', '0.21.0'], versions: ['0.19.0', '0.20.0', '0.21.0'],
'dependency-metadata': { }, 'dependency-metadata': { },
'release-notes': {
'0.19.0': 'release notes for Bitcoin 0.19.0',
'0.19.1': 'release notes for Bitcoin 0.19.1',
'0.19.2': 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.',
},
}, },
'latest': { 'latest': {
icon: 'assets/img/service-icons/bitcoind.png', icon: 'assets/img/service-icons/bitcoind.png',
manifest: Mock.MockManifestBitcoind, manifest: {
...Mock.MockManifestBitcoind,
'release-notes': 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.',
},
categories: ['bitcoin', 'cryptocurrency'], categories: ['bitcoin', 'cryptocurrency'],
versions: ['0.19.0', '0.20.0', '0.21.0'], versions: ['0.19.0', '0.20.0', '0.21.0'],
'dependency-metadata': { }, 'dependency-metadata': { },
'release-notes': {
'0.19.2': 'release notes for Bitcoin 0.19.2',
'0.20.0': 'release notes for Bitcoin 0.20.0',
'0.21.0': 'Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.',
},
}, },
}, },
'lnd': { 'lnd': {
@@ -461,6 +482,11 @@ export module Mock {
icon: 'assets/img/service-icons/bitcoin-proxy.png', icon: 'assets/img/service-icons/bitcoin-proxy.png',
}, },
}, },
'release-notes': {
'0.19.0': 'release notes for LND 0.19.0',
'0.19.1': 'release notes for LND 0.19.1',
'0.19.2': 'release notes for LND 0.19.2',
},
}, },
'0.11.1': { '0.11.1': {
icon: 'assets/img/service-icons/lnd.png', icon: 'assets/img/service-icons/lnd.png',
@@ -481,6 +507,11 @@ export module Mock {
icon: 'assets/img/service-icons/bitcoin-proxy.png', icon: 'assets/img/service-icons/bitcoin-proxy.png',
}, },
}, },
'release-notes': {
'0.19.0': 'release notes for LND 0.19.0',
'0.19.1': 'release notes for LND 0.19.1',
'0.19.2': 'release notes for LND 0.19.2',
},
}, },
'latest': { 'latest': {
icon: 'assets/img/service-icons/lnd.png', icon: 'assets/img/service-icons/lnd.png',
@@ -497,6 +528,11 @@ export module Mock {
icon: 'assets/img/service-icons/bitcoin-proxy.png', icon: 'assets/img/service-icons/bitcoin-proxy.png',
}, },
}, },
'release-notes': {
'0.19.0': 'release notes for LND 0.19.0',
'0.19.1': 'release notes for LND 0.19.1',
'0.19.2': 'release notes for LND 0.19.2',
},
}, },
}, },
'bitcoin-proxy': { 'bitcoin-proxy': {
@@ -511,6 +547,11 @@ export module Mock {
icon: 'assets/img/service-icons/bitcoind.png', icon: 'assets/img/service-icons/bitcoind.png',
}, },
}, },
'release-notes': {
'0.19.0': 'release notes for btc proxy 0.19.0',
'0.19.1': 'release notes for btc proxy 0.19.1',
'0.19.2': 'release notes for btc proxy 0.19.2',
},
}, },
}, },
} }

View File

@@ -1,4 +1,4 @@
import { HealthCheckResultWarmingUp, MainStatus, MainStatusRunning, PackageDataEntry, PackageMainStatus, PackageState, Status } from '../models/patch-db/data-model' import { HealthCheckResultLoading, MainStatusRunning, PackageDataEntry, PackageMainStatus, PackageState, Status } from '../models/patch-db/data-model'
import { ConnectionState } from './connection.service' import { ConnectionState } from './connection.service'
export function renderPkgStatus (pkg: PackageDataEntry, connection: ConnectionState): PkgStatusRendering { export function renderPkgStatus (pkg: PackageDataEntry, connection: ConnectionState): PkgStatusRendering {
@@ -35,8 +35,11 @@ function handleInstalledState (status: Status): PkgStatusRendering {
function handleRunningState (status: MainStatusRunning): PkgStatusRendering { function handleRunningState (status: MainStatusRunning): PkgStatusRendering {
if (Object.values(status.health).some(h => h.result === 'failure')) { if (Object.values(status.health).some(h => h.result === 'failure')) {
return { display: 'Needs Attention', color: 'danger', showDots: false, feStatus: FEStatus.NeedsAttention } return { display: 'Needs Attention', color: 'danger', showDots: false, feStatus: FEStatus.NeedsAttention }
} else if (Object.values(status.health).some(h => h.result === 'warming-up')) { } else if (Object.values(status.health).some(h => h.result === 'starting')) {
return { display: 'Starting Up', color: 'warning', showDots: true, feStatus: FEStatus.StartingUp } return { display: 'Starting Up', color: 'warning', showDots: true, feStatus: FEStatus.Starting }
} else if (Object.values(status.health).some(h => h.result === 'loading')) {
const firstLoading = Object.values(status.health).find(h => h.result === 'loading') as HealthCheckResultLoading
return { display: firstLoading.message, color: 'warning', showDots: true, feStatus: FEStatus.Loading }
} else { } else {
return { display: 'Running', color: 'success', showDots: false, feStatus: FEStatus.Running } return { display: 'Running', color: 'success', showDots: false, feStatus: FEStatus.Running }
} }
@@ -63,8 +66,9 @@ export enum FEStatus {
Restoring = 'restoring', Restoring = 'restoring',
// FE // FE
NeedsAttention = 'needs-attention', NeedsAttention = 'needs-attention',
StartingUp = 'starting-up', Starting = 'starting',
Connecting = 'connecting', Connecting = 'connecting',
DependencyIssue = 'dependency-issue', DependencyIssue = 'dependency-issue',
NeedsConfig = 'needs-config', NeedsConfig = 'needs-config',
Loading = 'loading',
} }