iobroker.mywebui 1.114.3 → 1.114.4
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/ain-faceplate.control +3 -3
- package/default-controls/controls/plantpax/alarm-faceplate.control +1 -1
- package/default-controls/controls/plantpax/cmdsrc-faceplate.control +1 -1
- package/default-controls/controls/plantpax/gate-faceplate.control +1 -1
- package/default-controls/controls/plantpax/intlk-faceplate.control +1 -1
- package/default-controls/controls/plantpax/meta-faceplate.control +1 -1
- package/default-controls/controls/plantpax/motor-faceplate.control +1 -1
- package/default-controls/controls/plantpax/motorrev-faceplate.control +1 -1
- package/default-controls/controls/plantpax/perm-faceplate.control +1 -1
- package/default-controls/controls/plantpax/pide-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valvec-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valveso-faceplate.control +1 -1
- package/default-controls/controls/plantpax/vsd-faceplate.control +1 -1
- 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 +23 -5
- 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 +2 -2
- 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 +2 -2
- package/www/dist/frontend/bundle/chunk-7PT7IGUJ.js +3 -3
- package/www/dist/frontend/bundle/chunk-AI5PDLDE.js +2 -2
- package/www/dist/frontend/bundle/chunk-AUTVRE23.js +1 -1
- package/www/dist/frontend/bundle/chunk-AWKVUUKN.js +3 -3
- 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 +2 -2
- package/www/dist/frontend/bundle/chunk-DNCD2F6X.js +2 -2
- 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 +2 -2
- package/www/dist/frontend/bundle/chunk-LKS3S4WX.js +1 -1
- package/www/dist/frontend/bundle/chunk-M6VVTDVX.js +3 -3
- 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 +3 -3
- 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 +2 -2
- 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 +2 -2
- package/www/dist/frontend/bundle/chunk-RTTBZOQU.js +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +3 -3
- package/www/dist/frontend/config/IobrokerWebuiAppShell.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiBindingsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiConfirmationWrapper.js +2 -2
- 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 +2 -2
- 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 +3 -3
- 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
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "520px",
|
|
18
18
|
"height": "600px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-adv-btn\" title=\"Advanced\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M4 6h10M4 12h16M4 18h7\"/><circle cx=\"17\" cy=\"6\" r=\"2\"/><circle cx=\"14\" cy=\"18\" r=\"2\"/></svg></button><button class=\"fp-x\">✕</button></div><div class=\"fp-desc\">Analog Input · EU: [[this.unit||'—']]</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=\"Diagnostics\" title=\"Diagnostics\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M6 3v6a4 4 0 008 0V3\"/><path d=\"M10 15v2a4 4 0 008 0v-1\"/><circle cx=\"18\" cy=\"14\" r=\"2\"/></svg><span class=\"fp-tab-cap\">Diag</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-badge\" bind-css:display=\"[[this.anyAlarm?'':'none']]\"></span></button><button class=\"fp-tab\" data-tab=\"Trend\" title=\"Trend\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 17l5-6 4 3 6-8\"/><path d=\"M3 21h18\"/></svg><span class=\"fp-tab-cap\">Trend</span></button></div><div class=\"fp-tabs hidden\" data-group=\"advanced\"><button class=\"fp-tab\" data-tab=\"Main\" title=\"Back to Main\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M15 6l-6 6 6 6\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button><button class=\"fp-tab\" data-tab=\"Engineering\" title=\"Engineering\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 3v3M12 18v3M3 12h3M18 12h3M5.6 5.6l2.1 2.1M16.3 16.3l2.1 2.1M18.4 5.6l-2.1 2.1M7.7 16.3l-2.1 2.1\"/></svg></button><button class=\"fp-tab\" data-tab=\"HMI\" title=\"HMI Config\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"14\" rx=\"1\"/><path d=\"M3 8h18\"/></svg></button><button class=\"fp-tab\" data-tab=\"Faults\" title=\"Faults\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M12 4v10\"/><circle cx=\"12\" cy=\"19\" r=\"0.6\"/></svg></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"fp-mai\"><webui-plantpax-components-level-bar id=\"lbar\"></webui-plantpax-components-level-bar><div class=\"fp-pv\"><div class=\"pv-big\">[[this.pv==null?'--':this.pv]]</div><div class=\"pv-eu\">[[this.unit||'']] · <span class=\"pv-mem\">Inp_PV</span></div><div class=\"fp-row\"><span class=\"lbl\">Quality</span><span bind-attr:class=\"[[this.pvBad?'qual bad':(this.pvUncertain?'qual unc':'qual good')]]\">[[this.pvBad?'BAD':(this.pvUncertain?'UNCERTAIN':'GOOD')]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Source</span><span>[[this.substActive?'Substitute':'Input']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Range</span><span>[[this.pvEuMin==null?'--':this.pvEuMin]] — [[this.pvEuMax==null?'--':this.pvEuMax]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Substitute</span><span>[[this.substActive?'On':'Off']]</span></div></div></div><div class=\"fp-flags\"><webui-plantpax-components-status-flag data-pp=\"1\" field=\"sim\" label=\"Sim\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"maintByp\" label=\"Maint Byp\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"substActive\" label=\"Substitute\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"failAlarm\" label=\"Input Fail\" tone=\"crit\"></webui-plantpax-components-status-flag></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-mrow head\"><span class=\"mnm\"></span><span class=\"mh\">Threshold</span><span class=\"mh\">Deadband</span></div><div class=\"fp-mrow\"><span class=\"mnm\">HiHi</span><input type=\"number\" class=\"mnum\" data-field=\"hiHiLim\" bind-prop:value=\"[[this.hiHiLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"hiHiDB\" bind-prop:value=\"[[this.hiHiDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">Hi</span><input type=\"number\" class=\"mnum\" data-field=\"hiLim\" bind-prop:value=\"[[this.hiLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"hiDB\" bind-prop:value=\"[[this.hiDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">Lo</span><input type=\"number\" class=\"mnum\" data-field=\"loLim\" bind-prop:value=\"[[this.loLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"loDB\" bind-prop:value=\"[[this.loDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">LoLo</span><input type=\"number\" class=\"mnum\" data-field=\"loLoLim\" bind-prop:value=\"[[this.loLoLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"loLoDB\" bind-prop:value=\"[[this.loLoDB]]\" placeholder=\"db\"></div><div class=\"fp-row\" style=\"margin-top:10px\"><span class=\"lbl\">Substitute PV</span><button class=\"fp-btn\" data-subst=\"1\">[[this.substActive?'Use Input':'Use Substitute']]</button></div></div><div data-pane=\"Engineering\" class=\"hidden\"><div class=\"fp-sec\">Raw Input Scaling</div><webui-plantpax-components-scaling-widget data-pp=\"1\" raw-min-field=\"inpRawMin\" raw-max-field=\"inpRawMax\" eu-min-field=\"pvEuMin\" eu-max-field=\"pvEuMax\"></webui-plantpax-components-scaling-widget><div class=\"fp-sec\">PV Source and Quality</div><label class=\"fp-chk\"><input type=\"checkbox\" data-fieldb=\"noSubstPV\"><span>Disable selection of Substitute PV</span></label><div class=\"fp-row\"><span class=\"lbl\">PV Filter Time Constant (sec)</span><input type=\"number\" data-field=\"filtTC\" bind-prop:value=\"[[this.filtTC]]\"></div></div><div data-pane=\"Trend\" class=\"hidden\"><div class=\"fp-sec\">PV Trend</div><webui-plantpax-components-sparkline id=\"sparkbig\" style=\"display:block;height:160px\" bind-prop:points=\"120\"></webui-plantpax-components-sparkline><div class=\"fp-row\" style=\"margin-top:6px\"><span class=\"lbl\">Current</span><span>[[this.pv==null?'--':this.pv]] [[this.unit||'']]</span></div></div><div data-pane=\"Diagnostics\" class=\"hidden\"><div class=\"fp-sec\">Signal Chain</div><div class=\"fp-row\"><span class=\"lbl\">Raw / Scaled Input</span><span>[[this.valInpPV==null?'--':this.valInpPV]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Scaled PV (EU)</span><span>[[this.pv==null?'--':this.pv]] [[this.unit||'']]</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Quality</span><span bind-attr:class=\"[[this.pvBad?'qual bad':(this.pvUncertain?'qual unc':'qual good')]]\">[[this.pvBad?'BAD':(this.pvUncertain?'UNCERTAIN':'GOOD')]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Substitute Active</span><span>[[this.substActive?'YES':'no']]</span></div></div><div data-pane=\"Alarms\" class=\"hidden\"><div class=\"fp-almbar\"><span class=\"fp-unack\" bind-css:display=\"[[(this.unackCount||0)>0?'':'none']]\">[[this.unackCount||0]] unacked</span><span class=\"fp-grow\"></span><button class=\"fp-btn\" data-ackall=\"1\">Ack All</button><button class=\"fp-btn ghost\" data-cmd=\"resetAckAll\">Reset & Ack</button><button class=\"fp-btn ghost\" data-cmd=\"resetAll\">Reset</button></div><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"HiHi\" member=\"HiHi.Alm · HiHi.Ack\" alarm-field=\"hiHiAlarm\" ack-field=\"hiHiAck\" severity=\"1000\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Hi\" member=\"Hi.Alm · Hi.Ack\" alarm-field=\"hiAlarm\" ack-field=\"hiAck\" severity=\"500\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Lo\" member=\"Lo.Alm · Lo.Ack\" alarm-field=\"loAlarm\" ack-field=\"loAck\" severity=\"500\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"LoLo\" member=\"LoLo.Alm · LoLo.Ack\" alarm-field=\"loLoAlarm\" ack-field=\"loLoAck\" severity=\"1000\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Fail\" member=\"Fail.Alm · Fail.Ack\" alarm-field=\"failAlarm\" ack-field=\"failAck\" severity=\"1500\"></webui-plantpax-components-alarm-row></div><div data-pane=\"HMI\" class=\"hidden\"><div class=\"fp-sec\">HMI Configuration</div><div class=\"fp-row\"><span class=\"lbl\">Instance</span><span style=\"font-size:11px;word-break:break-all\">[[this.root]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Type</span><span>[[this.type]]</span></div><div class=\"fp-row\"><span class=\"lbl\">EU Units</span><span>[[this.unit||'—']]</span></div></div><div data-pane=\"Faults\" class=\"hidden\"><div class=\"fp-sec\">Faults & Status</div><div class=\"fp-alm\" bind-attr:class=\"[[this.failAlarm?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Input Fail</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Bad</span><span>[[this.pvBad?'YES':'no']]</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Uncertain</span><span>[[this.pvUncertain?'YES':'no']]</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-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;}",
|
|
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 instance.pv=null; instance.pvBad=false; instance.pvUncertain=false; instance.substActive=false;\n instance.anyAlarm=false;\n const ALM=[\"hiHiAlarm\", \"hiAlarm\", \"loAlarm\", \"loLoAlarm\", \"failAlarm\"];\n const recomputeAlm=function(){ let any=false; for(const a of ALM){ if(instance[a]===true||instance[a]==='true'||instance[a]===1){ any=true; break; } } instance.anyAlarm=any; try{ instance._bindingsRefresh&&instance._bindingsRefresh(); }catch(e){} };\n const subs=[\"pv\", \"pvBad\", \"pvUncertain\", \"substActive\", \"valInpPV\", \"unackCount\", \"hiHiLim\", \"hiHiDB\", \"hiLim\", \"hiDB\", \"loLim\", \"loDB\", \"loLoLim\", \"loLoDB\", \"inpRawMax\", \"inpRawMin\", \"pvEuMax\", \"pvEuMin\", \"filtTC\", \"noSubstPV\", \"hiHiAlarm\", \"hiAlarm\", \"loAlarm\", \"loLoAlarm\", \"failAlarm\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){\n if(field==='pvBad'||field==='pvUncertain'||field==='substActive'){ instance[field]=(v===true||v==='true'||v===1); }\n else { instance[field]=v; }\n if(field==='pv') instance.pv=v;\n if(ALM.indexOf(field)>=0){ instance[field]=(v===true||v==='true'||v===1); recomputeAlm(); }\n }); })(f); }\n // reflect boolean checkbox states from live values\n const setChecks=function(){ for(const cb of instance._getDomElements('[data-fieldb]')){ const f=cb.getAttribute('data-fieldb'); cb.checked=(instance[f]===true||instance[f]==='true'||instance[f]===1); } };\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 if(name==='Engineering') setChecks();\n };\n // switch to the Advanced icon-strip (Engineering/HMI/Faults) and back to Main\n instance._adv=function(){\n for(const g of instance._getDomElements('[data-group]')) g.classList.toggle('hidden', g.getAttribute('data-group')!=='advanced');\n instance._tab('Engineering');\n };\n instance._main=function(){\n for(const g of instance._getDomElements('[data-group]')) g.classList.toggle('hidden', g.getAttribute('data-group')!=='main');\n instance._tab('Home');\n };\n ppWireHeader(instance);\n instance._tab('Home');\n // wire nested components by id (level-bar + sparklines get the EU unit too)\n (function(){ for(const cid of ['lbar','spark','sparkbig']){ const c=instance._getDomElement(cid); if(c){ c.root=instance.root; c.type=instance.type; c.unit=instance.unit;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } } } })();\n // wire composed [data-pp] components (alarm-row / scaling-widget / status-flag): give root/type + start\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 const can=function(action){ return (window.IOB && typeof window.IOB.secCan==='function') ? window.IOB.secCan(action,instance) : true; };\n const gate=function(){\n const cfg=can('configure'), mnt=can('maintenance'), ack=can('ackAlarm');\n for(const i of instance._getDomElements('[data-field],[data-fieldb]')) i.disabled=!cfg;\n for(const b of instance._getDomElements('[data-subst]')) b.classList.toggle('hidden',!mnt);\n for(const b of instance._getDomElements('[data-ack],[data-ackall]')) b.classList.toggle('hidden',!ack);\n for(const i of instance._getDomElements('.fp-mrow input')) i.disabled=!mnt;\n };\n gate();\n try{ window.IOB && window.IOB.securityChanged && window.IOB.securityChanged.on && window.IOB.securityChanged.on(gate); }catch(e){}\n // numeric config writes\n for(const i of instance._getDomElements('[data-field]')){\n (function(inp){ inp.addEventListener('change',function(){ ppWrite(instance,inp.getAttribute('data-field'),Number(inp.value),'configure'); }); })(i);\n }\n // boolean checkbox writes\n for(const cb of instance._getDomElements('[data-fieldb]')){\n (function(box){ box.addEventListener('change',function(){ ppWrite(instance,box.getAttribute('data-fieldb'),box.checked,'configure'); }); })(cb);\n }\n // substitute PV source toggle (maintenance)\n for(const b of instance._getDomElements('[data-subst]')){\n b.addEventListener('click',function(){ if(instance.substActive){ ppWrite(instance,'cmdInpPV',1,'maintenance'); } else { ppWrite(instance,'cmdSubstPV',1,'maintenance'); } });\n }\n // alarm ack\n const ackMap={\"HiHi\": \"hiHiAck\", \"Hi\": \"hiAck\", \"Lo\": \"loAck\", \"LoLo\": \"loLoAck\", \"Fail\": \"failAck\"};\n for(const b of instance._getDomElements('[data-ack]')){\n (function(btn){ btn.addEventListener('click',function(){ const nm=btn.closest('.fp-alm').querySelector('.nm').textContent; ppWrite(instance,ackMap[nm]||btn.getAttribute('data-ack'),1,'ackAlarm'); }); })(b);\n }\n for(const b of instance._getDomElements('[data-ackall]')){\n b.addEventListener('click',function(){ for(const k in ackMap) ppWrite(instance,ackMap[k],1,'ackAlarm'); });\n }\n // global alarm-set commands (Reset & Ack All / Reset)\n for(const b of instance._getDomElements('[data-cmd]')){\n (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'ackAlarm'); }); })(b);\n }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-adv-btn\" title=\"Advanced\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M4 6h10M4 12h16M4 18h7\"/><circle cx=\"17\" cy=\"6\" r=\"2\"/><circle cx=\"14\" cy=\"18\" r=\"2\"/></svg></button><button class=\"fp-x\">✕</button></div><div class=\"fp-desc\">Analog Input · EU: [[this.unit||'—']]</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=\"Diagnostics\" title=\"Diagnostics\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M6 3v6a4 4 0 008 0V3\"/><path d=\"M10 15v2a4 4 0 008 0v-1\"/><circle cx=\"18\" cy=\"14\" r=\"2\"/></svg><span class=\"fp-tab-cap\">Diag</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-badge\" bind-css:display=\"[[this.anyAlarm?'':'none']]\"></span></button><button class=\"fp-tab\" data-tab=\"Trend\" title=\"Trend\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 17l5-6 4 3 6-8\"/><path d=\"M3 21h18\"/></svg><span class=\"fp-tab-cap\">Trend</span></button></div><div class=\"fp-tabs hidden\" data-group=\"advanced\"><button class=\"fp-tab\" data-tab=\"Main\" title=\"Back to Main\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M15 6l-6 6 6 6\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button><button class=\"fp-tab\" data-tab=\"Engineering\" title=\"Engineering\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 3v3M12 18v3M3 12h3M18 12h3M5.6 5.6l2.1 2.1M16.3 16.3l2.1 2.1M18.4 5.6l-2.1 2.1M7.7 16.3l-2.1 2.1\"/></svg></button><button class=\"fp-tab\" data-tab=\"HMI\" title=\"HMI Config\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"14\" rx=\"1\"/><path d=\"M3 8h18\"/></svg></button><button class=\"fp-tab\" data-tab=\"Faults\" title=\"Faults\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M12 4v10\"/><circle cx=\"12\" cy=\"19\" r=\"0.6\"/></svg></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"fp-mai\"><webui-plantpax-components-level-bar id=\"lbar\"></webui-plantpax-components-level-bar><div class=\"fp-pv\"><div class=\"pv-big\">[[this.pv==null?'--':this.pv]]</div><div class=\"pv-eu\">[[this.unit||'']] · <span class=\"pv-mem\">Inp_PV</span></div><div class=\"fp-row\"><span class=\"lbl\">Quality</span><span bind-attr:class=\"[[this.pvBad?'qual bad':(this.pvUncertain?'qual unc':'qual good')]]\">[[this.pvBad?'BAD':(this.pvUncertain?'UNCERTAIN':'GOOD')]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Source</span><span>[[this.substActive?'Substitute':'Input']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Range</span><span>[[this.pvEuMin==null?'--':this.pvEuMin]] — [[this.pvEuMax==null?'--':this.pvEuMax]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Substitute</span><span>[[this.substActive?'On':'Off']]</span></div></div></div><div class=\"fp-flags\"><webui-plantpax-components-status-flag data-pp=\"1\" field=\"sim\" label=\"Sim\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"maintByp\" label=\"Maint Byp\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"substActive\" label=\"Substitute\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"failAlarm\" label=\"Input Fail\" tone=\"crit\"></webui-plantpax-components-status-flag></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-mrow head\"><span class=\"mnm\"></span><span class=\"mh\">Threshold</span><span class=\"mh\">Deadband</span></div><div class=\"fp-mrow\"><span class=\"mnm\">HiHi</span><input type=\"number\" class=\"mnum\" data-field=\"hiHiLim\" bind-prop:value=\"[[this.hiHiLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"hiHiDB\" bind-prop:value=\"[[this.hiHiDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">Hi</span><input type=\"number\" class=\"mnum\" data-field=\"hiLim\" bind-prop:value=\"[[this.hiLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"hiDB\" bind-prop:value=\"[[this.hiDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">Lo</span><input type=\"number\" class=\"mnum\" data-field=\"loLim\" bind-prop:value=\"[[this.loLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"loDB\" bind-prop:value=\"[[this.loDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">LoLo</span><input type=\"number\" class=\"mnum\" data-field=\"loLoLim\" bind-prop:value=\"[[this.loLoLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"loLoDB\" bind-prop:value=\"[[this.loLoDB]]\" placeholder=\"db\"></div><div class=\"fp-row\" style=\"margin-top:10px\"><span class=\"lbl\">Substitute PV</span><button class=\"fp-btn\" data-subst=\"1\">[[this.substActive?'Use Input':'Use Substitute']]</button></div></div><div data-pane=\"Engineering\" class=\"hidden\"><div class=\"fp-sec\">Raw Input Scaling</div><webui-plantpax-components-scaling-widget data-pp=\"1\" raw-min-field=\"inpRawMin\" raw-max-field=\"inpRawMax\" eu-min-field=\"pvEuMin\" eu-max-field=\"pvEuMax\"></webui-plantpax-components-scaling-widget><div class=\"fp-sec\">PV Source & Quality</div><label class=\"fp-chk\"><input type=\"checkbox\" data-fieldb=\"useChanSrcQ\"><span>Use channel source quality</span><span class=\"m\">Cfg_UseChanSrcQ</span></label><label class=\"fp-chk\"><input type=\"checkbox\" data-fieldb=\"noSubstPV\"><span>Disable substitute PV selection</span><span class=\"m\">Cfg_NoSubstPV</span></label><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Substitute PV value</b><span class=\"cfgmem\">Set_SubstPV</span></span><input type=\"number\" data-field=\"substPvSet\" bind-prop:value=\"[[this.substPvSet]]\"></div><div class=\"fp-sec\">Filtering & Thresholds</div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>PV filter time constant</b><span class=\"cfgmem\">Cfg_PVFiltTC</span></span><input type=\"number\" data-field=\"filtTC\" bind-prop:value=\"[[this.filtTC]]\"><span class=\"cfgunit\">s</span></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Fail High limit</b><span class=\"cfgmem\">Cfg_FailHiLim</span></span><input type=\"number\" data-field=\"failHiLim\" bind-prop:value=\"[[this.failHiLim]]\"></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Fail Low limit</b><span class=\"cfgmem\">Cfg_FailLoLim</span></span><input type=\"number\" data-field=\"failLoLim\" bind-prop:value=\"[[this.failLoLim]]\"></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>PV decimal places</b><span class=\"cfgmem\">Cfg_PVDecPlcs</span></span><input type=\"number\" data-field=\"pvDecPlcs\" bind-prop:value=\"[[this.pvDecPlcs]]\"></div></div><div data-pane=\"Trend\" class=\"hidden\"><div class=\"fp-sec\">PV Trend</div><webui-plantpax-components-sparkline id=\"sparkbig\" style=\"display:block;height:160px\" bind-prop:points=\"120\"></webui-plantpax-components-sparkline><div class=\"fp-row\" style=\"margin-top:6px\"><span class=\"lbl\">Current</span><span>[[this.pv==null?'--':this.pv]] [[this.unit||'']]</span></div></div><div data-pane=\"Diagnostics\" class=\"hidden\"><div class=\"fp-sec\">Signal Chain</div><div class=\"fp-row\"><span class=\"lbl\">Raw / Scaled Input</span><span>[[this.valInpPV==null?'--':this.valInpPV]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Scaled PV (EU)</span><span>[[this.pv==null?'--':this.pv]] [[this.unit||'']]</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Quality</span><span bind-attr:class=\"[[this.pvBad?'qual bad':(this.pvUncertain?'qual unc':'qual good')]]\">[[this.pvBad?'BAD':(this.pvUncertain?'UNCERTAIN':'GOOD')]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Substitute Active</span><span>[[this.substActive?'YES':'no']]</span></div></div><div data-pane=\"Alarms\" class=\"hidden\"><div class=\"fp-almbar\"><span class=\"fp-unack\" bind-css:display=\"[[(this.unackCount||0)>0?'':'none']]\">[[this.unackCount||0]] unacked</span><span class=\"fp-grow\"></span><button class=\"fp-btn\" data-ackall=\"1\">Ack All</button><button class=\"fp-btn ghost\" data-cmd=\"resetAckAll\">Reset & Ack</button><button class=\"fp-btn ghost\" data-cmd=\"resetAll\">Reset</button></div><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"HiHi\" member=\"HiHi.Alm · HiHi.Ack\" alarm-field=\"hiHiAlarm\" ack-field=\"hiHiAck\" severity=\"1000\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Hi\" member=\"Hi.Alm · Hi.Ack\" alarm-field=\"hiAlarm\" ack-field=\"hiAck\" severity=\"500\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Lo\" member=\"Lo.Alm · Lo.Ack\" alarm-field=\"loAlarm\" ack-field=\"loAck\" severity=\"500\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"LoLo\" member=\"LoLo.Alm · LoLo.Ack\" alarm-field=\"loLoAlarm\" ack-field=\"loLoAck\" severity=\"1000\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Fail\" member=\"Fail.Alm · Fail.Ack\" alarm-field=\"failAlarm\" ack-field=\"failAck\" severity=\"1500\"></webui-plantpax-components-alarm-row></div><div data-pane=\"HMI\" class=\"hidden\"><div class=\"fp-sec\">HMI Configuration</div><div class=\"fp-row\"><span class=\"lbl\">Instance</span><span style=\"font-size:11px;word-break:break-all\">[[this.root]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Type</span><span>[[this.type]]</span></div><div class=\"fp-row\"><span class=\"lbl\">EU Units</span><span>[[this.unit||'—']]</span></div></div><div data-pane=\"Faults\" class=\"hidden\"><div class=\"fp-sec\">Faults & Status</div><div class=\"fp-alm\" bind-attr:class=\"[[this.failAlarm?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Input Fail</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Bad</span><span>[[this.pvBad?'YES':'no']]</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Uncertain</span><span>[[this.pvUncertain?'YES':'no']]</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;}",
|
|
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 instance.pv=null; instance.pvBad=false; instance.pvUncertain=false; instance.substActive=false;\n instance.anyAlarm=false;\n const ALM=[\"hiHiAlarm\", \"hiAlarm\", \"loAlarm\", \"loLoAlarm\", \"failAlarm\"];\n const recomputeAlm=function(){ let any=false; for(const a of ALM){ if(instance[a]===true||instance[a]==='true'||instance[a]===1){ any=true; break; } } instance.anyAlarm=any; try{ instance._bindingsRefresh&&instance._bindingsRefresh(); }catch(e){} };\n const subs=[\"pv\", \"pvBad\", \"pvUncertain\", \"substActive\", \"valInpPV\", \"unackCount\", \"hiHiLim\", \"hiHiDB\", \"hiLim\", \"hiDB\", \"loLim\", \"loDB\", \"loLoLim\", \"loLoDB\", \"inpRawMax\", \"inpRawMin\", \"pvEuMax\", \"pvEuMin\", \"filtTC\", \"noSubstPV\", \"hiHiAlarm\", \"hiAlarm\", \"loAlarm\", \"loLoAlarm\", \"failAlarm\", \"useChanSrcQ\", \"substPvSet\", \"failHiLim\", \"failLoLim\", \"pvDecPlcs\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){\n if(field==='pvBad'||field==='pvUncertain'||field==='substActive'){ instance[field]=(v===true||v==='true'||v===1); }\n else { instance[field]=v; }\n if(field==='pv') instance.pv=v;\n if(ALM.indexOf(field)>=0){ instance[field]=(v===true||v==='true'||v===1); recomputeAlm(); }\n }); })(f); }\n // reflect boolean checkbox states from live values\n const setChecks=function(){ for(const cb of instance._getDomElements('[data-fieldb]')){ const f=cb.getAttribute('data-fieldb'); cb.checked=(instance[f]===true||instance[f]==='true'||instance[f]===1); } };\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 if(name==='Engineering') setChecks();\n };\n // switch to the Advanced icon-strip (Engineering/HMI/Faults) and back to Main\n instance._adv=function(){\n for(const g of instance._getDomElements('[data-group]')) g.classList.toggle('hidden', g.getAttribute('data-group')!=='advanced');\n instance._tab('Engineering');\n };\n instance._main=function(){\n for(const g of instance._getDomElements('[data-group]')) g.classList.toggle('hidden', g.getAttribute('data-group')!=='main');\n instance._tab('Home');\n };\n ppWireHeader(instance);\n instance._tab('Home');\n // wire nested components by id (level-bar + sparklines get the EU unit too)\n (function(){ for(const cid of ['lbar','spark','sparkbig']){ const c=instance._getDomElement(cid); if(c){ c.root=instance.root; c.type=instance.type; c.unit=instance.unit;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } } } })();\n // wire composed [data-pp] components (alarm-row / scaling-widget / status-flag): give root/type + start\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 const can=function(action){ return (window.IOB && typeof window.IOB.secCan==='function') ? window.IOB.secCan(action,instance) : true; };\n const gate=function(){\n const cfg=can('configure'), mnt=can('maintenance'), ack=can('ackAlarm');\n for(const i of instance._getDomElements('[data-field],[data-fieldb]')) i.disabled=!cfg;\n for(const b of instance._getDomElements('[data-subst]')) b.classList.toggle('hidden',!mnt);\n for(const b of instance._getDomElements('[data-ack],[data-ackall]')) b.classList.toggle('hidden',!ack);\n for(const i of instance._getDomElements('.fp-mrow input')) i.disabled=!mnt;\n };\n gate();\n try{ window.IOB && window.IOB.securityChanged && window.IOB.securityChanged.on && window.IOB.securityChanged.on(gate); }catch(e){}\n // numeric config writes\n for(const i of instance._getDomElements('[data-field]')){\n (function(inp){ inp.addEventListener('change',function(){ ppWrite(instance,inp.getAttribute('data-field'),Number(inp.value),'configure'); }); })(i);\n }\n // boolean checkbox writes\n for(const cb of instance._getDomElements('[data-fieldb]')){\n (function(box){ box.addEventListener('change',function(){ ppWrite(instance,box.getAttribute('data-fieldb'),box.checked,'configure'); }); })(cb);\n }\n // substitute PV source toggle (maintenance)\n for(const b of instance._getDomElements('[data-subst]')){\n b.addEventListener('click',function(){ if(instance.substActive){ ppWrite(instance,'cmdInpPV',1,'maintenance'); } else { ppWrite(instance,'cmdSubstPV',1,'maintenance'); } });\n }\n // alarm ack\n const ackMap={\"HiHi\": \"hiHiAck\", \"Hi\": \"hiAck\", \"Lo\": \"loAck\", \"LoLo\": \"loLoAck\", \"Fail\": \"failAck\"};\n for(const b of instance._getDomElements('[data-ack]')){\n (function(btn){ btn.addEventListener('click',function(){ const nm=btn.closest('.fp-alm').querySelector('.nm').textContent; ppWrite(instance,ackMap[nm]||btn.getAttribute('data-ack'),1,'ackAlarm'); }); })(b);\n }\n for(const b of instance._getDomElements('[data-ackall]')){\n b.addEventListener('click',function(){ for(const k in ackMap) ppWrite(instance,ackMap[k],1,'ackAlarm'); });\n }\n // global alarm-set commands (Reset & Ack All / Reset)\n for(const b of instance._getDomElements('[data-cmd]')){\n (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'ackAlarm'); }); })(b);\n }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
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=\"Operator\" title=\"Operator\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg></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></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></button></div><div class=\"fp-body\"><div data-pane=\"Operator\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"alarm\" label=\"In Alarm\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"ack\" label=\"Acked\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"shelved\" label=\"Shelved\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"suppressed\" label=\"Suppressed\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"disabled\" label=\"Disabled\" oncolor=\"var(--ui-dim,#9aa3b0)\"></webui-plantpax-components-status-lamp></div><div class=\"fp-row\"><span class=\"lbl\">Severity</span><span>[[this.severity==null?'--':this.severity]]</span></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdAck\" label=\"Ack\" value=\"1\" action=\"ackAlarm\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdShelve\" label=\"Shelve\" value=\"1\" action=\"ackAlarm\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdDisable\" label=\"Disable\" value=\"1\" action=\"disableAlarm\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Shelved</span><span>[[this.shelved?'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.alarm?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Alarm Active</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:
|
|
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
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=[\"alarm\", \"ack\", \"shelved\", \"suppressed\", \"disabled\", \"severity\"];\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('Operator');\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
23
|
}
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
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=\"Operator\" title=\"Operator\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg></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></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></button></div><div class=\"fp-body\"><div data-pane=\"Operator\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"operator\" label=\"Operator\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"program\" label=\"Program\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"override\" label=\"Override\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"maint\" label=\"Maintenance\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"local\" label=\"Local\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"extReq\" label=\"External\" oncolor=\"var(--ui-dim,#9aa3b0)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdOper\" label=\"Take Operator\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdProg\" label=\"Give Program\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Owner</span><span>[[this.operator?'Operator':(this.program?'Program':'—')]]</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.override?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Override Active</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:
|
|
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
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=[\"operator\", \"program\", \"override\", \"maint\", \"local\", \"extReq\"];\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('Operator');\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
23
|
}
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
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=\"Operator\" title=\"Operator\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg></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></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></button></div><div class=\"fp-body\"><div data-pane=\"Operator\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"inp\" label=\"Input\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"out\" label=\"Output\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"gated\" label=\"Gated\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdReset\" label=\"Reset\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Gated</span><span>[[this.gated?'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.gated?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Gate Active</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:
|
|
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
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=[\"inp\", \"out\", \"gated\"];\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('Operator');\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
23
|
}
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
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=\"Operator\" title=\"Operator\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg></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></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></button></div><div class=\"fp-body\"><div data-pane=\"Operator\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"ok\" label=\"OK\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"tripped\" label=\"Tripped\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"intlk1\" label=\"Intlk 1\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"intlk2\" label=\"Intlk 2\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"intlk3\" label=\"Intlk 3\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"bypActive\" label=\"Bypassed\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdReset\" label=\"Reset\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdByp\" label=\"Bypass\" value=\"1\" action=\"bypassInterlock\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Bypass</span><span>[[this.bypActive?'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.tripped?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Interlock Trip</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:
|
|
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
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=[\"ok\", \"tripped\", \"intlk1\", \"intlk2\", \"intlk3\", \"bypActive\"];\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('Operator');\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
23
|
}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "240px"
|
|
15
15
|
},
|
|
16
16
|
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-body\"><div class=\"fp-row\"><span class=\"lbl\">Description</span><span>[[this.desc||'—']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Label</span><span>[[this.label||'—']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Tag</span><span>[[this.tag||'—']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Area</span><span>[[this.area||'—']]</span></div></div></div>",
|
|
17
|
-
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:
|
|
17
|
+
"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);}",
|
|
18
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 for(const f of ['desc','label','tag','area']){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n ppWireHeader(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "440px"
|
|
15
15
|
},
|
|
16
16
|
"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=\"Operator\" title=\"Operator\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg></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></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></button></div><div class=\"fp-body\"><div data-pane=\"Operator\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"running\" label=\"Running\" 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><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"fault\" label=\"Faulted\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"tripped\" label=\"Intlk Trip\" oncolor=\"var(--ui-error,#e5484d)\"></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 class=\"mt-mode\">Mode <span class=\"badge\">[[this.progOper?'Operator':'Program']]</span></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Maint Bypass</span><span>[[this.maintByp?'ACTIVE':'—']]</span></div><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.failToStart?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Fail to Start</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.failToStop?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Fail to Stop</span></div><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></div></div>",
|
|
17
|
-
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:
|
|
17
|
+
"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);}",
|
|
18
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' || typeof instance._getDomElements!=='function') return;\n const subs=['running','stopped','available','fault','tripped','maintByp','progOper','failToStart','failToStop'];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=(v===true||v==='true'||v===1); 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('Operator');\n // wire nested Wave-1 components (status-lamps + command-buttons): give each root/type + start\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 // reset/ack commands\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"
|
|
19
19
|
}
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
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=\"Operator\" title=\"Operator\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg></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></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></button></div><div class=\"fp-body\"><div data-pane=\"Operator\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"running\" label=\"Running\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"forward\" label=\"Forward\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"reverse\" label=\"Reverse\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"fault\" label=\"Faulted\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdFwd\" label=\"◀ Fwd\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdRev\" label=\"Rev ▶\" 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 class=\"mt-mode\">Mode <span class=\"badge\">[[this.progOper?'Operator':'Program']]</span></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Maint Bypass</span><span>[[this.tripped?'Trip':'—']]</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.failToStart?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Fail to Start</span></div><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></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:
|
|
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
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=[\"running\", \"forward\", \"reverse\", \"stopped\", \"fault\", \"tripped\", \"progOper\", \"failToStart\"];\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('Operator');\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
23
|
}
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
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=\"Operator\" title=\"Operator\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg></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></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></button></div><div class=\"fp-body\"><div data-pane=\"Operator\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"ok\" label=\"Permit OK\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"perm1\" label=\"Perm 1\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"perm2\" label=\"Perm 2\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"perm3\" label=\"Perm 3\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"bypActive\" label=\"Bypassed\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdByp\" label=\"Bypass\" value=\"1\" action=\"bypassInterlock\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Bypass</span><span>[[this.bypActive?'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.ok?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Not Permitted</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:
|
|
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
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=[\"ok\", \"perm1\", \"perm2\", \"perm3\", \"bypActive\"];\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('Operator');\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
23
|
}
|