iobroker.mywebui 1.124.0 → 1.125.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 +1 -1
- package/default-controls/controls/plantpax/ain-symbol.control +1 -1
- package/default-controls/controls/plantpax/alarm-faceplate.control +1 -1
- package/default-controls/controls/plantpax/alarm-symbol.control +1 -1
- package/default-controls/controls/plantpax/cmdsrc-faceplate.control +1 -1
- package/default-controls/controls/plantpax/cmdsrc-symbol.control +1 -1
- package/default-controls/controls/plantpax/dbc-faceplate.control +1 -1
- package/default-controls/controls/plantpax/dbc-symbol.control +1 -1
- package/default-controls/controls/plantpax/din-faceplate.control +1 -1
- package/default-controls/controls/plantpax/din-symbol.control +1 -1
- package/default-controls/controls/plantpax/dose-faceplate.control +1 -1
- package/default-controls/controls/plantpax/dose-symbol.control +1 -1
- package/default-controls/controls/plantpax/dout-faceplate.control +1 -1
- package/default-controls/controls/plantpax/dout-symbol.control +1 -1
- package/default-controls/controls/plantpax/gate-faceplate.control +5 -9
- package/default-controls/controls/plantpax/gate-symbol.control +1 -1
- package/default-controls/controls/plantpax/hilosel-faceplate.control +1 -1
- package/default-controls/controls/plantpax/hilosel-symbol.control +1 -1
- package/default-controls/controls/plantpax/intlk-faceplate.control +1 -1
- package/default-controls/controls/plantpax/intlk-symbol.control +1 -1
- package/default-controls/controls/plantpax/logic-faceplate.control +1 -1
- package/default-controls/controls/plantpax/logic-symbol.control +1 -1
- package/default-controls/controls/plantpax/meta-faceplate.control +1 -1
- package/default-controls/controls/plantpax/meta-symbol.control +1 -1
- package/default-controls/controls/plantpax/motor-faceplate.control +1 -1
- package/default-controls/controls/plantpax/motor-symbol.control +1 -1
- package/default-controls/controls/plantpax/motor2spd-faceplate.control +1 -1
- package/default-controls/controls/plantpax/motor2spd-symbol.control +1 -1
- package/default-controls/controls/plantpax/motorrev-faceplate.control +1 -1
- package/default-controls/controls/plantpax/motorrev-symbol.control +1 -1
- package/default-controls/controls/plantpax/npos-faceplate.control +1 -1
- package/default-controls/controls/plantpax/npos-symbol.control +1 -1
- package/default-controls/controls/plantpax/perm-faceplate.control +1 -1
- package/default-controls/controls/plantpax/perm-symbol.control +1 -1
- package/default-controls/controls/plantpax/pide-faceplate.control +1 -1
- package/default-controls/controls/plantpax/pide-symbol.control +1 -1
- package/default-controls/controls/plantpax/valvec-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valvec-symbol.control +1 -1
- package/default-controls/controls/plantpax/valvemo-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valvemo-symbol.control +1 -1
- package/default-controls/controls/plantpax/valvemp-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valvemp-symbol.control +1 -1
- package/default-controls/controls/plantpax/valveso-faceplate.control +1 -1
- package/default-controls/controls/plantpax/valveso-symbol.control +1 -1
- package/default-controls/controls/plantpax/vsd-faceplate.control +1 -1
- package/default-controls/controls/plantpax/vsd-symbol.control +1 -1
- package/dist/backend/3d-editor-integration.js +1 -1
- package/dist/backend/ImportmapCreator.js +1 -1
- package/dist/backend/UploadHelper.js +1 -1
- package/dist/backend/main.js +1 -1
- package/io-package.json +2 -2
- package/package.json +2 -2
- package/scripts/_build_plantpax.py +87 -6
- 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 +2 -2
- package/www/dist/frontend/bundle/chunk-3C6XC7RW.js +1 -1
- package/www/dist/frontend/bundle/chunk-3R27DWVW.js +2 -2
- package/www/dist/frontend/bundle/chunk-3WGNLIWJ.js +3 -3
- package/www/dist/frontend/bundle/chunk-3YK3Y2SJ.js +1 -1
- package/www/dist/frontend/bundle/chunk-43HEBO5G.js +2 -2
- package/www/dist/frontend/bundle/chunk-5MUGMRXU.js +1 -1
- package/www/dist/frontend/bundle/chunk-5UBRCTRX.js +3 -3
- package/www/dist/frontend/bundle/chunk-65A3PNMG.js +1 -1
- package/www/dist/frontend/bundle/chunk-66EU64WD.js +1 -1
- package/www/dist/frontend/bundle/chunk-6BL3X2VD.js +3 -3
- package/www/dist/frontend/bundle/chunk-6L2YCGEX.js +1 -1
- package/www/dist/frontend/bundle/chunk-6PNYA23N.js +21 -0
- package/www/dist/frontend/bundle/chunk-7CWDQGAG.js +3 -3
- package/www/dist/frontend/bundle/chunk-7PT7IGUJ.js +3 -3
- package/www/dist/frontend/bundle/chunk-AI5PDLDE.js +3 -3
- package/www/dist/frontend/bundle/chunk-AUTVRE23.js +1 -1
- package/www/dist/frontend/bundle/chunk-AWKVUUKN.js +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 +2 -2
- package/www/dist/frontend/bundle/chunk-FFW7WOVM.js +1 -1
- package/www/dist/frontend/bundle/chunk-FHF6DL5U.js +1 -1
- package/www/dist/frontend/bundle/chunk-FO56TEZH.js +3 -3
- package/www/dist/frontend/bundle/chunk-FRCSTZQC.js +3 -3
- package/www/dist/frontend/bundle/chunk-FSHAYPVR.js +3 -3
- package/www/dist/frontend/bundle/chunk-FSRRPQMX.js +3 -3
- package/www/dist/frontend/bundle/chunk-GLQNGCFL.js +1 -1
- package/www/dist/frontend/bundle/chunk-HC7GL5JY.js +1 -1
- package/www/dist/frontend/bundle/chunk-HXNIU7FI.js +2 -2
- package/www/dist/frontend/bundle/chunk-JBDSDK2C.js +3 -3
- package/www/dist/frontend/bundle/chunk-JSC66ZLQ.js +1 -1
- package/www/dist/frontend/bundle/chunk-JVPUFDR5.js +3 -3
- package/www/dist/frontend/bundle/chunk-K6IV7LKW.js +1 -1
- package/www/dist/frontend/bundle/chunk-KJU5I76S.js +2 -2
- package/www/dist/frontend/bundle/chunk-KY73TL6O.js +2 -2
- package/www/dist/frontend/bundle/chunk-LKS3S4WX.js +1 -1
- package/www/dist/frontend/bundle/chunk-M6VVTDVX.js +3 -3
- package/www/dist/frontend/bundle/chunk-MECWXZRN.js +1 -1
- package/www/dist/frontend/bundle/chunk-N2YIZTB2.js +1 -1
- package/www/dist/frontend/bundle/chunk-NQ7L7KNT.js +2 -2
- package/www/dist/frontend/bundle/chunk-O2AJL747.js +2 -2
- package/www/dist/frontend/bundle/chunk-P7EOR36H.js +1 -1
- package/www/dist/frontend/bundle/chunk-PJYK24KZ.js +1 -1
- package/www/dist/frontend/bundle/chunk-PYLAW6UA.js +2 -2
- package/www/dist/frontend/bundle/chunk-QJJGP23I.js +1 -1
- package/www/dist/frontend/bundle/chunk-QV4IBWXA.js +1 -1
- package/www/dist/frontend/bundle/chunk-QVMAZVXM.js +1 -0
- package/www/dist/frontend/bundle/chunk-R6IQDPAP.js +3 -3
- package/www/dist/frontend/bundle/chunk-RRFSEMFS.js +3 -3
- package/www/dist/frontend/bundle/chunk-RTTBZOQU.js +3 -3
- package/www/dist/frontend/bundle/chunk-S4TLNW5D.js +1 -1
- package/www/dist/frontend/bundle/chunk-S7P222YS.js +1 -1
- package/www/dist/frontend/bundle/chunk-SE6N4ZEN.js +1 -1
- package/www/dist/frontend/bundle/chunk-SQHXO2IT.js +3 -3
- package/www/dist/frontend/bundle/chunk-T4AIQBBH.js +3 -3
- package/www/dist/frontend/bundle/chunk-TWQQHCU7.js +3 -3
- package/www/dist/frontend/bundle/chunk-U5Q332OH.js +1 -1
- package/www/dist/frontend/bundle/chunk-UIP324PP.js +1 -1
- package/www/dist/frontend/bundle/chunk-V27IRYSL.js +1 -1
- package/www/dist/frontend/bundle/chunk-V4C5FGJL.js +3 -3
- package/www/dist/frontend/bundle/chunk-V5CHFTYG.js +3 -3
- package/www/dist/frontend/bundle/chunk-VHXWCBNP.js +1 -1
- package/www/dist/frontend/bundle/chunk-W2KWSW4M.js +1 -1
- package/www/dist/frontend/bundle/chunk-W5QV7JN5.js +1 -1
- package/www/dist/frontend/bundle/chunk-WED7CGWA.js +3 -3
- package/www/dist/frontend/bundle/chunk-WQ5H5LTG.js +3 -3
- package/www/dist/frontend/bundle/chunk-WU54NCEU.js +1 -1
- package/www/dist/frontend/bundle/chunk-XCRSZKUF.js +1 -1
- package/www/dist/frontend/bundle/chunk-XFO5FUCN.js +1 -1
- package/www/dist/frontend/bundle/chunk-XWAQ2BWM.js +3 -3
- package/www/dist/frontend/bundle/chunk-YTQCHNRQ.js +3 -3
- package/www/dist/frontend/bundle/chunk-YUSK4FN3.js +2 -2
- package/www/dist/frontend/bundle/chunk-Z34BSG5O.js +2 -2
- 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 +2 -2
- package/www/dist/frontend/config/IobrokerWebui3DScreenViewer.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiAppShell.js +2 -2
- package/www/dist/frontend/config/IobrokerWebuiBindingsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiConfirmationWrapper.js +2 -2
- package/www/dist/frontend/config/IobrokerWebuiControlPropertiesEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiDynamicPropsEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiEventAssignment.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiIconsView.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiMonacoEditor.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiPlantPaxTypesEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiPropertyGrid.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreenEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiScreensView.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiSecurityEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSignalPropertyEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiSolutionExplorer.js +3 -3
- package/www/dist/frontend/config/IobrokerWebuiTranslationEditor.js +1 -1
- package/www/dist/frontend/config/IobrokerWebuiWidgetGallery.js +3 -3
- package/www/dist/frontend/helper/DialogHelper.js +3 -3
- package/www/dist/frontend/helper/EsprimaHelper.js +1 -1
- package/www/dist/frontend/helper/Helper.js +1 -1
- package/www/dist/frontend/helper/LayoutHelper.js +1 -1
- package/www/dist/frontend/helper/XmlHelper.js +1 -1
- package/www/dist/frontend/helper/ZipHelper.js +1 -1
- package/www/dist/frontend/runtime/AnimationService.js +1 -1
- package/www/dist/frontend/runtime/CustomControls.js +1 -1
- package/www/dist/frontend/runtime/DynamicElementProperties.js +1 -1
- package/www/dist/frontend/runtime/HabPanelLikeMenu.js +2 -2
- package/www/dist/frontend/runtime/NavigationShell.js +1 -1
- package/www/dist/frontend/runtime/RuntimeTheme.js +1 -1
- package/www/dist/frontend/runtime/ScreenViewer.js +3 -3
- package/www/dist/frontend/runtime/TranslateableText.js +2 -2
- package/www/dist/frontend/runtime/VisibilityService.js +1 -1
- package/www/dist/frontend/runtime/controls.js +1 -1
- package/www/dist/frontend/runtime/init.js +1 -1
- package/www/dist/frontend/scripting/IobrokerWebuiScriptSystem.js +1 -1
- package/www/dist/frontend/scripting/blockly/OpenScreen.js +1 -1
- package/www/dist/frontend/scripting/blockly/webuiBlocklyToolbox.js +1 -1
- package/www/dist/frontend/services/DynamicPropertiesHelper.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableLocalObjectsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectDragDropService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectsForPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiBindableObjectsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiConfigButtonProvider.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCopyPasteService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCustomControlEventsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiCustomElementContextMenu.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiDemoProviderService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiDynamicPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiEventsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiExternalDragDropService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiLitPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiPropertyGroupsService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiRefactorService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiScreenContextMenu.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiSpecialPropertiesService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiSpectrumEditorService.js +1 -1
- package/www/dist/frontend/services/IobrokerWebuiVisibilityPropertiesService.js +1 -1
- package/www/dist/frontend/services/LayoutComponentsPropertiesService.js +1 -1
- package/www/dist/frontend/widgets/OrthoFlowLineTool.js +1 -1
- package/www/dist/frontend/widgets/customElementsObserver.js +1 -1
- package/www/dist/frontend/widgets/importWidgetFiles.js +1 -1
- package/www/dist/frontend/widgets/importWidgetFilesRuntime.js +1 -1
- package/www/dist/frontend/widgets/layout-components.js +1 -1
- package/www/dist/frontend/widgets/layout-placement-services.js +1 -1
- package/www/dist/frontend/widgets/testElement.js +1 -1
|
@@ -19,5 +19,5 @@
|
|
|
19
19
|
},
|
|
20
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
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
|
-
"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"
|
|
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// 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// 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 // bind-prop:value=\"[[...]]\" never reaches input.value (the [[..]] parser consumes\n // the attribute but writes a junk 'bindProp:value' expando) -> fill numeric\n // [data-field] inputs imperatively; skip while the operator is typing in it.\n const setNum=function(field,v){ for(const inp of instance._getDomElements('input[data-field=\"'+field+'\"]')){ if(!inp.matches(':focus')) inp.value=(v===null||v===undefined)?'':v; } };\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; setNum(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
|
}
|
|
@@ -19,5 +19,5 @@
|
|
|
19
19
|
},
|
|
20
20
|
"html": "<div id=\"sym\" class=\"pp-sym\"><span class=\"pp-pv\">[[this.pv==null?'--':this.pv]]</span><span class=\"pp-unit\">[[this.unit||'']]</span><span class=\"pp-badge\" css:display=\"[[this.unacked?'':'none']]\"></span></div>",
|
|
21
21
|
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.pp-sym{position:relative;display:flex;align-items:baseline;gap:4px;justify-content:center;height:100%;box-sizing:border-box;padding:4px 8px;border-radius:4px;cursor:pointer;background:var(--pp-bg,var(--ui-surface-2,#2f3545));color:var(--ui-text,#e8e8ea);border:1px solid var(--ui-border,#4a5570);}.pp-pv{font-size:18px;font-weight:700;}.pp-unit{font-size:11px;opacity:.7;}.pp-badge{position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:var(--ui-warn,#f6b73c);}",
|
|
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.unacked=0; instance.__alm={}; instance.__sts={};\n ppSubscribe(instance,'pv',function(v){ instance.pv=v; });\n const alarms=[\"hiHiAlarm\", \"hiAlarm\", \"loAlarm\", \"loLoAlarm\", \"failAlarm\"];\n for(const a of alarms){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__alm[name]=(v===true||v==='true'||v===1); ppSymColor(instance); }); })(a); }\n // threshold-status bits (Sts_*) so the symbol tracks the MAI colour even before an alarm annunciates\n for(const s of ['hiHiSts','hiSts','loSts','loLoSts']){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__sts[name]=(v===true||v==='true'||v===1); ppSymColor(instance); }); })(s); }\n ppWireSymbol(instance);\n}\nfunction ppSymColor(instance){\n const A=instance.__alm||{}, S=instance.__sts||{};\n const hi2=A.hiHiAlarm||A.loLoAlarm||S.hiHiSts||S.loLoSts, hi1=A.hiAlarm||A.loAlarm||S.hiSts||S.loSts, fail=A.failAlarm;\n const el=instance._getDomElement('sym');\n const c=(hi2||fail)?'var(--ui-error,#e5484d)':(hi1?'var(--ui-warn,#f6b73c)':'var(--ui-ok,#30a46c)');\n if(el) el.style.setProperty('--pp-bg', c);\n // annunciated (unacked) badge tracks the real alarm objects only, not raw threshold status\n instance.unacked=(A.hiHiAlarm||A.loLoAlarm||A.hiAlarm||A.loAlarm||A.failAlarm)?1:0;\n try{ instance._bindingsRefresh&&instance._bindingsRefresh(); }catch(e){}\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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// 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// 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.unacked=0; instance.__alm={}; instance.__sts={};\n ppSubscribe(instance,'pv',function(v){ instance.pv=v; });\n const alarms=[\"hiHiAlarm\", \"hiAlarm\", \"loAlarm\", \"loLoAlarm\", \"failAlarm\"];\n for(const a of alarms){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__alm[name]=(v===true||v==='true'||v===1); ppSymColor(instance); }); })(a); }\n // threshold-status bits (Sts_*) so the symbol tracks the MAI colour even before an alarm annunciates\n for(const s of ['hiHiSts','hiSts','loSts','loLoSts']){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__sts[name]=(v===true||v==='true'||v===1); ppSymColor(instance); }); })(s); }\n ppWireSymbol(instance);\n}\nfunction ppSymColor(instance){\n const A=instance.__alm||{}, S=instance.__sts||{};\n const hi2=A.hiHiAlarm||A.loLoAlarm||S.hiHiSts||S.loLoSts, hi1=A.hiAlarm||A.loAlarm||S.hiSts||S.loSts, fail=A.failAlarm;\n const el=instance._getDomElement('sym');\n const c=(hi2||fail)?'var(--ui-error,#e5484d)':(hi1?'var(--ui-warn,#f6b73c)':'var(--ui-ok,#30a46c)');\n if(el) el.style.setProperty('--pp-bg', c);\n // annunciated (unacked) badge tracks the real alarm objects only, not raw threshold status\n instance.unacked=(A.hiHiAlarm||A.loLoAlarm||A.hiAlarm||A.loAlarm||A.failAlarm)?1:0;\n try{ instance._bindingsRefresh&&instance._bindingsRefresh(); }catch(e){}\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -19,5 +19,5 @@
|
|
|
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
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
|
-
"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"
|
|
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// 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// 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
|
}
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">ALM</span></div>",
|
|
17
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"
|
|
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// 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// 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
|
}
|
|
@@ -19,5 +19,5 @@
|
|
|
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
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
|
-
"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"
|
|
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// 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// 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
|
}
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">CMD</span></div>",
|
|
17
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"
|
|
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// 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// 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
|
}
|
|
@@ -19,5 +19,5 @@
|
|
|
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=\"available\" label=\"Available\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp></div><div class=\"fp-row\"><span class=\"lbl\">Process Value</span><span>[[this.pv==null?'--':this.pv]]</span></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-row\"><span class=\"lbl\">No alarms configured</span></div></div></div></div>",
|
|
21
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
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"available\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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// 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// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"available\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">DBC</span></div>",
|
|
17
17
|
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"available\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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// 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// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"available\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -19,5 +19,5 @@
|
|
|
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=\"pv\" label=\"Input On\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"substActive\" label=\"Substitute\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"sim\" label=\"Simulation\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"maintByp\" label=\"Maint Byp\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Substitute</span><span>[[this.substActive?'Active':'—']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.tgtDisagree?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Target Disagree</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.ioFault?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">I/O Fault</span></div></div></div></div>",
|
|
21
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
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"pv\", \"substActive\", \"sim\", \"maintByp\", \"tgtDisagree\", \"ioFault\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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// 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// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"pv\", \"substActive\", \"sim\", \"maintByp\", \"tgtDisagree\", \"ioFault\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><svg id=\"svg\" viewBox=\"0 0 48 40\" class=\"dv-svg\"><rect x=\"10\" y=\"6\" width=\"28\" height=\"28\" rx=\"3\" class=\"dv-fill dv-out\"/><circle cx=\"24\" cy=\"20\" r=\"6\" class=\"dv-dot\"/></svg></div>",
|
|
17
17
|
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"pv\", \"tgtDisagree\", \"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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// 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// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"pv\", \"tgtDisagree\", \"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -19,5 +19,5 @@
|
|
|
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=\"available\" label=\"Available\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"notRdy\" label=\"Not Ready\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdStart\" label=\"Start\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdStop\" label=\"Stop\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Available</span><span>[[this.available?'YES':'no']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.ioFault?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">I/O Fault</span></div></div></div></div>",
|
|
21
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
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"available\", \"notRdy\", \"ioFault\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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// 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// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"available\", \"notRdy\", \"ioFault\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|
|
@@ -15,5 +15,5 @@
|
|
|
15
15
|
},
|
|
16
16
|
"html": "<div id=\"sym\" class=\"dv-sym\"><span class=\"dv-ab\">DZ</span></div>",
|
|
17
17
|
"style": ":host{display:block;width:100%;height:100%;font-family:'Segoe UI',sans-serif;}.dv-sym{width:100%;height:100%;min-width:40px;min-height:34px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ui-text,#e8e8ea);font-weight:700;font-size:13px;}.dv-sym .dv-ab{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:5px;background:var(--dv-fill,var(--ui-surface-2,#2f3545));border:1px solid var(--ui-border,#4a5570);}.dv-svg{width:100%;height:100%;}.dv-fill{fill:var(--dv-fill,var(--ui-surface-2,#2f3545));transition:fill .25s;}.dv-out{stroke:var(--ui-text,#cfd6df);stroke-width:1.6;fill:none;stroke-linejoin:round;}rect.dv-fill,path.dv-fill{stroke:none;}.dv-txt{fill:var(--ui-text,#e8e8ea);font:700 15px 'Segoe UI',sans-serif;text-anchor:middle;}.dv-dot{fill:var(--dv-dot,var(--ui-border,#4a5570));transition:fill .25s;}",
|
|
18
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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// 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// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function') return;\n instance.__s={};\n const CF=[\"ioFault\"];\n const upd=function(){ const s=instance.__s; let bad=false,on=false;\n for(const f of CF){ if(s[f]){ if(/fault|trip|fail|ioFault|disagree/i.test(f)) bad=true; else on=true; } }\n const el=instance._getDomElement('sym'); if(!el) return;\n const c = bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-surface-2,#2f3545)');\n el.style.setProperty('--dv-fill', c);\n el.style.setProperty('--dv-dot', bad?'var(--ui-error,#e5484d)':(on?'var(--ui-ok,#30a46c)':'var(--ui-border,#4a5570)')); };\n for(const f of CF){ (function(name){ ppSubscribe(instance,name,function(v){ instance.__s[name]=(v===true||v==='true'||v===1); upd(); }); })(f); }\n ppWireSymbol(instance);\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
19
19
|
}
|
|
@@ -19,5 +19,5 @@
|
|
|
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=\"pv\" label=\"Output On\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"fdbk\" label=\"Feedback\" oncolor=\"var(--ui-ok,#30a46c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"substActive\" label=\"Substitute\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp><webui-plantpax-components-status-lamp data-pp=\"1\" field=\"maintByp\" label=\"Maint Byp\" oncolor=\"var(--ui-warn,#f6b73c)\"></webui-plantpax-components-status-lamp></div><div class=\"mt-cmds\"><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdOn\" label=\"On\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button><webui-plantpax-components-command-button data-pp=\"1\" field=\"cmdOff\" label=\"Off\" value=\"1\" action=\"operate\"></webui-plantpax-components-command-button></div></div><div data-pane=\"Maintenance\" class=\"hidden\"><div class=\"fp-row\"><span class=\"lbl\">Substitute</span><span>[[this.substActive?'Active':'—']]</span></div><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-top:8px\">Reset & Ack All</button></div><div data-pane=\"Alarms\" class=\"hidden\"><button class=\"fp-btn\" data-cmd=\"resetAckAll\" style=\"margin-bottom:8px\">Reset & Ack All</button><div class=\"fp-alm\" bind-attr:class=\"[[this.ioFault?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">I/O Fault</span></div><div class=\"fp-alm\" bind-attr:class=\"[[this.fdbkDisagree?'fp-alm active':'fp-alm']]\"><span class=\"fp-chip\"></span><span class=\"nm\">Feedback Disagree</span></div></div></div></div>",
|
|
21
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
|
-
"script": "\nfunction ppResolve(instance,field){ try{ return window.IOB.resolvePlantPaxField(instance.type,instance.root,field); }catch(e){ return null; } }\nfunction ppSubscribe(instance,field,onVal){\n const id=ppResolve(instance,field); if(!id) return;\n instance.__ppSubs=instance.__ppSubs||[];\n const cb=(_i,s)=>{ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} };\n try{ window.IOB.getState(id).then(function(s){ onVal(s&&s.val); try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }).catch(function(){}); }catch(e){}\n try{ window.IOB.subscribeState(id,cb); instance.__ppSubs.push([id,cb]); }catch(e){}\n}\nfunction ppCleanup(instance){\n for(const pair of (instance.__ppSubs||[])){ try{ window.IOB.unsubscribeState(pair[0],pair[1]); }catch(e){} }\n instance.__ppSubs=[];\n}\nasync function ppWrite(instance,field,val,action){\n const id=ppResolve(instance,field); if(!id) return;\n try{ await window.IOB.secWriteState(id,val,{action:action,element:instance}); }catch(e){ console.warn('[plantpax] write failed',field,e); }\n}\n// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"pv\", \"fdbk\", \"substActive\", \"maintByp\", \"ioFault\", \"fdbkDisagree\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
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// 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// wire symbol click -> open faceplate (event bindings can't eval expressions here, so bind imperatively)\nfunction ppWireSymbol(instance){\n const el=instance._getDomElement&&instance._getDomElement('sym'); if(!el) return;\n el.addEventListener('click',function(){ try{ window.IOB && window.IOB.openFaceplate && window.IOB.openFaceplate(instance.type,instance.root); }catch(e){} });\n}\n// wire faceplate header + icon tab-strip clicks imperatively\nfunction ppWireHeader(instance){\n if(!instance._getDomElements) return;\n for(const b of instance._getDomElements('.fp-x')){ b.addEventListener('click',function(){ try{ window.IOB && window.IOB.closeFaceplate && window.IOB.closeFaceplate(); }catch(e){} }); }\n for(const b of instance._getDomElements('.fp-adv-btn')){ b.addEventListener('click',function(){ instance._adv&&instance._adv(); }); }\n for(const t of instance._getDomElements('.fp-tab')){ (function(btn){ btn.addEventListener('click',function(){ const n=btn.getAttribute('data-tab'); if(n==='Main'){ instance._main&&instance._main(); } else { instance._tab&&instance._tab(n); } }); })(t); }\n}\n\nexport function init(instance){\n if(!instance || typeof instance._getDomElement!=='function' || typeof instance._getDomElements!=='function') return;\n const subs=[\"pv\", \"fdbk\", \"substActive\", \"maintByp\", \"ioFault\", \"fdbkDisagree\"];\n for(const f of subs){ (function(field){ ppSubscribe(instance,field,function(v){ instance[field]=v; try{instance._bindingsRefresh&&instance._bindingsRefresh();}catch(e){} }); })(f); }\n instance._tab=function(name){\n for(const p of instance._getDomElements('[data-pane]')) p.classList.toggle('hidden', p.getAttribute('data-pane')!==name);\n for(const t of instance._getDomElements('.fp-tab')) t.classList.toggle('sel', t.getAttribute('data-tab')===name);\n };\n ppWireHeader(instance);\n instance._tab('Home');\n for(const c of instance._getDomElements('[data-pp]')){ c.root=instance.root; c.type=instance.type;\n if(typeof c._ppReinit==='function'){ c._ppReinit(); } else { (function(cc){ setTimeout(function(){ cc._ppReinit&&cc._ppReinit(); },200); })(c); } }\n for(const b of instance._getDomElements('[data-cmd]')){ (function(btn){ btn.addEventListener('click',function(){ ppWrite(instance,btn.getAttribute('data-cmd'),1,'maintenance'); }); })(b); }\n}\nexport function disconnectedCallback(instance){ ppCleanup(instance); }\n"
|
|
23
23
|
}
|