Skip to content

Commit f9f473f

Browse files
Class properties display, sort fix, etc
1 parent c31d0f9 commit f9f473f

File tree

8 files changed

+231
-9
lines changed

8 files changed

+231
-9
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "cache-visual-editor",
33
"printableName": "Cache Visual Editor",
4-
"version": "0.1.0",
4+
"version": "0.1.1",
55
"description": "Visual class editor for InterSystems Caché",
66
"main": "index.js",
77
"keywords": [

source/cache/VisualEditor.REST.Informer.cls

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,116 @@ XData UrlMap
99
</Routes>
1010
}
1111

12+
ClassMethod GetClassData(className As %String) As %ZEN.proxyObject
13+
{
14+
set class = ##class(%Dictionary.ClassDefinition).%OpenId(className)
15+
set cClass = ##class(%Dictionary.CompiledClass).%OpenId(className)
16+
set oClass = ##class(%ZEN.proxyObject).%New()
17+
if ((class = "") || (cClass = "")) return oClass
18+
19+
set oParameters = ##class(%ZEN.proxyObject).%New()
20+
set oProperties = ##class(%ZEN.proxyObject).%New()
21+
set oMethods = ##class(%ZEN.proxyObject).%New()
22+
set oQueries = ##class(%ZEN.proxyObject).%New()
23+
set oIndices = ##class(%ZEN.proxyObject).%New()
24+
set oXDatas = ##class(%ZEN.proxyObject).%New()
25+
26+
set oClass.isDataType = class.ClientDataTypeIsDefined()
27+
set oClass.isOdbcType = class.OdbcTypeIsDefined()
28+
set oClass.isSoapBindingStyle = class.SoapBindingStyleIsDefined()
29+
set oClass.isSoapBodyUse = class.SoapBodyUseIsDefined()
30+
set oClass.isSqlCategory = class.SqlCategoryIsDefined()
31+
32+
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.ClassDefinition")
33+
for j=1:1:props.Properties.Count() {
34+
set pname = props.Properties.GetAt(j).Name
35+
set:((pname '= "parent")
36+
&& ('props.Properties.GetAt(j).Private)
37+
&& ('$IsObject($PROPERTY(class, pname)))) $PROPERTY(oClass, pname) = $PROPERTY(class, pname)
38+
}
39+
if (oClass.TimeChanged) { set oClass.TimeChanged = $zdatetime(oClass.TimeChanged) }
40+
if (oClass.TimeCreated) { set oClass.TimeCreated = $zdatetime(oClass.TimeCreated) }
41+
if ((cClass.ClassType '= "")) {
42+
set oClass.ClassType = cClass.ClassType // set class type from all inherited classes
43+
} else {
44+
set oClass.ClassType = "registered"
45+
}
46+
47+
set oClass.Parameters = oParameters
48+
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.ParameterDefinition")
49+
for i=1:1:class.Parameters.Count() {
50+
set oPar = ##class(%ZEN.proxyObject).%New()
51+
set p = class.Parameters.GetAt(i)
52+
for j=1:1:props.Properties.Count() {
53+
set pname = props.Properties.GetAt(j).Name
54+
set:(pname '= "parent") $PROPERTY(oPar, pname) = $PROPERTY(p, pname)
55+
}
56+
do oParameters.%DispatchSetProperty(p.Name, oPar)
57+
}
58+
59+
set oClass.Properties = oProperties
60+
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.PropertyDefinition")
61+
for i=1:1:class.Properties.Count() {
62+
set oProp = ##class(%ZEN.proxyObject).%New()
63+
set p = class.Properties.GetAt(i)
64+
for j=1:1:props.Properties.Count() {
65+
set pname = props.Properties.GetAt(j).Name
66+
set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(p, pname)
67+
}
68+
do oProperties.%DispatchSetProperty(p.Name, oProp)
69+
}
70+
71+
set oClass.Methods = oMethods
72+
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.MethodDefinition")
73+
for i=1:1:class.Methods.Count() {
74+
set oMeth = ##class(%ZEN.proxyObject).%New()
75+
set met = class.Methods.GetAt(i)
76+
for j=1:1:props.Properties.Count() {
77+
set pname = props.Properties.GetAt(j).Name
78+
set:((pname '= "parent") && (pname '= "Implementation")) $PROPERTY(oMeth, pname) = $PROPERTY(met, pname)
79+
}
80+
do oMethods.%DispatchSetProperty(met.Name, oMeth)
81+
}
82+
83+
set oClass.Queries = oQueries
84+
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.QueryDefinition")
85+
for i=1:1:class.Queries.Count() {
86+
set oProp = ##class(%ZEN.proxyObject).%New()
87+
set q = class.Queries.GetAt(i)
88+
for j=1:1:props.Properties.Count() {
89+
set pname = props.Properties.GetAt(j).Name
90+
set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(q, pname)
91+
}
92+
do oQueries.%DispatchSetProperty(q.Name, oProp)
93+
}
94+
95+
set oClass.XDatas = oXDatas
96+
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.XDataDefinition")
97+
for i=1:1:class.XDatas.Count() {
98+
set oProp = ##class(%ZEN.proxyObject).%New()
99+
set xd = class.XDatas.GetAt(i)
100+
for j=1:1:props.Properties.Count() {
101+
set pname = props.Properties.GetAt(j).Name
102+
set:((pname '= "parent") && (pname '= "Object")) $PROPERTY(oProp, pname) = $PROPERTY(xd, pname)
103+
}
104+
do oXDatas.%DispatchSetProperty(xd.Name, oProp)
105+
}
106+
107+
set oClass.Indices = oIndices
108+
set props = ##class(%Dictionary.ClassDefinition).%OpenId("%Dictionary.IndexDefinition")
109+
for i=1:1:class.Indices.Count() {
110+
set oProp = ##class(%ZEN.proxyObject).%New()
111+
set ind = class.Indices.GetAt(i)
112+
for j=1:1:props.Properties.Count() {
113+
set pname = props.Properties.GetAt(j).Name
114+
set:(pname '= "parent") $PROPERTY(oProp, pname) = $PROPERTY(ind, pname)
115+
}
116+
do oIndices.%DispatchSetProperty(ind.Name, oProp)
117+
}
118+
119+
return oClass
120+
}
121+
12122
ClassMethod List() As %Status
13123
{
14124
set baseLevel = $case(%request.Get("level"), "":"", :%request.Get("level") _ ".")
@@ -32,7 +142,7 @@ ClassMethod List() As %Status
32142
set $PROPERTY(data, folderName) = oFolder
33143
} elseif ($LENGTH(clsName, ".") = $LENGTH(baseLevel, ".")) {
34144
set className = $PIECE(clsName, ".", $LENGTH(baseLevel, "."))
35-
set oClass = ##class(%ZEN.proxyObject).%New()
145+
set oClass = ..GetClassData(clsName)
36146
set $PROPERTY(oClass, "_type") = "class"
37147
set $PROPERTY(oClass, "fullName") = clsName
38148
set $PROPERTY(oClass, "name") = className

source/client/js/classEditor/card.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
11
import { loadLevel } from "./index";
22

3-
function block (className) {
4-
let el = document.createElement("div");
3+
function block (className, element = "div") {
4+
let el = document.createElement(element);
55
el.className = className;
66
return el;
77
}
88

9+
function getContainer (prop) {
10+
let item = block(`item`),
11+
icon = block(`icon public`),
12+
text = block(`label`, `span`);
13+
item.appendChild(icon);
14+
text.textContent = `${ prop["Name"] }: ${ prop["Type"] }`;
15+
item.appendChild(text);
16+
return item;
17+
}
18+
919
/**
1020
* This function returns card element that may be applied to the grid.
1121
* @param {*} data
@@ -14,14 +24,29 @@ function block (className) {
1424
export function getCardElement (data) {
1525
let card = block(`card ${ data["_type"] }`),
1626
head = block(`head`),
17-
headIcon = block(`icon ${ data["ClassType"] || "" }`),
27+
headIcon = block(`cardIcon ${ data["ClassType"] || "" }`),
1828
header = block(`header`);
1929

2030
header.textContent = data["name"];
2131
head.appendChild(headIcon);
2232
head.appendChild(header);
2333
card.appendChild(head);
2434

35+
let section, body;
36+
for (let prop in data["Properties"]) {
37+
section = block(`section`);
38+
header = block(`header`);
39+
header.textContent = "Properties";
40+
body = block(`body`);
41+
section.appendChild(header);
42+
section.appendChild(body);
43+
card.appendChild(section);
44+
break;
45+
}
46+
for (let prop in data["Properties"]) {
47+
section.appendChild(getContainer(data["Properties"][prop]));
48+
}
49+
2550
if (data["_type"] === "package") {
2651
card.addEventListener("click", () => {
2752
loadLevel(data["fullName"]);

source/client/js/classEditor/index.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,29 @@ var PATH = "";
99
*/
1010
let grid = null;
1111

12-
export function loadLevel (level) {
12+
function orderData (data) {
13+
var sortable = [],
14+
sorted = {};
15+
for (var property in data)
16+
sortable.push([property, data[property]]);
17+
sortable.sort(([p1, d1], [p2, d2]) => {
18+
if (d1["_type"] === "package" && d2["_type"] !== "package") return -1;
19+
if (d2["_type"] === "package" && d1["_type"] !== "package") return 1;
20+
if (d1["ClassType"] !== d2["ClassType"]) return d1["ClassType"] > d2["ClassType"] ? 1 : -1;
21+
if (p1[0] === "%" && p2[0] !== "%") return -1;
22+
if (p2[0] === "%" && p1[0] !== "%") return 1;
23+
if (p1[0] === "%" && p2[0] === "%") return p1.substr(1) > p2.substr(1) ? 1 : -1;
24+
return p1 > p2 ? 1 : -1;
25+
});
26+
sortable.forEach(([p, v]) => sorted[p] = v);
27+
return sorted;
28+
}
1329

30+
export function loadLevel (level) {
1431
PATH = level;
1532
grid.clear();
1633
getList("SAMPLES", PATH, (data) => {
34+
data = orderData(data);
1735
for (let obj in data) {
1836
grid.applyChild(getCardElement(data[obj]));
1937
}

source/client/scss/basic.scss

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1+
@import "const";
2+
13
html, body {
4+
margin: 0;
25
background: #eee;
36
font-family: Verdana, Geneva, sans-serif;
47
font-size: 18px;
8+
}
9+
10+
body {
11+
margin: $defaultMargin;
512
}

source/client/scss/classBuilder/card.scss

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ $headerIconWidth: 32px;
2121
}
2222

2323
> .head {
24-
> .icon {
24+
> .cardIcon {
2525
border: 1px solid black;
2626
}
2727
}
@@ -32,7 +32,7 @@ $headerIconWidth: 32px;
3232

3333
overflow: hidden;
3434

35-
> .icon {
35+
> .cardIcon {
3636

3737
position: relative;
3838
float: left;
@@ -74,6 +74,34 @@ $headerIconWidth: 32px;
7474
}
7575
}
7676

77+
&.view {
78+
background: #e6f;
79+
&:before {
80+
content: "V"
81+
}
82+
}
83+
84+
&.datatype {
85+
background: #7cf;
86+
&:before {
87+
content: "T"
88+
}
89+
}
90+
91+
&.stream {
92+
background: #0f8;
93+
&:before {
94+
content: "s"
95+
}
96+
}
97+
98+
&.donotuse {
99+
background: #f00;
100+
&:before {
101+
content: "X"
102+
}
103+
}
104+
77105
}
78106

79107
> .header {
@@ -89,4 +117,25 @@ $headerIconWidth: 32px;
89117

90118
}
91119

120+
> .section {
121+
122+
position: relative;
123+
124+
> .header {
125+
font-size: 18px;
126+
color: gray;
127+
font-weight: bold;
128+
text-decoration: underline;
129+
}
130+
131+
> .body {
132+
133+
> .item {
134+
135+
}
136+
137+
}
138+
139+
}
140+
92141
}

source/client/scss/icons.scss

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
.icon {
2+
display: inline-block;
3+
vertical-align: middle;
4+
margin: 2px;
5+
width: 18px;
6+
height: 18px;
7+
}
8+
9+
.icon.public {
10+
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAgVBMVEUAAACm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14Wm14X7TPrzAAAAKnRSTlMA1j0u0koqj0UyFPTlJt46CuvMuDakIPDa0IR6d8bDs6yJfXFgVL2YWGdryPEzAAABw0lEQVRYw9WX2XaDIBBAte5L3KMmmmgSs83/f2DbQLUNRAY8pz29jwI3MDBD0L5jD4d1nvfXxvI1efzWhJGgO8uObyr4SebKDC8zYHHw470AeOTY8SsgKBtCIKiuYg0j6WV97TcwEWMCMPburISE9DTOKUIIdkC5T9+ScVbi82AD5cZdly4UOEA4PH1PgWAgt6B6/n6jgq1gvDFtGH8KO4HgTgXFq7UFCSoEKdtypmpvXtCTXpfXi7PmBTnpdeUUCCoY5gV7dhMpCY3iCXEO+ZsVkaZmXkAryZHTpFO3siCkJ0RZUFgPVvMCWopbTQxe4NteUcRx/PaKOC68r4nVTKjjPgAMkeOTlHkK9RHQVO7n71nuB1apUU6AhZ8nJUiRciq0HAOTQJJ0TApLsmEuOUnMPxfovyYIkAKbP7o1/MJRF4TknFvKAntMEzVBPrZWaoJmugLUBNulgkywBHEyueM9rCgIyNU/gKoAInJIFwqMBYKaNGHS2ePP4D8JmF7TH7XzAgFcfM0L+VUZJ4DARJZ1e+m9UCqWdfWrrcY+n9DPsoOkgHmdJoCH/xZwQYIw0TgGfBj2/Ed+0ma1LqQ2u8cr7R2alVquL2OXZgAAAABJRU5ErkJggg==');
11+
background-size: 100% 100%;
12+
}

source/client/scss/index.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55

66
@import "basic";
77
@import "grid/cards";
8-
@import "classBuilder/card";
8+
@import "classBuilder/card";
9+
@import "icons";

0 commit comments

Comments
 (0)