Skip to content

Commit 87cc58d

Browse files
committed
added module support and auto refreshing
1 parent 7a9509b commit 87cc58d

File tree

15 files changed

+555
-274
lines changed

15 files changed

+555
-274
lines changed

libraries/javascript/perspective-client/src/globals/globals.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export type EmbrGlobals = {
2+
modules: Record<string, any>
23
scripting: ScriptingProperties
34
}
45

@@ -14,6 +15,7 @@ declare global {
1415

1516
function createDefaultGlobals(): EmbrGlobals {
1617
window.__embrGlobals = {
18+
modules: {},
1719
scripting: {
1820
globals: {},
1921
},

modules/periscope/common/src/main/resources/schemas/components/embr.periscope.embedding.react/variants/base.props.json

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
{
2-
"component": "(props) => <div>{props.text}</div>",
3-
"props": {
4-
"text": "Hello World!"
5-
},
6-
"options": {
7-
"babel": {
8-
"presets": ["react"]
9-
}
10-
},
2+
"component": "",
3+
"props": {},
114
"style": {
125
"classes": ""
136
}

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/PeriscopeDesignerContext.kt

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import com.mussonindustrial.embr.perspective.designer.component.removeComponent
1313
import com.mussonindustrial.ignition.embr.periscope.component.ComponentIdSuggestionSource
1414
import com.mussonindustrial.ignition.embr.periscope.component.TypeScriptResourceSuggestionSource
1515
import com.mussonindustrial.ignition.embr.periscope.component.embedding.*
16-
import com.mussonindustrial.ignition.embr.periscope.resources.typescript.TypeScriptResourceListener
1716
import com.mussonindustrial.ignition.embr.periscope.resources.typescript.TypeScriptResourceWorkspace
1817
import com.teamdev.jxbrowser.engine.Engine
1918

@@ -55,8 +54,6 @@ class PeriscopeDesignerContext(val context: DesignerContext) :
5554
React.asDesignerComponent(),
5655
)
5756

58-
private val handlers = listOf(TypeScriptResourceListener(this))
59-
6057
private val workspaces = listOf(TypeScriptResourceWorkspace(context, perspectiveNavNode))
6158

6259
fun registerComponents() {
@@ -70,12 +67,4 @@ class PeriscopeDesignerContext(val context: DesignerContext) :
7067
fun registerResourceWorkspaces() {
7168
workspaces.forEach { registerResourceWorkspace(it) }
7269
}
73-
74-
fun registerProjectResourceHandlers() {
75-
handlers.forEach { project?.addProjectResourceListener(it) }
76-
}
77-
78-
fun removeProjectResourceHandlers() {
79-
handlers.forEach { project?.removeProjectResourceListener(it) }
80-
}
8170
}

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/PeriscopeDesignerHook.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ class PeriscopeDesignerHook : AbstractDesignerModuleHook() {
4040

4141
logger.debug("Registering resource editors...")
4242
this.context.registerResourceWorkspaces()
43-
44-
logger.debug("Registering project resource handlers...")
45-
this.context.registerProjectResourceHandlers()
4643
}
4744

4845
override fun shutdown() {
@@ -56,8 +53,5 @@ class PeriscopeDesignerHook : AbstractDesignerModuleHook() {
5653

5754
logger.debug("Removing components...")
5855
this.context.removeComponents()
59-
60-
logger.debug("Removing project resource handlers...")
61-
this.context.removeProjectResourceHandlers()
6256
}
6357
}

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/resources/typescript/TypeScriptResourceEditor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class TypeScriptResourceEditor(workspace: TabbedResourceWorkspace?, path: Resour
7777
}
7878

7979
override fun getObjectForSave(): TypeScriptResource {
80-
val result = compiler.compile(textArea.text)
80+
val result = compiler.compile(textArea.text, resourcePath.path.toString())
8181

8282
return TypeScriptResource(
8383
textArea.text ?: "",

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/resources/typescript/TypeScriptResourceListener.kt

Lines changed: 0 additions & 48 deletions
This file was deleted.

modules/periscope/designer/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/typescript/TypeScriptCompiler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ class TypeScriptCompiler(engine: Engine) {
3030
}
3131
val frame = browser.mainFrame().get()
3232

33-
fun compile(input: String): CompilationResult? {
33+
fun compile(input: String, modulePath: String): CompilationResult? {
3434
val compiler = frame.executeJavaScript<JsObject>(compilerModule)!!
35-
val result = compiler.call<JsObject>("compile", input)
35+
val result = compiler.call<JsObject>("compile", input, modulePath)
3636

3737
return try {
3838
CompilationResult(result)

modules/periscope/gateway/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/PeriscopeGatewayContext.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.mussonindustrial.embr.perspective.gateway.component.removeComponent
2222
import com.mussonindustrial.embr.perspective.gateway.reflect.ViewLoader
2323
import com.mussonindustrial.embr.servlets.ModuleServletManager
2424
import com.mussonindustrial.ignition.embr.periscope.component.embedding.*
25+
import com.mussonindustrial.ignition.embr.periscope.resources.typescript.TypeScriptChangeListener
2526
import java.util.EnumSet
2627
import java.util.WeakHashMap
2728

@@ -49,6 +50,8 @@ class PeriscopeGatewayContext(private val context: GatewayContext) :
4950
PerspectiveContext.get(context) as GatewayHook.PerspectiveGatewayContext
5051
}
5152

53+
private val projectLifecycles =
54+
listOf(TypeScriptChangeListener(perspectiveContext, context.projectManager))
5255
private val viewLoaders = WeakHashMap<PageModel, ViewLoader>()
5356

5457
fun getViewLoader(pageModel: PageModel): ViewLoader {
@@ -85,6 +88,14 @@ class PeriscopeGatewayContext(private val context: GatewayContext) :
8588
}
8689
}
8790

91+
fun startupProjectLifecycles() {
92+
projectLifecycles.forEach { it.startup() }
93+
}
94+
95+
fun shutdownProjectLifecycles() {
96+
projectLifecycles.forEach { it.shutdown() }
97+
}
98+
8899
fun removeServlets() {
89100
servletManager.removeAllServlets()
90101
}

modules/periscope/gateway/src/main/kotlin/com/mussonindustrial/ignition/embr/periscope/PeriscopeGatewayHook.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ class PeriscopeGatewayHook : AbstractGatewayModuleHook() {
3636

3737
logger.debug("Registering components...")
3838
context.registerComponents()
39+
40+
logger.debug("Starting project lifecycles...")
41+
context.startupProjectLifecycles()
3942
}
4043

4144
override fun shutdown() {
@@ -50,6 +53,9 @@ class PeriscopeGatewayHook : AbstractGatewayModuleHook() {
5053

5154
logger.debug("Removing servlets...")
5255
context.removeServlets()
56+
57+
logger.debug("Stopping project lifecycles...")
58+
context.shutdownProjectLifecycles()
5359
}
5460

5561
override fun getMountedResourceFolder(): Optional<String> {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.mussonindustrial.ignition.embr.periscope.resources.typescript
2+
3+
import com.inductiveautomation.ignition.common.gson.JsonObject
4+
import com.inductiveautomation.ignition.common.project.RuntimeProject
5+
import com.inductiveautomation.ignition.common.project.resource.ProjectResource
6+
import com.inductiveautomation.ignition.common.project.resource.ProjectResourceId
7+
import com.inductiveautomation.ignition.gateway.project.ProjectLifecycle
8+
import com.inductiveautomation.ignition.gateway.project.ProjectLifecycleFactory
9+
import com.inductiveautomation.ignition.gateway.project.ProjectManager
10+
import com.inductiveautomation.ignition.gateway.project.ResourceFilter
11+
import com.inductiveautomation.perspective.gateway.api.PerspectiveContext
12+
import com.mussonindustrial.ignition.embr.periscope.resources.TypeScriptResource
13+
14+
class TypeScriptChangeListener(val context: PerspectiveContext, projectManager: ProjectManager) :
15+
ProjectLifecycleFactory<ProjectLifecycle>(projectManager) {
16+
val filter: ResourceFilter =
17+
ResourceFilter.newBuilder().addResourceType(TypeScriptResource.Companion.type).build()
18+
19+
override fun createProjectLifecycle(project: RuntimeProject): Notifier {
20+
return Notifier(project)
21+
}
22+
23+
override fun getResourceFilter(): ResourceFilter {
24+
return filter
25+
}
26+
27+
inner class Notifier(project: RuntimeProject) : ProjectLifecycle(project) {
28+
29+
fun notifyClients() {
30+
context.sessionMonitor.getClientSessionsForProject(project.name).forEach {
31+
it.pages.forEach { page ->
32+
page.send("periscope-client-resource-refresh", JsonObject())
33+
}
34+
}
35+
}
36+
37+
override fun onStartup(resourceIds: List<ProjectResource>) {}
38+
39+
override fun onShutdown(resourceIds: List<ProjectResourceId>) {}
40+
41+
override fun onResourcesCreated(resources: List<ProjectResource>) {
42+
notifyClients()
43+
}
44+
45+
override fun onResourcesModified(resources: List<ProjectResource>) {
46+
notifyClients()
47+
}
48+
49+
override fun onResourcesDeleted(resources: List<ProjectResourceId>) {
50+
notifyClients()
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)