iobroker.mywebui 1.122.0 → 1.124.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/default-controls/controls/plantpax/alarm-symbol.control +2 -2
- package/default-controls/controls/plantpax/cmdsrc-symbol.control +2 -2
- package/default-controls/controls/plantpax/components/alarm-row.control +1 -1
- package/default-controls/controls/plantpax/components/command-button.control +1 -1
- package/default-controls/controls/plantpax/components/level-bar.control +1 -1
- package/default-controls/controls/plantpax/components/radio-toggle.control +1 -1
- package/default-controls/controls/plantpax/components/scaling-widget.control +1 -1
- package/default-controls/controls/plantpax/components/sparkline.control +1 -1
- package/default-controls/controls/plantpax/components/status-flag.control +1 -1
- package/default-controls/controls/plantpax/components/status-lamp.control +1 -1
- package/default-controls/controls/plantpax/components/std-slider.control +1 -1
- package/default-controls/controls/plantpax/components/tank.control +1 -1
- package/default-controls/controls/plantpax/components/toggle-switch.control +1 -1
- package/default-controls/controls/plantpax/dbc-symbol.control +2 -2
- package/default-controls/controls/plantpax/din-symbol.control +3 -3
- package/default-controls/controls/plantpax/dose-symbol.control +2 -2
- package/default-controls/controls/plantpax/dout-symbol.control +3 -3
- package/default-controls/controls/plantpax/gate-symbol.control +2 -2
- package/default-controls/controls/plantpax/hilosel-symbol.control +2 -2
- package/default-controls/controls/plantpax/intlk-symbol.control +2 -2
- package/default-controls/controls/plantpax/logic-symbol.control +2 -2
- package/default-controls/controls/plantpax/meta-symbol.control +2 -2
- package/default-controls/controls/plantpax/motor-faceplate.control +2 -2
- package/default-controls/controls/plantpax/motor2spd-symbol.control +3 -3
- package/default-controls/controls/plantpax/motorrev-symbol.control +3 -3
- package/default-controls/controls/plantpax/npos-symbol.control +3 -3
- package/default-controls/controls/plantpax/perm-symbol.control +2 -2
- package/default-controls/controls/plantpax/pide-symbol.control +2 -2
- package/default-controls/controls/plantpax/valvec-symbol.control +3 -3
- package/default-controls/controls/plantpax/valvemo-symbol.control +3 -3
- package/default-controls/controls/plantpax/valvemp-symbol.control +3 -3
- package/default-controls/controls/plantpax/valveso-symbol.control +3 -3
- package/default-controls/controls/plantpax/vsd-symbol.control +3 -3
- 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 +59 -15
- package/scripts/_build_plantpax_components.py +18 -1
- package/www/3d-editor/js/Animation.js +1 -1
- package/www/3d-editor/js/AnimationResizer.js +1 -1
- package/www/3d-editor/js/Command.js +1 -1
- package/www/3d-editor/js/Config.js +1 -1
- package/www/3d-editor/js/Editor.js +1 -1
- package/www/3d-editor/js/EditorControls.js +1 -1
- package/www/3d-editor/js/GLTFImportDialog.js +1 -1
- package/www/3d-editor/js/History.js +1 -1
- package/www/3d-editor/js/Loader.js +1 -1
- package/www/3d-editor/js/LoaderUtils.js +1 -1
- package/www/3d-editor/js/Menubar.Add.js +1 -1
- package/www/3d-editor/js/Menubar.Edit.js +1 -1
- package/www/3d-editor/js/Menubar.File.js +1 -1
- package/www/3d-editor/js/Menubar.Help.js +1 -1
- package/www/3d-editor/js/Menubar.Render.js +1 -1
- package/www/3d-editor/js/Menubar.Status.js +1 -1
- package/www/3d-editor/js/Menubar.View.js +1 -1
- package/www/3d-editor/js/Menubar.js +1 -1
- package/www/3d-editor/js/Player.js +1 -1
- package/www/3d-editor/js/Resizer.js +1 -1
- package/www/3d-editor/js/Script.js +1 -1
- package/www/3d-editor/js/Selector.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.BoxGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.BufferGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CapsuleGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CircleGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.CylinderGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.DodecahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.ExtrudeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.IcosahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.LatheGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.Modifiers.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.OctahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.PlaneGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.RingGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.ShapeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.SphereGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TetrahedronGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TextGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TorusGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TorusKnotGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.TubeGeometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Geometry.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.BooleanProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.ColorProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.ConstantProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.MapProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.NumberProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.Program.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.RangeValueProperty.js +1 -1
- package/www/3d-editor/js/Sidebar.Material.js +1 -1
- package/www/3d-editor/js/Sidebar.Object.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.App.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Materials.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Renderer.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.Resources.js +1 -1
- package/www/3d-editor/js/Sidebar.Project.js +1 -1
- package/www/3d-editor/js/Sidebar.Properties.js +1 -1
- package/www/3d-editor/js/Sidebar.Scene.js +1 -1
- package/www/3d-editor/js/Sidebar.Script.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.History.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.Shortcuts.js +1 -1
- package/www/3d-editor/js/Sidebar.Settings.js +1 -1
- package/www/3d-editor/js/Sidebar.js +1 -1
- package/www/3d-editor/js/Storage.js +1 -1
- package/www/3d-editor/js/Strings.js +1 -1
- package/www/3d-editor/js/TextureParametersDialog.js +1 -1
- package/www/3d-editor/js/Toolbar.js +1 -1
- package/www/3d-editor/js/Viewport.Controls.js +1 -1
- package/www/3d-editor/js/Viewport.Info.js +1 -1
- package/www/3d-editor/js/Viewport.Pathtracer.js +1 -1
- package/www/3d-editor/js/Viewport.ViewHelper.js +1 -1
- package/www/3d-editor/js/Viewport.XR.js +1 -1
- package/www/3d-editor/js/Viewport.js +1 -1
- package/www/3d-editor/js/commands/AddObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/AddScriptCommand.js +1 -1
- package/www/3d-editor/js/commands/Commands.js +1 -1
- package/www/3d-editor/js/commands/MoveObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/MultiCmdsCommand.js +1 -1
- package/www/3d-editor/js/commands/RemoveObjectCommand.js +1 -1
- package/www/3d-editor/js/commands/RemoveScriptCommand.js +1 -1
- package/www/3d-editor/js/commands/SetColorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetGeometryCommand.js +1 -1
- package/www/3d-editor/js/commands/SetGeometryValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialColorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialMapCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialRangeCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetMaterialVectorCommand.js +1 -1
- package/www/3d-editor/js/commands/SetPositionCommand.js +1 -1
- package/www/3d-editor/js/commands/SetRotationCommand.js +1 -1
- package/www/3d-editor/js/commands/SetScaleCommand.js +1 -1
- package/www/3d-editor/js/commands/SetSceneCommand.js +1 -1
- package/www/3d-editor/js/commands/SetScriptValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetShadowValueCommand.js +1 -1
- package/www/3d-editor/js/commands/SetTextureParametersCommand.js +1 -1
- package/www/3d-editor/js/commands/SetUuidCommand.js +1 -1
- package/www/3d-editor/js/commands/SetValueCommand.js +1 -1
- package/www/dist/frontend/bundle/chunk-34JJK367.js +3 -3
- package/www/dist/frontend/bundle/chunk-3AS7GRBW.js +3 -3
- package/www/dist/frontend/bundle/chunk-3C6XC7RW.js +1 -1
- package/www/dist/frontend/bundle/chunk-3R27DWVW.js +3 -3
- package/www/dist/frontend/bundle/chunk-3WGNLIWJ.js +3 -3
- package/www/dist/frontend/bundle/chunk-3YK3Y2SJ.js +1 -1
- package/www/dist/frontend/bundle/chunk-43HEBO5G.js +3 -3
- package/www/dist/frontend/bundle/chunk-5MUGMRXU.js +1 -1
- package/www/dist/frontend/bundle/chunk-5UBRCTRX.js +3 -3
- package/www/dist/frontend/bundle/chunk-65A3PNMG.js +1 -1
- package/www/dist/frontend/bundle/chunk-66EU64WD.js +1 -1
- package/www/dist/frontend/bundle/chunk-6BL3X2VD.js +3 -3
- package/www/dist/frontend/bundle/chunk-6L2YCGEX.js +1 -1
- package/www/dist/frontend/bundle/chunk-7CWDQGAG.js +3 -3
- package/www/dist/frontend/bundle/chunk-7PT7IGUJ.js +2 -2
- package/www/dist/frontend/bundle/chunk-AI5PDLDE.js +3 -3
- package/www/dist/frontend/bundle/chunk-AUTVRE23.js +1 -1
- package/www/dist/frontend/bundle/chunk-AWKVUUKN.js +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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/www/dist/frontend/bundle/chunk-O2AJL747.js +2 -2
- package/www/dist/frontend/bundle/chunk-P7EOR36H.js +1 -1
- package/www/dist/frontend/bundle/chunk-PJYK24KZ.js +1 -1
- package/www/dist/frontend/bundle/chunk-PYLAW6UA.js +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 +2 -2
- package/www/dist/frontend/bundle/chunk-RRFSEMFS.js +2 -2
- package/www/dist/frontend/bundle/chunk-RTTBZOQU.js +3 -3
- package/www/dist/frontend/bundle/chunk-S4TLNW5D.js +1 -1
- package/www/dist/frontend/bundle/chunk-S7P222YS.js +1 -1
- package/www/dist/frontend/bundle/chunk-SE6N4ZEN.js +1 -1
- package/www/dist/frontend/bundle/chunk-SQHXO2IT.js +2 -2
- package/www/dist/frontend/bundle/chunk-T4AIQBBH.js +3 -3
- package/www/dist/frontend/bundle/chunk-TWQQHCU7.js +3 -3
- package/www/dist/frontend/bundle/chunk-U5Q332OH.js +1 -1
- package/www/dist/frontend/bundle/chunk-UIP324PP.js +1 -1
- package/www/dist/frontend/bundle/chunk-V27IRYSL.js +1 -1
- package/www/dist/frontend/bundle/chunk-V4C5FGJL.js +2 -2
- package/www/dist/frontend/bundle/chunk-V5CHFTYG.js +3 -3
- package/www/dist/frontend/bundle/chunk-VHXWCBNP.js +1 -1
- package/www/dist/frontend/bundle/chunk-W2KWSW4M.js +1 -1
- package/www/dist/frontend/bundle/chunk-W5QV7JN5.js +1 -1
- package/www/dist/frontend/bundle/chunk-WED7CGWA.js +3 -3
- package/www/dist/frontend/bundle/chunk-WQ5H5LTG.js +3 -3
- package/www/dist/frontend/bundle/chunk-WU54NCEU.js +1 -1
- package/www/dist/frontend/bundle/chunk-XCRSZKUF.js +1 -1
- package/www/dist/frontend/bundle/chunk-XFO5FUCN.js +1 -1
- package/www/dist/frontend/bundle/chunk-XWAQ2BWM.js +3 -3
- package/www/dist/frontend/bundle/chunk-YTQCHNRQ.js +3 -3
- package/www/dist/frontend/bundle/chunk-YUSK4FN3.js +3 -3
- package/www/dist/frontend/bundle/chunk-Z34BSG5O.js +3 -3
- package/www/dist/frontend/bundle/common/IobrokerHandler.js +1 -1
- package/www/dist/frontend/bundle/runtime/CustomControls.js +1 -1
- package/www/dist/frontend/bundle/runtime/ScreenViewer.js +1 -1
- package/www/dist/frontend/bundle/runtime/controls.js +4 -4
- package/www/dist/frontend/bundle/runtime/init.js +2 -2
- 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 +2 -2
- package/www/dist/frontend/config/IobrokerWebui3DScreenPropertiesPanel.js +2 -2
- package/www/dist/frontend/config/IobrokerWebui3DScreenViewer.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiAppShell.js +2 -2
- package/www/dist/frontend/config/IobrokerWebuiBindingsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiConfirmationWrapper.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiControlPropertiesEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiDynamicPropsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiEventAssignment.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiIconsView.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiMonacoEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiPlantPaxTypesEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiPropertyGrid.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreenEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreensView.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiSecurityEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSignalPropertyEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSolutionExplorer.js +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 +3 -3
- 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 +2 -2
- 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
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">ALM</span></div>",
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"alarm\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"alarm\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">CMD</span></div>",
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"override\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"override\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
},
|
|
48
48
|
"html": "<div id=\"ar\" class=\"ar\"><img id=\"ico\" class=\"ar-ico\" alt=\"\"><span class=\"ar-nm\"><b id=\"nm\"></b><span id=\"mem\" class=\"ar-mem\"></span></span><span id=\"chip\" class=\"ar-chip\"></span><img id=\"ack\" class=\"ar-ackimg\" alt=\"Ack\" title=\"Acknowledge alarm\"><button id=\"shelve\" class=\"ar-btn ghost\">Shelve</button></div>",
|
|
49
49
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.ar{display:flex;align-items:center;gap:9px;padding:7px 9px;border:1px solid var(--ui-border,#4a5570);border-radius:6px;margin-bottom:6px;background:var(--ui-surface-2,#2f3545);}.ar-ico{width:18px;height:18px;flex:none;object-fit:contain;}.ar.crit{border-left:3px solid var(--ui-error,#e5484d);}.ar.warn{border-left:3px solid var(--ui-warn,#f6b73c);}.ar-nm{flex:1;font-size:12px;} .ar-nm b{display:block;} .ar-mem{font:10px monospace;color:var(--ui-dim,#9aa4b2);}.ar-chip{font:10px monospace;padding:2px 7px;border-radius:10px;}.ar-chip.unack{background:rgba(229,72,77,.16);color:var(--ui-error,#e5484d);}.ar-chip.ackd{background:rgba(48,164,108,.16);color:var(--ui-ok,#30a46c);}.ar-chip.shelv,.ar-chip.supp{background:rgba(59,125,216,.16);color:var(--ui-info,#3b7dd8);}.ar-ackimg{width:32px;height:32px;flex:none;cursor:pointer;}.ar-ackimg.off{opacity:.35;cursor:default;pointer-events:none;}.ar-btn{font-size:11px;padding:5px 10px;border-radius:5px;border:1px solid var(--ui-border,#4a5570);background:transparent;color:var(--ui-text,#e8e8ea);cursor:pointer;}",
|
|
50
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\nconst AR_ICO={\"prio-urg\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA7ElEQVQ4ja2TPQrCQBCFvyyKqPjTK0vKxUobsUwR7AX7iK2CVzIn8Ah6A1OmXHIC8QBi4Sas6//P6+btvMfbYcbDQearGRABgfO0A2Kp07VNepbQBzZA3zV1kAATqVNdGBjxHmi/EOc4AAOpUy0MsbHF5Z5CNBtFd2U0dA3aRoMwf76KXRuHNOZRUbdWi3sp+pmvZoLLwL5FJLid9icIxOue5/jZoHSPPB2Pbxt4ma+2fD+HnQDim1jdztUelHvqkUEszG4nNlufTqiOw6JurZaUuh1XnEidrv+zyuYwBm6SB0hyMVjXmOPTcz4D2MM/n+vtA34AAAAASUVORK5CYII=\", \"prio-hi\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAAuElEQVQ4ja2TPQ6CQBBG344SbRQKEgsSbbWz0Z5rcQCvxRXoOIGdBbGzMFq4ayCz6wbD1y077+3fYAjkdjkcgdoOy7xqG1+dicCZ/dSFJErggV28EvkFS1qQbM9uOgNqW6MFvpVnaUGyO/XrlUQi2/ZlIJGRsJLIH/BAItGySAQo+TyRyutx59ldQ2wHlAZGX+IXzqu2EQDbHGon882+3wcKdkcgJDGLNWa5CsIwQStP/zN5JIRggDfwqlYRazv8jwAAAABJRU5ErkJggg==\", \"prio-med\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA5ElEQVQ4jZ2SvQ3CMBSEvyC6IJTeRcIIbJARMkLYIBswAmICoKShYw5KJBpwkZooinsKnkJ+HEM4yYX17u6d5QMHjFaJ0SpxcTyHOADucl34YV7YeBOHeQYEcrJRCYxWEXARMUABLP0wf/yaYA0EZQVlBWK0thF7BrI9Bbje4HCsR6nMvibYDKSyzloGRqsYcH1bIpzBBNZ3uji1gRQm7rItiJvlaiZwvb2LmuvJ9hTY2ZhlBfOZ1WTlh/nek8pegMgmhkGDB7Cc8K5pTwxwOrd60EUEZJ7R6smnsmNRTIHtn2IAXjXIP+KmEHb7AAAAAElFTkSuQmCC\", \"prio-lo\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAAr0lEQVQ4jWNkgIKJWWsTGBgY5jMQBxLzpwUvYGBgYGBBEoz3SbNgUNKXwqvz3sVnDFtmnYhnYGBYwMDAwMCELMnOxUbQanQ1TDjUMTAwMDDsXnyWYcusE3gNZMEn+fntN4IuwusCYsBwN4CNi5WgAXhjwTXWmOHnt9/ku+DC/jsM108+JN8FT2+9gTC8yDQgqMAWr+0MDGhe+PntF0EN6GqQXbBwy6wTDgRNgKqFMQBgfyntJ+szPQAAAABJRU5ErkJggg==\", \"alm-active\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA7klEQVQ4y52TwU0DMRREHyvm7g7YVIA7IFRAStgO2BJoIRVsCYgKNiWkA9JBfPchXMbBisLGYSTLtjwz/+trDICkKOlb0sgNSBrNjQCdpADMwNaEfkFc3rbALCk8SJqAAByANfAKRODdO8Deor2L7YAeSEg6Stp4D5IGSac/1mDOWdO5OnYNwLQwgtLtzvfQufUEfAEbbmNtbgIOjznnVTWkjwaDPudceKvu4vGJO3Fp0Ddonq8aOA+xwSCa+2tQhSm0zKCEqO5gbKx+7gIYaoMX7sdbbZD+YZCWftzkP4Kj+1nuTbBoduaPPl8d8A9arze4rxI+6AAAAABJRU5ErkJggg==\", \"alm-ackd\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABMUlEQVQ4y42TzW3CQBCFPyy9c3zhjEvg4AKSDoioAOF7IhoIooFIPiOhVBBSgXEFuIO4A/vuw+SQMTLG/DxptdrVmzezb2YBkDSV9CtpzR1IWjt3ChBICoEMOAC1pOhGcATUzs0khSNJOyAESuAZeAWmwJufAfbAF1AA3y7wLyapkjTzPfIS7cp6d84pJvDsuCrAxw0LPnvcMPA3AfwAM+5j5lw6sWcOX5Q+n8+tqqr2fNapoKf+1E83mUzYbrckSXK/NklZP3ue55amafcuuxYcuruW57nFcWybzcaKorDxeNwVqHx2LoKPLWm1WllZlmZmFsfxUDuPZyJD5qVpasvl0m7NBMCofXtn6h7FoWmal2Cwn4+hPlUwYGj7PxZ+tQPqpmkWD0m7qd2WZhfOO/4AYcyI1qa9e8YAAAAASUVORK5CYII=\", \"alm-ackreqd\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABIUlEQVQ4jZWTPW6DQBCFH1FqRP1EQbnSFnELFc2eIxInICeIcwEuQOGaKu64AZR2QR+LgtbiBJPC5idkQfYnrbTa3fdmNDPrwALJPYB3AMHs+Ajgq+u6s00zF5+UUlIUhbRtKyIiZVlKkiRC8kpytyVOlVLSNI3YSNNUSP5sRs/z3CoWEen7XkgKyXjQvCw8dlrr1QCu6yIMQwBYNcCWgY3RgKQ3RNkiiiK7AYD16v7nzWYQP5K+7/sAEA8ZA5jaV5blagfmGGOE5ImkB5IBSamq6iHxwuQAkntjzFNikdt0kry+ArfKZ1n2RA1HPOc+VZ+Li1hr/aeldV0DwOW+Bub7CZIHY8z4mfI8H0Y4WL51Vgw8AN+YRvYC4KPruuPy7S/oGxMb+o3kHQAAAABJRU5ErkJggg==\", \"alm-inactive\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA+0lEQVQ4ja2S0VHDMBBEnzMpwHTgdOAOMAXcQCoglKAO6CCTCnAJyWwB0AHpwO4AdxA+dICRBeiDndHPandvR7qKBJJqYA/cAbXTE3AEgplNc/0qYx6AFgjAlZ/g3OCaT6yTAntgBG6SSb2kI/DsmodsA2CXqwngXHDNEpI6SZfs5XfdRVL3U4Pxr4BU868BXYF5oZ0HXAPnAvPZtV8Bkp6ABjgUBByA1j1UknbEv93kvi8HSQ3wCoQVcAv0pWYAMxuBHrhfE/e9lvRYGuCoIa7yyVs0s4uW+FjTLxzAqcpFSxqAF+LqQnyjzsw2qTZdpA9sfeKbn9a5Bd4B5A5T5qcv+BsAAAAASUVORK5CYII=\", \"alm-shelved\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA0UlEQVQ4jZ2SsW3DMBBFnxwXbg5R2j9BtpC9iTKBnU28gWbIBLY20AZKdTUBNe7swqQRGBFI6wEESOLex+FwFYCkFui48wucgW93D2Sonj8kbYE9sAV27j7kQv5FUidpXCT/CRljR7O8zYi1mW2AT+DDzAYz20zTdHmuXc0Et8AJCMB7vLfFrccuOknXeLq8MR+yTC6lklRzX6L6RTcAX+v4SHJfKDfJWbt7kPQD4O7HElvSIdZnVz1LmsFhoX9Mi9TEU8qjPs2gB8KLM6jdPdwA/uA+o1bOYrQAAAAASUVORK5CYII=\", \"alm-supp\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA9klEQVQ4jaWTMa6DMBBEJyi1DzASEqUlLvFvAgXufRGfAIr8mhPQcQMan8AFbWQusGkgSpD5Ij+vtWZ217N7wQ6SNYAKwM/uaQTwO8/zba/ZhAXJSWstzjkJIciG917athWttZCcSBYp8d1aKzFGOSLGKNZaIXl/MyE5WWsPhXtWk+k5s9b6z8qpTtZx6gxAZYyBUir5NymUUjDGAEAFkuK9P119I4QgJOUKAGVZYlkWdF13qoOmaZDnOQAgO933ESTfMj+L915ISgZg7Pv+48LDMADA+HWM2xj/X6TV4LtVfjF5HtPrboQQxDmXPKZLIpUaH5zzA+va1+Bf11DpAAAAAElFTkSuQmCC\", \"alm-disabled\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABzUlEQVQ4jXWTMW7iUBRFD6MsgPp9IVEhJIphKmSaQEHNIBYASCzAEQvIzAJssgAka1ZACjoKJg0tjGTqjLBs0aBgNvBSYEeOIVey9PX97v33//tegRxEpAhMgZ9AMdn+D/wBnqIoOmVq7UKOXAY2tVqtOB6PsSyL8/nMbrfDdV2CINgC7aR8lT8cEZl3Oh2N41jziONYu93uRkTqIrJJvmKWXBQR9X3/ipzAS8hvIjJPyXcZA3WAWq125Qx4Msa8JLafoygapT++Zassy7pFHhlj/gFz4DfwIiL1WwLlHPEE9Iwx3wEPGIVhSLL+uPtXAiegbYzpAkPgRxiG98A0ueJNgftmswmwXSwWbWOMB7Qsy+qFYfiYCFEqlQAGn7yKyKrRaOjxeNw4jlNOY3Icp6yqm2wUvu9rtVpVEfFS8rBarerhcPD6/X4rjWm9XrdU9fVWnr7vq4ioiLQQkdVgMPBEJCV7qlpX1bevGkJV1bZtFRHvDnhYLpd1Lhk/VCqVk+u6mxtxfkIQBADlgoj8Ah6BEfDMZZCGk8nkoziOY2azGVz6IIstie1W7lFfbdvW/X6v+/1eO52Oisj18ACFW5tJp02BVPgv0MuOcop37BYZdtrxCIQAAAAASUVORK5CYII=\", \"cmd-ack\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAAB4ElEQVRYhcWWvXXjMBCEv/spgNeBSrAC+TmUOpA6OIVeJFYFtiuwEmxKdWB1YOUKjh2cQztTCQ6weNKDfkjaIL0ZCUAzGuwMF76hRNxAxF0B/P4OcOCfPf752TcB4BkogBVArwRE3ANwBVTAI8CPHsHHwIs9DlV9BT0pIOIKoLTHRQTvjQDwBAyAjapfHi50TkDETYG/wA6Yp+ud9sCB5QpgpurX6Z6uFSgNfHUKvFMCZrkx8Aoszu3r5AosZmPaDQ+7Pq3sCiSWe7wE3gkB4B5LO1X/ULc5KwGz3B3BcrMmZ7L1gEn/n9D1c1W/anIupwLxK7duCp6NgIi7Y2+5o7S7VF++ArPcC+HfT1T9ps35HArEtFu2BQdTQMTF0Jio+l3TwyLuidD1laoftgWHvQI7gnfLC3tT8DF7y7W691MEZvZDU8vwOvCC0PXQIO1qCZjsE3t3b4FyqeK9r9MB41MEjETFXsoyzu1pmeWmfFH6WEc2FHElYYJ5JXzJdgdrA2oGjLZ1ZENVPwc2hBnuOVmOabfMAX6SgNWMoMDYrHZyps9RZ5MwSbglwXJQM2C0rV/nFrbb7dtodP1OaLgbe73IJX0tASNRjUbXhRHYqPrbnODQ4Fug6heEjGg0YLStD2XTpfneGuMxAAAAAElFTkSuQmCC\", \"cmd-ack-disa\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAABvUlEQVRYhcWWbXnCQBCE3/apAOoACeBgcAAOigNQACgAB8EBOGAdFAdFQiT0x+090OMjSbmE/RfujpnM7UwWXlBm1jezAcDHK8CBb3/8fO+aALADesAWoFMCZrYEBsARWAG8dQgu4OCPQ0lH6EgBM+sBhT/OI3hnBIA10AdM0uZyoXUCZjYGvoASmKbrrfbAheV6wETSPt3TtgKFg29vgbdKwC0n4ATM7+1r5Qo8ZmPaDS+7Pq3sCiSWWz0Cb4UAsMDTTtKyanNWAm65GcFykzpnsvWAS/9D6PqppG2dczkViF+5fV3wbATMbMbZcldp96ievgK33IHw9iNJ1uR8DgVi2m2agoMrYGYxNEaSyrqHzWxN6PqjpGFTcDgrUBK8WzzYm4KLs+Ua3fstAhP/o7FneBV4j9D1UCPtKgm47CP/beGB8qjive/TAeNfBJzEkbOURZzb03LLjXlS+lhXNjSzgjDBnAhfsvJirU/FgNG0rmwoaQoYYYbbJcsx7TY5wG8S8JoQFJBb7eZMn6PuJmGScBuC5aBiwMhGwEl88Tcb5s92fSMCTiKmnUkaVe1vWpXfAklzQkbUGjCa1i8+T6S6pgvcmgAAAABJRU5ErkJggg==\"};\n\nfunction arApply(instance){\n const ico=instance._getDomElement('ico'), nm=instance._getDomElement('nm'), mem=instance._getDomElement('mem'),\n chip=instance._getDomElement('chip'), ar=instance._getDomElement('ar'),\n ack=instance._getDomElement('ack'), sh=instance._getDomElement('shelve');\n if(nm) nm.textContent=instance.name||'';\n if(mem) mem.innerHTML=(instance.member||instance.alarmField||'');\n const active=instance.__active===true, ackd=instance.__ackd===true,\n shelved=instance.__shelved===true, supp=instance.__supp===true, dis=instance.__dis===true;\n const sev=(instance.severity|0);\n if(ar){ ar.classList.toggle('crit', sev>=750 || (active&&sev>=500)); ar.classList.toggle('warn', sev>0 && sev<750); }\n // real Rockwell alarm-state icon\n let icoKey='alm-inactive', s='ackd', t='OK';\n if(dis){ icoKey='alm-disabled'; s='supp'; t='DISABLED'; }\n else if(supp){ icoKey='alm-supp'; s='supp'; t='SUPPRESSED'; }\n else if(shelved){ icoKey='alm-shelved'; s='shelv'; t='SHELVED'; }\n else if(active&&!ackd){ icoKey=(sev>=1000?'prio-urg':(sev>=750?'prio-hi':(sev>=250?'prio-med':'prio-lo'))); s='unack'; t='UNACK'; }\n else if(active){ icoKey='alm-ackd'; s='ackd'; t='ACTIVE'; }\n if(ico && AR_ICO[icoKey]) ico.src=AR_ICO[icoKey];\n if(chip){ chip.className='ar-chip '+s; chip.textContent=t; }\n // real ACK command button graphic; dim when nothing to ack\n if(ack){ const needAck=active&&!ackd; ack.src=AR_ICO[needAck?'cmd-ack':'cmd-ack-disa']||''; ack.classList.toggle('off',!needAck); }\n if(sh) sh.style.display = instance.__allowShelve ? '' : 'none';\n}\nfunction arStart(instance){\n ppCleanup(instance);\n if(!instance.root){ arApply(instance); return; }\n const sub=(f,k)=>{ if(!instance[f]) return; ppSubscribe(instance,instance[f],function(v){ instance[k]=(v===true||v==='true'||v===1); arApply(instance); }); };\n if(instance.alarmField) ppSubscribe(instance,instance.alarmField,function(v){ instance.__active=(v===true||v==='true'||v===1); arApply(instance); });\n sub('ackField','__ackd'); sub('shelveField','__shelved'); sub('suppressField','__supp'); sub('disableField','__dis');\n arApply(instance);\n}\nexport function init(instance){\n if(!instance||typeof instance._getDomElement!=='function') return;\n instance.__allowShelve = !!instance.shelveField;\n instance._ppReinit=function(){ arStart(instance); };\n const ack=instance._getDomElement('ack'), sh=instance._getDomElement('shelve');\n if(ack) ack.addEventListener('click',function(){ if(instance.ackField) ppWrite(instance,instance.ackField,1,'ackAlarm'); });\n if(sh) sh.addEventListener('click',function(){ if(instance.shelveField) ppWrite(instance,instance.shelveField,1,'ackAlarm'); });\n arStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
50
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\nconst AR_ICO={\"prio-urg\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA7ElEQVQ4ja2TPQrCQBCFvyyKqPjTK0vKxUobsUwR7AX7iK2CVzIn8Ah6A1OmXHIC8QBi4Sas6//P6+btvMfbYcbDQearGRABgfO0A2Kp07VNepbQBzZA3zV1kAATqVNdGBjxHmi/EOc4AAOpUy0MsbHF5Z5CNBtFd2U0dA3aRoMwf76KXRuHNOZRUbdWi3sp+pmvZoLLwL5FJLid9icIxOue5/jZoHSPPB2Pbxt4ma+2fD+HnQDim1jdztUelHvqkUEszG4nNlufTqiOw6JurZaUuh1XnEidrv+zyuYwBm6SB0hyMVjXmOPTcz4D2MM/n+vtA34AAAAASUVORK5CYII=\", \"prio-hi\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAAuElEQVQ4ja2TPQ6CQBBG344SbRQKEgsSbbWz0Z5rcQCvxRXoOIGdBbGzMFq4ayCz6wbD1y077+3fYAjkdjkcgdoOy7xqG1+dicCZ/dSFJErggV28EvkFS1qQbM9uOgNqW6MFvpVnaUGyO/XrlUQi2/ZlIJGRsJLIH/BAItGySAQo+TyRyutx59ldQ2wHlAZGX+IXzqu2EQDbHGon882+3wcKdkcgJDGLNWa5CsIwQStP/zN5JIRggDfwqlYRazv8jwAAAABJRU5ErkJggg==\", \"prio-med\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA5ElEQVQ4jZ2SvQ3CMBSEvyC6IJTeRcIIbJARMkLYIBswAmICoKShYw5KJBpwkZooinsKnkJ+HEM4yYX17u6d5QMHjFaJ0SpxcTyHOADucl34YV7YeBOHeQYEcrJRCYxWEXARMUABLP0wf/yaYA0EZQVlBWK0thF7BrI9Bbje4HCsR6nMvibYDKSyzloGRqsYcH1bIpzBBNZ3uji1gRQm7rItiJvlaiZwvb2LmuvJ9hTY2ZhlBfOZ1WTlh/nek8pegMgmhkGDB7Cc8K5pTwxwOrd60EUEZJ7R6smnsmNRTIHtn2IAXjXIP+KmEHb7AAAAAElFTkSuQmCC\", \"prio-lo\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAAr0lEQVQ4jWNkgIKJWWsTGBgY5jMQBxLzpwUvYGBgYGBBEoz3SbNgUNKXwqvz3sVnDFtmnYhnYGBYwMDAwMCELMnOxUbQanQ1TDjUMTAwMDDsXnyWYcusE3gNZMEn+fntN4IuwusCYsBwN4CNi5WgAXhjwTXWmOHnt9/ku+DC/jsM108+JN8FT2+9gTC8yDQgqMAWr+0MDGhe+PntF0EN6GqQXbBwy6wTDgRNgKqFMQBgfyntJ+szPQAAAABJRU5ErkJggg==\", \"alm-active\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA7klEQVQ4y52TwU0DMRREHyvm7g7YVIA7IFRAStgO2BJoIRVsCYgKNiWkA9JBfPchXMbBisLGYSTLtjwz/+trDICkKOlb0sgNSBrNjQCdpADMwNaEfkFc3rbALCk8SJqAAByANfAKRODdO8Deor2L7YAeSEg6Stp4D5IGSac/1mDOWdO5OnYNwLQwgtLtzvfQufUEfAEbbmNtbgIOjznnVTWkjwaDPudceKvu4vGJO3Fp0Ddonq8aOA+xwSCa+2tQhSm0zKCEqO5gbKx+7gIYaoMX7sdbbZD+YZCWftzkP4Kj+1nuTbBoduaPPl8d8A9arze4rxI+6AAAAABJRU5ErkJggg==\", \"alm-ackd\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABMUlEQVQ4y42TzW3CQBCFPyy9c3zhjEvg4AKSDoioAOF7IhoIooFIPiOhVBBSgXEFuIO4A/vuw+SQMTLG/DxptdrVmzezb2YBkDSV9CtpzR1IWjt3ChBICoEMOAC1pOhGcATUzs0khSNJOyAESuAZeAWmwJufAfbAF1AA3y7wLyapkjTzPfIS7cp6d84pJvDsuCrAxw0LPnvcMPA3AfwAM+5j5lw6sWcOX5Q+n8+tqqr2fNapoKf+1E83mUzYbrckSXK/NklZP3ue55amafcuuxYcuruW57nFcWybzcaKorDxeNwVqHx2LoKPLWm1WllZlmZmFsfxUDuPZyJD5qVpasvl0m7NBMCofXtn6h7FoWmal2Cwn4+hPlUwYGj7PxZ+tQPqpmkWD0m7qd2WZhfOO/4AYcyI1qa9e8YAAAAASUVORK5CYII=\", \"alm-ackreqd\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABIUlEQVQ4jZWTPW6DQBCFH1FqRP1EQbnSFnELFc2eIxInICeIcwEuQOGaKu64AZR2QR+LgtbiBJPC5idkQfYnrbTa3fdmNDPrwALJPYB3AMHs+Ajgq+u6s00zF5+UUlIUhbRtKyIiZVlKkiRC8kpytyVOlVLSNI3YSNNUSP5sRs/z3CoWEen7XkgKyXjQvCw8dlrr1QCu6yIMQwBYNcCWgY3RgKQ3RNkiiiK7AYD16v7nzWYQP5K+7/sAEA8ZA5jaV5blagfmGGOE5ImkB5IBSamq6iHxwuQAkntjzFNikdt0kry+ArfKZ1n2RA1HPOc+VZ+Li1hr/aeldV0DwOW+Bub7CZIHY8z4mfI8H0Y4WL51Vgw8AN+YRvYC4KPruuPy7S/oGxMb+o3kHQAAAABJRU5ErkJggg==\", \"alm-inactive\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA+0lEQVQ4ja2S0VHDMBBEnzMpwHTgdOAOMAXcQCoglKAO6CCTCnAJyWwB0AHpwO4AdxA+dICRBeiDndHPandvR7qKBJJqYA/cAbXTE3AEgplNc/0qYx6AFgjAlZ/g3OCaT6yTAntgBG6SSb2kI/DsmodsA2CXqwngXHDNEpI6SZfs5XfdRVL3U4Pxr4BU868BXYF5oZ0HXAPnAvPZtV8Bkp6ABjgUBByA1j1UknbEv93kvi8HSQ3wCoQVcAv0pWYAMxuBHrhfE/e9lvRYGuCoIa7yyVs0s4uW+FjTLxzAqcpFSxqAF+LqQnyjzsw2qTZdpA9sfeKbn9a5Bd4B5A5T5qcv+BsAAAAASUVORK5CYII=\", \"alm-shelved\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA0UlEQVQ4jZ2SsW3DMBBFnxwXbg5R2j9BtpC9iTKBnU28gWbIBLY20AZKdTUBNe7swqQRGBFI6wEESOLex+FwFYCkFui48wucgW93D2Sonj8kbYE9sAV27j7kQv5FUidpXCT/CRljR7O8zYi1mW2AT+DDzAYz20zTdHmuXc0Et8AJCMB7vLfFrccuOknXeLq8MR+yTC6lklRzX6L6RTcAX+v4SHJfKDfJWbt7kPQD4O7HElvSIdZnVz1LmsFhoX9Mi9TEU8qjPs2gB8KLM6jdPdwA/uA+o1bOYrQAAAAASUVORK5CYII=\", \"alm-supp\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAA9klEQVQ4jaWTMa6DMBBEJyi1DzASEqUlLvFvAgXufRGfAIr8mhPQcQMan8AFbWQusGkgSpD5Ij+vtWZ217N7wQ6SNYAKwM/uaQTwO8/zba/ZhAXJSWstzjkJIciG917athWttZCcSBYp8d1aKzFGOSLGKNZaIXl/MyE5WWsPhXtWk+k5s9b6z8qpTtZx6gxAZYyBUir5NymUUjDGAEAFkuK9P119I4QgJOUKAGVZYlkWdF13qoOmaZDnOQAgO933ESTfMj+L915ISgZg7Pv+48LDMADA+HWM2xj/X6TV4LtVfjF5HtPrboQQxDmXPKZLIpUaH5zzA+va1+Bf11DpAAAAAElFTkSuQmCC\", \"alm-disabled\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAABzUlEQVQ4jXWTMW7iUBRFD6MsgPp9IVEhJIphKmSaQEHNIBYASCzAEQvIzAJssgAka1ZACjoKJg0tjGTqjLBs0aBgNvBSYEeOIVey9PX97v33//tegRxEpAhMgZ9AMdn+D/wBnqIoOmVq7UKOXAY2tVqtOB6PsSyL8/nMbrfDdV2CINgC7aR8lT8cEZl3Oh2N41jziONYu93uRkTqIrJJvmKWXBQR9X3/ipzAS8hvIjJPyXcZA3WAWq125Qx4Msa8JLafoygapT++Zassy7pFHhlj/gFz4DfwIiL1WwLlHPEE9Iwx3wEPGIVhSLL+uPtXAiegbYzpAkPgRxiG98A0ueJNgftmswmwXSwWbWOMB7Qsy+qFYfiYCFEqlQAGn7yKyKrRaOjxeNw4jlNOY3Icp6yqm2wUvu9rtVpVEfFS8rBarerhcPD6/X4rjWm9XrdU9fVWnr7vq4ioiLQQkdVgMPBEJCV7qlpX1bevGkJV1bZtFRHvDnhYLpd1Lhk/VCqVk+u6mxtxfkIQBADlgoj8Ah6BEfDMZZCGk8nkoziOY2azGVz6IIstie1W7lFfbdvW/X6v+/1eO52Oisj18ACFW5tJp02BVPgv0MuOcop37BYZdtrxCIQAAAAASUVORK5CYII=\", \"cmd-ack\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAAB4ElEQVRYhcWWvXXjMBCEv/spgNeBSrAC+TmUOpA6OIVeJFYFtiuwEmxKdWB1YOUKjh2cQztTCQ6weNKDfkjaIL0ZCUAzGuwMF76hRNxAxF0B/P4OcOCfPf752TcB4BkogBVArwRE3ANwBVTAI8CPHsHHwIs9DlV9BT0pIOIKoLTHRQTvjQDwBAyAjapfHi50TkDETYG/wA6Yp+ud9sCB5QpgpurX6Z6uFSgNfHUKvFMCZrkx8Aoszu3r5AosZmPaDQ+7Pq3sCiSWe7wE3gkB4B5LO1X/ULc5KwGz3B3BcrMmZ7L1gEn/n9D1c1W/anIupwLxK7duCp6NgIi7Y2+5o7S7VF++ArPcC+HfT1T9ps35HArEtFu2BQdTQMTF0Jio+l3TwyLuidD1laoftgWHvQI7gnfLC3tT8DF7y7W691MEZvZDU8vwOvCC0PXQIO1qCZjsE3t3b4FyqeK9r9MB41MEjETFXsoyzu1pmeWmfFH6WEc2FHElYYJ5JXzJdgdrA2oGjLZ1ZENVPwc2hBnuOVmOabfMAX6SgNWMoMDYrHZyps9RZ5MwSbglwXJQM2C0rV/nFrbb7dtodP1OaLgbe73IJX0tASNRjUbXhRHYqPrbnODQ4Fug6heEjGg0YLStD2XTpfneGuMxAAAAAElFTkSuQmCC\", \"cmd-ack-disa\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAABvUlEQVRYhcWWbXnCQBCE3/apAOoACeBgcAAOigNQACgAB8EBOGAdFAdFQiT0x+090OMjSbmE/RfujpnM7UwWXlBm1jezAcDHK8CBb3/8fO+aALADesAWoFMCZrYEBsARWAG8dQgu4OCPQ0lH6EgBM+sBhT/OI3hnBIA10AdM0uZyoXUCZjYGvoASmKbrrfbAheV6wETSPt3TtgKFg29vgbdKwC0n4ATM7+1r5Qo8ZmPaDS+7Pq3sCiSWWz0Cb4UAsMDTTtKyanNWAm65GcFykzpnsvWAS/9D6PqppG2dczkViF+5fV3wbATMbMbZcldp96ievgK33IHw9iNJ1uR8DgVi2m2agoMrYGYxNEaSyrqHzWxN6PqjpGFTcDgrUBK8WzzYm4KLs+Ua3fstAhP/o7FneBV4j9D1UCPtKgm47CP/beGB8qjive/TAeNfBJzEkbOURZzb03LLjXlS+lhXNjSzgjDBnAhfsvJirU/FgNG0rmwoaQoYYYbbJcsx7TY5wG8S8JoQFJBb7eZMn6PuJmGScBuC5aBiwMhGwEl88Tcb5s92fSMCTiKmnUkaVe1vWpXfAklzQkbUGjCa1i8+T6S6pgvcmgAAAABJRU5ErkJggg==\"};\n\nfunction arApply(instance){\n const ico=instance._getDomElement('ico'), nm=instance._getDomElement('nm'), mem=instance._getDomElement('mem'),\n chip=instance._getDomElement('chip'), ar=instance._getDomElement('ar'),\n ack=instance._getDomElement('ack'), sh=instance._getDomElement('shelve');\n if(nm) nm.textContent=instance.name||'';\n if(mem) mem.innerHTML=(instance.member||instance.alarmField||'');\n const active=instance.__active===true, ackd=instance.__ackd===true,\n shelved=instance.__shelved===true, supp=instance.__supp===true, dis=instance.__dis===true;\n const sev=(instance.severity|0);\n if(ar){ ar.classList.toggle('crit', sev>=750 || (active&&sev>=500)); ar.classList.toggle('warn', sev>0 && sev<750); }\n // real Rockwell alarm-state icon\n let icoKey='alm-inactive', s='ackd', t='OK';\n if(dis){ icoKey='alm-disabled'; s='supp'; t='DISABLED'; }\n else if(supp){ icoKey='alm-supp'; s='supp'; t='SUPPRESSED'; }\n else if(shelved){ icoKey='alm-shelved'; s='shelv'; t='SHELVED'; }\n else if(active&&!ackd){ icoKey=(sev>=1000?'prio-urg':(sev>=750?'prio-hi':(sev>=250?'prio-med':'prio-lo'))); s='unack'; t='UNACK'; }\n else if(active){ icoKey='alm-ackd'; s='ackd'; t='ACTIVE'; }\n if(ico && AR_ICO[icoKey]) ico.src=AR_ICO[icoKey];\n if(chip){ chip.className='ar-chip '+s; chip.textContent=t; }\n // real ACK command button graphic; dim when nothing to ack\n if(ack){ const needAck=active&&!ackd; ack.src=AR_ICO[needAck?'cmd-ack':'cmd-ack-disa']||''; ack.classList.toggle('off',!needAck); }\n if(sh) sh.style.display = instance.__allowShelve ? '' : 'none';\n}\nfunction arStart(instance){\n ppCleanup(instance);\n if(!instance.root){ arApply(instance); return; }\n const sub=(f,k)=>{ if(!instance[f]) return; ppSubscribe(instance,instance[f],function(v){ instance[k]=(v===true||v==='true'||v===1); arApply(instance); }); };\n if(instance.alarmField){ ppHideIfMissing(instance,instance.alarmField,instance._getDomElement('ar'));\n ppSubscribe(instance,instance.alarmField,function(v){ instance.__active=(v===true||v==='true'||v===1); arApply(instance); }); }\n sub('ackField','__ackd'); sub('shelveField','__shelved'); sub('suppressField','__supp'); sub('disableField','__dis');\n arApply(instance);\n}\nexport function init(instance){\n if(!instance||typeof instance._getDomElement!=='function') return;\n instance.__allowShelve = !!instance.shelveField;\n instance._ppReinit=function(){ arStart(instance); };\n const ack=instance._getDomElement('ack'), sh=instance._getDomElement('shelve');\n if(ack) ack.addEventListener('click',function(){ if(instance.ackField) ppWrite(instance,instance.ackField,1,'ackAlarm'); });\n if(sh) sh.addEventListener('click',function(){ if(instance.shelveField) ppWrite(instance,instance.shelveField,1,'ackAlarm'); });\n arStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
51
51
|
}
|
|
@@ -31,5 +31,5 @@
|
|
|
31
31
|
},
|
|
32
32
|
"html": "<button id=\"cb\" class=\"cb\">[[this.label||'Command']]</button>",
|
|
33
33
|
"style": ":host{display:inline-block;}.cb{padding:6px 12px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:12px;font-family:'Segoe UI',sans-serif;}.cb:hover{filter:brightness(1.1);}.cb:disabled{opacity:.4;cursor:not-allowed;}",
|
|
34
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ gate(); };\n const btn=instance._getDomElement('cb'); if(!btn) return;\n function gate(){ const a=instance.action||'operate';\n const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(a,instance):true; btn.disabled=!ok; }\n gate();\n try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(gate); }catch(e){}\n btn.addEventListener('click',function(){\n const id=ppResolve(instance,instance.field); if(!id) return;\n let val=instance.value; if(val==='true')val=true; else if(val==='false')val=false; else if(val!==''&&!isNaN(val))val=Number(val);\n try{ window.IOB.secWriteState(id,val,{action:instance.action||'operate',element:instance}); }catch(e){ console.warn('[plantpax] cmd write failed',e); }\n });\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
34
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ gate(); };\n const btn=instance._getDomElement('cb'); if(!btn) return;\n function gate(){ const a=instance.action||'operate';\n const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(a,instance):true; btn.disabled=!ok; }\n gate();\n if(instance.root&&instance.field) ppHideIfMissing(instance,instance.field,btn);\n try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(gate); }catch(e){}\n btn.addEventListener('click',function(){\n const id=ppResolve(instance,instance.field); if(!id) return;\n let val=instance.value; if(val==='true')val=true; else if(val==='false')val=false; else if(val!==''&&!isNaN(val))val=Number(val);\n try{ window.IOB.secWriteState(id,val,{action:instance.action||'operate',element:instance}); }catch(e){ console.warn('[plantpax] cmd write failed',e); }\n });\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
35
35
|
}
|
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
},
|
|
24
24
|
"html": "<div id=\"lb\" class=\"lb\"><div id=\"scale\" class=\"lb-scale\"><div id=\"fill\" class=\"lb-fill\"></div><div id=\"mk-hihi\" class=\"lb-mk hihi\"><span class=\"lb-mv\" id=\"mv-hihi\"></span></div><div id=\"mk-hi\" class=\"lb-mk hi\"><span class=\"lb-mv\" id=\"mv-hi\"></span></div><div id=\"mk-lo\" class=\"lb-mk lo\"><span class=\"lb-mv\" id=\"mv-lo\"></span></div><div id=\"mk-lolo\" class=\"lb-mk lolo\"><span class=\"lb-mv\" id=\"mv-lolo\"></span></div><div id=\"ptr\" class=\"lb-ptr\"><span id=\"ptrval\"></span></div></div></div>",
|
|
25
25
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.lb{display:flex;justify-content:center;padding:6px 2px;}.lb-scale{position:relative;width:46px;height:190px;border-radius:5px;background:linear-gradient(var(--ui-surface-2,#2f3545),color-mix(in srgb,var(--ui-surface-2,#2f3545) 55%,transparent));border:1px solid var(--ui-border,#4a5570);overflow:visible;}.lb-fill{position:absolute;left:0;right:0;bottom:0;height:0%;border-radius:0 0 4px 4px;background:var(--lb-col,var(--ui-ok,#30a46c));opacity:.9;transition:height .25s,background .25s;}.lb-mk{position:absolute;left:-2px;right:-2px;height:0;border-top:2px dashed;z-index:2;}.lb-mv{position:absolute;left:calc(100% + 6px);top:-8px;font:10px monospace;white-space:nowrap;}.lb-mk.hihi,.lb-mk.lolo{border-color:var(--ui-error,#e5484d);color:var(--ui-error,#e5484d);}.lb-mk.hi,.lb-mk.lo{border-color:var(--ui-warn,#f6b73c);color:var(--ui-warn,#f6b73c);}.lb-ptr{position:absolute;left:-3px;right:-3px;height:2px;background:var(--ui-text,#e8e8ea);z-index:3;transition:bottom .25s;}.lb-ptr span{position:absolute;right:calc(100% + 5px);top:-8px;font:600 10px monospace;white-space:nowrap;color:var(--ui-text,#e8e8ea);}.lb-mk.off,.lb-ptr.off{display:none;}",
|
|
26
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction lbApply(instance){\n if(typeof instance._getDomElement!=='function') return;\n const min=ppNum(instance.pvEuMin), max=ppNum(instance.pvEuMax), pv=ppNum(instance.pv);\n const span=(min!=null&&max!=null&&max>min)?(max-min):null;\n // percent from the BOTTOM of the scale (bottom=min, top=max)\n const pct=(v)=>{ if(v==null||span==null) return null; return Math.max(0,Math.min(100,(v-min)/span*100)); };\n const dp=(instance.decimals!=null)?Number(instance.decimals):1;\n // markers: position by limit value, print the EU value beside each\n const mk=(mid,vid,v)=>{ const el=instance._getDomElement(mid), lab=instance._getDomElement(vid);\n const p=pct(v);\n if(el){ if(p==null){ el.classList.add('off'); } else { el.classList.remove('off'); el.style.bottom=p+'%'; } }\n if(lab) lab.textContent=(v==null)?'':Number(v).toFixed(0); };\n mk('mk-hihi','mv-hihi',ppNum(instance.hiHiLim));\n mk('mk-hi','mv-hi',ppNum(instance.hiLim));\n mk('mk-lo','mv-lo',ppNum(instance.loLim));\n mk('mk-lolo','mv-lolo',ppNum(instance.loLoLim));\n // fill + pointer\n const fp=pct(pv), fill=instance._getDomElement('fill'), ptr=instance._getDomElement('ptr'), pval=instance._getDomElement('ptrval');\n if(fill) fill.style.height=(fp==null?0:fp)+'%';\n if(ptr){ if(fp==null){ ptr.classList.add('off'); } else { ptr.classList.remove('off'); ptr.style.bottom=fp+'%'; } }\n if(pval) pval.textContent=(pv==null)?'':pv.toFixed(dp);\n // fill colour: highest active threshold (computed from PV vs limits; falls back to alarm flags)\n const A=instance.__alm||{};\n const hh=ppNum(instance.hiHiLim), ll=ppNum(instance.loLoLim), h=ppNum(instance.hiLim), l=ppNum(instance.loLim);\n let crit=A.hiHiAlarm||A.loLoAlarm||A.failAlarm, warn=A.hiAlarm||A.loAlarm;\n if(pv!=null){ if((hh!=null&&pv>=hh)||(ll!=null&&pv<=ll)) crit=true; else if((h!=null&&pv>=h)||(l!=null&&pv<=l)) warn=true; }\n const col=crit?'var(--ui-error,#e5484d)':(warn?'var(--ui-warn,#f6b73c)':'var(--ui-ok,#30a46c)');\n const lb=instance._getDomElement('lb'); if(lb) lb.style.setProperty('--lb-col',col);\n}\nfunction lbStart(instance){\n ppCleanup(instance);\n instance.__alm={};\n if(!instance.root){ lbApply(instance); return; }\n const F=['pv','pvEuMin','pvEuMax','hiHiLim','hiLim','loLim','loLoLim'];\n for(const f of F){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; lbApply(instance); }); })(f); }\n const AL=['hiHiAlarm','hiAlarm','loAlarm','loLoAlarm','failAlarm'];\n for(const a of AL){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__alm[name]=(v===true||v==='true'||v===1); lbApply(instance); }); })(a); }\n lbApply(instance);\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n instance._ppReinit=function(){ lbStart(instance); };\n lbStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
26
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction lbApply(instance){\n if(typeof instance._getDomElement!=='function') return;\n const min=ppNum(instance.pvEuMin), max=ppNum(instance.pvEuMax), pv=ppNum(instance.pv);\n const span=(min!=null&&max!=null&&max>min)?(max-min):null;\n // percent from the BOTTOM of the scale (bottom=min, top=max)\n const pct=(v)=>{ if(v==null||span==null) return null; return Math.max(0,Math.min(100,(v-min)/span*100)); };\n const dp=(instance.decimals!=null)?Number(instance.decimals):1;\n // markers: position by limit value, print the EU value beside each\n const mk=(mid,vid,v)=>{ const el=instance._getDomElement(mid), lab=instance._getDomElement(vid);\n const p=pct(v);\n if(el){ if(p==null){ el.classList.add('off'); } else { el.classList.remove('off'); el.style.bottom=p+'%'; } }\n if(lab) lab.textContent=(v==null)?'':Number(v).toFixed(0); };\n mk('mk-hihi','mv-hihi',ppNum(instance.hiHiLim));\n mk('mk-hi','mv-hi',ppNum(instance.hiLim));\n mk('mk-lo','mv-lo',ppNum(instance.loLim));\n mk('mk-lolo','mv-lolo',ppNum(instance.loLoLim));\n // fill + pointer\n const fp=pct(pv), fill=instance._getDomElement('fill'), ptr=instance._getDomElement('ptr'), pval=instance._getDomElement('ptrval');\n if(fill) fill.style.height=(fp==null?0:fp)+'%';\n if(ptr){ if(fp==null){ ptr.classList.add('off'); } else { ptr.classList.remove('off'); ptr.style.bottom=fp+'%'; } }\n if(pval) pval.textContent=(pv==null)?'':pv.toFixed(dp);\n // fill colour: highest active threshold (computed from PV vs limits; falls back to alarm flags)\n const A=instance.__alm||{};\n const hh=ppNum(instance.hiHiLim), ll=ppNum(instance.loLoLim), h=ppNum(instance.hiLim), l=ppNum(instance.loLim);\n let crit=A.hiHiAlarm||A.loLoAlarm||A.failAlarm, warn=A.hiAlarm||A.loAlarm;\n if(pv!=null){ if((hh!=null&&pv>=hh)||(ll!=null&&pv<=ll)) crit=true; else if((h!=null&&pv>=h)||(l!=null&&pv<=l)) warn=true; }\n const col=crit?'var(--ui-error,#e5484d)':(warn?'var(--ui-warn,#f6b73c)':'var(--ui-ok,#30a46c)');\n const lb=instance._getDomElement('lb'); if(lb) lb.style.setProperty('--lb-col',col);\n}\nfunction lbStart(instance){\n ppCleanup(instance);\n instance.__alm={};\n if(!instance.root){ lbApply(instance); return; }\n const F=['pv','pvEuMin','pvEuMax','hiHiLim','hiLim','loLim','loLoLim'];\n for(const f of F){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; lbApply(instance); }); })(f); }\n const AL=['hiHiAlarm','hiAlarm','loAlarm','loLoAlarm','failAlarm'];\n for(const a of AL){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__alm[name]=(v===true||v==='true'||v===1); lbApply(instance); }); })(a); }\n lbApply(instance);\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n instance._ppReinit=function(){ lbStart(instance); };\n lbStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
27
27
|
}
|
|
@@ -27,5 +27,5 @@
|
|
|
27
27
|
},
|
|
28
28
|
"html": "<div id=\"rt\" class=\"rt\"></div>",
|
|
29
29
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.rt{display:inline-flex;border:1px solid var(--ui-border,#4a5570);border-radius:4px;overflow:hidden;}.rt button{padding:5px 12px;background:var(--ui-surface-2,#2f3545);color:var(--ui-dim,#9aa3b0);border:none;cursor:pointer;font-size:12px;border-right:1px solid var(--ui-border,#4a5570);}.rt button:last-child{border-right:none;}.rt button.sel{background:var(--accent,#2680eb);color:#fff;}.rt button:disabled{opacity:.5;cursor:not-allowed;}",
|
|
30
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction rtApply(instance){ const cur=String(instance.__val);\n for(const b of (instance._getDomElements?instance._getDomElements('#rt button'):[])) b.classList.toggle('sel', b.getAttribute('data-v')===cur); }\nfunction rtStart(instance){\n ppCleanup(instance);\n const box=instance._getDomElement('rt'); if(!box) return;\n let opts=[]; try{ opts=JSON.parse(instance.options||'[]'); }catch(e){ opts=[]; }\n box.innerHTML='';\n for(const o of opts){ const b=document.createElement('button'); b.textContent=o.label; b.setAttribute('data-v',String(o.value));\n ppGate(instance,b,instance.action||'operate');\n b.addEventListener('click',function(){ if(b.disabled) return; let v=o.value; if(v!==''&&!isNaN(v))v=Number(v); ppWrite(instance,instance.field,v,instance.action||'operate'); });\n box.appendChild(b); }\n if(instance.root&&instance.field) ppSubscribe(instance,instance.field,function(v){ instance.__val=v; rtApply(instance); });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ rtStart(instance); };\n rtStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
30
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction rtApply(instance){ const cur=String(instance.__val);\n for(const b of (instance._getDomElements?instance._getDomElements('#rt button'):[])) b.classList.toggle('sel', b.getAttribute('data-v')===cur); }\nfunction rtStart(instance){\n ppCleanup(instance);\n const box=instance._getDomElement('rt'); if(!box) return;\n let opts=[]; try{ opts=JSON.parse(instance.options||'[]'); }catch(e){ opts=[]; }\n box.innerHTML='';\n for(const o of opts){ const b=document.createElement('button'); b.textContent=o.label; b.setAttribute('data-v',String(o.value));\n ppGate(instance,b,instance.action||'operate');\n b.addEventListener('click',function(){ if(b.disabled) return; let v=o.value; if(v!==''&&!isNaN(v))v=Number(v); ppWrite(instance,instance.field,v,instance.action||'operate'); });\n box.appendChild(b); }\n if(instance.root&&instance.field) ppSubscribe(instance,instance.field,function(v){ instance.__val=v; rtApply(instance); });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ rtStart(instance); };\n rtStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
31
31
|
}
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
},
|
|
36
36
|
"html": "<div class=\"sw\"><div class=\"sw-col\"><div class=\"sw-h\">Raw</div><input id=\"rmax\" class=\"sw-i\" data-w=\"rawMaxField\"><input id=\"rmin\" class=\"sw-i\" data-w=\"rawMinField\"></div><div class=\"sw-arw\">→</div><div class=\"sw-col\"><div class=\"sw-h\">EU <span id=\"u\"></span></div><input id=\"emax\" class=\"sw-i\" data-w=\"euMaxField\"><input id=\"emin\" class=\"sw-i\" data-w=\"euMinField\"></div></div>",
|
|
37
37
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.sw{display:flex;align-items:center;gap:10px;}.sw-col{flex:1;text-align:center;}.sw-h{font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--ui-dim,#9aa4b2);margin-bottom:5px;}.sw-i{width:100%;text-align:right;font:12px monospace;padding:4px 8px;margin-bottom:5px;border-radius:5px;border:1px solid var(--ui-border,#4a5570);background:var(--ui-surface,#1e222b);color:var(--ui-text,#e8e8ea);box-sizing:border-box;}.sw-arw{color:var(--accent,#2680eb);font-size:20px;padding-top:16px;}",
|
|
38
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction swStart(instance){\n ppCleanup(instance);\n const u=instance._getDomElement('u'); if(u) u.textContent=instance.unit||'';\n if(!instance.root) return;\n for(const cid of ['rmax','rmin','emax','emin']){\n const el=instance._getDomElement(cid); if(!el) continue;\n const fkey=el.getAttribute('data-w'); const field=instance[fkey]; if(!field){ el.disabled=true; continue; }\n ppSubscribe(instance,field,function(v){ if(document.activeElement!==el){ const n=ppNum(v); el.value=(n==null?'':n); } });\n el.addEventListener('change',function(){ ppWrite(instance,field,Number(el.value),'configure'); });\n }\n}\nexport function init(instance){\n if(!instance||typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ swStart(instance); }; swStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
38
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction swStart(instance){\n ppCleanup(instance);\n const u=instance._getDomElement('u'); if(u) u.textContent=instance.unit||'';\n if(!instance.root) return;\n for(const cid of ['rmax','rmin','emax','emin']){\n const el=instance._getDomElement(cid); if(!el) continue;\n const fkey=el.getAttribute('data-w'); const field=instance[fkey]; if(!field){ el.disabled=true; continue; }\n ppSubscribe(instance,field,function(v){ if(document.activeElement!==el){ const n=ppNum(v); el.value=(n==null?'':n); } });\n el.addEventListener('change',function(){ ppWrite(instance,field,Number(el.value),'configure'); });\n }\n}\nexport function init(instance){\n if(!instance||typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ swStart(instance); }; swStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
39
39
|
}
|
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
},
|
|
24
24
|
"html": "<div id=\"sp\" class=\"sp\"><svg id=\"svg\" class=\"sp-svg\" preserveAspectRatio=\"none\" viewBox=\"0 0 100 30\"><polyline id=\"pl\" class=\"sp-line\" points=\"\"></polyline></svg></div>",
|
|
25
25
|
"style": ":host{display:block;width:100%;height:100%;}.sp{width:100%;height:100%;min-height:34px;background:var(--ui-surface-2,#2f3545);border:1px solid var(--ui-border,#4a5570);border-radius:4px;box-sizing:border-box;padding:2px;}.sp-svg{width:100%;height:100%;display:block;}.sp-line{fill:none;stroke:var(--sp-col,var(--accent,#2680eb));stroke-width:1.5;vector-effect:non-scaling-stroke;}",
|
|
26
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction spDraw(instance){\n const buf=instance.__buf||[]; if(!buf.length) return;\n const pl=instance._getDomElement('pl'); if(!pl) return;\n let lo=Math.min.apply(null,buf), hi=Math.max.apply(null,buf);\n if(hi<=lo) hi=lo+1;\n const n=buf.length, W=100, H=30;\n const pts=buf.map(function(v,i){ const x=(n<2)?0:(i/(n-1)*W); const y=H-((v-lo)/(hi-lo)*H); return x.toFixed(2)+','+y.toFixed(2); });\n pl.setAttribute('points', pts.join(' '));\n}\nfunction spStart(instance){\n ppCleanup(instance); instance.__buf=[];\n if(!instance.root) return;\n const cap=Number(instance.points)||60;\n ppSubscribe(instance,instance.field||'pv',function(v){\n v=Number(v); if(!isFinite(v)) return;\n instance.__buf.push(v); if(instance.__buf.length>cap) instance.__buf.shift();\n spDraw(instance);\n });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ spStart(instance); };\n spStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
26
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction spDraw(instance){\n const buf=instance.__buf||[]; if(!buf.length) return;\n const pl=instance._getDomElement('pl'); if(!pl) return;\n let lo=Math.min.apply(null,buf), hi=Math.max.apply(null,buf);\n if(hi<=lo) hi=lo+1;\n const n=buf.length, W=100, H=30;\n const pts=buf.map(function(v,i){ const x=(n<2)?0:(i/(n-1)*W); const y=H-((v-lo)/(hi-lo)*H); return x.toFixed(2)+','+y.toFixed(2); });\n pl.setAttribute('points', pts.join(' '));\n}\nfunction spStart(instance){\n ppCleanup(instance); instance.__buf=[];\n if(!instance.root) return;\n const cap=Number(instance.points)||60;\n ppSubscribe(instance,instance.field||'pv',function(v){\n v=Number(v); if(!isFinite(v)) return;\n instance.__buf.push(v); if(instance.__buf.length>cap) instance.__buf.shift();\n spDraw(instance);\n });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ spStart(instance); };\n spStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
27
27
|
}
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
},
|
|
36
36
|
"html": "<div id=\"sf\" class=\"sf\"><span class=\"sf-dot\"></span><span id=\"lb\"></span></div>",
|
|
37
37
|
"style": ":host{display:inline-block;font-family:'Segoe UI',sans-serif;}.sf{display:flex;align-items:center;gap:5px;font-size:11px;padding:3px 8px;border-radius:5px;background:var(--ui-surface-2,#2f3545);border:1px solid var(--ui-border,#4a5570);color:var(--ui-dim,#9aa4b2);}.sf-dot{width:8px;height:8px;border-radius:2px;background:var(--ui-border,#4a5570);}.sf.on{color:var(--ui-text,#e8e8ea);} .sf.on.crit .sf-dot{background:var(--ui-error,#e5484d);}.sf.on.warn .sf-dot{background:var(--ui-warn,#f6b73c);} .sf.on.ok .sf-dot{background:var(--ui-ok,#30a46c);}",
|
|
38
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction sfStart(instance){\n ppCleanup(instance);\n const lb=instance._getDomElement('lb'); if(lb) lb.textContent=instance.label||'';\n const sf=instance._getDomElement('sf');\n if(!instance.root||!instance.field){ if(sf) sf.className='sf'; return; }\n ppSubscribe(instance,instance.field,function(v){ const on=(v===true||v==='true'||v===1);\n if(sf){ sf.className='sf'+(on?' on '+(instance.tone||'ok'):''); }\n if(lb) lb.textContent=(on?(instance.onLabel||instance.label):(instance.offLabel||instance.label))||''; });\n}\nexport function init(instance){\n if(!instance||typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ sfStart(instance); }; sfStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
38
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction sfStart(instance){\n ppCleanup(instance);\n const lb=instance._getDomElement('lb'); if(lb) lb.textContent=instance.label||'';\n const sf=instance._getDomElement('sf');\n if(!instance.root||!instance.field){ if(sf) sf.className='sf'; return; }\n ppHideIfMissing(instance,instance.field,sf);\n ppSubscribe(instance,instance.field,function(v){ const on=(v===true||v==='true'||v===1);\n if(sf){ sf.className='sf'+(on?' on '+(instance.tone||'ok'):''); }\n if(lb) lb.textContent=(on?(instance.onLabel||instance.label):(instance.offLabel||instance.label))||''; });\n}\nexport function init(instance){\n if(!instance||typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ sfStart(instance); }; sfStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
39
39
|
}
|
|
@@ -31,5 +31,5 @@
|
|
|
31
31
|
},
|
|
32
32
|
"html": "<div id=\"lp\" class=\"lp\"><span id=\"dot\" class=\"lp-dot\"></span><span id=\"lbl\" class=\"lp-lbl\">[[this.label||'']]</span></div>",
|
|
33
33
|
"style": ":host{display:inline-block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.lp{display:inline-flex;align-items:center;gap:6px;}.lp-dot{width:12px;height:12px;border-radius:50%;background:var(--lp-col,var(--ui-dim,#6b7280));box-shadow:0 0 4px var(--lp-col,transparent);transition:background .2s;}.lp-lbl{font-size:12px;}",
|
|
34
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction lpApply(instance){\n const on=instance.__on===true;\n const col= on ? (instance.oncolor||'var(--ui-ok,#30a46c)') : (instance.offcolor||'var(--ui-dim,#4a5570)');\n const el=instance._getDomElement('dot'); if(el) el.style.setProperty('--lp-col', col);\n}\nfunction lpStart(instance){\n ppCleanup(instance);\n if(!instance.root||!instance.field){ lpApply(instance); return; }\n ppSubscribe(instance,instance.field,function(v){ instance.__on=(v===true||v==='true'||v===1); lpApply(instance); });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ lpStart(instance); };\n lpStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
34
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction lpApply(instance){\n const on=instance.__on===true;\n const col= on ? (instance.oncolor||'var(--ui-ok,#30a46c)') : (instance.offcolor||'var(--ui-dim,#4a5570)');\n const el=instance._getDomElement('dot'); if(el) el.style.setProperty('--lp-col', col);\n}\nfunction lpStart(instance){\n ppCleanup(instance);\n if(!instance.root||!instance.field){ lpApply(instance); return; }\n ppHideIfMissing(instance,instance.field,instance._getDomElement('lp'));\n ppSubscribe(instance,instance.field,function(v){ instance.__on=(v===true||v==='true'||v===1); lpApply(instance); });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ lpStart(instance); };\n lpStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
35
35
|
}
|
|
@@ -39,5 +39,5 @@
|
|
|
39
39
|
},
|
|
40
40
|
"html": "<div id=\"sl\" class=\"sl\"><span class=\"sl-lbl\">[[this.label||'']]</span><input id=\"rng\" type=\"range\" class=\"sl-rng\"><span id=\"val\" class=\"sl-val\">--</span></div>",
|
|
41
41
|
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.sl{display:flex;align-items:center;gap:8px;}.sl-lbl{font-size:12px;min-width:40px;}.sl-rng{flex:1;accent-color:var(--accent,#2680eb);}.sl-val{font-size:12px;min-width:40px;text-align:right;}.sl-rng:disabled{opacity:.4;}",
|
|
42
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction slStart(instance){\n ppCleanup(instance);\n const rng=instance._getDomElement('rng'), val=instance._getDomElement('val'); if(!rng) return;\n rng.min=instance.min!=null?instance.min:0; rng.max=instance.max!=null?instance.max:100; rng.step=instance.step!=null?instance.step:1;\n ppGate(instance,rng,instance.action||'setpointOverride');\n if(instance.root&&instance.field) ppSubscribe(instance,instance.field,function(v){ const n=ppNum(v); if(n!=null){ rng.value=n; if(val) val.textContent=n.toFixed(1); } });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ slStart(instance); };\n const rng=instance._getDomElement('rng'), val=instance._getDomElement('val');\n if(rng){ rng.addEventListener('input',function(){ if(val) val.textContent=Number(rng.value).toFixed(1); });\n rng.addEventListener('change',function(){ ppWrite(instance,instance.field,Number(rng.value),instance.action||'setpointOverride'); }); }\n slStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
42
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction slStart(instance){\n ppCleanup(instance);\n const rng=instance._getDomElement('rng'), val=instance._getDomElement('val'); if(!rng) return;\n rng.min=instance.min!=null?instance.min:0; rng.max=instance.max!=null?instance.max:100; rng.step=instance.step!=null?instance.step:1;\n ppGate(instance,rng,instance.action||'setpointOverride');\n if(instance.root&&instance.field) ppSubscribe(instance,instance.field,function(v){ const n=ppNum(v); if(n!=null){ rng.value=n; if(val) val.textContent=n.toFixed(1); } });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ slStart(instance); };\n const rng=instance._getDomElement('rng'), val=instance._getDomElement('val');\n if(rng){ rng.addEventListener('input',function(){ if(val) val.textContent=Number(rng.value).toFixed(1); });\n rng.addEventListener('change',function(){ ppWrite(instance,instance.field,Number(rng.value),instance.action||'setpointOverride'); }); }\n slStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
43
43
|
}
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"tk\" class=\"tk\"><svg viewBox=\"0 0 60 90\" class=\"tk-svg\" preserveAspectRatio=\"none\"><clipPath id=\"tkc\"><rect x=\"6\" y=\"8\" width=\"48\" height=\"74\" rx=\"6\"/></clipPath><rect id=\"fill\" x=\"6\" y=\"82\" width=\"48\" height=\"0\" clip-path=\"url(#tkc)\" class=\"tk-fill\"></rect><rect x=\"6\" y=\"8\" width=\"48\" height=\"74\" rx=\"6\" class=\"tk-out\"/></svg><span id=\"pvt\" class=\"tk-pv\">--</span></div>",
|
|
17
17
|
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.tk{position:relative;width:100%;height:100%;min-width:44px;min-height:64px;cursor:pointer;}.tk-svg{width:100%;height:100%;display:block;}.tk-out{fill:none;stroke:var(--ui-border,#4a5570);stroke-width:2;}.tk-fill{fill:var(--tk-col,var(--ui-ok,#30a46c));transition:y .3s,height .3s,fill .3s;}.tk-pv{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:12px;font-weight:700;color:var(--ui-text,#e8e8ea);text-shadow:0 1px 2px rgba(0,0,0,.6);pointer-events:none;}",
|
|
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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction tkApply(instance){\n const min=ppNum(instance.pvEuMin), max=ppNum(instance.pvEuMax), pv=ppNum(instance.pv);\n const fill=instance._getDomElement('fill'), pvt=instance._getDomElement('pvt'), tk=instance._getDomElement('tk');\n if(fill && min!=null && max!=null && max>min && pv!=null){\n let p=Math.max(0,Math.min(1,(pv-min)/(max-min)));\n const top=8, full=74, h=full*p;\n fill.setAttribute('y',(top+full-h).toFixed(1)); fill.setAttribute('height',h.toFixed(1));\n }\n if(pvt) pvt.textContent=(pv==null)?'--':pv.toFixed(1);\n const A=instance.__alm||{};\n const col=(A.hiHiAlarm||A.loLoAlarm||A.failAlarm)?'var(--ui-error,#e5484d)':((A.hiAlarm||A.loAlarm)?'var(--ui-warn,#f6b73c)':'var(--ui-ok,#30a46c)');\n if(tk) tk.style.setProperty('--tk-col',col);\n}\nfunction tkStart(instance){\n ppCleanup(instance); instance.__alm={};\n if(!instance.root){ tkApply(instance); return; }\n for(const f of ['pv','pvEuMin','pvEuMax']){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; tkApply(instance); }); })(f); }\n for(const a of ['hiHiAlarm','hiAlarm','loAlarm','loLoAlarm','failAlarm']){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__alm[name]=(v===true||v==='true'||v===1); tkApply(instance); }); })(a); }\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ tkStart(instance); };\n const tk=instance._getDomElement('tk');\n if(tk) tk.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n tkStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction tkApply(instance){\n const min=ppNum(instance.pvEuMin), max=ppNum(instance.pvEuMax), pv=ppNum(instance.pv);\n const fill=instance._getDomElement('fill'), pvt=instance._getDomElement('pvt'), tk=instance._getDomElement('tk');\n if(fill && min!=null && max!=null && max>min && pv!=null){\n let p=Math.max(0,Math.min(1,(pv-min)/(max-min)));\n const top=8, full=74, h=full*p;\n fill.setAttribute('y',(top+full-h).toFixed(1)); fill.setAttribute('height',h.toFixed(1));\n }\n if(pvt) pvt.textContent=(pv==null)?'--':pv.toFixed(1);\n const A=instance.__alm||{};\n const col=(A.hiHiAlarm||A.loLoAlarm||A.failAlarm)?'var(--ui-error,#e5484d)':((A.hiAlarm||A.loAlarm)?'var(--ui-warn,#f6b73c)':'var(--ui-ok,#30a46c)');\n if(tk) tk.style.setProperty('--tk-col',col);\n}\nfunction tkStart(instance){\n ppCleanup(instance); instance.__alm={};\n if(!instance.root){ tkApply(instance); return; }\n for(const f of ['pv','pvEuMin','pvEuMax']){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; tkApply(instance); }); })(f); }\n for(const a of ['hiHiAlarm','hiAlarm','loAlarm','loLoAlarm','failAlarm']){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__alm[name]=(v===true||v==='true'||v===1); tkApply(instance); }); })(a); }\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ tkStart(instance); };\n const tk=instance._getDomElement('tk');\n if(tk) tk.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n tkStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -27,5 +27,5 @@
|
|
|
27
27
|
},
|
|
28
28
|
"html": "<div id=\"tg\" class=\"tg\"><span class=\"tg-lbl\">[[this.label||'']]</span><button id=\"sw\" class=\"tg-sw\" role=\"switch\"><span class=\"tg-knob\"></span></button></div>",
|
|
29
29
|
"style": ":host{display:inline-block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.tg{display:inline-flex;align-items:center;gap:8px;}.tg-lbl{font-size:12px;}.tg-sw{position:relative;width:38px;height:20px;border-radius:10px;border:none;cursor:pointer;background:var(--ui-surface-2,#4a5570);transition:background .2s;padding:0;}.tg-sw.on{background:var(--ui-ok,#30a46c);}.tg-knob{position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:left .2s;}.tg-sw.on .tg-knob{left:20px;}.tg-sw:disabled{opacity:.4;cursor:not-allowed;}",
|
|
30
|
-
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n\nfunction tgApply(instance){ const sw=instance._getDomElement('sw'); if(sw) sw.classList.toggle('on', instance.__on===true); }\nfunction tgStart(instance){\n ppCleanup(instance);\n const sw=instance._getDomElement('sw'); if(sw) ppGate(instance,sw,instance.action||'operate');\n if(!instance.root||!instance.field){ tgApply(instance); return; }\n ppSubscribe(instance,instance.field,function(v){ instance.__on=(v===true||v==='true'||v===1); tgApply(instance); });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ tgStart(instance); };\n const sw=instance._getDomElement('sw');\n if(sw) sw.addEventListener('click',function(){ if(sw.disabled) return; ppWrite(instance,instance.field,!(instance.__on===true),instance.action||'operate'); });\n tgStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
30
|
+
"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); };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); }).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}\nfunction ppNum(v){ v=Number(v); return isFinite(v)&&Math.abs(v)<1e30 ? v : null; }\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||'operate',element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\nfunction ppGate(instance,el,action){\n const g=function(){ const ok=(window.IOB&&typeof window.IOB.secCan==='function')?window.IOB.secCan(action||'operate',instance):true; el.disabled=!ok; el.classList.toggle('pp-nogate',!ok); };\n g(); try{ window.IOB&&window.IOB.securityChanged&&window.IOB.securityChanged.on&&window.IOB.securityChanged.on(g); }catch(e){}\n}\n// adapter-data-gating: hide el when the resolved member does not exist on the adapter\n// (real .gfx controls are included only when our adapter actually exposes the member).\nasync function ppHideIfMissing(instance,field,el){\n if(!el) return;\n const id=ppResolve(instance,field);\n if(!id){ el.style.display='none'; return; }\n try{\n const o=await window.IOB.getObject(id).catch(function(){ return null; });\n if(o){ el.style.display=''; return; }\n const s=await window.IOB.getState(id).catch(function(){ return null; });\n el.style.display=(s===null||s===undefined)?'none':'';\n }catch(e){}\n}\n\nfunction tgApply(instance){ const sw=instance._getDomElement('sw'); if(sw) sw.classList.toggle('on', instance.__on===true); }\nfunction tgStart(instance){\n ppCleanup(instance);\n const sw=instance._getDomElement('sw'); if(sw) ppGate(instance,sw,instance.action||'operate');\n if(!instance.root||!instance.field){ tgApply(instance); return; }\n ppSubscribe(instance,instance.field,function(v){ instance.__on=(v===true||v==='true'||v===1); tgApply(instance); });\n}\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance._ppReinit=function(){ tgStart(instance); };\n const sw=instance._getDomElement('sw');\n if(sw) sw.addEventListener('click',function(){ if(sw.disabled) return; ppWrite(instance,instance.field,!(instance.__on===true),instance.action||'operate'); });\n tgStart(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
31
31
|
}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">DBC</span></div>",
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"available\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"available\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"width": "48px",
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
|
-
"html": "<div id=\"sym\" class=\"dv-sym\"><
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"pv\", \"tgtDisagree\", \"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><svg id=\"svg\" viewBox=\"0 0 48 40\" class=\"dv-svg\"><rect x=\"10\" y=\"6\" width=\"28\" height=\"28\" rx=\"3\" class=\"dv-fill dv-out\"/><circle cx=\"24\" cy=\"20\" r=\"6\" class=\"dv-dot\"/></svg></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"pv\", \"tgtDisagree\", \"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">DZ</span></div>",
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"width": "48px",
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
|
-
"html": "<div id=\"sym\" class=\"dv-sym\"><
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"pv\", \"ioFault\", \"fdbkDisagree\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
16
|
+
"html": "<div id=\"sym\" class=\"dv-sym\"><svg id=\"svg\" viewBox=\"0 0 48 40\" class=\"dv-svg\"><rect x=\"10\" y=\"6\" width=\"28\" height=\"28\" rx=\"3\" class=\"dv-fill dv-out\"/><circle cx=\"24\" cy=\"20\" r=\"6\" class=\"dv-dot\"/></svg></div>",
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"pv\", \"ioFault\", \"fdbkDisagree\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">GT</span></div>",
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"gated\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"gated\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">H/L</span></div>",
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"available\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"available\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
"height": "40px"
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">ILK</span></div>",
|
|
17
|
-
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;background:var(--dv-
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"tripped\"];\n const upd=function(){ const s=instance.__s; let bad=false,
|
|
17
|
+
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
+
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"tripped\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|