2023-06-30 10:55:56 +02:00
/* eslint-disable multiline-comment-style */
2020-10-09 19:35:46 +02:00
import Plugin from '../Plugin' ;
import createViewHandle from '../utils/createViewHandle' ;
2020-11-13 19:09:28 +02:00
import WebviewController , { ContainerType } from '../WebviewController' ;
2020-10-09 19:35:46 +02:00
import { ViewHandle } from './types' ;
/ * *
2024-03-26 13:36:15 +02:00
* Allows creating and managing view panels . View panels allow displaying any HTML
* content ( within a webview ) and updating it in real - time . For example it
2020-11-13 19:09:28 +02:00
* could be used to display a table of content for the active note , or
* display various metadata or graph .
2020-10-09 19:35:46 +02:00
*
2024-03-26 13:36:15 +02:00
* On desktop , view panels currently are displayed at the right of the sidebar , though can
* be moved with "View" > "Change application layout" .
*
* On mobile , view panels are shown in a tabbed dialog that can be opened using a
* toolbar button .
*
2020-11-05 18:58:23 +02:00
* [ View the demo plugin ] ( https : //github.com/laurent22/joplin/tree/dev/packages/app-cli/tests/support/plugins/toc)
2020-10-09 19:35:46 +02:00
* /
export default class JoplinViewsPanels {
private store : any ;
private plugin : Plugin ;
2021-01-02 15:32:15 +02:00
public constructor ( plugin : Plugin , store : any ) {
2020-10-09 19:35:46 +02:00
this . store = store ;
this . plugin = plugin ;
}
2020-11-12 21:13:28 +02:00
private controller ( handle : ViewHandle ) : WebviewController {
2020-10-09 19:35:46 +02:00
return this . plugin . viewController ( handle ) as WebviewController ;
}
/ * *
* Creates a new panel
* /
2021-01-02 15:32:15 +02:00
public async create ( id : string ) : Promise < ViewHandle > {
2020-11-13 19:09:28 +02:00
if ( ! id ) {
2021-08-05 13:02:03 +02:00
this . plugin . deprecationNotice ( '1.5' , 'Creating a view without an ID is deprecated. To fix it, change your call to `joplin.views.panels.create("my-unique-id")`' , true ) ;
2020-11-13 19:09:28 +02:00
id = ` ${ this . plugin . viewCount } ` ;
}
const handle = createViewHandle ( this . plugin , id ) ;
const controller = new WebviewController ( handle , this . plugin . id , this . store , this . plugin . baseDir , ContainerType . Panel ) ;
2020-10-09 19:35:46 +02:00
this . plugin . addViewController ( controller ) ;
return handle ;
}
/ * *
* Sets the panel webview HTML
* /
2021-11-09 17:50:50 +02:00
public async setHtml ( handle : ViewHandle , html : string ) : Promise < string > {
2020-10-09 19:35:46 +02:00
return this . controller ( handle ) . html = html ;
}
/ * *
* Adds and loads a new JS or CSS files into the panel .
* /
2021-11-09 17:50:50 +02:00
public async addScript ( handle : ViewHandle , scriptPath : string ) : Promise < void > {
2020-10-09 19:35:46 +02:00
return this . controller ( handle ) . addScript ( scriptPath ) ;
}
/ * *
* Called when a message is sent from the webview ( using postMessage ) .
2021-01-12 01:33:10 +02:00
*
* To post a message from the webview to the plugin use :
*
* ` ` ` javascript
* const response = await webviewApi . postMessage ( message ) ;
* ` ` `
*
* - ` message ` can be any JavaScript object , string or number
* - ` response ` is whatever was returned by the ` onMessage ` handler
*
* Using this mechanism , you can have two - way communication between the
* plugin and webview .
*
* See the [ postMessage
* demo ] ( https : //github.com/laurent22/joplin/tree/dev/packages/app-cli/tests/support/plugins/post_messages) for more details.
*
2020-10-09 19:35:46 +02:00
* /
2023-06-30 11:30:29 +02:00
// eslint-disable-next-line @typescript-eslint/ban-types -- Old code before rule was applied
2021-11-09 17:50:50 +02:00
public async onMessage ( handle : ViewHandle , callback : Function ) : Promise < void > {
2020-10-09 19:35:46 +02:00
return this . controller ( handle ) . onMessage ( callback ) ;
}
2021-11-09 17:50:50 +02:00
/ * *
* Sends a message to the webview .
*
* The webview must have registered a message handler prior , otherwise the message is ignored . Use ;
*
* ` ` ` javascript
* webviewApi . onMessage ( ( message ) = > { . . . } ) ;
* ` ` `
*
* - ` message ` can be any JavaScript object , string or number
*
* The view API may have only one onMessage handler defined .
* This method is fire and forget so no response is returned .
*
* It is particularly useful when the webview needs to react to events emitted by the plugin or the joplin api .
* /
public postMessage ( handle : ViewHandle , message : any ) : void {
return this . controller ( handle ) . postMessage ( message ) ;
}
2021-01-02 15:32:15 +02:00
/ * *
* Shows the panel
* /
2023-06-30 10:11:26 +02:00
public async show ( handle : ViewHandle , show = true ) : Promise < void > {
2021-01-02 15:32:15 +02:00
await this . controller ( handle ) . show ( show ) ;
}
/ * *
* Hides the panel
* /
public async hide ( handle : ViewHandle ) : Promise < void > {
await this . show ( handle , false ) ;
}
/ * *
* Tells whether the panel is visible or not
* /
public async visible ( handle : ViewHandle ) : Promise < boolean > {
return this . controller ( handle ) . visible ;
}
2020-10-09 19:35:46 +02:00
}