feat: add extension setting tooltip (#247)

This commit is contained in:
Levi authored and GitHub committed 2023-10-21 16:16:46 +08:00
1 parent 32e3620f5e
commit 256faf2cbd
4 files changed
+134 -15

No files matched your search

+44 -2
View File
@@ -422,8 +422,50 @@ func (e *Extension) update(newExt *Extension) error {
e.Homepage = newExt.Homepage e.Homepage = newExt.Homepage
e.Repository = newExt.Repository e.Repository = newExt.Repository
e.Scripts = newExt.Scripts e.Scripts = newExt.Scripts
// don't override settings // merge settings
//e.Settings = newExt.Settings // if new setting not exist in old settings, append it
for _, newSetting := range newExt.Settings {
var exist bool
for _, setting := range e.Settings {
if setting.Name == newSetting.Name {
exist = true
break
}
}
if !exist {
e.Settings = append(e.Settings, newSetting)
}
}
// if old setting not exist in new settings, remove it
for i := 0; i < len(e.Settings); i++ {
var exist bool
for _, setting := range newExt.Settings {
if setting.Name == e.Settings[i].Name {
exist = true
break
}
}
if !exist {
e.Settings = append(e.Settings[:i], e.Settings[i+1:]...)
i--
}
}
// if new setting exist in old settings, update it
for _, newSetting := range newExt.Settings {
for _, setting := range e.Settings {
if setting.Name == newSetting.Name {
setting.Title = newSetting.Title
setting.Description = newSetting.Description
setting.Options = newSetting.Options
// if type changed, reset value
if setting.Type != newSetting.Type {
setting.Type = newSetting.Type
setting.Value = newSetting.Value
}
break
}
}
}
e.UpdatedAt = time.Now() e.UpdatedAt = time.Now()
return nil return nil
} }
+33 -3
View File
@@ -95,6 +95,15 @@ func TestDownloader_InstallExtensionByGitFull(t *testing.T) {
} }
func TestDownloader_UpgradeExtension(t *testing.T) { func TestDownloader_UpgradeExtension(t *testing.T) {
getSetting := func(settings []*Setting, name string) *Setting {
for _, setting := range settings {
if setting.Name == name {
return setting
}
}
return nil
}
setupDownloader(func(downloader *Downloader) { setupDownloader(func(downloader *Downloader) {
installedExt, err := downloader.InstallExtensionByFolder("./testdata/extensions/update", false) installedExt, err := downloader.InstallExtensionByFolder("./testdata/extensions/update", false)
if err != nil { if err != nil {
@@ -122,14 +131,35 @@ func TestDownloader_UpgradeExtension(t *testing.T) {
t.Fatal("extension update fail") t.Fatal("extension update fail")
} }
// check setting update
s1 := getSetting(upgradeExt.Settings, "s1")
if s1.Title == "S1 old" {
t.Fatal("setting update fail")
}
// check setting type update
s2 := getSetting(upgradeExt.Settings, "s2")
if s2.Type == "number" {
t.Fatal("setting type update fail")
}
// check setting remove
d1 := getSetting(upgradeExt.Settings, "d1")
if d1 != nil {
t.Fatal("setting remove fail")
}
// check setting add
s3 := getSetting(upgradeExt.Settings, "s3")
if s3 == nil {
t.Fatal("setting add fail")
}
rr, err := downloader.Resolve(&base.Request{ rr, err := downloader.Resolve(&base.Request{
URL: "https://github.com/GopeedLab/gopeed/releases", URL: "https://test.com",
}) })
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if len(rr.Res.Files) == 1 { if rr.Res.Name != "test" {
t.Fatal("resolve error") t.Fatal("script update fail")
} }
}) })
} }
+28 -4
View File
@@ -1,13 +1,13 @@
{ {
"name": "github-release", "name": "extension-test",
"author": "gopeed", "author": "gopeed",
"title": "Github Release", "title": "Gopeed Extension Test",
"description": "Download github release assets", "description": "Test extension settings and upgrade",
"version": "0.0.1", "version": "0.0.1",
"homepage": "https://gopeed.com", "homepage": "https://gopeed.com",
"repository": { "repository": {
"url": "https://github.com/GopeedLab/gopeed-extension-samples", "url": "https://github.com/GopeedLab/gopeed-extension-samples",
"directory": "github-release-sample" "directory": "extension-test"
}, },
"scripts": [ "scripts": [
{ {
@@ -19,5 +19,29 @@
}, },
"entry": "index.js" "entry": "index.js"
} }
],
"settings": [
{
"name": "s1",
"title": "S1 old",
"description": "Test setting update",
"type": "string",
"required": true
},
{
"name": "s2",
"title": "s2 number old",
"description": "Test setting type update",
"type": "number",
"required": true,
"value": 1
},
{
"name": "d1",
"title": "Delete test",
"description": "Test setting delete",
"type": "string",
"required": true
}
] ]
} }
@@ -256,9 +256,32 @@ class ExtensionView extends GetView<ExtensionController> {
Expanded( Expanded(
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
children: extension.settings! children: extension.settings!.map((e) {
.map((e) => _buildSettingItem(e)) final settingItem = _buildSettingItem(e);
.toList()),
return Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
SizedBox(
width: 20,
child: e.description.isEmpty
? null
: Tooltip(
message: e.description,
child: const CircleAvatar(
radius: 10,
backgroundColor:
Colors.grey,
child: Icon(
Icons.question_mark,
size: 10,
)),
))
.paddingOnly(right: 10),
Expanded(child: settingItem),
],
);
}).toList()),
), ),
), ),
]), ]),
@@ -324,8 +347,7 @@ class ExtensionView extends GetView<ExtensionController> {
FormFieldValidator<String>? validator, TextInputType? keyBoardType) { FormFieldValidator<String>? validator, TextInputType? keyBoardType) {
return FormBuilderTextField( return FormBuilderTextField(
name: setting.name, name: setting.name,
decoration: InputDecoration( decoration: InputDecoration(labelText: setting.title),
labelText: setting.title, hintText: setting.description),
initialValue: setting.value?.toString(), initialValue: setting.value?.toString(),
inputFormatters: inputFormatter != null ? [inputFormatter] : null, inputFormatters: inputFormatter != null ? [inputFormatter] : null,
keyboardType: keyBoardType, keyboardType: keyBoardType,
@@ -340,7 +362,8 @@ class ExtensionView extends GetView<ExtensionController> {
return FormBuilderDropdown<String>( return FormBuilderDropdown<String>(
name: setting.name, name: setting.name,
decoration: InputDecoration( decoration: InputDecoration(
labelText: setting.title, hintText: setting.description), labelText: setting.title,
),
initialValue: setting.value?.toString(), initialValue: setting.value?.toString(),
validator: FormBuilderValidators.compose([ validator: FormBuilderValidators.compose([
requiredValidator, requiredValidator,