iobroker.mywebui 1.121.0 → 1.123.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/ain-faceplate.control +2 -2
- package/default-controls/controls/plantpax/alarm-faceplate.control +1 -1
- package/default-controls/controls/plantpax/alarm-symbol.control +2 -2
- package/default-controls/controls/plantpax/cmdsrc-faceplate.control +1 -1
- 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-faceplate.control +1 -1
- package/default-controls/controls/plantpax/dbc-symbol.control +2 -2
- package/default-controls/controls/plantpax/din-faceplate.control +1 -1
- package/default-controls/controls/plantpax/din-symbol.control +3 -3
- package/default-controls/controls/plantpax/dose-faceplate.control +1 -1
- package/default-controls/controls/plantpax/dose-symbol.control +2 -2
- package/default-controls/controls/plantpax/dout-faceplate.control +1 -1
- package/default-controls/controls/plantpax/dout-symbol.control +3 -3
- package/default-controls/controls/plantpax/gate-faceplate.control +1 -1
- package/default-controls/controls/plantpax/gate-symbol.control +2 -2
- package/default-controls/controls/plantpax/hilosel-faceplate.control +1 -1
- package/default-controls/controls/plantpax/hilosel-symbol.control +2 -2
- package/default-controls/controls/plantpax/intlk-faceplate.control +1 -1
- package/default-controls/controls/plantpax/intlk-symbol.control +2 -2
- package/default-controls/controls/plantpax/logic-faceplate.control +1 -1
- package/default-controls/controls/plantpax/logic-symbol.control +2 -2
- package/default-controls/controls/plantpax/meta-faceplate.control +1 -1
- package/default-controls/controls/plantpax/meta-symbol.control +2 -2
- package/default-controls/controls/plantpax/motor-faceplate.control +1 -1
- package/default-controls/controls/plantpax/motor2spd-faceplate.control +1 -1
- package/default-controls/controls/plantpax/motor2spd-symbol.control +3 -3
- package/default-controls/controls/plantpax/motorrev-faceplate.control +1 -1
- package/default-controls/controls/plantpax/motorrev-symbol.control +3 -3
- package/default-controls/controls/plantpax/npos-faceplate.control +1 -1
- package/default-controls/controls/plantpax/npos-symbol.control +3 -3
- package/default-controls/controls/plantpax/perm-faceplate.control +1 -1
- package/default-controls/controls/plantpax/perm-symbol.control +2 -2
- package/default-controls/controls/plantpax/pide-faceplate.control +1 -1
- package/default-controls/controls/plantpax/pide-symbol.control +2 -2
- package/default-controls/controls/plantpax/valvec-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valvec-symbol.control +3 -3
- package/default-controls/controls/plantpax/valvemo-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valvemo-symbol.control +3 -3
- package/default-controls/controls/plantpax/valvemp-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valvemp-symbol.control +3 -3
- package/default-controls/controls/plantpax/valveso-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valveso-symbol.control +3 -3
- package/default-controls/controls/plantpax/vsd-faceplate.control +1 -1
- 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 +55 -17
- 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 +2 -2
- package/www/dist/frontend/bundle/chunk-5MUGMRXU.js +1 -1
- package/www/dist/frontend/bundle/chunk-5UBRCTRX.js +2 -2
- package/www/dist/frontend/bundle/chunk-65A3PNMG.js +1 -1
- package/www/dist/frontend/bundle/chunk-66EU64WD.js +1 -1
- package/www/dist/frontend/bundle/chunk-6BL3X2VD.js +3 -3
- package/www/dist/frontend/bundle/chunk-6L2YCGEX.js +1 -1
- package/www/dist/frontend/bundle/chunk-7CWDQGAG.js +2 -2
- package/www/dist/frontend/bundle/chunk-7PT7IGUJ.js +3 -3
- package/www/dist/frontend/bundle/chunk-AI5PDLDE.js +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 +3 -3
- package/www/dist/frontend/bundle/chunk-DNCD2F6X.js +3 -3
- package/www/dist/frontend/bundle/chunk-FFW7WOVM.js +1 -1
- package/www/dist/frontend/bundle/chunk-FHF6DL5U.js +1 -1
- package/www/dist/frontend/bundle/chunk-FO56TEZH.js +3 -3
- package/www/dist/frontend/bundle/chunk-FRCSTZQC.js +2 -2
- package/www/dist/frontend/bundle/chunk-FSHAYPVR.js +3 -3
- package/www/dist/frontend/bundle/chunk-FSRRPQMX.js +3 -3
- package/www/dist/frontend/bundle/chunk-GLQNGCFL.js +1 -1
- package/www/dist/frontend/bundle/chunk-HC7GL5JY.js +1 -1
- package/www/dist/frontend/bundle/chunk-HXNIU7FI.js +3 -3
- package/www/dist/frontend/bundle/chunk-JBDSDK2C.js +3 -3
- package/www/dist/frontend/bundle/chunk-JSC66ZLQ.js +1 -1
- package/www/dist/frontend/bundle/chunk-JVPUFDR5.js +2 -2
- package/www/dist/frontend/bundle/chunk-K6IV7LKW.js +1 -1
- package/www/dist/frontend/bundle/chunk-KJU5I76S.js +3 -3
- package/www/dist/frontend/bundle/chunk-KY73TL6O.js +2 -2
- package/www/dist/frontend/bundle/chunk-LKS3S4WX.js +1 -1
- package/www/dist/frontend/bundle/chunk-M6VVTDVX.js +3 -3
- package/www/dist/frontend/bundle/chunk-MECWXZRN.js +1 -1
- package/www/dist/frontend/bundle/chunk-N2YIZTB2.js +1 -1
- package/www/dist/frontend/bundle/chunk-NQ7L7KNT.js +3 -3
- package/www/dist/frontend/bundle/chunk-O2AJL747.js +3 -3
- package/www/dist/frontend/bundle/chunk-P7EOR36H.js +1 -1
- package/www/dist/frontend/bundle/chunk-PJYK24KZ.js +1 -1
- package/www/dist/frontend/bundle/chunk-PYLAW6UA.js +2 -2
- package/www/dist/frontend/bundle/chunk-QJJGP23I.js +1 -1
- package/www/dist/frontend/bundle/chunk-QV4IBWXA.js +1 -1
- package/www/dist/frontend/bundle/chunk-R6IQDPAP.js +3 -3
- package/www/dist/frontend/bundle/chunk-RRFSEMFS.js +3 -3
- package/www/dist/frontend/bundle/chunk-RTTBZOQU.js +2 -2
- package/www/dist/frontend/bundle/chunk-S4TLNW5D.js +1 -1
- package/www/dist/frontend/bundle/chunk-S7P222YS.js +1 -1
- package/www/dist/frontend/bundle/chunk-SE6N4ZEN.js +1 -1
- package/www/dist/frontend/bundle/chunk-SQHXO2IT.js +3 -3
- package/www/dist/frontend/bundle/chunk-T4AIQBBH.js +2 -2
- package/www/dist/frontend/bundle/chunk-TWQQHCU7.js +3 -3
- package/www/dist/frontend/bundle/chunk-U5Q332OH.js +1 -1
- package/www/dist/frontend/bundle/chunk-UIP324PP.js +1 -1
- package/www/dist/frontend/bundle/chunk-V27IRYSL.js +1 -1
- package/www/dist/frontend/bundle/chunk-V4C5FGJL.js +3 -3
- package/www/dist/frontend/bundle/chunk-V5CHFTYG.js +3 -3
- package/www/dist/frontend/bundle/chunk-VHXWCBNP.js +1 -1
- package/www/dist/frontend/bundle/chunk-W2KWSW4M.js +1 -1
- package/www/dist/frontend/bundle/chunk-W5QV7JN5.js +1 -1
- package/www/dist/frontend/bundle/chunk-WED7CGWA.js +3 -3
- package/www/dist/frontend/bundle/chunk-WQ5H5LTG.js +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 +2 -2
- package/www/dist/frontend/bundle/chunk-YUSK4FN3.js +3 -3
- package/www/dist/frontend/bundle/chunk-Z34BSG5O.js +3 -3
- package/www/dist/frontend/bundle/common/IobrokerHandler.js +1 -1
- package/www/dist/frontend/bundle/runtime/CustomControls.js +1 -1
- package/www/dist/frontend/bundle/runtime/ScreenViewer.js +1 -1
- package/www/dist/frontend/bundle/runtime/controls.js +4 -4
- package/www/dist/frontend/bundle/runtime/init.js +3 -3
- package/www/dist/frontend/common/Common.globals.js +1 -1
- package/www/dist/frontend/common/IobrokerHandler.js +1 -1
- package/www/dist/frontend/common/PlantPaxResolve.js +1 -1
- package/www/dist/frontend/common/Runtime.js +1 -1
- package/www/dist/frontend/config/CommandHandling.js +1 -1
- package/www/dist/frontend/config/ConfigureWebcomponentDesigner.js +1 -1
- package/www/dist/frontend/config/DockHelper.js +1 -1
- package/www/dist/frontend/config/IobrokerWebui3DDriveEngine.js +1 -1
- package/www/dist/frontend/config/IobrokerWebui3DScreenEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebui3DScreenPropertiesPanel.js +3 -3
- package/www/dist/frontend/config/IobrokerWebui3DScreenViewer.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiAppShell.js +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 +2 -2
- package/www/dist/frontend/config/IobrokerWebuiMonacoEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiPlantPaxTypesEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiPropertyGrid.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreenEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreensView.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiSecurityEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSignalPropertyEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSolutionExplorer.js +2 -2
- package/www/dist/frontend/config/IobrokerWebuiTranslationEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiWidgetGallery.js +3 -3
- package/www/dist/frontend/helper/DialogHelper.js +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 +3 -3
- package/www/dist/frontend/runtime/NavigationShell.js +1 -1
- package/www/dist/frontend/runtime/RuntimeTheme.js +1 -1
- package/www/dist/frontend/runtime/ScreenViewer.js +3 -3
- package/www/dist/frontend/runtime/TranslateableText.js +2 -2
- package/www/dist/frontend/runtime/VisibilityService.js +1 -1
- package/www/dist/frontend/runtime/controls.js +1 -1
- package/www/dist/frontend/runtime/init.js +1 -1
- package/www/dist/frontend/scripting/IobrokerWebuiScriptSystem.js +1 -1
- package/www/dist/frontend/scripting/blockly/OpenScreen.js +1 -1
- package/www/dist/frontend/scripting/blockly/webuiBlocklyToolbox.js +1 -1
- package/www/dist/frontend/services/DynamicPropertiesHelper.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableLocalObjectsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectDragDropService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectsForPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiConfigButtonProvider.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCopyPasteService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCustomControlEventsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCustomElementContextMenu.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiDemoProviderService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiDynamicPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiEventsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiExternalDragDropService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiLitPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiPropertyGroupsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiRefactorService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiScreenContextMenu.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiSpecialPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiSpectrumEditorService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiVisibilityPropertiesService.js +1 -1
- package/www/dist/frontend/services/LayoutComponentsPropertiesService.js +1 -1
- package/www/dist/frontend/widgets/OrthoFlowLineTool.js +1 -1
- package/www/dist/frontend/widgets/customElementsObserver.js +1 -1
- package/www/dist/frontend/widgets/importWidgetFiles.js +1 -1
- package/www/dist/frontend/widgets/importWidgetFilesRuntime.js +1 -1
- package/www/dist/frontend/widgets/layout-components.js +1 -1
- package/www/dist/frontend/widgets/layout-placement-services.js +1 -1
- package/www/dist/frontend/widgets/testElement.js +1 -1
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"width": "520px",
|
|
18
18
|
"height": "600px"
|
|
19
19
|
},
|
|
20
|
-
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-adv-btn\" title=\"Advanced\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M4 6h10M4 12h16M4 18h7\"/><circle cx=\"17\" cy=\"6\" r=\"2\"/><circle cx=\"14\" cy=\"18\" r=\"2\"/></svg></button><button class=\"fp-x\">✕</button></div><div class=\"fp-desc\">Analog Input · EU: [[this.unit||'—']]</div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Diagnostics\" title=\"Diagnostics\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M6 3v6a4 4 0 008 0V3\"/><path d=\"M10 15v2a4 4 0 008 0v-1\"/><circle cx=\"18\" cy=\"14\" r=\"2\"/></svg><span class=\"fp-tab-cap\">Diag</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-badge\" bind-css:display=\"[[this.anyAlarm?'':'none']]\"></span></button><button class=\"fp-tab\" data-tab=\"Trend\" title=\"Trend\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 17l5-6 4 3 6-8\"/><path d=\"M3 21h18\"/></svg><span class=\"fp-tab-cap\">Trend</span></button></div><div class=\"fp-tabs hidden\" data-group=\"advanced\"><button class=\"fp-tab\" data-tab=\"Main\" title=\"Back to Main\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M15 6l-6 6 6 6\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button><button class=\"fp-tab\" data-tab=\"Engineering\" title=\"Engineering\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 3v3M12 18v3M3 12h3M18 12h3M5.6 5.6l2.1 2.1M16.3 16.3l2.1 2.1M18.4 5.6l-2.1 2.1M7.7 16.3l-2.1 2.1\"/></svg></button><button class=\"fp-tab\" data-tab=\"HMI\" title=\"HMI Config\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"14\" rx=\"1\"/><path d=\"M3 8h18\"/></svg></button><button class=\"fp-tab\" data-tab=\"Faults\" title=\"Faults\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M12 4v10\"/><circle cx=\"12\" cy=\"19\" r=\"0.6\"/></svg></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"fp-mai\"><webui-plantpax-components-level-bar id=\"lbar\"></webui-plantpax-components-level-bar><div class=\"fp-pv\"><div class=\"pv-big\">[[this.pv==null?'--':this.pv]]</div><div class=\"pv-eu\">[[this.unit||'']] · <span class=\"pv-mem\">Inp_PV</span></div><div class=\"fp-row\"><span class=\"lbl\">Quality</span><span bind-attr:class=\"[[this.pvBad?'qual bad':(this.pvUncertain?'qual unc':'qual good')]]\">[[this.pvBad?'BAD':(this.pvUncertain?'UNCERTAIN':'GOOD')]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Source</span><span>[[this.substActive?'Substitute':'Input']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Range</span><span>[[this.pvEuMin==null?'--':this.pvEuMin]] — [[this.pvEuMax==null?'--':this.pvEuMax]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Substitute</span><span>[[this.substActive?'On':'Off']]</span></div></div></div><div class=\"fp-flags\"><webui-plantpax-components-status-flag data-pp=\"1\" field=\"sim\" label=\"Sim\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"maintByp\" label=\"Maint Byp\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"substActive\" label=\"Substitute\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"failAlarm\" label=\"Input Fail\" tone=\"crit\"></webui-plantpax-components-status-flag></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-mrow head\"><span class=\"mnm\"></span><span class=\"mh\">Threshold</span><span class=\"mh\">Deadband</span></div><div class=\"fp-mrow\"><span class=\"mnm\">HiHi</span><input type=\"number\" class=\"mnum\" data-field=\"hiHiLim\" bind-prop:value=\"[[this.hiHiLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"hiHiDB\" bind-prop:value=\"[[this.hiHiDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">Hi</span><input type=\"number\" class=\"mnum\" data-field=\"hiLim\" bind-prop:value=\"[[this.hiLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"hiDB\" bind-prop:value=\"[[this.hiDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">Lo</span><input type=\"number\" class=\"mnum\" data-field=\"loLim\" bind-prop:value=\"[[this.loLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"loDB\" bind-prop:value=\"[[this.loDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">LoLo</span><input type=\"number\" class=\"mnum\" data-field=\"loLoLim\" bind-prop:value=\"[[this.loLoLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"loLoDB\" bind-prop:value=\"[[this.loLoDB]]\" placeholder=\"db\"></div><div class=\"fp-row\" style=\"margin-top:10px\"><span class=\"lbl\">Substitute PV</span><button class=\"fp-btn\" data-subst=\"1\">[[this.substActive?'Use Input':'Use Substitute']]</button></div></div><div data-pane=\"Engineering\" class=\"hidden\"><div class=\"fp-sec\">Raw Input Scaling</div><webui-plantpax-components-scaling-widget data-pp=\"1\" raw-min-field=\"inpRawMin\" raw-max-field=\"inpRawMax\" eu-min-field=\"pvEuMin\" eu-max-field=\"pvEuMax\"></webui-plantpax-components-scaling-widget><div class=\"fp-sec\">PV Source & Quality</div><label class=\"fp-chk\"><input type=\"checkbox\" data-fieldb=\"useChanSrcQ\"><span>Use channel source quality</span><span class=\"m\">Cfg_UseChanSrcQ</span></label><label class=\"fp-chk\"><input type=\"checkbox\" data-fieldb=\"noSubstPV\"><span>Disable substitute PV selection</span><span class=\"m\">Cfg_NoSubstPV</span></label><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Substitute PV value</b><span class=\"cfgmem\">Set_SubstPV</span></span><input type=\"number\" data-field=\"substPvSet\" bind-prop:value=\"[[this.substPvSet]]\"></div><div class=\"fp-sec\">Filtering & Thresholds</div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>PV filter time constant</b><span class=\"cfgmem\">Cfg_PVFiltTC</span></span><input type=\"number\" data-field=\"filtTC\" bind-prop:value=\"[[this.filtTC]]\"><span class=\"cfgunit\">s</span></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Fail High limit</b><span class=\"cfgmem\">Cfg_FailHiLim</span></span><input type=\"number\" data-field=\"failHiLim\" bind-prop:value=\"[[this.failHiLim]]\"></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Fail Low limit</b><span class=\"cfgmem\">Cfg_FailLoLim</span></span><input type=\"number\" data-field=\"failLoLim\" bind-prop:value=\"[[this.failLoLim]]\"></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>PV decimal places</b><span class=\"cfgmem\">Cfg_PVDecPlcs</span></span><input type=\"number\" data-field=\"pvDecPlcs\" bind-prop:value=\"[[this.pvDecPlcs]]\"></div></div><div data-pane=\"Trend\" class=\"hidden\"><div class=\"fp-sec\">PV Trend</div><webui-plantpax-components-sparkline id=\"sparkbig\" style=\"display:block;height:160px\" bind-prop:points=\"120\"></webui-plantpax-components-sparkline><div class=\"fp-row\" style=\"margin-top:6px\"><span class=\"lbl\">Current</span><span>[[this.pv==null?'--':this.pv]] [[this.unit||'']]</span></div></div><div data-pane=\"Diagnostics\" class=\"hidden\"><div class=\"fp-sec\">Signal Chain</div><div class=\"fp-row\"><span class=\"lbl\">Raw / Scaled Input</span><span>[[this.valInpPV==null?'--':this.valInpPV]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Scaled PV (EU)</span><span>[[this.pv==null?'--':this.pv]] [[this.unit||'']]</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Quality</span><span bind-attr:class=\"[[this.pvBad?'qual bad':(this.pvUncertain?'qual unc':'qual good')]]\">[[this.pvBad?'BAD':(this.pvUncertain?'UNCERTAIN':'GOOD')]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Substitute Active</span><span>[[this.substActive?'YES':'no']]</span></div></div><div data-pane=\"Alarms\" class=\"hidden\"><div class=\"fp-almbar\"><span class=\"fp-unack\" bind-css:display=\"[[(this.unackCount||0)>0?'':'none']]\">[[this.unackCount||0]] unacked</span><span class=\"fp-grow\"></span><button class=\"fp-btn\" data-ackall=\"1\">Ack All</button><button class=\"fp-btn ghost\" data-cmd=\"resetAckAll\">Reset & Ack</button><button class=\"fp-btn ghost\" data-cmd=\"resetAll\">Reset</button></div><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"HiHi\" member=\"HiHi.Alm · HiHi.Ack\" alarm-field=\"hiHiAlarm\" ack-field=\"hiHiAck\" severity=\"1000\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Hi\" member=\"Hi.Alm · Hi.Ack\" alarm-field=\"hiAlarm\" ack-field=\"hiAck\" severity=\"500\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Lo\" member=\"Lo.Alm · Lo.Ack\" alarm-field=\"loAlarm\" ack-field=\"loAck\" severity=\"500\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"LoLo\" member=\"LoLo.Alm · LoLo.Ack\" alarm-field=\"loLoAlarm\" ack-field=\"loLoAck\" severity=\"1000\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Fail\" member=\"Fail.Alm · Fail.Ack\" alarm-field=\"failAlarm\" ack-field=\"failAck\" severity=\"1500\"></webui-plantpax-components-alarm-row></div><div data-pane=\"HMI\" class=\"hidden\"><div class=\"fp-sec\">HMI Configuration</div><div class=\"fp-row\"><span class=\"lbl\">Instance</span><span style=\"font-size:11px;word-break:break-all\">[[this.root]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Type</span><span>[[this.type]]</span></div><div class=\"fp-row\"><span class=\"lbl\">EU Units</span><span>[[this.unit||'—']]</span></div></div><div data-pane=\"Faults\" class=\"hidden\"><div class=\"fp-sec\">Faults & Status</div><div class=\"fp-alm\" bind-attr:class=\"[[this.failAlarm?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Input Fail</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Bad</span><span>[[this.pvBad?'YES':'no']]</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Uncertain</span><span>[[this.pvUncertain?'YES':'no']]</span></div></div></div></div>",
|
|
21
|
-
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}",
|
|
20
|
+
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-adv-btn\" title=\"Advanced\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M4 6h10M4 12h16M4 18h7\"/><circle cx=\"17\" cy=\"6\" r=\"2\"/><circle cx=\"14\" cy=\"18\" r=\"2\"/></svg></button><button class=\"fp-x\">✕</button></div><div class=\"fp-desc\">Analog Input · EU: [[this.unit||'—']]</div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Diagnostics\" title=\"Diagnostics\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M6 3v6a4 4 0 008 0V3\"/><path d=\"M10 15v2a4 4 0 008 0v-1\"/><circle cx=\"18\" cy=\"14\" r=\"2\"/></svg><span class=\"fp-tab-cap\">Diag</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-badge\" bind-css:display=\"[[this.anyAlarm?'':'none']]\"></span></button><button class=\"fp-tab\" data-tab=\"Trend\" title=\"Trend\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 17l5-6 4 3 6-8\"/><path d=\"M3 21h18\"/></svg><span class=\"fp-tab-cap\">Trend</span></button></div><div class=\"fp-tabs hidden\" data-group=\"advanced\"><button class=\"fp-tab\" data-tab=\"Main\" title=\"Back to Main\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M15 6l-6 6 6 6\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button><button class=\"fp-tab\" data-tab=\"Engineering\" title=\"Engineering\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 3v3M12 18v3M3 12h3M18 12h3M5.6 5.6l2.1 2.1M16.3 16.3l2.1 2.1M18.4 5.6l-2.1 2.1M7.7 16.3l-2.1 2.1\"/></svg></button><button class=\"fp-tab\" data-tab=\"HMI\" title=\"HMI Config\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"14\" rx=\"1\"/><path d=\"M3 8h18\"/></svg></button><button class=\"fp-tab\" data-tab=\"Faults\" title=\"Faults\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M12 4v10\"/><circle cx=\"12\" cy=\"19\" r=\"0.6\"/></svg></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"fp-mai\"><webui-plantpax-components-level-bar id=\"lbar\"></webui-plantpax-components-level-bar><div class=\"fp-pv\"><div class=\"pv-big\">[[this.pv==null?'--':this.pv]]</div><div class=\"pv-eu\">[[this.unit||'']] · <span class=\"pv-mem\">Inp_PV</span></div><div class=\"fp-row\"><span class=\"lbl\">Quality</span><span bind-attr:class=\"[[this.pvBad?'qual bad':(this.pvUncertain?'qual unc':'qual good')]]\">[[this.pvBad?'BAD':(this.pvUncertain?'UNCERTAIN':'GOOD')]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Source</span><span>[[this.substActive?'Substitute':'Input']]</span></div><div class=\"fp-row\"><span class=\"lbl\">Range</span><span>[[this.pvEuMin==null?'--':this.pvEuMin]] — [[this.pvEuMax==null?'--':this.pvEuMax]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Substitute</span><span>[[this.substActive?'On':'Off']]</span></div></div></div><div class=\"fp-flags\"><webui-plantpax-components-status-flag data-pp=\"1\" field=\"sim\" label=\"Sim\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"maintByp\" label=\"Maint Byp\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"substActive\" label=\"Substitute\" tone=\"warn\"></webui-plantpax-components-status-flag><webui-plantpax-components-status-flag data-pp=\"1\" field=\"failAlarm\" label=\"Input Fail\" tone=\"crit\"></webui-plantpax-components-status-flag></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-mrow head\"><span class=\"mnm\"></span><span class=\"mh\">Threshold</span><span class=\"mh\">Deadband</span></div><div class=\"fp-mrow\"><span class=\"mnm\">HiHi</span><input type=\"number\" class=\"mnum\" data-field=\"hiHiLim\" bind-prop:value=\"[[this.hiHiLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"hiHiDB\" bind-prop:value=\"[[this.hiHiDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">Hi</span><input type=\"number\" class=\"mnum\" data-field=\"hiLim\" bind-prop:value=\"[[this.hiLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"hiDB\" bind-prop:value=\"[[this.hiDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">Lo</span><input type=\"number\" class=\"mnum\" data-field=\"loLim\" bind-prop:value=\"[[this.loLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"loDB\" bind-prop:value=\"[[this.loDB]]\" placeholder=\"db\"></div><div class=\"fp-mrow\"><span class=\"mnm\">LoLo</span><input type=\"number\" class=\"mnum\" data-field=\"loLoLim\" bind-prop:value=\"[[this.loLoLim]]\" placeholder=\"limit\"><input type=\"number\" class=\"mnum\" data-field=\"loLoDB\" bind-prop:value=\"[[this.loLoDB]]\" placeholder=\"db\"></div><div class=\"fp-row\" style=\"margin-top:10px\"><span class=\"lbl\">Substitute PV</span><button class=\"fp-btn\" data-subst=\"1\">[[this.substActive?'Use Input':'Use Substitute']]</button></div></div><div data-pane=\"Engineering\" class=\"hidden\"><div class=\"fp-sec\">Raw Input Scaling</div><webui-plantpax-components-scaling-widget data-pp=\"1\" raw-min-field=\"inpRawMin\" raw-max-field=\"inpRawMax\" eu-min-field=\"pvEuMin\" eu-max-field=\"pvEuMax\"></webui-plantpax-components-scaling-widget><div class=\"fp-sec\">PV Source & Quality</div><label class=\"fp-chk\"><input type=\"checkbox\" data-fieldb=\"useChanSrcQ\"><span>Use channel source quality</span><span class=\"m\">Cfg_UseChanSrcQ</span></label><label class=\"fp-chk\"><input type=\"checkbox\" data-fieldb=\"noSubstPV\"><span>Disable substitute PV selection</span><span class=\"m\">Cfg_NoSubstPV</span></label><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Substitute PV value</b><span class=\"cfgmem\">Set_SubstPV</span></span><input type=\"number\" data-field=\"substPvSet\" bind-prop:value=\"[[this.substPvSet]]\"></div><div class=\"fp-sec\">Filtering & Thresholds</div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>PV filter time constant</b><span class=\"cfgmem\">Cfg_PVFiltTC</span></span><input type=\"number\" data-field=\"filtTC\" bind-prop:value=\"[[this.filtTC]]\"><span class=\"cfgunit\">s</span></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Fail High limit</b><span class=\"cfgmem\">Cfg_FailHiLim</span></span><input type=\"number\" data-field=\"failHiLim\" bind-prop:value=\"[[this.failHiLim]]\"></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>Fail Low limit</b><span class=\"cfgmem\">Cfg_FailLoLim</span></span><input type=\"number\" data-field=\"failLoLim\" bind-prop:value=\"[[this.failLoLim]]\"></div><div class=\"fp-row\"><span class=\"lbl cfg\"><b>PV decimal places</b><span class=\"cfgmem\">Cfg_PVDecPlcs</span></span><input type=\"number\" data-field=\"pvDecPlcs\" bind-prop:value=\"[[this.pvDecPlcs]]\"></div></div><div data-pane=\"Trend\" class=\"hidden\"><div class=\"fp-sec\">PV Trend</div><webui-plantpax-components-sparkline id=\"sparkbig\" style=\"display:block;height:160px\" bind-prop:points=\"120\"></webui-plantpax-components-sparkline><div class=\"fp-row\" style=\"margin-top:6px\"><span class=\"lbl\">Current</span><span>[[this.pv==null?'--':this.pv]] [[this.unit||'']]</span></div></div><div data-pane=\"Diagnostics\" class=\"hidden\"><div class=\"fp-sec\">Signal Chain</div><div class=\"fp-row\"><span class=\"lbl\">Raw / Scaled Input</span><span>[[this.valInpPV==null?'--':this.valInpPV]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Scaled PV (EU)</span><span>[[this.pv==null?'--':this.pv]] [[this.unit||'']]</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Quality</span><span bind-attr:class=\"[[this.pvBad?'qual bad':(this.pvUncertain?'qual unc':'qual good')]]\">[[this.pvBad?'BAD':(this.pvUncertain?'UNCERTAIN':'GOOD')]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Substitute Active</span><span>[[this.substActive?'YES':'no']]</span></div></div><div data-pane=\"Alarms\" class=\"hidden\"><div class=\"fp-almbar\"><span class=\"fp-unack\" bind-css:display=\"[[(this.unackCount||0)>0?'':'none']]\">[[this.unackCount||0]] unacked</span><span class=\"fp-grow\"></span><img class=\"fp-cmdimg\" data-ackall=\"1\" title=\"Acknowledge All\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAAB4ElEQVRYhcWWvXXjMBCEv/spgNeBSrAC+TmUOpA6OIVeJFYFtiuwEmxKdWB1YOUKjh2cQztTCQ6weNKDfkjaIL0ZCUAzGuwMF76hRNxAxF0B/P4OcOCfPf752TcB4BkogBVArwRE3ANwBVTAI8CPHsHHwIs9DlV9BT0pIOIKoLTHRQTvjQDwBAyAjapfHi50TkDETYG/wA6Yp+ud9sCB5QpgpurX6Z6uFSgNfHUKvFMCZrkx8Aoszu3r5AosZmPaDQ+7Pq3sCiSWe7wE3gkB4B5LO1X/ULc5KwGz3B3BcrMmZ7L1gEn/n9D1c1W/anIupwLxK7duCp6NgIi7Y2+5o7S7VF++ArPcC+HfT1T9ps35HArEtFu2BQdTQMTF0Jio+l3TwyLuidD1laoftgWHvQI7gnfLC3tT8DF7y7W691MEZvZDU8vwOvCC0PXQIO1qCZjsE3t3b4FyqeK9r9MB41MEjETFXsoyzu1pmeWmfFH6WEc2FHElYYJ5JXzJdgdrA2oGjLZ1ZENVPwc2hBnuOVmOabfMAX6SgNWMoMDYrHZyps9RZ5MwSbglwXJQM2C0rV/nFrbb7dtodP1OaLgbe73IJX0tASNRjUbXhRHYqPrbnODQ4Fug6heEjGg0YLStD2XTpfneGuMxAAAAAElFTkSuQmCC\"><img class=\"fp-cmdimg\" data-cmd=\"resetAckAll\" title=\"Reset and Acknowledge All\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAACzElEQVRYhc2Xy3naQBSFf/tzAbgDpQKLCiIqiFxBzHa0AFdgUwH2QrM1qQBcAaQCKxVEHYQSspgzaCSEEPIiuZtBw8w9R/ct+MdydclhY7IISIA7IAYerc2LzxC46Qn8AMwEGkoMFI2zS2DeOLdvngOm1uZlJwFjshRYApG2CuAd2AGFtfm+zwuIQNLYG8EJCxiTjQT8oK0VsLA2L3uA/cRZoKROfNxG+PoE+Fbg/uK0Jzg464B767F0pMBWursJAGsq304uDTK9ZSEdJTAJnt86CRiTPeN85cH7+rgpO62JdHgSqTFZLUAPBJRiTzjT3X8CHFwcAHyFg1XupftJWHUCAof+wXZSrM03+hkHeyXwiot+j1UjkAJ7a/OXz4AHMgV+NPZecFZIfUBewyHfR7h0GyzGZB/GZGsAa/OVtXlNn1yxElZyIIB8ReW7IeBLnMnPxc671m8hAe+r3UDwBFd89sBj11lrc48RhQQinP8vjnz5cq3HvtlTopcOCQztam84n74Eb9eHQBWEfcWYLFXA+uc5LnsKa/NO058S34z2VI2jS2ZAYkw20Z2l1umFuL5MHyxQ9CTwqnVNVdcXl/QLxcyoSaDUn0nXZVW4hRTEwGZA4fIYRUiglptnSDzjiknJ5aaHRs25goNZfuuPL2EqaRyjWdWGSIhjbX4LsoAANzjTNue577T08YEyF4ZvVrU0XOAieha2S+SrMP2GiHTOhLE4IqB26QNsHYxPtd4+ENxXyxHwGrb7o+8CdbMUTUXa/oMrNuOB4Ftc1uyszSfh/22VcEo1w22pynTcNlSeAfc6/Ix53zxzRCCY4Ta6+IHqNsez/SngyJjsTXdjXNq2zpg3/gLdkR5pjQkiOAD0hSnB1RLf3kvc59vRnRoBqsp2zsR3LeAPHJMvcMG2OqPPEVAtv21RHlHvEW01v0CfasAvXKCV54D/G/kL1vcb60D2msYAAAAASUVORK5CYII=\"><img class=\"fp-cmdimg\" data-cmd=\"resetAll\" title=\"Reset\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAACP0lEQVRYhe2XzXHbMBCFv3hUANOBS6ArCFWBlAocX4FD7ApsV2DlQFwdVxCqAjEVWCWoBJaQA3cpEAIpKJQdH7IzGgwhYN/DYv8A/1g+pS40xl4CS2AB5EAGrJwr7yLrLsP9zpV1TO8sATgH7gU8RZ6BIqLH/2yAK+fK3SgBY+wTcOtNbYEXYDt0okTJ5Be3gDE2Aza0pgaogcdE0N8cWmALzJ0rm3DxxRHwBrhxrpyfcGJd1wA3MubARnSPEwjA586VPxOBgZ6zZcjJfRKjBOTOffDtKeCeKIlCdHQkBOOQgHi7OtzdBHBo/QDgC4Do0nC9Faw+AUCZ1aeaPSK1jIVOiE6d76xwAV3y0MWPE8HVDyrgR/CX6i4Es7OAJpmp8e2T+Opc+RAhple79AksZHw5B/gRUYyFT0CdYorjpYpi5D6BDIYLxjklyBPRRPSu8p+AEmgAjLHFWwN6GI1PoOeZbyy9iFMCaxmv34GAYqx9ApWMeXgNxtgHY+yvcyCLbrVA1RFwrtyxLxT3wb7vwPJM/qG6a8HsRYGWy8IY+82bV2KTCIhO1dF10h0Bqdkr+Xzyanavtv8leM6+BK/8XuPgXWCMfcXrimT6VUgmvyMC8A3SojlXXvn/xxLRnDZEwub05DwhZu/A2R9omIC0zj6JZxkh0Q+MsYUxduPt3THQls9kQ46Y+YgM+oEXYtf0E9rB8+2AAK2JG/YnTZbI60mlon3MjPYYM+jywOdAcRFZvxvR1dBe2xqoNM4/vPwBFavdGFxFMCwAAAAASUVORK5CYII=\"></div><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"HiHi\" member=\"HiHi.Alm · HiHi.Ack\" alarm-field=\"hiHiAlarm\" ack-field=\"hiHiAck\" severity=\"1000\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Hi\" member=\"Hi.Alm · Hi.Ack\" alarm-field=\"hiAlarm\" ack-field=\"hiAck\" severity=\"500\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Lo\" member=\"Lo.Alm · Lo.Ack\" alarm-field=\"loAlarm\" ack-field=\"loAck\" severity=\"500\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"LoLo\" member=\"LoLo.Alm · LoLo.Ack\" alarm-field=\"loLoAlarm\" ack-field=\"loLoAck\" severity=\"1000\"></webui-plantpax-components-alarm-row><webui-plantpax-components-alarm-row data-pp=\"1\" name=\"Fail\" member=\"Fail.Alm · Fail.Ack\" alarm-field=\"failAlarm\" ack-field=\"failAck\" severity=\"1500\"></webui-plantpax-components-alarm-row></div><div data-pane=\"HMI\" class=\"hidden\"><div class=\"fp-sec\">HMI Configuration</div><div class=\"fp-row\"><span class=\"lbl\">Instance</span><span style=\"font-size:11px;word-break:break-all\">[[this.root]]</span></div><div class=\"fp-row\"><span class=\"lbl\">Type</span><span>[[this.type]]</span></div><div class=\"fp-row\"><span class=\"lbl\">EU Units</span><span>[[this.unit||'—']]</span></div></div><div data-pane=\"Faults\" class=\"hidden\"><div class=\"fp-sec\">Faults & Status</div><div class=\"fp-alm\" bind-attr:class=\"[[this.failAlarm?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Input Fail</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Bad</span><span>[[this.pvBad?'YES':'no']]</span></div><div class=\"fp-row\"><span class=\"lbl\">PV Uncertain</span><span>[[this.pvUncertain?'YES':'no']]</span></div></div></div></div>",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.fp-cmdimg{width:34px;height:34px;cursor:pointer;flex:none;margin-left:4px;border-radius:4px;}.fp-cmdimg:hover{background:rgba(255,255,255,.08);}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}",
|
|
22
22
|
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n instance.pv=null; instance.pvBad=false; instance.pvUncertain=false; instance.substActive=false;\n instance.anyAlarm=false;\n const ALM=[\"hiHiAlarm\", \"hiAlarm\", \"loAlarm\", \"loLoAlarm\", \"failAlarm\"];\n const recomputeAlm=function(){ let any=false; for(const a of ALM){ if(instance[a]===true||instance[a]==='true'||instance[a]===1){ any=true; break; } } instance.anyAlarm=any; try{ instance._bindingsRefresh&&instance._bindingsRefresh(); }catch(e){} };\n const subs=[\"pv\", \"pvBad\", \"pvUncertain\", \"substActive\", \"valInpPV\", \"unackCount\", \"hiHiLim\", \"hiHiDB\", \"hiLim\", \"hiDB\", \"loLim\", \"loDB\", \"loLoLim\", \"loLoDB\", \"inpRawMax\", \"inpRawMin\", \"pvEuMax\", \"pvEuMin\", \"filtTC\", \"noSubstPV\", \"hiHiAlarm\", \"hiAlarm\", \"loAlarm\", \"loLoAlarm\", \"failAlarm\", \"useChanSrcQ\", \"substPvSet\", \"failHiLim\", \"failLoLim\", \"pvDecPlcs\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){\n if(field==='pvBad'||field==='pvUncertain'||field==='substActive'){ instance[field]=(v===true||v==='true'||v===1); }\n else { instance[field]=v; }\n if(field==='pv') instance.pv=v;\n if(ALM.indexOf(field)>=0){ instance[field]=(v===true||v==='true'||v===1); recomputeAlm(); }\n }); })(f); }\n // reflect boolean checkbox states from live values\n const setChecks=function(){ for(const cb of instance._getDomElements('[data-fieldb]')){ const f=cb.getAttribute('data-fieldb'); cb.checked=(instance[f]===true||instance[f]==='true'||instance[f]===1); } };\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n if(name==='Engineering') setChecks();\n };\n // switch to the Advanced icon-strip (Engineering/HMI/Faults) and back to Main\n instance._adv=function(){\n for(const g of instance._getDomElements('[data-group]')) g.classList.toggle('hidden', g.getAttribute('data-group')!=='advanced');\n instance._tab('Engineering');\n };\n instance._main=function(){\n for(const g of instance._getDomElements('[data-group]')) g.classList.toggle('hidden', g.getAttribute('data-group')!=='main');\n instance._tab('Home');\n };\n ppWireHeader(instance);\n instance._tab('Home');\n // wire nested components by id (level-bar + sparklines get the EU unit too)\n (function(){ for(const cid of ['lbar','spark','sparkbig']){ const c=instance._getDomElement(cid); if(c){ c.root=instance.root; c.type=instance.type; c.unit=instance.unit;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } } } })();\n // wire composed [data-pp] components (alarm-row / scaling-widget / status-flag): give root/type + start\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n const can=function(action){ return (window.IOB && typeof window.IOB.secCan==='function') ? window.IOB.secCan(action,instance) : true; };\n const gate=function(){\n const cfg=can('configure'), mnt=can('maintenance'), ack=can('ackAlarm');\n for(const i of instance._getDomElements('[data-field],[data-fieldb]')) i.disabled=!cfg;\n for(const b of instance._getDomElements('[data-subst]')) b.classList.toggle('hidden',!mnt);\n for(const b of instance._getDomElements('[data-ack],[data-ackall]')) b.classList.toggle('hidden',!ack);\n for(const i of instance._getDomElements('.fp-mrow input')) i.disabled=!mnt;\n };\n gate();\n try{ window.IOB && window.IOB.securityChanged && window.IOB.securityChanged.on && window.IOB.securityChanged.on(gate); }catch(e){}\n // numeric config writes\n for(const i of instance._getDomElements('[data-field]')){\n (function(inp){ inp.addEventListener('change',function(){ ppWrite(instance,inp.getAttribute('data-field'),Number(inp.value),'configure'); }); })(i);\n }\n // boolean checkbox writes\n for(const cb of instance._getDomElements('[data-fieldb]')){\n (function(box){ box.addEventListener('change',function(){ ppWrite(instance,box.getAttribute('data-fieldb'),box.checked,'configure'); }); })(cb);\n }\n // substitute PV source toggle (maintenance)\n for(const b of instance._getDomElements('[data-subst]')){\n b.addEventListener('click',function(){ if(instance.substActive){ ppWrite(instance,'cmdInpPV',1,'maintenance'); } else { ppWrite(instance,'cmdSubstPV',1,'maintenance'); } });\n }\n // alarm ack\n const ackMap={\"HiHi\": \"hiHiAck\", \"Hi\": \"hiAck\", \"Lo\": \"loAck\", \"LoLo\": \"loLoAck\", \"Fail\": \"failAck\"};\n for(const b of instance._getDomElements('[data-ack]')){\n (function(btn){ btn.addEventListener('click',function(){ const nm=btn.closest('.fp-alm').querySelector('.nm').textContent; ppWrite(instance,ackMap[nm]||btn.getAttribute('data-ack'),1,'ackAlarm'); }); })(b);\n }\n for(const b of instance._getDomElements('[data-ackall]')){\n b.addEventListener('click',function(){ for(const k in ackMap) ppWrite(instance,ackMap[k],1,'ackAlarm'); });\n }\n // global alarm-set commands (Reset & Ack All / Reset)\n for(const b of instance._getDomElements('[data-cmd]')){\n (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'ackAlarm'); }); })(b);\n }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
20
|
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"alarm\" label=\"In Alarm\" oncolor=\"var(--ui-error,#e5484d)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"ack\" label=\"Acked\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"shelved\" label=\"Shelved\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"suppressed\" label=\"Suppressed\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"disabled\" label=\"Disabled\" oncolor=\"var(--ui-dim,#9aa3b0)\"></webui-plantpax-components-status-lamp></div><div class=\"fp-row\"><span class=\"lbl\">Severity</span><span>[[this.severity==null?'--':this.severity]]</span></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdAck\" label=\"Ack\" value=\"1\" action=\"ackAlarm\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdShelve\" label=\"Shelve\" value=\"1\" action=\"ackAlarm\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdDisable\" label=\"Disable\" value=\"1\" action=\"disableAlarm\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Shelved</span><span>[[this.shelved?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.alarm?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Alarm Active</span></div></div></div></div>",
|
|
21
|
-
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.fp-cmdimg{width:34px;height:34px;cursor:pointer;flex:none;margin-left:4px;border-radius:4px;}.fp-cmdimg:hover{background:rgba(255,255,255,.08);}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
22
|
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"alarm\", \"ack\", \"shelved\", \"suppressed\", \"disabled\", \"severity\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -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
|
}
|
|
@@ -18,6 +18,6 @@
|
|
|
18
18
|
"height": "460px"
|
|
19
19
|
},
|
|
20
20
|
"html": "<div class=\"fp\"><div class=\"fp-hdr\"><span class=\"fp-title\">[[this.root]]</span><button class=\"fp-x\">✕</button></div><div class=\"fp-tabs\" data-group=\"main\"><button class=\"fp-tab\" data-tab=\"Home\" title=\"Home\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M3 11l9-8 9 8\"/><path d=\"M5 10v10h14V10\"/></svg><span class=\"fp-tab-cap\">Home</span></button><button class=\"fp-tab\" data-tab=\"Maintenance\" title=\"Maintenance\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M14 6a3.5 3.5 0 00-4.8 4.2l-5 5 1.4 1.4 5-5A3.5 3.5 0 0014 6z\"/><circle cx=\"16.5\" cy=\"7.5\" r=\"1.2\"/></svg><span class=\"fp-tab-cap\">Maint</span></button><button class=\"fp-tab\" data-tab=\"Alarms\" title=\"Alarms\"><svg viewBox=\"0 0 24 24\" class=\"fp-ic\"><path d=\"M18 8a6 6 0 10-12 0c0 7-3 9-3 9h18s-3-2-3-9\"/><path d=\"M13.7 21a2 2 0 01-3.4 0\"/></svg><span class=\"fp-tab-cap\">Alarm</span></button></div><div class=\"fp-body\"><div data-pane=\"Home\"><div class=\"mt-lamps\"><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"operator\" label=\"Operator\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"program\" label=\"Program\" oncolor=\"var(--accent,#2680eb)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"override\" label=\"Override\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"maint\" label=\"Maintenance\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"local\" label=\"Local\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"extReq\" label=\"External\" oncolor=\"var(--ui-dim,#9aa3b0)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdOper\" label=\"Take Operator\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdProg\" label=\"Give Program\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Owner</span><span>[[this.operator?'Operator':(this.program?'Program':'—')]]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.override?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Override Active</span></div></div></div></div>",
|
|
21
|
-
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
21
|
+
"style": ":host{display:block;font-family:'Segoe UI',sans-serif;color:var(--ui-text,#e8e8ea);}.fp{display:flex;flex-direction:column;min-width:340px;font-size:13px;background:var(--ui-surface,#1a212b);border-radius:8px;overflow:hidden;}.fp-hdr{display:flex;align-items:center;gap:8px;padding:11px 13px;background:var(--ui-surface-2,#232e3d);}.fp-title{font-weight:640;flex:1;font-size:13px;font-family:monospace;letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.fp-x{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);font-size:15px;opacity:.85;padding:2px 7px;border-radius:4px;}.fp-x:hover{background:rgba(255,255,255,.1);}.fp-adv-btn{cursor:pointer;background:none;border:none;color:var(--ui-text,#e8e8ea);opacity:.85;padding:3px;display:flex;border-radius:4px;}.fp-adv-btn:hover{background:rgba(255,255,255,.1);}.fp-desc{padding:6px 13px;font-size:11.5px;color:var(--ui-dim,#9aa4b2);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tabs{display:flex;background:var(--ui-surface-2,#1e2732);border-bottom:1px solid var(--ui-border,#2b3542);}.fp-tab{flex:1;position:relative;padding:8px 2px;cursor:pointer;background:none;border:none;color:var(--ui-dim,#9aa4b2);display:flex;flex-direction:column;align-items:center;gap:3px;border-right:1px solid var(--ui-border,#222b36);}.fp-tab:last-child{border-right:none;}.fp-tab:hover{color:var(--ui-text,#e8e8ea);}.fp-tab.sel{color:var(--accent,#5b9bff);background:var(--ui-surface,#1a212b);}.fp-tab.sel::after{content:'';position:absolute;bottom:-1px;left:0;right:0;height:2px;background:var(--accent,#5b9bff);}.fp-tab-cap{font-size:9px;letter-spacing:.02em;}.fp-ic{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}.fp-tab-badge{position:absolute;top:5px;right:calc(50% - 15px);width:7px;height:7px;border-radius:50%;background:var(--ui-error,#e5484d);}.fp-body{padding:14px 15px;}.fp-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-top:1px solid var(--ui-border,#222b36);font-size:12.5px;}.fp-row:first-child{border-top:none;}.fp-row .lbl{opacity:.7;}.fp-row input{width:90px;flex:none;text-align:right;padding:4px 8px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-family:monospace;}.fp-btn{padding:5px 11px;background:var(--accent,#2680eb);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:11px;}.fp-btn.ghost{background:none;border:1px solid var(--ui-border,#4a5570);color:var(--ui-text,#e8e8ea);}.fp-alm{display:flex;align-items:center;gap:8px;margin-bottom:6px;}.fp-chip{width:12px;height:12px;border-radius:50%;background:var(--ui-ok,#30a46c);}.fp-alm.active .fp-chip{background:var(--ui-error,#e5484d);}.fp-alm .nm{flex:1;font-size:12px;}.fp-mai{display:flex;gap:16px;align-items:stretch;}.fp-mai webui-plantpax-components-level-bar{flex:none;}.fp-pv{flex:1;display:flex;flex-direction:column;}.pv-big{font-size:36px;font-weight:710;letter-spacing:-.02em;line-height:1;}.pv-eu{font-size:12px;opacity:.7;margin:3px 0 8px;}.pv-mem{font-family:monospace;font-size:10px;color:var(--accent,#5b9bff);opacity:.8;}.fp-flags{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}.fp-sec{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--ui-dim,#9aa4b2);margin:14px 0 8px;padding-bottom:5px;border-bottom:1px solid var(--ui-border,#222b36);}.fp-sec:first-child{margin-top:2px;}.fp-mrow{display:flex;align-items:center;gap:8px;margin-bottom:5px;}.fp-mrow .mnm{width:44px;font-size:12px;opacity:.8;}.fp-mrow .mh{flex:1;text-align:center;font-size:10px;opacity:.6;text-transform:uppercase;}.fp-mrow.head{margin-bottom:6px;}.fp-mrow input.mnum{flex:1;width:0;padding:4px;background:var(--ui-surface-2,#2f3545);color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);border-radius:4px;font-size:12px;}.fp-chk{display:flex;align-items:center;gap:8px;font-size:12.5px;margin:8px 0;cursor:pointer;}.fp-chk .m{margin-left:auto;font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.fp-row .lbl.cfg{display:flex;flex-direction:column;gap:1px;opacity:1;}.fp-row .lbl.cfg b{font-weight:500;font-size:12.5px;}.cfgmem{font-family:monospace;font-size:9.5px;color:var(--accent,#5b9bff);opacity:.75;}.cfgunit{font-family:monospace;font-size:11px;color:var(--ui-dim,#9aa4b2);margin-left:6px;}.fp-almbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;}.fp-grow{flex:1;}.fp-unack{font-size:12px;color:var(--ui-error,#e5484d);font-weight:600;}.fp-cmdimg{width:34px;height:34px;cursor:pointer;flex:none;margin-left:4px;border-radius:4px;}.fp-cmdimg:hover{background:rgba(255,255,255,.08);}.qual{font-weight:600;font-size:12px;display:inline-flex;align-items:center;gap:6px;}.qual::after{content:'';width:8px;height:8px;border-radius:50%;background:currentColor;order:2;}.qual.good{color:var(--ui-ok,#30a46c);}.qual.unc{color:var(--ui-warn,#f6b73c);}.qual.bad{color:var(--ui-error,#e5484d);}.hidden{display:none!important;}.mt-lamps{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px;}.mt-cmds{display:flex;gap:10px;margin:10px 0;}.mt-cmds webui-plantpax-components-command-button{flex:1;}.mt-mode{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:8px;}.mt-mode .badge{padding:3px 10px;border-radius:10px;font-weight:700;font-size:11px;background:var(--ui-surface-2,#2f3545);}",
|
|
22
22
|
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"operator\", \"program\", \"override\", \"maint\", \"local\", \"extReq\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -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
|
}
|