mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 12:11:56 +00:00
sdk input spec improvements (#2785)
* sdk input spec improvements * more sdk changes * fe changes * alpha.14 * fix tests * separate validator in filehelper * use deeppartial for getinput * fix union type and update ts-matches * alpha.15 * alpha.16 * alpha.17 --------- Co-authored-by: Matt Hill <mattnine@protonmail.com>
This commit is contained in:
@@ -268,25 +268,29 @@ const cifsSpec = ISB.InputSpec.of({
|
||||
'The hostname of your target device on the Local Area Network.',
|
||||
warning: null,
|
||||
placeholder: `e.g. 'My Computer' OR 'my-computer.local'`,
|
||||
required: { default: null },
|
||||
required: true,
|
||||
default: null,
|
||||
patterns: [],
|
||||
}),
|
||||
path: ISB.Value.text({
|
||||
name: 'Path',
|
||||
description: `On Windows, this is the fully qualified path to the shared folder, (e.g. /Desktop/my-folder).\n\n On Linux and Mac, this is the literal name of the shared folder (e.g. my-shared-folder).`,
|
||||
placeholder: 'e.g. my-shared-folder or /Desktop/my-folder',
|
||||
required: { default: null },
|
||||
required: true,
|
||||
default: null,
|
||||
}),
|
||||
username: ISB.Value.text({
|
||||
name: 'Username',
|
||||
description: `On Linux, this is the samba username you created when sharing the folder.\n\n On Mac and Windows, this is the username of the user who is sharing the folder.`,
|
||||
required: { default: null },
|
||||
required: true,
|
||||
default: null,
|
||||
placeholder: 'My Network Folder',
|
||||
}),
|
||||
password: ISB.Value.text({
|
||||
name: 'Password',
|
||||
description: `On Linux, this is the samba password you created when sharing the folder.\n\n On Mac and Windows, this is the password of the user who is sharing the folder.`,
|
||||
required: false,
|
||||
default: null,
|
||||
masked: true,
|
||||
placeholder: 'My Network Folder',
|
||||
}),
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
[tuiHintContent]="spec | hint"
|
||||
[disabled]="disabled"
|
||||
[readOnly]="readOnly"
|
||||
[tuiTextfieldCleaner]="!spec.required"
|
||||
[tuiTextfieldCleaner]="false"
|
||||
[pseudoInvalid]="invalid"
|
||||
[(ngModel)]="selected"
|
||||
(focusedChange)="onFocus($event)"
|
||||
>
|
||||
{{ spec.name }}
|
||||
<span *ngIf="spec.required">*</span>
|
||||
{{ spec.name }}*
|
||||
<select
|
||||
tuiSelect
|
||||
[placeholder]="spec.name"
|
||||
|
||||
@@ -697,23 +697,20 @@ interface SettingBtn {
|
||||
const passwordSpec = ISB.InputSpec.of({
|
||||
currentPassword: ISB.Value.text({
|
||||
name: 'Current Password',
|
||||
required: {
|
||||
default: null,
|
||||
},
|
||||
required: true,
|
||||
default: null,
|
||||
masked: true,
|
||||
}),
|
||||
newPassword1: ISB.Value.text({
|
||||
name: 'New Password',
|
||||
required: {
|
||||
default: null,
|
||||
},
|
||||
required: true,
|
||||
default: null,
|
||||
masked: true,
|
||||
}),
|
||||
newPassword2: ISB.Value.text({
|
||||
name: 'Retype New Password',
|
||||
required: {
|
||||
default: null,
|
||||
},
|
||||
required: true,
|
||||
default: null,
|
||||
masked: true,
|
||||
}),
|
||||
})
|
||||
|
||||
@@ -1151,7 +1151,7 @@ export module Mock {
|
||||
name: 'P2P Settings',
|
||||
description:
|
||||
'<p>The Bitcoin Core node to connect to over the peer-to-peer (P2P) interface:</p><ul><li><strong>Bitcoin Core</strong>: The Bitcoin Core service installed on this device</li><li><strong>External Node</strong>: A Bitcoin node running on a different device</li></ul>',
|
||||
required: { default: 'internal' },
|
||||
default: 'internal',
|
||||
},
|
||||
ISB.Variants.of({
|
||||
internal: { name: 'Bitcoin Core', spec: ISB.InputSpec.of({}) },
|
||||
@@ -1160,9 +1160,8 @@ export module Mock {
|
||||
spec: ISB.InputSpec.of({
|
||||
'p2p-host': ISB.Value.text({
|
||||
name: 'Public Address',
|
||||
required: {
|
||||
default: null,
|
||||
},
|
||||
required: false,
|
||||
default: null,
|
||||
description:
|
||||
'The public address of your Bitcoin Core server',
|
||||
}),
|
||||
@@ -1170,9 +1169,8 @@ export module Mock {
|
||||
name: 'P2P Port',
|
||||
description:
|
||||
'The port that your Bitcoin Core P2P server is bound to',
|
||||
required: {
|
||||
default: 8333,
|
||||
},
|
||||
required: true,
|
||||
default: 8333,
|
||||
min: 0,
|
||||
max: 65535,
|
||||
integer: true,
|
||||
@@ -1186,10 +1184,12 @@ export module Mock {
|
||||
color: ISB.Value.color({
|
||||
name: 'Color',
|
||||
required: false,
|
||||
default: null,
|
||||
}),
|
||||
datetime: ISB.Value.datetime({
|
||||
name: 'Datetime',
|
||||
required: false,
|
||||
default: null,
|
||||
}),
|
||||
// file: ISB.Value.file({
|
||||
// name: 'File',
|
||||
@@ -1221,9 +1221,8 @@ export module Mock {
|
||||
ISB.InputSpec.of({
|
||||
rpcuser2: ISB.Value.text({
|
||||
name: 'RPC Username',
|
||||
required: {
|
||||
default: 'defaultrpcusername',
|
||||
},
|
||||
required: false,
|
||||
default: 'defaultrpcusername',
|
||||
description: 'rpc username',
|
||||
patterns: [
|
||||
{
|
||||
@@ -1234,9 +1233,8 @@ export module Mock {
|
||||
}),
|
||||
rpcuser: ISB.Value.text({
|
||||
name: 'RPC Username',
|
||||
required: {
|
||||
default: 'defaultrpcusername',
|
||||
},
|
||||
required: true,
|
||||
default: 'defaultrpcusername',
|
||||
description: 'rpc username',
|
||||
patterns: [
|
||||
{
|
||||
@@ -1247,21 +1245,19 @@ export module Mock {
|
||||
}),
|
||||
rpcpass: ISB.Value.text({
|
||||
name: 'RPC User Password',
|
||||
required: {
|
||||
default: {
|
||||
charset: 'a-z,A-Z,2-9',
|
||||
len: 20,
|
||||
},
|
||||
required: true,
|
||||
default: {
|
||||
charset: 'a-z,A-Z,2-9',
|
||||
len: 20,
|
||||
},
|
||||
description: 'rpc password',
|
||||
}),
|
||||
rpcpass2: ISB.Value.text({
|
||||
name: 'RPC User Password',
|
||||
required: {
|
||||
default: {
|
||||
charset: 'a-z,A-Z,2-9',
|
||||
len: 20,
|
||||
},
|
||||
required: true,
|
||||
default: {
|
||||
charset: 'a-z,A-Z,2-9',
|
||||
len: 20,
|
||||
},
|
||||
description: 'rpc password',
|
||||
}),
|
||||
@@ -1294,14 +1290,14 @@ export module Mock {
|
||||
name: 'First Name',
|
||||
required: false,
|
||||
description: 'User first name',
|
||||
default: 'Matt',
|
||||
}),
|
||||
'last-name': ISB.Value.text({
|
||||
name: 'Last Name',
|
||||
required: {
|
||||
default: {
|
||||
charset: 'a-g,2-9',
|
||||
len: 12,
|
||||
},
|
||||
required: true,
|
||||
default: {
|
||||
charset: 'a-g,2-9',
|
||||
len: 12,
|
||||
},
|
||||
description: 'User first name',
|
||||
patterns: [
|
||||
@@ -1316,6 +1312,7 @@ export module Mock {
|
||||
description: 'The age of the user',
|
||||
warning: 'User must be at least 18.',
|
||||
required: false,
|
||||
default: null,
|
||||
min: 18,
|
||||
integer: false,
|
||||
}),
|
||||
@@ -1343,7 +1340,7 @@ export module Mock {
|
||||
name: 'Preference',
|
||||
description: null,
|
||||
warning: null,
|
||||
required: { default: 'summer' },
|
||||
default: 'summer',
|
||||
},
|
||||
ISB.Variants.of({
|
||||
summer: {
|
||||
@@ -1351,17 +1348,14 @@ export module Mock {
|
||||
spec: ISB.InputSpec.of({
|
||||
'favorite-tree': ISB.Value.text({
|
||||
name: 'Favorite Tree',
|
||||
required: {
|
||||
default: 'Maple',
|
||||
},
|
||||
required: true,
|
||||
default: 'Maple',
|
||||
description: 'What is your favorite tree?',
|
||||
}),
|
||||
'favorite-flower': ISB.Value.select({
|
||||
name: 'Favorite Flower',
|
||||
description: 'Select your favorite flower',
|
||||
required: {
|
||||
default: 'none',
|
||||
},
|
||||
default: 'none',
|
||||
values: {
|
||||
none: 'none',
|
||||
red: 'red',
|
||||
@@ -1392,9 +1386,7 @@ export module Mock {
|
||||
name: 'Random select',
|
||||
description: 'This is not even real.',
|
||||
warning: 'Be careful changing this!',
|
||||
required: {
|
||||
default: null,
|
||||
},
|
||||
default: 'option1',
|
||||
values: {
|
||||
option1: 'option1',
|
||||
option2: 'option2',
|
||||
@@ -1409,9 +1401,8 @@ export module Mock {
|
||||
description: 'Your favorite number of all time',
|
||||
warning:
|
||||
'Once you set this number, it can never be changed without severe consequences.',
|
||||
required: {
|
||||
default: 7,
|
||||
},
|
||||
required: false,
|
||||
default: 7,
|
||||
integer: false,
|
||||
units: 'BTC',
|
||||
},
|
||||
@@ -1432,11 +1423,13 @@ export module Mock {
|
||||
name: 'First Law',
|
||||
required: false,
|
||||
description: 'the first law',
|
||||
default: null,
|
||||
}),
|
||||
law2: ISB.Value.text({
|
||||
name: 'Second Law',
|
||||
required: false,
|
||||
description: 'the second law',
|
||||
default: null,
|
||||
}),
|
||||
}),
|
||||
),
|
||||
@@ -1452,19 +1445,17 @@ export module Mock {
|
||||
spec: ISB.InputSpec.of({
|
||||
rulemakername: ISB.Value.text({
|
||||
name: 'Rulemaker Name',
|
||||
required: {
|
||||
default: {
|
||||
charset: 'a-g,2-9',
|
||||
len: 12,
|
||||
},
|
||||
required: true,
|
||||
default: {
|
||||
charset: 'a-g,2-9',
|
||||
len: 12,
|
||||
},
|
||||
description: 'the name of the rule maker',
|
||||
}),
|
||||
rulemakerip: ISB.Value.text({
|
||||
name: 'Rulemaker IP',
|
||||
required: {
|
||||
default: '192.168.1.0',
|
||||
},
|
||||
required: true,
|
||||
default: '192.168.1.0',
|
||||
description: 'the ip of the rule maker',
|
||||
patterns: [
|
||||
{
|
||||
@@ -1480,9 +1471,8 @@ export module Mock {
|
||||
),
|
||||
rpcuser: ISB.Value.text({
|
||||
name: 'RPC Username',
|
||||
required: {
|
||||
default: 'defaultrpcusername',
|
||||
},
|
||||
required: true,
|
||||
default: 'defaultrpcusername',
|
||||
description: 'rpc username',
|
||||
patterns: [
|
||||
{
|
||||
@@ -1493,11 +1483,10 @@ export module Mock {
|
||||
}),
|
||||
rpcpass: ISB.Value.text({
|
||||
name: 'RPC User Password',
|
||||
required: {
|
||||
default: {
|
||||
charset: 'a-z,A-Z,2-9',
|
||||
len: 20,
|
||||
},
|
||||
required: true,
|
||||
default: {
|
||||
charset: 'a-z,A-Z,2-9',
|
||||
len: 20,
|
||||
},
|
||||
description: 'rpc password',
|
||||
masked: true,
|
||||
@@ -1509,7 +1498,7 @@ export module Mock {
|
||||
name: 'Bitcoin Node',
|
||||
description: 'Options<ul><li>Item 1</li><li>Item 2</li></ul>',
|
||||
warning: 'Careful changing this',
|
||||
required: { default: 'internal' },
|
||||
default: 'internal',
|
||||
},
|
||||
ISB.Variants.of({
|
||||
fake: {
|
||||
@@ -1531,9 +1520,8 @@ export module Mock {
|
||||
ISB.InputSpec.of({
|
||||
name: ISB.Value.text({
|
||||
name: 'Name',
|
||||
required: {
|
||||
default: null,
|
||||
},
|
||||
required: false,
|
||||
default: null,
|
||||
patterns: [
|
||||
{
|
||||
regex: '^[a-zA-Z]+$',
|
||||
@@ -1544,17 +1532,15 @@ export module Mock {
|
||||
email: ISB.Value.text({
|
||||
name: 'Email',
|
||||
inputmode: 'email',
|
||||
required: {
|
||||
default: null,
|
||||
},
|
||||
required: false,
|
||||
default: null,
|
||||
}),
|
||||
}),
|
||||
),
|
||||
'public-domain': ISB.Value.text({
|
||||
name: 'Public Domain',
|
||||
required: {
|
||||
default: 'bitcoinnode.com',
|
||||
},
|
||||
required: true,
|
||||
default: 'bitcoinnode.com',
|
||||
description: 'the public address of the node',
|
||||
patterns: [
|
||||
{
|
||||
@@ -1565,9 +1551,8 @@ export module Mock {
|
||||
}),
|
||||
'private-domain': ISB.Value.text({
|
||||
name: 'Private Domain',
|
||||
required: {
|
||||
default: null,
|
||||
},
|
||||
required: false,
|
||||
default: null,
|
||||
description: 'the private address of the node',
|
||||
masked: true,
|
||||
inputmode: 'url',
|
||||
@@ -1580,9 +1565,8 @@ export module Mock {
|
||||
name: 'Port',
|
||||
description:
|
||||
'the default port for your Bitcoin node. default: 8333, testnet: 18333, regtest: 18444',
|
||||
required: {
|
||||
default: 8333,
|
||||
},
|
||||
required: true,
|
||||
default: 8333,
|
||||
min: 1,
|
||||
max: 9998,
|
||||
step: 1,
|
||||
@@ -1595,6 +1579,7 @@ export module Mock {
|
||||
len: 20,
|
||||
},
|
||||
required: false,
|
||||
default: null,
|
||||
description:
|
||||
'You most favorite slogan in the whole world, used for paying you.',
|
||||
masked: true,
|
||||
|
||||
@@ -135,7 +135,7 @@ export class FormService {
|
||||
return this.formBuilder.control(value)
|
||||
case 'select':
|
||||
value = currentValue === undefined ? spec.default : currentValue
|
||||
return this.formBuilder.control(value, selectValidators(spec))
|
||||
return this.formBuilder.control(value)
|
||||
case 'multiselect':
|
||||
value = currentValue === undefined ? spec.default : currentValue
|
||||
return this.formBuilder.control(value, multiselectValidators(spec))
|
||||
@@ -231,16 +231,6 @@ function numberValidators(spec: IST.ValueSpecNumber): ValidatorFn[] {
|
||||
return validators
|
||||
}
|
||||
|
||||
function selectValidators(spec: IST.ValueSpecSelect): ValidatorFn[] {
|
||||
const validators: ValidatorFn[] = []
|
||||
|
||||
if (spec.required) {
|
||||
validators.push(Validators.required)
|
||||
}
|
||||
|
||||
return validators
|
||||
}
|
||||
|
||||
function multiselectValidators(spec: IST.ValueSpecMultiselect): ValidatorFn[] {
|
||||
const validators: ValidatorFn[] = []
|
||||
validators.push(listInRange(spec.minLength, spec.maxLength))
|
||||
|
||||
Reference in New Issue
Block a user