iobroker.mywebui 1.118.0 → 1.120.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/default-controls/controls/plantpax/dbc-faceplate.control +23 -0
- package/default-controls/controls/plantpax/dbc-symbol.control +19 -0
- package/default-controls/controls/plantpax/din-faceplate.control +23 -0
- package/default-controls/controls/plantpax/din-symbol.control +19 -0
- package/default-controls/controls/plantpax/dose-faceplate.control +23 -0
- package/default-controls/controls/plantpax/dose-symbol.control +19 -0
- package/default-controls/controls/plantpax/dout-faceplate.control +23 -0
- package/default-controls/controls/plantpax/dout-symbol.control +19 -0
- package/default-controls/controls/plantpax/hilosel-faceplate.control +23 -0
- package/default-controls/controls/plantpax/hilosel-symbol.control +19 -0
- package/default-controls/controls/plantpax/logic-faceplate.control +23 -0
- package/default-controls/controls/plantpax/logic-symbol.control +19 -0
- package/default-controls/controls/plantpax/motor2spd-faceplate.control +23 -0
- package/default-controls/controls/plantpax/motor2spd-symbol.control +19 -0
- package/default-controls/controls/plantpax/npos-faceplate.control +23 -0
- package/default-controls/controls/plantpax/npos-symbol.control +19 -0
- package/default-controls/controls/plantpax/valvemo-faceplate.control +23 -0
- package/default-controls/controls/plantpax/valvemo-symbol.control +19 -0
- package/default-controls/controls/plantpax/valvemp-faceplate.control +23 -0
- package/default-controls/controls/plantpax/valvemp-symbol.control +19 -0
- package/dist/backend/3d-editor-integration.js +1 -1
- package/dist/backend/ImportmapCreator.js +1 -1
- package/dist/backend/UploadHelper.js +1 -1
- package/dist/backend/main.js +1 -1
- package/io-package.json +1 -1
- package/package.json +1 -1
- package/scripts/_build_plantpax.py +64 -1
- package/www/3d-editor/js/Animation.js +1 -1
- package/www/3d-editor/js/AnimationResizer.js +1 -1
- package/www/3d-editor/js/Command.js +1 -1
- package/www/3d-editor/js/Config.js +1 -1
- package/www/3d-editor/js/Editor.js +1 -1
- package/www/3d-editor/js/EditorControls.js +1 -1
- package/www/3d-editor/js/GLTFImportDialog.js +1 -1
- package/www/3d-editor/js/History.js +1 -1
- package/www/3d-editor/js/Loader.js +1 -1
- package/www/3d-editor/js/LoaderUtils.js +1 -1
- package/www/3d-editor/js/Menubar.Add.js +1 -1
- package/www/3d-editor/js/Menubar.Edit.js +1 -1
- package/www/3d-editor/js/Menubar.File.js +1 -1
- package/www/3d-editor/js/Menubar.Help.js +1 -1
- package/www/3d-editor/js/Menubar.Render.js +1 -1
- package/www/3d-editor/js/Menubar.Status.js +1 -1
- package/www/3d-editor/js/Menubar.View.js +1 -1
- package/www/3d-editor/js/Menubar.js +1 -1
- package/www/3d-editor/js/Player.js +1 -1
- package/www/3d-editor/js/Resizer.js +1 -1
- package/www/3d-editor/js/Script.js +1 -1
- package/www/3d-editor/js/Selector.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.BoxGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.BufferGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CapsuleGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CircleGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CylinderGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.DodecahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.ExtrudeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.IcosahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.LatheGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.Modifiers.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.OctahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.PlaneGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.RingGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.ShapeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.SphereGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TetrahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TextGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TorusGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TorusKnotGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TubeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.BooleanProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.ColorProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.ConstantProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.MapProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.NumberProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.Program.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.RangeValueProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.js +1 -1
- package/www/3d-editor/js/Sidebar.Object.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.App.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Materials.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Renderer.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Resources.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.js +1 -1
- package/www/3d-editor/js/Sidebar.Properties.js +1 -1
- package/www/3d-editor/js/Sidebar.Scene.js +1 -1
- package/www/3d-editor/js/Sidebar.Script.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.History.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.Shortcuts.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.js +1 -1
- package/www/3d-editor/js/Sidebar.js +1 -1
- package/www/3d-editor/js/Storage.js +1 -1
- package/www/3d-editor/js/Strings.js +1 -1
- package/www/3d-editor/js/TextureParametersDialog.js +1 -1
- package/www/3d-editor/js/Toolbar.js +1 -1
- package/www/3d-editor/js/Viewport.Controls.js +1 -1
- package/www/3d-editor/js/Viewport.Info.js +1 -1
- package/www/3d-editor/js/Viewport.Pathtracer.js +1 -1
- package/www/3d-editor/js/Viewport.ViewHelper.js +1 -1
- package/www/3d-editor/js/Viewport.XR.js +1 -1
- package/www/3d-editor/js/Viewport.js +1 -1
- package/www/3d-editor/js/commands/AddObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/AddScriptCommand.js +1 -1
- package/www/3d-editor/js/commands/Commands.js +1 -1
- package/www/3d-editor/js/commands/MoveObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/MultiCmdsCommand.js +1 -1
- package/www/3d-editor/js/commands/RemoveObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/RemoveScriptCommand.js +1 -1
- package/www/3d-editor/js/commands/SetColorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetGeometryCommand.js +1 -1
- package/www/3d-editor/js/commands/SetGeometryValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialColorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialMapCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialRangeCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialVectorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetPositionCommand.js +1 -1
- package/www/3d-editor/js/commands/SetRotationCommand.js +1 -1
- package/www/3d-editor/js/commands/SetScaleCommand.js +1 -1
- package/www/3d-editor/js/commands/SetSceneCommand.js +1 -1
- package/www/3d-editor/js/commands/SetScriptValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetShadowValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetTextureParametersCommand.js +1 -1
- package/www/3d-editor/js/commands/SetUuidCommand.js +1 -1
- package/www/3d-editor/js/commands/SetValueCommand.js +1 -1
- package/www/dist/frontend/bundle/chunk-34JJK367.js +3 -3
- package/www/dist/frontend/bundle/chunk-3AS7GRBW.js +3 -3
- package/www/dist/frontend/bundle/chunk-3C6XC7RW.js +1 -1
- package/www/dist/frontend/bundle/chunk-3R27DWVW.js +3 -3
- package/www/dist/frontend/bundle/chunk-3WGNLIWJ.js +3 -3
- package/www/dist/frontend/bundle/chunk-3YK3Y2SJ.js +1 -1
- package/www/dist/frontend/bundle/chunk-43HEBO5G.js +3 -3
- package/www/dist/frontend/bundle/chunk-5MUGMRXU.js +1 -1
- package/www/dist/frontend/bundle/chunk-5UBRCTRX.js +3 -3
- package/www/dist/frontend/bundle/chunk-65A3PNMG.js +1 -1
- package/www/dist/frontend/bundle/chunk-66EU64WD.js +1 -1
- package/www/dist/frontend/bundle/chunk-6BL3X2VD.js +3 -3
- package/www/dist/frontend/bundle/chunk-6L2YCGEX.js +1 -1
- package/www/dist/frontend/bundle/chunk-7CWDQGAG.js +3 -3
- package/www/dist/frontend/bundle/chunk-7PT7IGUJ.js +3 -3
- package/www/dist/frontend/bundle/chunk-AI5PDLDE.js +3 -3
- package/www/dist/frontend/bundle/chunk-AUTVRE23.js +1 -1
- package/www/dist/frontend/bundle/chunk-AWKVUUKN.js +2 -2
- package/www/dist/frontend/bundle/chunk-B6NXWGSB.js +1 -1
- package/www/dist/frontend/bundle/chunk-BHSHNRXW.js +1 -1
- package/www/dist/frontend/bundle/chunk-BVONDEOL.js +3 -3
- package/www/dist/frontend/bundle/chunk-C7OGVQZC.js +1 -1
- package/www/dist/frontend/bundle/chunk-CHDKROX5.js +3 -3
- package/www/dist/frontend/bundle/chunk-DNCD2F6X.js +3 -3
- package/www/dist/frontend/bundle/chunk-FFW7WOVM.js +1 -1
- package/www/dist/frontend/bundle/chunk-FHF6DL5U.js +1 -1
- package/www/dist/frontend/bundle/chunk-FO56TEZH.js +3 -3
- package/www/dist/frontend/bundle/chunk-FRCSTZQC.js +3 -3
- package/www/dist/frontend/bundle/chunk-FSHAYPVR.js +3 -3
- package/www/dist/frontend/bundle/chunk-FSRRPQMX.js +3 -3
- package/www/dist/frontend/bundle/chunk-GLQNGCFL.js +1 -1
- package/www/dist/frontend/bundle/chunk-HC7GL5JY.js +1 -1
- package/www/dist/frontend/bundle/chunk-HXNIU7FI.js +3 -3
- package/www/dist/frontend/bundle/chunk-JBDSDK2C.js +3 -3
- package/www/dist/frontend/bundle/chunk-JSC66ZLQ.js +1 -1
- package/www/dist/frontend/bundle/chunk-JVPUFDR5.js +3 -3
- package/www/dist/frontend/bundle/chunk-K6IV7LKW.js +1 -1
- package/www/dist/frontend/bundle/chunk-KJU5I76S.js +3 -3
- package/www/dist/frontend/bundle/chunk-KY73TL6O.js +3 -3
- package/www/dist/frontend/bundle/chunk-LKS3S4WX.js +1 -1
- package/www/dist/frontend/bundle/chunk-M6VVTDVX.js +2 -2
- package/www/dist/frontend/bundle/chunk-MECWXZRN.js +1 -1
- package/www/dist/frontend/bundle/chunk-N2YIZTB2.js +1 -1
- package/www/dist/frontend/bundle/chunk-NQ7L7KNT.js +3 -3
- package/www/dist/frontend/bundle/chunk-O2AJL747.js +2 -2
- package/www/dist/frontend/bundle/chunk-P7EOR36H.js +1 -1
- package/www/dist/frontend/bundle/chunk-PJYK24KZ.js +1 -1
- package/www/dist/frontend/bundle/chunk-PYLAW6UA.js +3 -3
- package/www/dist/frontend/bundle/chunk-QJJGP23I.js +1 -1
- package/www/dist/frontend/bundle/chunk-QV4IBWXA.js +1 -1
- package/www/dist/frontend/bundle/chunk-R6IQDPAP.js +3 -3
- package/www/dist/frontend/bundle/chunk-RRFSEMFS.js +3 -3
- package/www/dist/frontend/bundle/chunk-RTTBZOQU.js +3 -3
- package/www/dist/frontend/bundle/chunk-S4TLNW5D.js +1 -1
- package/www/dist/frontend/bundle/chunk-S7P222YS.js +1 -1
- package/www/dist/frontend/bundle/chunk-SE6N4ZEN.js +1 -1
- package/www/dist/frontend/bundle/chunk-SQHXO2IT.js +3 -3
- package/www/dist/frontend/bundle/chunk-T4AIQBBH.js +3 -3
- package/www/dist/frontend/bundle/chunk-TWQQHCU7.js +3 -3
- package/www/dist/frontend/bundle/chunk-U5Q332OH.js +1 -1
- package/www/dist/frontend/bundle/chunk-UIP324PP.js +1 -1
- package/www/dist/frontend/bundle/chunk-V27IRYSL.js +1 -1
- package/www/dist/frontend/bundle/chunk-V4C5FGJL.js +3 -3
- package/www/dist/frontend/bundle/chunk-V5CHFTYG.js +3 -3
- package/www/dist/frontend/bundle/chunk-VHXWCBNP.js +1 -1
- package/www/dist/frontend/bundle/chunk-W2KWSW4M.js +1 -1
- package/www/dist/frontend/bundle/chunk-W5QV7JN5.js +1 -1
- package/www/dist/frontend/bundle/chunk-WED7CGWA.js +3 -3
- package/www/dist/frontend/bundle/chunk-WQ5H5LTG.js +3 -3
- package/www/dist/frontend/bundle/chunk-WU54NCEU.js +1 -1
- package/www/dist/frontend/bundle/chunk-XCRSZKUF.js +1 -1
- package/www/dist/frontend/bundle/chunk-XFO5FUCN.js +1 -1
- package/www/dist/frontend/bundle/chunk-XWAQ2BWM.js +3 -3
- package/www/dist/frontend/bundle/chunk-YTQCHNRQ.js +3 -3
- package/www/dist/frontend/bundle/chunk-YUSK4FN3.js +3 -3
- package/www/dist/frontend/bundle/chunk-Z34BSG5O.js +3 -3
- package/www/dist/frontend/bundle/common/IobrokerHandler.js +1 -1
- package/www/dist/frontend/bundle/runtime/CustomControls.js +1 -1
- package/www/dist/frontend/bundle/runtime/ScreenViewer.js +1 -1
- package/www/dist/frontend/bundle/runtime/controls.js +4 -4
- package/www/dist/frontend/bundle/runtime/init.js +3 -3
- package/www/dist/frontend/common/Common.globals.js +1 -1
- package/www/dist/frontend/common/IobrokerHandler.js +1 -1
- package/www/dist/frontend/common/PlantPaxResolve.js +1 -1
- package/www/dist/frontend/common/Runtime.js +1 -1
- package/www/dist/frontend/config/CommandHandling.js +1 -1
- package/www/dist/frontend/config/ConfigureWebcomponentDesigner.js +1 -1
- package/www/dist/frontend/config/DockHelper.js +1 -1
- package/www/dist/frontend/config/IobrokerWebui3DDriveEngine.js +1 -1
- package/www/dist/frontend/config/IobrokerWebui3DScreenEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebui3DScreenPropertiesPanel.js +3 -3
- package/www/dist/frontend/config/IobrokerWebui3DScreenViewer.js +2 -2
- package/www/dist/frontend/config/IobrokerWebuiAppShell.js +2 -2
- package/www/dist/frontend/config/IobrokerWebuiBindingsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiConfirmationWrapper.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiControlPropertiesEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiDynamicPropsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiEventAssignment.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiIconsView.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiMonacoEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiPlantPaxTypesEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiPropertyGrid.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreenEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreensView.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiSecurityEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSignalPropertyEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSolutionExplorer.js +2 -2
- package/www/dist/frontend/config/IobrokerWebuiTranslationEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiWidgetGallery.js +3 -3
- package/www/dist/frontend/helper/DialogHelper.js +2 -2
- package/www/dist/frontend/helper/EsprimaHelper.js +1 -1
- package/www/dist/frontend/helper/Helper.js +1 -1
- package/www/dist/frontend/helper/LayoutHelper.js +1 -1
- package/www/dist/frontend/helper/XmlHelper.js +1 -1
- package/www/dist/frontend/helper/ZipHelper.js +1 -1
- package/www/dist/frontend/runtime/AnimationService.js +1 -1
- package/www/dist/frontend/runtime/CustomControls.js +1 -1
- package/www/dist/frontend/runtime/DynamicElementProperties.js +1 -1
- package/www/dist/frontend/runtime/HabPanelLikeMenu.js +3 -3
- package/www/dist/frontend/runtime/NavigationShell.js +1 -1
- package/www/dist/frontend/runtime/RuntimeTheme.js +1 -1
- package/www/dist/frontend/runtime/ScreenViewer.js +3 -3
- package/www/dist/frontend/runtime/TranslateableText.js +2 -2
- package/www/dist/frontend/runtime/VisibilityService.js +1 -1
- package/www/dist/frontend/runtime/controls.js +1 -1
- package/www/dist/frontend/runtime/init.js +1 -1
- package/www/dist/frontend/scripting/IobrokerWebuiScriptSystem.js +1 -1
- package/www/dist/frontend/scripting/blockly/OpenScreen.js +1 -1
- package/www/dist/frontend/scripting/blockly/webuiBlocklyToolbox.js +1 -1
- package/www/dist/frontend/services/DynamicPropertiesHelper.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableLocalObjectsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectDragDropService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectsForPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiConfigButtonProvider.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCopyPasteService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCustomControlEventsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCustomElementContextMenu.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiDemoProviderService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiDynamicPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiEventsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiExternalDragDropService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiLitPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiPropertyGroupsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiRefactorService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiScreenContextMenu.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiSpecialPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiSpectrumEditorService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiVisibilityPropertiesService.js +1 -1
- package/www/dist/frontend/services/LayoutComponentsPropertiesService.js +1 -1
- package/www/dist/frontend/widgets/OrthoFlowLineTool.js +1 -1
- package/www/dist/frontend/widgets/customElementsObserver.js +1 -1
- package/www/dist/frontend/widgets/importWidgetFiles.js +1 -1
- package/www/dist/frontend/widgets/importWidgetFilesRuntime.js +1 -1
- package/www/dist/frontend/widgets/layout-components.js +1 -1
- package/www/dist/frontend/widgets/layout-placement-services.js +1 -1
- package/www/dist/frontend/widgets/testElement.js +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_DBC"
|
|
10
|
+
},
|
|
11
|
+
"unit": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"default": ""
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"width": "440px",
|
|
18
|
+
"height": "460px"
|
|
19
|
+
},
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"available\" label=\"Available\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp></div><div class=\"fp-row\"><span class=\"lbl\">Process Value</span><span>[[this.pv==null?'--':this.pv]]</span></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-row\"><span class=\"lbl\">No alarms configured</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"available\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_DBC"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"settings": {
|
|
13
|
+
"width": "48px",
|
|
14
|
+
"height": "40px"
|
|
15
|
+
},
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">DBC</span></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-bg,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"available\"];\n const upd=function(){ const s=instance.__s; let bad=false,warn=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail/i.test(f)) bad=true; else warn=true; } }\n const el=instance._getDomElement('sym'); if(el) el.style.setProperty('--dv-bg', bad?'var(--ui-error,#e5484d)':(warn?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_DIn"
|
|
10
|
+
},
|
|
11
|
+
"unit": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"default": ""
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"width": "440px",
|
|
18
|
+
"height": "460px"
|
|
19
|
+
},
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"pv\" label=\"Input On\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"substActive\" label=\"Substitute\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"sim\" label=\"Simulation\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"maintByp\" label=\"Maint Byp\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Substitute</span><span>[[this.substActive?'Active':'—']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.tgtDisagree?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Target Disagree</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.ioFault?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">I/O Fault</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"pv\", \"substActive\", \"sim\", \"maintByp\", \"tgtDisagree\", \"ioFault\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_DIn"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"settings": {
|
|
13
|
+
"width": "48px",
|
|
14
|
+
"height": "40px"
|
|
15
|
+
},
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">DI</span></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-bg,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"pv\", \"tgtDisagree\", \"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,warn=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail/i.test(f)) bad=true; else warn=true; } }\n const el=instance._getDomElement('sym'); if(el) el.style.setProperty('--dv-bg', bad?'var(--ui-error,#e5484d)':(warn?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_Dose"
|
|
10
|
+
},
|
|
11
|
+
"unit": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"default": ""
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"width": "440px",
|
|
18
|
+
"height": "460px"
|
|
19
|
+
},
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"available\" label=\"Available\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"notRdy\" label=\"Not Ready\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdStart\" label=\"Start\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdStop\" label=\"Stop\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.ioFault?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">I/O Fault</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"available\", \"notRdy\", \"ioFault\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_Dose"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"settings": {
|
|
13
|
+
"width": "48px",
|
|
14
|
+
"height": "40px"
|
|
15
|
+
},
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">DZ</span></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-bg,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,warn=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail/i.test(f)) bad=true; else warn=true; } }\n const el=instance._getDomElement('sym'); if(el) el.style.setProperty('--dv-bg', bad?'var(--ui-error,#e5484d)':(warn?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_DOut"
|
|
10
|
+
},
|
|
11
|
+
"unit": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"default": ""
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"width": "440px",
|
|
18
|
+
"height": "460px"
|
|
19
|
+
},
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"pv\" label=\"Output On\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"fdbk\" label=\"Feedback\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"substActive\" label=\"Substitute\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"maintByp\" label=\"Maint Byp\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdOn\" label=\"On\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdOff\" label=\"Off\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Substitute</span><span>[[this.substActive?'Active':'—']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.ioFault?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">I/O Fault</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.fdbkDisagree?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Feedback Disagree</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"pv\", \"fdbk\", \"substActive\", \"maintByp\", \"ioFault\", \"fdbkDisagree\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_DOut"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"settings": {
|
|
13
|
+
"width": "48px",
|
|
14
|
+
"height": "40px"
|
|
15
|
+
},
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">DO</span></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-bg,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"pv\", \"ioFault\", \"fdbkDisagree\"];\n const upd=function(){ const s=instance.__s; let bad=false,warn=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail/i.test(f)) bad=true; else warn=true; } }\n const el=instance._getDomElement('sym'); if(el) el.style.setProperty('--dv-bg', bad?'var(--ui-error,#e5484d)':(warn?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_HiLoSel"
|
|
10
|
+
},
|
|
11
|
+
"unit": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"default": ""
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"width": "440px",
|
|
18
|
+
"height": "460px"
|
|
19
|
+
},
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"fp-row\"><span class=\"lbl\">Selected Output</span><span>[[this.out==null?'--':this.out]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Selected Input</span><span>[[this.selected==null?'--':this.selected]]</span></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-row\"><span class=\"lbl\">No alarms configured</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_HiLoSel"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"settings": {
|
|
13
|
+
"width": "48px",
|
|
14
|
+
"height": "40px"
|
|
15
|
+
},
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">H/L</span></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-bg,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"available\"];\n const upd=function(){ const s=instance.__s; let bad=false,warn=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail/i.test(f)) bad=true; else warn=true; } }\n const el=instance._getDomElement('sym'); if(el) el.style.setProperty('--dv-bg', bad?'var(--ui-error,#e5484d)':(warn?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_Logic"
|
|
10
|
+
},
|
|
11
|
+
"unit": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"default": ""
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"width": "440px",
|
|
18
|
+
"height": "460px"
|
|
19
|
+
},
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"out\" label=\"Output\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-row\"><span class=\"lbl\">No alarms configured</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"out\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_Logic"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"settings": {
|
|
13
|
+
"width": "48px",
|
|
14
|
+
"height": "40px"
|
|
15
|
+
},
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">LGC</span></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-bg,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"out\"];\n const upd=function(){ const s=instance.__s; let bad=false,warn=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail/i.test(f)) bad=true; else warn=true; } }\n const el=instance._getDomElement('sym'); if(el) el.style.setProperty('--dv-bg', bad?'var(--ui-error,#e5484d)':(warn?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_Motor2Spd"
|
|
10
|
+
},
|
|
11
|
+
"unit": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"default": ""
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"width": "440px",
|
|
18
|
+
"height": "460px"
|
|
19
|
+
},
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"runningFast\" label=\"Running Fast\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"runningSlow\" label=\"Running Slow\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"available\" label=\"Available\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdFast\" label=\"Fast\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdSlow\" label=\"Slow\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdStop\" label=\"Stop\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.tripped?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Interlock Trip</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.ioFault?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">I/O Fault</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"runningFast\", \"runningSlow\", \"available\", \"tripped\", \"ioFault\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_Motor2Spd"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"settings": {
|
|
13
|
+
"width": "48px",
|
|
14
|
+
"height": "40px"
|
|
15
|
+
},
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">M2</span></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-bg,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"tripped\", \"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,warn=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail/i.test(f)) bad=true; else warn=true; } }\n const el=instance._getDomElement('sym'); if(el) el.style.setProperty('--dv-bg', bad?'var(--ui-error,#e5484d)':(warn?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"properties": {
|
|
3
|
+
"root": {
|
|
4
|
+
"type": "signal",
|
|
5
|
+
"default": ""
|
|
6
|
+
},
|
|
7
|
+
"type": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"default": "P_nPos"
|
|
10
|
+
},
|
|
11
|
+
"unit": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"default": ""
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"settings": {
|
|
17
|
+
"width": "440px",
|
|
18
|
+
"height": "460px"
|
|
19
|
+
},
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"available\" label=\"Available\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"notRdy\" label=\"Not Ready\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.tripped?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Interlock Trip</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.ioFault?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">I/O Fault</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"available\", \"notRdy\", \"tripped\", \"ioFault\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
|
+
}
|