PLT-7709 Add UI settings to plugin manifest (#7794)
* Add UI settings to plugin manifest * Add another test case * Add options field to setting * Updates per feedback * Report diagnostics on if plugins have settings set * Add regenerate_help_text field
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
1d1998c668
Коммит
5ef7277521
@@ -499,6 +499,7 @@ func (a *App) trackPlugins() {
|
|||||||
totalInactiveCount := -1 // -1 to indicate disabled or error
|
totalInactiveCount := -1 // -1 to indicate disabled or error
|
||||||
webappInactiveCount := 0
|
webappInactiveCount := 0
|
||||||
backendInactiveCount := 0
|
backendInactiveCount := 0
|
||||||
|
settingsCount := 0
|
||||||
|
|
||||||
plugins, _ := a.GetPluginManifests()
|
plugins, _ := a.GetPluginManifests()
|
||||||
|
|
||||||
@@ -513,6 +514,10 @@ func (a *App) trackPlugins() {
|
|||||||
if plugin.Backend != nil {
|
if plugin.Backend != nil {
|
||||||
backendActiveCount += 1
|
backendActiveCount += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if plugin.SettingsSchema != nil {
|
||||||
|
settingsCount += 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
totalInactiveCount = len(plugins.Inactive)
|
totalInactiveCount = len(plugins.Inactive)
|
||||||
@@ -525,6 +530,10 @@ func (a *App) trackPlugins() {
|
|||||||
if plugin.Backend != nil {
|
if plugin.Backend != nil {
|
||||||
backendInactiveCount += 1
|
backendInactiveCount += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if plugin.SettingsSchema != nil {
|
||||||
|
settingsCount += 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,6 +544,7 @@ func (a *App) trackPlugins() {
|
|||||||
"inactive_plugins": totalInactiveCount,
|
"inactive_plugins": totalInactiveCount,
|
||||||
"inactive_webapp_plugins": webappInactiveCount,
|
"inactive_webapp_plugins": webappInactiveCount,
|
||||||
"inactive_backend_plugins": backendInactiveCount,
|
"inactive_backend_plugins": backendInactiveCount,
|
||||||
|
"plugins_with_settings": settingsCount,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
||||||
// See License.txt for license information.
|
// See License.txt for license information.
|
||||||
|
|
||||||
package model
|
package model
|
||||||
@@ -13,13 +13,42 @@ import (
|
|||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PLUGIN_CONFIG_TYPE_TEXT = "text"
|
||||||
|
PLUGIN_CONFIG_TYPE_BOOL = "bool"
|
||||||
|
PLUGIN_CONFIG_TYPE_RADIO = "radio"
|
||||||
|
PLUGIN_CONFIG_TYPE_DROPDOWN = "dropdown"
|
||||||
|
PLUGIN_CONFIG_TYPE_GENERATED = "generated"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PluginOption struct {
|
||||||
|
DisplayName string `json:"display_name" yaml:"display_name"`
|
||||||
|
Value string `json:"value" yaml:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type PluginSetting struct {
|
||||||
|
DisplayName string `json:"display_name" yaml:"display_name"`
|
||||||
|
Type string `json:"type" yaml:"type"`
|
||||||
|
HelpText string `json:"help_text" yaml:"help_text"`
|
||||||
|
RegenerateHelpText string `json:"regenerate_help_text,omitempty" yaml:"regenerate_help_text,omitempty"`
|
||||||
|
Default interface{} `json:"default" yaml:"default"`
|
||||||
|
Options []*PluginOption `json:"options,omitempty" yaml:"options,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type PluginSettingsSchema struct {
|
||||||
|
Header string `json:"header" yaml:"header"`
|
||||||
|
Footer string `json:"footer" yaml:"footer"`
|
||||||
|
Settings map[string]*PluginSetting `json:"settings" yaml:"settings"`
|
||||||
|
}
|
||||||
|
|
||||||
type Manifest struct {
|
type Manifest struct {
|
||||||
Id string `json:"id" yaml:"id"`
|
Id string `json:"id" yaml:"id"`
|
||||||
Name string `json:"name,omitempty" yaml:"name,omitempty"`
|
Name string `json:"name,omitempty" yaml:"name,omitempty"`
|
||||||
Description string `json:"description,omitempty" yaml:"description,omitempty"`
|
Description string `json:"description,omitempty" yaml:"description,omitempty"`
|
||||||
Version string `json:"version" yaml:"version"`
|
Version string `json:"version" yaml:"version"`
|
||||||
Backend *ManifestBackend `json:"backend,omitempty" yaml:"backend,omitempty"`
|
Backend *ManifestBackend `json:"backend,omitempty" yaml:"backend,omitempty"`
|
||||||
Webapp *ManifestWebapp `json:"webapp,omitempty" yaml:"webapp,omitempty"`
|
Webapp *ManifestWebapp `json:"webapp,omitempty" yaml:"webapp,omitempty"`
|
||||||
|
SettingsSchema *PluginSettingsSchema `json:"settings_schema,omitempty" yaml:"settings_schema,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ManifestBackend struct {
|
type ManifestBackend struct {
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
||||||
|
// See License.txt for license information.
|
||||||
|
|
||||||
package model
|
package model
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -64,6 +67,25 @@ func TestManifestUnmarshal(t *testing.T) {
|
|||||||
Webapp: &ManifestWebapp{
|
Webapp: &ManifestWebapp{
|
||||||
BundlePath: "thebundlepath",
|
BundlePath: "thebundlepath",
|
||||||
},
|
},
|
||||||
|
SettingsSchema: &PluginSettingsSchema{
|
||||||
|
Header: "theheadertext",
|
||||||
|
Footer: "thefootertext",
|
||||||
|
Settings: map[string]*PluginSetting{
|
||||||
|
"thesetting": &PluginSetting{
|
||||||
|
DisplayName: "thedisplayname",
|
||||||
|
Type: PLUGIN_CONFIG_TYPE_DROPDOWN,
|
||||||
|
HelpText: "thehelptext",
|
||||||
|
RegenerateHelpText: "theregeneratehelptext",
|
||||||
|
Options: []*PluginOption{
|
||||||
|
&PluginOption{
|
||||||
|
DisplayName: "theoptiondisplayname",
|
||||||
|
Value: "thevalue",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Default: "thedefault",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
var yamlResult Manifest
|
var yamlResult Manifest
|
||||||
@@ -73,6 +95,19 @@ backend:
|
|||||||
executable: theexecutable
|
executable: theexecutable
|
||||||
webapp:
|
webapp:
|
||||||
bundle_path: thebundlepath
|
bundle_path: thebundlepath
|
||||||
|
settings_schema:
|
||||||
|
header: theheadertext
|
||||||
|
footer: thefootertext
|
||||||
|
settings:
|
||||||
|
thesetting:
|
||||||
|
display_name: thedisplayname
|
||||||
|
type: dropdown
|
||||||
|
help_text: thehelptext
|
||||||
|
regenerate_help_text: theregeneratehelptext
|
||||||
|
options:
|
||||||
|
- display_name: theoptiondisplayname
|
||||||
|
value: thevalue
|
||||||
|
default: thedefault
|
||||||
`), &yamlResult))
|
`), &yamlResult))
|
||||||
assert.Equal(t, expected, yamlResult)
|
assert.Equal(t, expected, yamlResult)
|
||||||
|
|
||||||
@@ -84,7 +119,26 @@ webapp:
|
|||||||
},
|
},
|
||||||
"webapp": {
|
"webapp": {
|
||||||
"bundle_path": "thebundlepath"
|
"bundle_path": "thebundlepath"
|
||||||
}
|
},
|
||||||
|
"settings_schema": {
|
||||||
|
"header": "theheadertext",
|
||||||
|
"footer": "thefootertext",
|
||||||
|
"settings": {
|
||||||
|
"thesetting": {
|
||||||
|
"display_name": "thedisplayname",
|
||||||
|
"type": "dropdown",
|
||||||
|
"help_text": "thehelptext",
|
||||||
|
"regenerate_help_text": "theregeneratehelptext",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"display_name": "theoptiondisplayname",
|
||||||
|
"value": "thevalue"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": "thedefault"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}`), &jsonResult))
|
}`), &jsonResult))
|
||||||
assert.Equal(t, expected, jsonResult)
|
assert.Equal(t, expected, jsonResult)
|
||||||
}
|
}
|
||||||
@@ -115,6 +169,25 @@ func TestManifestJson(t *testing.T) {
|
|||||||
Webapp: &ManifestWebapp{
|
Webapp: &ManifestWebapp{
|
||||||
BundlePath: "thebundlepath",
|
BundlePath: "thebundlepath",
|
||||||
},
|
},
|
||||||
|
SettingsSchema: &PluginSettingsSchema{
|
||||||
|
Header: "theheadertext",
|
||||||
|
Footer: "thefootertext",
|
||||||
|
Settings: map[string]*PluginSetting{
|
||||||
|
"thesetting": &PluginSetting{
|
||||||
|
DisplayName: "thedisplayname",
|
||||||
|
Type: PLUGIN_CONFIG_TYPE_DROPDOWN,
|
||||||
|
HelpText: "thehelptext",
|
||||||
|
RegenerateHelpText: "theregeneratehelptext",
|
||||||
|
Options: []*PluginOption{
|
||||||
|
&PluginOption{
|
||||||
|
DisplayName: "theoptiondisplayname",
|
||||||
|
Value: "thevalue",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Default: "thedefault",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
json := manifest.ToJson()
|
json := manifest.ToJson()
|
||||||
@@ -159,6 +232,25 @@ func TestManifestClientManifest(t *testing.T) {
|
|||||||
Webapp: &ManifestWebapp{
|
Webapp: &ManifestWebapp{
|
||||||
BundlePath: "thebundlepath",
|
BundlePath: "thebundlepath",
|
||||||
},
|
},
|
||||||
|
SettingsSchema: &PluginSettingsSchema{
|
||||||
|
Header: "theheadertext",
|
||||||
|
Footer: "thefootertext",
|
||||||
|
Settings: map[string]*PluginSetting{
|
||||||
|
"thesetting": &PluginSetting{
|
||||||
|
DisplayName: "thedisplayname",
|
||||||
|
Type: PLUGIN_CONFIG_TYPE_DROPDOWN,
|
||||||
|
HelpText: "thehelptext",
|
||||||
|
RegenerateHelpText: "theregeneratehelptext",
|
||||||
|
Options: []*PluginOption{
|
||||||
|
&PluginOption{
|
||||||
|
DisplayName: "theoptiondisplayname",
|
||||||
|
Value: "thevalue",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Default: "thedefault",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
sanitized := manifest.ClientManifest()
|
sanitized := manifest.ClientManifest()
|
||||||
@@ -166,6 +258,7 @@ func TestManifestClientManifest(t *testing.T) {
|
|||||||
assert.NotEmpty(t, sanitized.Id)
|
assert.NotEmpty(t, sanitized.Id)
|
||||||
assert.NotEmpty(t, sanitized.Version)
|
assert.NotEmpty(t, sanitized.Version)
|
||||||
assert.NotEmpty(t, sanitized.Webapp)
|
assert.NotEmpty(t, sanitized.Webapp)
|
||||||
|
assert.NotEmpty(t, sanitized.SettingsSchema)
|
||||||
assert.Empty(t, sanitized.Name)
|
assert.Empty(t, sanitized.Name)
|
||||||
assert.Empty(t, sanitized.Description)
|
assert.Empty(t, sanitized.Description)
|
||||||
assert.Empty(t, sanitized.Backend)
|
assert.Empty(t, sanitized.Backend)
|
||||||
@@ -176,4 +269,5 @@ func TestManifestClientManifest(t *testing.T) {
|
|||||||
assert.NotEmpty(t, manifest.Name)
|
assert.NotEmpty(t, manifest.Name)
|
||||||
assert.NotEmpty(t, manifest.Description)
|
assert.NotEmpty(t, manifest.Description)
|
||||||
assert.NotEmpty(t, manifest.Backend)
|
assert.NotEmpty(t, manifest.Backend)
|
||||||
|
assert.NotEmpty(t, manifest.SettingsSchema)
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user