mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-15 21:03:41 +00:00
feat: add extension setting tooltip (#247)
This commit is contained in:
4 files changed
+134
-15
No files matched your search
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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,
|
||||||
|
|||||||
Reference in new issue
Block a user