Skip to content

Commit 1b2bd58

Browse files
muenchrisChris Muench
andauthored
New NMI Editor with RedPill (#56)
* Fix for SubProperties in NMI * proper UX Management of Sub-Properties * Fix for super large collapsible groups * Fix for missing Template assignment; fix for SideBar in ClassicMode * no checkin of cdeWorker.js * LiveChart with PixelWidth * Bar with PixelHeight/Width; remove od debugger * fix for Chart Control * Fix for Pixel precision sizing of NMI Controls * Fix for Bar PixelWidth * code smell removed * fix for sonarcloud * Fix for Foreign Things in Screens * Fix for FacePlate inlines pointing at other Things * Missing Event Fire on Screen Model Update * Tuning of Faceplate tags * Fix for custom HomeScreen OnShow not firing; fix for FacePlate parsing * fix for faceplate parsing * SonarCloud Cleanup; Final FacePlate Fix * remove allowanonymour from nmi initialization * SonarCloud cleanup; Support for ReloadAfterLogout; Support for DefaultPortal of a plugin; Fix of Login Screen if host name has changed; * code smell fix * Small Fix for Dashboard Tiles * ForceLoad if DefaultPortal is set * new FitToScreen option for Forms; some more SonarCloud cleanup * code smell fix * Fit To Screen for vertical adjustments * Fix for FitToScreen; new ClassName Macro for Faceplates * FacePlate fix; Copyright to 2023 * Fix for SonarCloud duplication * Correct fetch of images from Mesh Sources; Sonarcloud fixes * sonar cloud fix * Initial work on NMI Editor * Updates to NMI Editor * Support the for the NMI Editor with RedPill * fix for sonar * No Sonar for webworker * still fighting sonarcloud * Still fighting --------- Co-authored-by: Chris Muench <chris.muench@live.com>
1 parent ee5ccf8 commit 1b2bd58

23 files changed

+2704
-487
lines changed

src/HTML5/CDMyNMIHtml5RT/ClientBin/CDE/cde.min.js

Lines changed: 298 additions & 166 deletions
Large diffs are not rendered by default.

src/HTML5/CDMyNMIHtml5RT/ClientBin/CDE/cdeWorker.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/HTML5/CDMyNMIHtml5RT/ClientBin/CSS/CDESTYLES.min.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/HTML5/CDMyNMIHtml5RT/ClientBin/CSS/MYSTYLES.min.css

Lines changed: 1 addition & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/HTML5/CDMyNMIHtml5RT/TheNMIEditor.cs

Lines changed: 47 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,20 @@
1-
// SPDX-FileCopyrightText: 2009-2020 TRUMPF Laser GmbH, authors: C-Labs
1+
// SPDX-FileCopyrightText: 2009-2023 TRUMPF Laser GmbH, authors: C-Labs
22
//
33
// SPDX-License-Identifier: MPL-2.0
44

55
using nsCDEngine.BaseClasses;
66
using nsCDEngine.Communication;
7+
using nsCDEngine.Engines;
78
using nsCDEngine.Engines.NMIService;
89
using nsCDEngine.Engines.ThingService;
910
using nsCDEngine.ViewModels;
1011
using System;
1112

1213
namespace NMIService
1314
{
14-
public class TheNMIEditor : ICDEThing
15+
public class TheNMIEditor : TheThingBase
1516
{
16-
#region ICDEThing Methods
17-
public void SetBaseThing(TheThing pThing)
18-
{
19-
MyBaseThing = pThing;
20-
}
21-
public TheThing GetBaseThing()
22-
{
23-
return MyBaseThing;
24-
}
25-
public virtual cdeP GetProperty(string pName, bool DoCreate)
26-
{
27-
if (MyBaseThing != null)
28-
return MyBaseThing.GetProperty(pName, DoCreate);
29-
return null;
30-
}
31-
public virtual cdeP SetProperty(string pName, object pValue)
32-
{
33-
if (MyBaseThing != null)
34-
return MyBaseThing.SetProperty(pName, pValue);
35-
return null;
36-
}
37-
38-
public void RegisterEvent(string pName, Action<ICDEThing, object> pCallBack)
39-
{
40-
if (MyBaseThing != null)
41-
MyBaseThing.RegisterEvent(pName, pCallBack);
42-
}
43-
public void UnregisterEvent(string pName, Action<ICDEThing, object> pCallBack)
44-
{
45-
if (MyBaseThing != null)
46-
MyBaseThing.UnregisterEvent(pName, pCallBack);
47-
}
48-
public void FireEvent(string pEventName, ICDEThing sender, object pPara, bool FireAsync)
49-
{
50-
if (MyBaseThing != null)
51-
MyBaseThing.FireEvent(pEventName, sender, pPara, FireAsync);
52-
}
53-
public bool HasRegisteredEvents(string pEventName)
54-
{
55-
if (MyBaseThing != null)
56-
return MyBaseThing.HasRegisteredEvents(pEventName);
57-
return false;
58-
}
59-
60-
public virtual void HandleMessage(ICDEThing sender, object pMsg)
61-
{ }
62-
63-
protected TheThing MyBaseThing;
64-
65-
protected bool mIsUXInitCalled;
66-
protected bool mIsUXInitialized;
67-
protected bool mIsInitCalled;
68-
protected bool mIsInitialized;
69-
public bool IsUXInit()
70-
{ return mIsUXInitialized; }
71-
public bool IsInit()
72-
{ return mIsInitialized; }
73-
74-
/// <summary>
75-
/// The possible types of WeMo devices that can be detected
76-
/// </summary>
77-
#endregion
78-
79-
public bool Init()
17+
public override bool Init()
8018
{
8119
if (mIsInitCalled) return false;
8220
mIsInitCalled = true;
@@ -97,25 +35,12 @@ public virtual bool DoInit()
9735
return true;
9836
}
9937

100-
public bool Delete()
101-
{
102-
mIsInitialized = false;
103-
// TODO Properly implement delete
104-
return DoDelete();
105-
}
106-
107-
public virtual bool DoDelete()
108-
{
109-
return true;
110-
}
111-
112-
11338
public virtual void sinkThrottleChanged(cdeP pNewValue)
11439
{
11540
MyBaseThing.SetPublishThrottle(TheCommonUtils.CInt(pNewValue));
11641
}
11742

118-
public bool CreateUX()
43+
public override bool CreateUX()
11944
{
12045
if (mIsUXInitCalled) return false;
12146
mIsUXInitCalled = true;
@@ -176,29 +101,57 @@ public virtual bool DoCreateUX()
176101
{
177102
MyEditorForm = new TheFormInfo(MyBaseThing) { DefaultView = eDefaultView.Form, PropertyBag = new ThePropertyBag { "MaxTileWidth=6", "HideCaption=true", "AllowDrag=true" } };
178103
MyEditorForm.ModelID = "NMIEditor";
179-
104+
TheCDEngines.MyNMIService?.SetProperty("NMIEditorFormID", MyEditorForm.cdeMID);
180105
TheDashboardInfo tDash = TheNMIEngine.GetDashboardById(TheNMIHtml5RT.eNMIDashboard);
181106
MyEditorDashIcon = TheNMIEngine.AddFormToThingUX(tDash, MyBaseThing, MyEditorForm, "CMyForm", "NMI Control Editor", 1, 0x89, 0x80, "NMI", null, new ThePropertyBag() { "RenderTarget=cdeInSideBarRight", "NeverHide=true" }); //"mAllowDrag=true", "nVisibility=false",
107+
return true; //retired for now. Moved into NMI Control Code
182108

183-
MySampleControl = TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.SingleEnded, 3, 2, MyBaseThing.cdeA, "CurrentValue", "Value", null);
109+
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileGroup, 9, 0, 0, null, null, new nmiCtrlTileGroup { TileWidth = 7, TileHeight = 1, TileFactorY = 2 });
110+
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 10, 2, 0, "Main", null, new nmiCtrlTileButton { ParentFld = 9, OnClick = "GRP:NMIP:Main", TileWidth = 1, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
111+
//TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 20, 2, 0, "Screen", null, new nmiCtrlTileButton { ParentFld = 9, OnClick = "GRP:NMIP:Screen", TileWidth = 1, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
112+
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 30, 2, 0, "All", null, new nmiCtrlTileButton { ParentFld = 9, OnClick = "GRP:NMIP:All", TileWidth = 1, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
113+
//TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 40, 2, 0, "Source", null, new nmiCtrlTileButton { ParentFld = 9, OnClick = "GRP:NMIP:Source", TileWidth = 1, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
184114

115+
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileGroup, 1000, 2, 0x80, null, null, new nmiCtrlTileGroup() { Group = "NMIP:Main" });
185116

186-
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileGroup, 9, 0, 0, null, null, new nmiCtrlTileGroup { TileWidth = 7, TileHeight = 1, TileFactorY = 2 });
187-
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 10, 2, 0, "Basic", null, new nmiCtrlTileButton { ParentFld=9, OnClick = "GRP:NMIP:Basic", TileWidth = 1, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
188-
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 20, 2, 0, "Screen", null, new nmiCtrlTileButton { ParentFld = 9, OnClick = "GRP:NMIP:Screen", TileWidth = 1, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
189-
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 30, 2, 0, "All", null, new nmiCtrlTileButton { ParentFld = 9, OnClick = "GRP:NMIP:All", TileWidth = 1, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
190-
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 40, 2, 0, "Source", null, new nmiCtrlTileButton { ParentFld = 9, OnClick = "GRP:NMIP:Source", TileWidth = 1, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
191-
//TheNMIEngine.AddSmartControl(MyBaseThing, MyStatusForm, eFieldType.TileButton, 50, 2, 0, "Compounds", null, new nmiCtrlTileButton { OnClick = "GRP:Cate:5", TileWidth = 2, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
192-
//TheNMIEngine.AddSmartControl(MyBaseThing, MyStatusForm, eFieldType.TileButton, 60, 2, 0, "Gauges", null, new nmiCtrlTileButton { OnClick = "GRP:Cate:6", TileWidth = 2, TileHeight = 1, TileFactorY = 2, NoTE = true, ClassName = "cdeTransitButton" });
193-
TheFieldInfo mSendbutton = TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 70, 2, 0x80, "Reload", false, "", null, new nmiCtrlTileButton() { ParentFld=9, TileWidth = 2, NoTE = true, TileFactorY = 2, ClassName = "cdeGoodActionButton" });
194-
mSendbutton.RegisterUXEvent(MyBaseThing, eUXEvents.OnClick, "", (pThing, pPara) =>
117+
//ALL Properties
118+
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileGroup, 2000, 2, 0x80, null, null, new nmiCtrlTileGroup() { TileWidth = 6, Group = "NMIP:All", Visibility = false });
119+
120+
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.Table, 2010, 0xA2, 0x80, "All Properties", "mypropertybag;1", new ThePropertyBag() { "NoTE=true", "TileHeight=5", "TileWidth=6", "ParentFld=2000" });
121+
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.SingleEnded, 2020, 0x0A, 0, "New Property Name", "ScratchName", new nmiCtrlSingleEnded() { ParentFld = 2000 });
122+
TheFieldInfo tBut = TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 2040, 0x0A, 0, "Add Property", false, null, null, new nmiCtrlTileButton() { ParentFld = 2000, NoTE = true, ClassName = "cdeGoodActionButton" });
123+
tBut.RegisterUXEvent(MyBaseThing, eUXEvents.OnClick, "AddProp", (pThing, pObj) =>
195124
{
196-
TheProcessMessage pMsg = pPara as TheProcessMessage;
125+
TheProcessMessage pMsg = pObj as TheProcessMessage;
197126
if (pMsg?.Message == null) return;
198-
UpdateUx(pThing.GetBaseThing());
199-
MyEditorForm.Reload(pMsg, tDash.cdeMID, true);
127+
TheThing tOrg = pThing.GetBaseThing();
128+
129+
string tNewPropName = TheThing.GetSafePropertyString(tOrg, "ScratchName");
130+
if (string.IsNullOrEmpty(tNewPropName))
131+
TheCommCore.PublishToOriginator(pMsg.Message, new TSM(eEngineName.NMIService, "NMI_TOAST", "Please specify a new property name"));
132+
else
133+
{
134+
if (tOrg.GetProperty(tNewPropName) != null)
135+
{
136+
TheCommCore.PublishToOriginator(pMsg.Message, new TSM(eEngineName.NMIService, "NMI_TOAST", "Property already exists"));
137+
}
138+
else
139+
{
140+
tOrg.DeclareNMIProperty(tNewPropName, ePropertyTypes.TString);
141+
TheCommCore.PublishToOriginator(pMsg.Message, new TSM(eEngineName.NMIService, "NMI_TOAST", "Property Added"));
142+
MyEditorForm.Reload(pMsg, false);
143+
}
144+
tOrg.SetProperty("ScratchName", "");
145+
}
200146
});
201147

148+
return true; //retired for now. Moved into NMI Control Code
149+
150+
MySampleControl = TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.SingleEnded, 3, 2, MyBaseThing.cdeA, "CurrentValue", "Value", null);
151+
152+
153+
154+
202155
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileGroup, 1000, 2, 0x80, null, null, new nmiCtrlTileGroup() { Group = "NMIP:Basic" });
203156
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.ComboBox, 1010, 2, 0x80, "Control Type", "ControlType", new ThePropertyBag() { "Options=%RegisteredControlTypes%", "ParentFld=1000" });
204157
GetProperty("ControlType", true).RegisterEvent(eThingEvents.PropertyChanged, (p) =>
@@ -255,38 +208,7 @@ public virtual bool DoCreateUX()
255208
"<span class='fa-stack'><i class='fa fa-stack-1x'>&#xf0f6;</i><i class='fa fa-stack-2x text-danger' style='opacity:0.5'>&#xf05e;</i></span>,"+
256209
"<span class='fa-stack'><i class='fa fa-stack-1x'>&#xf15c;</i><i class='fa fa-stack-2x text-danger' style='opacity:0.5'>&#xf05e;</i></span>","ParentFld=3000" }).FldWidth = 1;
257210

258-
//ALL Properties
259-
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileGroup, 2000, 2, 0x80, null, null, new nmiCtrlTileGroup() { TileWidth = 6, Group = "NMIP:All", Visibility = false });
260211

261-
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.Table, 2010, 0xA2, 0x80, "All Properties", "mypropertybag;1", new ThePropertyBag() { "NoTE=true", "TileHeight=4", "TileLeft=9", "TileTop=3", "TileWidth=6", "FldWidth=6", "ParentFld=2000" });
262-
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.SingleEnded, 2020, 0x0A, 0, "New Property Name", "ScratchName", new nmiCtrlSingleEnded() { ParentFld = 2000 });
263-
TheFieldInfo tBut = TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileButton, 2040, 0x0A, 0, "Add Property", false, null, null, new nmiCtrlTileButton() { ParentFld = 2000, NoTE = true, ClassName = "cdeGoodActionButton" });
264-
tBut.RegisterUXEvent(MyBaseThing, eUXEvents.OnClick, "AddProp", (pThing, pObj) =>
265-
{
266-
TheProcessMessage pMsg = pObj as TheProcessMessage;
267-
if (pMsg?.Message == null) return;
268-
string[] parts = pMsg.Message.PLS.Split(':');
269-
TheThing tOrg = pThing.GetBaseThing(); // TheThingRegistry.GetThingByMID(MyBaseEngine.GetEngineName(), TheCommonUtils.CGuid(parts[2]));
270-
//if (tOrg == null) return;
271-
272-
string tNewPropName = TheThing.GetSafePropertyString(tOrg, "ScratchName");
273-
if (string.IsNullOrEmpty(tNewPropName))
274-
TheCommCore.PublishToOriginator(pMsg.Message, new TSM(eEngineName.NMIService, "NMI_TOAST", "Please specify a new property name"));
275-
else
276-
{
277-
if (tOrg.GetProperty(tNewPropName) != null)
278-
{
279-
TheCommCore.PublishToOriginator(pMsg.Message, new TSM(eEngineName.NMIService, "NMI_TOAST", "Property already exists"));
280-
}
281-
else
282-
{
283-
tOrg.DeclareNMIProperty(tNewPropName, ePropertyTypes.TString);
284-
TheCommCore.PublishToOriginator(pMsg.Message, new TSM(eEngineName.NMIService, "NMI_TOAST", "Property Added"));
285-
MyEditorForm.Reload(pMsg, false);
286-
}
287-
tOrg.SetProperty("ScratchName", "");
288-
}
289-
});
290212

291213
//THING Connector
292214
TheNMIEngine.AddSmartControl(MyBaseThing, MyEditorForm, eFieldType.TileGroup, 5000, 2, 0x80, null, null, new nmiCtrlTileGroup() { TileWidth = 6, Group = "NMIP:Source", Visibility = false });

src/HTML5/CDMyNMIHtml5RT/cde_NMIRunTime.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,7 +708,12 @@ private static string CreateHeader(TheRequestData pRequest, string pRealPage, st
708708
if (!Found)
709709
{
710710
if (pRequest != null && TheBaseAssets.MyServiceHostInfo.AllowLocalHost)
711-
tStationUri = pRequest.RequestUri;
711+
{
712+
if (pRequest.Header.ContainsKey("Cf-Visitor") && TheCommonUtils.CBool(TheBaseAssets.MySettings.GetSetting("AllowCloudFlareTunnel")))
713+
tStationUri = new Uri($"https://{pRequest.RequestUri.Host}");
714+
else
715+
tStationUri = pRequest.RequestUri;
716+
}
712717
else
713718
tStationUri = new Uri(TheBaseAssets.MyServiceHostInfo.GetPrimaryStationURL(false));
714719
}

src/HTML5/cdeTS/cde/CSS/CDESTYLES.css

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2009-2020 TRUMPF Laser GmbH, authors: C-Labs
2+
* Copyright (c) 2009-2023 TRUMPF Laser GmbH, authors: C-Labs
33
*
44
* SPDX-License-Identifier: CC0-1.0
55
*/
@@ -282,8 +282,7 @@ div.cdeFormEntryComment {
282282
}
283283

284284
.cdeNodeGone {
285-
opacity: 0.5;
286-
/* Safari, Opera */
285+
opacity: 0.5; /* Safari, Opera */
287286
pointer-events: none;
288287
filter: blur(5px);
289288
}
@@ -627,7 +626,7 @@ i.cdeFormPin {
627626
}
628627

629628
.cdeButtonHover2:hover, .cdeButtonHover2:visited, .cdeButtonHover2:active, .cdeButtonHover2:focus, .cdeLiveTile:hover, .cdeLiveTile:visited, .cdeLiveTile:active, .cdeLiveTile:focus, .cdeLiveTileBar:hover, .cdeLiveTileBar:visited, .cdeLiveTileBar:active, .cdeLiveTileBar:focus, .cdeGlassButton:hover, .cdeGlassButton:visited, .cdeGlassButton:active, .cdeGlassButton:focus {
630-
box-shadow: inset 1px 1px 1px #909192, 1px 1px 1px white;
629+
box-shadow: inset 1px 1px 1px hsl(220deg, 1%, 57%), 1px 1px 1px hsl(0deg, 0%, 100%);
631630
}
632631

633632
div.cdeOverlay {
@@ -666,8 +665,7 @@ div.cdeDrawOverlay {
666665

667666
div.ctrlTouchDraw {
668667
width: 100%;
669-
height: 100%;
670-
/* 600px;*/
668+
height: 100%; /* 600px;*/
671669
overflow: hidden;
672670
text-align: left;
673671
margin: 0;
@@ -1288,7 +1286,7 @@ div.cdeDivRefresh {
12881286
}
12891287

12901288
.cdeTabSelected {
1291-
color: black;
1289+
color: rgb(0, 0, 0);
12921290
}
12931291

12941292
.cdeTabNotSelected {
@@ -1681,7 +1679,7 @@ progress.ctrlProgressBar {
16811679
-moz-border-radius-bottomleft: 20px;
16821680
border-top-left-radius: 20px;
16831681
border-bottom-left-radius: 20px;
1684-
background-color: #1da3d1;
1682+
background-color: rgb(29, 163, 209);
16851683
position: absolute;
16861684
top: 0;
16871685
left: 0;
@@ -2163,15 +2161,13 @@ td .toggleChecked > .cdeSwitch {
21632161
.cdeToolTip .cdeToolTipText {
21642162
top: 100%;
21652163
left: 50%;
2166-
margin-left: -160px;
2167-
/* Use half of the width (120/2 = 60), to center the tooltip */
2164+
margin-left: -160px; /* Use half of the width (120/2 = 60), to center the tooltip */
21682165
}
21692166

21702167
.cdeToolTip .cdeToolTipText::after {
21712168
content: " ";
21722169
position: absolute;
2173-
bottom: 100%;
2174-
/* At the top of the tooltip */
2170+
bottom: 100%; /* At the top of the tooltip */
21752171
left: 50%;
21762172
margin-left: -5px;
21772173
border-width: 5px;

src/HTML5/cdeTS/cde/CSS/CDESTYLES.min.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/HTML5/cdeTS/cde/CSS/CDESTYLES.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2009-2020 TRUMPF Laser GmbH, authors: C-Labs
2+
* Copyright (c) 2009-2023 TRUMPF Laser GmbH, authors: C-Labs
33
*
44
* SPDX-License-Identifier: CC0-1.0
55
*/
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
/*
2-
* Copyright (c) 2009-2020 TRUMPF Laser GmbH, authors: C-Labs
1+
/*
2+
* Copyright (c) 2009-2023 TRUMPF Laser GmbH, authors: C-Labs
33
*
44
* SPDX-License-Identifier: CC0-1.0
55
*/
6-
76
div.PlaceHolder {
8-
display: block; }
7+
display: block;
8+
}
9+
10+
.cde-is-selected {
11+
border-width: 3px;
12+
border-style: solid;
13+
border-color: #FF0000;
14+
background: white;
15+
}

0 commit comments

Comments
 (0)