From c5da1864a6a327244cd25290c300e63d0af334da Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 15 Jan 2020 16:10:27 -0800 Subject: [PATCH] AppPlugin: remove simple app from the core repo (#21526) --- docs/sources/plugins/developing/apps.md | 2 +- .../app/features/plugins/built_in_plugins.ts | 4 - .../features/plugins/plugin_loader.test.ts | 110 ------------------ .../app/example-app/ExampleRootPage.tsx | 103 ---------------- public/app/plugins/app/example-app/README.md | 4 - .../app/example-app/config/ExamplePage1.tsx | 26 ----- .../app/example-app/config/ExamplePage2.tsx | 26 ----- .../app/example-app/dashboards/stats.json | 110 ------------------ .../app/example-app/dashboards/streaming.json | 83 ------------- .../app/plugins/app/example-app/img/logo.png | Bin 42729 -> 0 bytes .../legacy/angular_example_page.html | 8 -- .../legacy/angular_example_page.ts | 10 -- .../app/example-app/legacy/config.html | 22 ---- .../plugins/app/example-app/legacy/config.ts | 36 ------ public/app/plugins/app/example-app/module.ts | 29 ----- .../app/plugins/app/example-app/plugin.json | 42 ------- public/app/plugins/app/example-app/types.ts | 4 - 17 files changed, 1 insertion(+), 618 deletions(-) delete mode 100644 public/app/features/plugins/plugin_loader.test.ts delete mode 100644 public/app/plugins/app/example-app/ExampleRootPage.tsx delete mode 100644 public/app/plugins/app/example-app/README.md delete mode 100644 public/app/plugins/app/example-app/config/ExamplePage1.tsx delete mode 100644 public/app/plugins/app/example-app/config/ExamplePage2.tsx delete mode 100644 public/app/plugins/app/example-app/dashboards/stats.json delete mode 100644 public/app/plugins/app/example-app/dashboards/streaming.json delete mode 100644 public/app/plugins/app/example-app/img/logo.png delete mode 100644 public/app/plugins/app/example-app/legacy/angular_example_page.html delete mode 100644 public/app/plugins/app/example-app/legacy/angular_example_page.ts delete mode 100644 public/app/plugins/app/example-app/legacy/config.html delete mode 100644 public/app/plugins/app/example-app/legacy/config.ts delete mode 100644 public/app/plugins/app/example-app/module.ts delete mode 100644 public/app/plugins/app/example-app/plugin.json delete mode 100644 public/app/plugins/app/example-app/types.ts diff --git a/docs/sources/plugins/developing/apps.md b/docs/sources/plugins/developing/apps.md index b20a521bded..37baab0323e 100644 --- a/docs/sources/plugins/developing/apps.md +++ b/docs/sources/plugins/developing/apps.md @@ -55,5 +55,5 @@ If possible a link to a dashboard or custom page should be shown after enabling > Our goal is not to have a very extensive documentation but rather have actual > code that people can look at. An example implementation of an app can be found -> in this [example app repo](https://github.com/grafana/grafana/tree/master/public/app/plugins/app/example-app) +> in this [example app repo](https://github.com/grafana/simple-app-plugin) diff --git a/public/app/features/plugins/built_in_plugins.ts b/public/app/features/plugins/built_in_plugins.ts index e06e6ee6f5c..92a73df8407 100644 --- a/public/app/features/plugins/built_in_plugins.ts +++ b/public/app/features/plugins/built_in_plugins.ts @@ -54,8 +54,6 @@ import * as barGaugePanel from 'app/plugins/panel/bargauge/module'; import * as logsPanel from 'app/plugins/panel/logs/module'; import * as newsPanel from 'app/plugins/panel/news/module'; -const exampleApp = async () => await import(/* webpackChunkName: "exampleApp" */ 'app/plugins/app/example-app/module'); - const builtInPlugins: any = { 'app/plugins/datasource/graphite/module': graphitePlugin, 'app/plugins/datasource/cloudwatch/module': cloudwatchPlugin, @@ -94,8 +92,6 @@ const builtInPlugins: any = { 'app/plugins/panel/piechart/module': pieChartPanel, 'app/plugins/panel/bargauge/module': barGaugePanel, 'app/plugins/panel/logs/module': logsPanel, - - 'app/plugins/app/example-app/module': exampleApp, }; export default builtInPlugins; diff --git a/public/app/features/plugins/plugin_loader.test.ts b/public/app/features/plugins/plugin_loader.test.ts deleted file mode 100644 index 809a2f179b2..00000000000 --- a/public/app/features/plugins/plugin_loader.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -// Use the real plugin_loader (stubbed by default) -jest.unmock('app/features/plugins/plugin_loader'); - -(global as any).ace = { - define: jest.fn(), -}; - -jest.mock('app/core/core', () => { - return { - coreModule: { - directive: jest.fn(), - }, - }; -}); - -import { SystemJS } from '@grafana/runtime'; -import { AppPluginMeta, PluginMetaInfo, PluginType, PluginIncludeType, AppPlugin } from '@grafana/data'; -import { importAppPlugin } from './plugin_loader'; - -class MyCustomApp extends AppPlugin { - initWasCalled = false; - calledTwice = false; - - init(meta: AppPluginMeta) { - this.initWasCalled = true; - this.calledTwice = this.meta === meta; - } -} - -describe('Load App', () => { - const app = new MyCustomApp(); - const modulePath = 'my/custom/plugin/module'; - - beforeAll(() => { - SystemJS.set(modulePath, SystemJS.newModule({ plugin: app })); - }); - - afterAll(() => { - SystemJS.delete(modulePath); - }); - - it('should call init and set meta', async () => { - const meta: AppPluginMeta = { - id: 'test-app', - module: modulePath, - baseUrl: 'xxx', - info: {} as PluginMetaInfo, - type: PluginType.app, - name: 'test', - }; - - // Check that we mocked the import OK - const m = await SystemJS.import(modulePath); - expect(m.plugin).toBe(app); - - const loaded = await importAppPlugin(meta); - expect(loaded).toBe(app); - expect(app.meta).toBe(meta); - expect(app.initWasCalled).toBeTruthy(); - expect(app.calledTwice).toBeFalsy(); - - const again = await importAppPlugin(meta); - expect(again).toBe(app); - expect(app.calledTwice).toBeTruthy(); - }); -}); - -import { ExampleConfigCtrl as ConfigCtrl } from 'app/plugins/app/example-app/legacy/config'; -import { AngularExamplePageCtrl } from 'app/plugins/app/example-app/legacy/angular_example_page'; - -describe('Load Legacy App', () => { - const app = { - ConfigCtrl, - AngularExamplePageCtrl, // Must match `pages.component` in plugin.json - }; - - const modulePath = 'my/custom/legacy/plugin/module'; - - beforeAll(() => { - SystemJS.set(modulePath, SystemJS.newModule(app)); - }); - - afterAll(() => { - SystemJS.delete(modulePath); - }); - - it('should call init and set meta for legacy app', async () => { - const meta: AppPluginMeta = { - id: 'test-app', - module: modulePath, - baseUrl: 'xxx', - info: {} as PluginMetaInfo, - type: PluginType.app, - name: 'test', - includes: [ - { - type: PluginIncludeType.page, - name: 'Example Page', - component: 'AngularExamplePageCtrl', - role: 'Viewer', - addToNav: false, - }, - ], - }; - - const loaded = await importAppPlugin(meta); - expect(loaded).toHaveProperty('angularPages'); - expect(loaded.angularPages).toHaveProperty('AngularExamplePageCtrl', AngularExamplePageCtrl); - }); -}); diff --git a/public/app/plugins/app/example-app/ExampleRootPage.tsx b/public/app/plugins/app/example-app/ExampleRootPage.tsx deleted file mode 100644 index d884731730a..00000000000 --- a/public/app/plugins/app/example-app/ExampleRootPage.tsx +++ /dev/null @@ -1,103 +0,0 @@ -// Libraries -import React, { PureComponent } from 'react'; - -// Types -import { NavModelItem, AppRootProps } from '@grafana/data'; - -interface Props extends AppRootProps {} - -const TAB_ID_A = 'A'; -const TAB_ID_B = 'B'; -const TAB_ID_C = 'C'; - -export class ExampleRootPage extends PureComponent { - constructor(props: Props) { - super(props); - } - - componentDidMount() { - this.updateNav(); - } - - componentDidUpdate(prevProps: Props) { - if (this.props.query !== prevProps.query) { - if (this.props.query.tab !== prevProps.query.tab) { - this.updateNav(); - } - } - } - - updateNav() { - const { path, onNavChanged, query, meta } = this.props; - - const tabs: NavModelItem[] = []; - tabs.push({ - text: 'Tab A', - icon: 'fa fa-fw fa-file-text-o', - url: path + '?tab=' + TAB_ID_A, - id: TAB_ID_A, - }); - tabs.push({ - text: 'Tab B', - icon: 'fa fa-fw fa-file-text-o', - url: path + '?tab=' + TAB_ID_B, - id: TAB_ID_B, - }); - tabs.push({ - text: 'Tab C', - icon: 'fa fa-fw fa-file-text-o', - url: path + '?tab=' + TAB_ID_C, - id: TAB_ID_C, - }); - - // Set the active tab - let found = false; - const selected = query.tab || TAB_ID_B; - for (const tab of tabs) { - tab.active = !found && selected === tab.id; - if (tab.active) { - found = true; - } - } - if (!found) { - tabs[0].active = true; - } - - const node = { - text: 'This is the Page title', - img: meta.info.logos.large, - subTitle: 'subtitle here', - url: path, - children: tabs, - }; - - // Update the page header - onNavChanged({ - node: node, - main: node, - }); - } - - render() { - const { path, query, meta } = this.props; - - return ( -
- QUERY:
{JSON.stringify(query)}
-
- -
{JSON.stringify(meta.jsonData)}
-
- ); - } -} diff --git a/public/app/plugins/app/example-app/README.md b/public/app/plugins/app/example-app/README.md deleted file mode 100644 index 8dc5db52a34..00000000000 --- a/public/app/plugins/app/example-app/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Example App - Native Plugin - -This is an example app. It has no real use other than making sure external apps are supported. - diff --git a/public/app/plugins/app/example-app/config/ExamplePage1.tsx b/public/app/plugins/app/example-app/config/ExamplePage1.tsx deleted file mode 100644 index 6b3d229fe04..00000000000 --- a/public/app/plugins/app/example-app/config/ExamplePage1.tsx +++ /dev/null @@ -1,26 +0,0 @@ -// Libraries -import React, { PureComponent } from 'react'; - -// Types -import { PluginConfigPageProps, AppPluginMeta } from '@grafana/data'; -import { ExampleAppSettings } from '../types'; - -interface Props extends PluginConfigPageProps> {} - -export class ExamplePage1 extends PureComponent { - constructor(props: Props) { - super(props); - } - - render() { - const { query } = this.props; - - return ( -
- 11111111111111111111111111111111 -
{JSON.stringify(query)}
- 11111111111111111111111111111111 -
- ); - } -} diff --git a/public/app/plugins/app/example-app/config/ExamplePage2.tsx b/public/app/plugins/app/example-app/config/ExamplePage2.tsx deleted file mode 100644 index 8350dfec1c6..00000000000 --- a/public/app/plugins/app/example-app/config/ExamplePage2.tsx +++ /dev/null @@ -1,26 +0,0 @@ -// Libraries -import React, { PureComponent } from 'react'; - -// Types -import { PluginConfigPageProps, AppPluginMeta } from '@grafana/data'; -import { ExampleAppSettings } from '../types'; - -interface Props extends PluginConfigPageProps> {} - -export class ExamplePage2 extends PureComponent { - constructor(props: Props) { - super(props); - } - - render() { - const { query } = this.props; - - return ( -
- 22222222222222222222222222222222 -
{JSON.stringify(query)}
- 22222222222222222222222222222222 -
- ); - } -} diff --git a/public/app/plugins/app/example-app/dashboards/stats.json b/public/app/plugins/app/example-app/dashboards/stats.json deleted file mode 100644 index 45e2316e4de..00000000000 --- a/public/app/plugins/app/example-app/dashboards/stats.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "__inputs": [], - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "6.2.0-pre" - }, - { - "type": "panel", - "id": "singlestat2", - "name": "Singlestat (react)", - "version": "" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": null, - "links": [], - "panels": [ - { - "gridPos": { - "h": 4, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "options": { - "orientation": "auto", - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": true - }, - "thresholds": [ - { - "color": "green", - "index": 0, - "value": null - }, - { - "color": "red", - "index": 1, - "value": 80 - } - ], - "valueMappings": [], - "valueOptions": { - "decimals": null, - "prefix": "", - "stat": "mean", - "suffix": "", - "unit": "none" - } - }, - "pluginVersion": "6.2.0-pre", - "targets": [ - { - "refId": "A", - "scenarioId": "random_walk_table", - "stringInput": "" - }, - { - "refId": "B", - "scenarioId": "random_walk_table", - "stringInput": "" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Panel Title", - "type": "singlestat2" - } - ], - "schemaVersion": 18, - "style": "dark", - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"], - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "", - "title": "stats", - "uid": "YeBxHjzWz", - "version": 1 -} diff --git a/public/app/plugins/app/example-app/dashboards/streaming.json b/public/app/plugins/app/example-app/dashboards/streaming.json deleted file mode 100644 index ec6714f8816..00000000000 --- a/public/app/plugins/app/example-app/dashboards/streaming.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "__inputs": [], - "__requires": [ - { - "type": "grafana", - "id": "grafana", - "name": "Grafana", - "version": "6.2.0-pre" - }, - { - "type": "panel", - "id": "graph2", - "name": "React Graph", - "version": "" - } - ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": null, - "links": [], - "panels": [ - { - "description": "", - "gridPos": { - "h": 6, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 2, - "links": [], - "targets": [ - { - "refId": "A", - "scenarioId": "streaming_client", - "stream": { - "noise": 10, - "speed": 100, - "spread": 20, - "type": "signal" - }, - "stringInput": "" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Simple dummy streaming example", - "type": "graph2" - } - ], - "schemaVersion": 18, - "style": "dark", - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-1m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": ["5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d"], - "time_options": ["5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d"] - }, - "timezone": "", - "title": "simple streaming", - "uid": "TbbEZjzWz", - "version": 1 -} diff --git a/public/app/plugins/app/example-app/img/logo.png b/public/app/plugins/app/example-app/img/logo.png deleted file mode 100644 index 46099d58095a914cfdf6eebe0ead073cddfd69ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42729 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 diff --git a/public/app/plugins/app/example-app/legacy/angular_example_page.html b/public/app/plugins/app/example-app/legacy/angular_example_page.html deleted file mode 100644 index 850b1d22087..00000000000 --- a/public/app/plugins/app/example-app/legacy/angular_example_page.html +++ /dev/null @@ -1,8 +0,0 @@ - - -

- Example Page -

- -

this is in angular

- diff --git a/public/app/plugins/app/example-app/legacy/angular_example_page.ts b/public/app/plugins/app/example-app/legacy/angular_example_page.ts deleted file mode 100644 index 525e58c0ae7..00000000000 --- a/public/app/plugins/app/example-app/legacy/angular_example_page.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { GrafanaRootScope } from 'app/routes/GrafanaCtrl'; - -export class AngularExamplePageCtrl { - static templateUrl = 'legacy/angular_example_page.html'; - - /** @ngInject */ - constructor($scope: any, $rootScope: GrafanaRootScope) { - console.log('AngularExamplePageCtrl:', this); - } -} diff --git a/public/app/plugins/app/example-app/legacy/config.html b/public/app/plugins/app/example-app/legacy/config.html deleted file mode 100644 index 162fc16a74c..00000000000 --- a/public/app/plugins/app/example-app/legacy/config.html +++ /dev/null @@ -1,22 +0,0 @@ -

Example Application

- -

-Angular based config: -

- -
-
-
-
- json Data property - -
-
- -
-
-
-
diff --git a/public/app/plugins/app/example-app/legacy/config.ts b/public/app/plugins/app/example-app/legacy/config.ts deleted file mode 100644 index 3d7c1618fbe..00000000000 --- a/public/app/plugins/app/example-app/legacy/config.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { PluginMeta } from '@grafana/data'; - -export class ExampleConfigCtrl { - static templateUrl = 'legacy/config.html'; - - appEditCtrl: any; - appModel: PluginMeta; - - /** @ngInject */ - constructor($scope: any, $injector: any) { - this.appEditCtrl.setPostUpdateHook(this.postUpdate.bind(this)); - - // Make sure it has a JSON Data spot - if (!this.appModel) { - this.appModel = {} as PluginMeta; - } - - // Required until we get the types sorted on appModel :( - const appModel = this.appModel as any; - if (!appModel.jsonData) { - appModel.jsonData = {}; - } - - console.log('ExampleConfigCtrl', this); - } - - postUpdate() { - if (!this.appModel.enabled) { - console.log('Not enabled...'); - return; - } - - // TODO, can do stuff after update - console.log('Post Update:', this); - } -} diff --git a/public/app/plugins/app/example-app/module.ts b/public/app/plugins/app/example-app/module.ts deleted file mode 100644 index ff7cf9112b6..00000000000 --- a/public/app/plugins/app/example-app/module.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Angular pages -import { ExampleConfigCtrl } from './legacy/config'; -import { AngularExamplePageCtrl } from './legacy/angular_example_page'; -import { AppPlugin } from '@grafana/data'; -import { ExamplePage1 } from './config/ExamplePage1'; -import { ExamplePage2 } from './config/ExamplePage2'; -import { ExampleRootPage } from './ExampleRootPage'; -import { ExampleAppSettings } from './types'; - -// Legacy exports just for testing -export { - ExampleConfigCtrl as ConfigCtrl, - AngularExamplePageCtrl, // Must match `pages.component` in plugin.json -}; - -export const plugin = new AppPlugin() - .setRootPage(ExampleRootPage) - .addConfigPage({ - title: 'Page 1', - icon: 'fa fa-info', - body: ExamplePage1, - id: 'page1', - }) - .addConfigPage({ - title: 'Page 2', - icon: 'fa fa-user', - body: ExamplePage2, - id: 'page2', - }); diff --git a/public/app/plugins/app/example-app/plugin.json b/public/app/plugins/app/example-app/plugin.json deleted file mode 100644 index e514d4c3296..00000000000 --- a/public/app/plugins/app/example-app/plugin.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "type": "app", - "name": "Example App", - "id": "example-app", - "state": "alpha", - - "info": { - "author": { - "name": "Grafana Project", - "url": "https://grafana.com" - }, - "logos": { - "small": "img/logo.png", - "large": "img/logo.png" - } - }, - - "includes": [ - { - "type": "page", - "name": "Angular Page", - "component": "AngularExamplePageCtrl", - "role": "Viewer", - "addToNav": true, - "defaultNav": true - }, - { - "type": "dashboard", - "name": "Streaming Example", - "path": "dashboards/streaming.json" - }, - { - "type": "dashboard", - "name": "Lots of Stats", - "path": "dashboards/stats.json" - }, - { - "type": "panel", - "name": "Anything -- just display?" - } - ] -} diff --git a/public/app/plugins/app/example-app/types.ts b/public/app/plugins/app/example-app/types.ts deleted file mode 100644 index c3c5bad5e76..00000000000 --- a/public/app/plugins/app/example-app/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface ExampleAppSettings { - customText?: string; - customCheckbox?: boolean; -}