Skip to content

Commit 417fbfe

Browse files
class view of whole package feature
1 parent c974c7d commit 417fbfe

File tree

7 files changed

+190
-42
lines changed

7 files changed

+190
-42
lines changed

cache/projectTemplate.xml

Lines changed: 84 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,55 @@
44
<Class name="UMLExplorer.ClassView">
55
<Description>
66
Class contains methods that return structured class data.</Description>
7-
<TimeChanged>63667,81331.819092</TimeChanged>
7+
<TimeChanged>63668,773.59952</TimeChanged>
88
<TimeCreated>63653,67019.989197</TimeCreated>
99

10+
<Method name="getClassTree">
11+
<ClassMethod>1</ClassMethod>
12+
<ReturnType>%ZEN.proxyObject</ReturnType>
13+
<Implementation><![CDATA[
14+
set resp = ##class(%ZEN.proxyObject).%New()
15+
16+
set classes = ##class(%ResultSet).%New("%Dictionary.ClassDefinition:Summary")
17+
set objects = ##class(%Library.ArrayOfObjects).%New()
18+
set lastParts = $LB()
19+
20+
set level = 1
21+
do objects.SetAt(resp, level)
22+
23+
do classes.Execute()
24+
while (classes.Next()) {
25+
set name = classes.Data("Name")
26+
set parts = $LISTFROMSTRING(name, ".")
27+
set i = 0
28+
while (i < $LISTLENGTH(parts)) && ($LISTGET(lastParts, i + 1) = $LISTGET(parts, i + 1)) {
29+
set i = i + 1
30+
}
31+
set level = i + 1
32+
set resp = objects.GetAt(level)
33+
while ($LISTLENGTH(parts) > level) {
34+
set level = level + 1
35+
set resp = ##class(%ZEN.proxyObject).%New()
36+
do objects.GetAt(level - 1).%DispatchSetProperty($LISTGET(parts, level - 1), resp)
37+
do objects.SetAt(resp, level)
38+
}
39+
if ($LISTLENGTH(parts) = level) {
40+
do resp.%DispatchSetProperty($LISTGET(parts, level), classes.Data("Hidden"))
41+
}
42+
set lastParts = parts
43+
}
44+
45+
quit objects.GetAt(1)
46+
]]></Implementation>
47+
</Method>
48+
1049
<Method name="getClassData">
1150
<ClassMethod>1</ClassMethod>
1251
<FormalSpec>classDefinition:%Dictionary.ClassDefinition</FormalSpec>
1352
<ReturnType>%ZEN.proxyObject</ReturnType>
1453
<Implementation><![CDATA[
1554
set oClass = ##class(%ZEN.proxyObject).%New()
1655
17-
1856
set oProperties = ##class(%ZEN.proxyObject).%New()
1957
set oClass.super = classDefinition.Super
2058
set oClass.properties = oProperties
@@ -105,13 +143,39 @@ Class contains methods that return structured class data.</Description>
105143
quit oData
106144
]]></Implementation>
107145
</Method>
146+
147+
<Method name="getPackageView">
148+
<ClassMethod>1</ClassMethod>
149+
<FormalSpec>rootPackageName:%String</FormalSpec>
150+
<ReturnType>%ZEN.proxyObject</ReturnType>
151+
<Implementation><![CDATA[
152+
set oData = ##class(%ZEN.proxyObject).%New()
153+
set oData.classes = ##class(%ZEN.proxyObject).%New()
154+
set oData.inheritance = ##class(%ZEN.proxyObject).%New()
155+
156+
set classes = ##class(%ResultSet).%New("%Dictionary.ClassDefinition:Summary")
157+
do classes.Execute()
158+
set listLen = $LISTLENGTH($LISTFROMSTRING(rootPackageName, "."))
159+
while (classes.Next()) {
160+
set className = classes.Data("Name")
161+
set packageName = $LISTTOSTRING($LIST($LISTFROMSTRING(className, "."), 1, listLen), ".")
162+
if (packageName = rootPackageName) {
163+
set classDef = ##class(%Dictionary.ClassDefinition).%OpenId(className)
164+
do oData.classes.%DispatchSetProperty(classDef.Name, ..getClassData(classDef))
165+
do ..collectInheritance(oData, classDef)
166+
}
167+
}
168+
169+
quit oData
170+
]]></Implementation>
171+
</Method>
108172
</Class>
109173

110174

111-
<Project name="UMLExplorer" LastModified="2015-04-12 19:03:12.221887">
175+
<Project name="UMLExplorer" LastModified="2015-04-25 15:46:50.605954">
112176
<Items>
113-
<ProjectItem name="UMLExplorer.Router" type="CLS"></ProjectItem>
114177
<ProjectItem name="UMLExplorer.ClassView" type="CLS"></ProjectItem>
178+
<ProjectItem name="UMLExplorer.Router" type="CLS"></ProjectItem>
115179
<ProjectItem name="UMLExplorer.StaticContent" type="CLS"></ProjectItem>
116180
</Items>
117181
</Project>
@@ -121,7 +185,7 @@ Class contains methods that return structured class data.</Description>
121185
<Description>
122186
REST interface for UMLExplorer</Description>
123187
<Super>%CSP.REST</Super>
124-
<TimeChanged>63663,76166.562046</TimeChanged>
188+
<TimeChanged>63667,85509.960346</TimeChanged>
125189
<TimeCreated>63648,30450.187229</TimeCreated>
126190

127191
<XData name="UrlMap">
@@ -134,6 +198,7 @@ REST interface for UMLExplorer</Description>
134198
<Route Url="/Test" Method="GET" Call="Test"/>
135199
<Route Url="/GetClassTree" Method="GET" Call="GetClassTree"/>
136200
<Route Url="/GetClassView/:ClassName" Method="GET" Call="GetClassView"/>
201+
<Route Url="/GetPackageView/:PackageName" Method="GET" Call="GetPackageView"/>
137202
</Routes>
138203
]]></Data>
139204
</XData>
@@ -144,37 +209,7 @@ Method returns whole class tree visible in the current namespace.</Description>
144209
<ClassMethod>1</ClassMethod>
145210
<ReturnType>%Status</ReturnType>
146211
<Implementation><![CDATA[
147-
set resp = ##class(%ZEN.proxyObject).%New()
148-
set classes = ##class(%ResultSet).%New("%Dictionary.ClassDefinition:Summary")
149-
set objects = ##class(%Library.ArrayOfObjects).%New()
150-
set lastParts = $LB()
151-
152-
set level = 1
153-
do objects.SetAt(resp, level)
154-
155-
do classes.Execute()
156-
While (classes.Next()) {
157-
set name = classes.Data("Name")
158-
set parts = $LISTFROMSTRING(name, ".")
159-
set i = 0
160-
while (i < $LISTLENGTH(parts)) && ($LISTGET(lastParts, i + 1) = $LISTGET(parts, i + 1)) {
161-
set i = i + 1
162-
}
163-
set level = i + 1
164-
set resp = objects.GetAt(level)
165-
while ($LISTLENGTH(parts) > level) {
166-
set level = level + 1
167-
set resp = ##class(%ZEN.proxyObject).%New()
168-
do objects.GetAt(level - 1).%DispatchSetProperty($LISTGET(parts, level - 1), resp)
169-
do objects.SetAt(resp, level)
170-
}
171-
if ($LISTLENGTH(parts) = level) {
172-
do resp.%DispatchSetProperty($LISTGET(parts, level), classes.Data("Hidden"))
173-
}
174-
set lastParts = parts
175-
}
176-
177-
do objects.GetAt(1).%ToJSON(, "ou")
212+
do ##class(UMLExplorer.ClassView).getClassTree().%ToJSON(, "ou")
178213
return $$$OK
179214
]]></Implementation>
180215
</Method>
@@ -194,6 +229,19 @@ Returns classTree by given class name</Description>
194229
]]></Implementation>
195230
</Method>
196231

232+
<Method name="GetPackageView">
233+
<Description>
234+
Returns all package class trees by given package name</Description>
235+
<ClassMethod>1</ClassMethod>
236+
<FormalSpec>packageName:%String</FormalSpec>
237+
<ReturnType>%Status</ReturnType>
238+
<Implementation><![CDATA[
239+
set classData = ##class(UMLExplorer.ClassView).getPackageView(packageName)
240+
do classData.%ToJSON(, "ou")
241+
return $$$OK
242+
]]></Implementation>
243+
</Method>
244+
197245
<Method name="Test">
198246
<Description>
199247
Method to test accessibility of REST interface.</Description>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "CacheUMLExplorer",
3-
"version": "0.2.0",
3+
"version": "0.3.0",
44
"description": "An UML Class explorer for InterSystems Caché",
55
"directories": {
66
"test": "test"

web/css/extras.css

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,44 @@
128128
width: 100%;
129129
top: 6px;
130130
left: 0;
131+
}
132+
133+
.icon.list {
134+
position: relative;
135+
width: 30px;
136+
height: 20px;
137+
background-color: transparent;
138+
}
139+
140+
.icon.list:before {
141+
content: "";
142+
top: 8px;
143+
width: 18px;
144+
height: 4px;
145+
left: 8px;
146+
box-shadow: inset 0 0 0 32px black, 0 -7px 0 0 black, 0 7px 0 0 black;
147+
position: absolute;
148+
}
149+
150+
.icon.list:after {
151+
content: "";
152+
left: 0;
153+
top: 8px;
154+
width: 4px;
155+
height: 4px;
156+
box-shadow: inset 0 0 0 32px black, 0 -7px 0 0 black, 0 7px 0 0 black;
157+
position: absolute;
158+
-webkit-transition: all .2s ease;
159+
-moz-transition: all .2s ease;
160+
-o-transition: all .2s ease;
161+
transition: all .2s ease;
162+
}
163+
164+
.icon.list:hover {
165+
box-shadow: none;
166+
}
167+
168+
.icon.list:hover:after {
169+
left: 4px;
170+
box-shadow: inset 0 0 0 32px #ffcc1b, 0 -7px 0 0 #ffcc1b, 0 7px 0 0 #ffcc1b;
131171
}

web/css/treeView.css

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
}
1717

1818
.tv-class-name, .tv-package-name {
19+
position: relative;
1920
padding: 3px;
2021
cursor: pointer;
2122
border-radius: 5px;
@@ -100,4 +101,15 @@
100101

101102
.tv-package .tv-package-content {
102103
padding-left: 20px;
104+
}
105+
106+
.tv-rightListIcon {
107+
position: absolute !important;
108+
top: 3px;
109+
opacity: 0;
110+
right: 0;
111+
}
112+
113+
.tv-package-name:hover .tv-rightListIcon {
114+
opacity: 1;
103115
}

web/js/ClassTree.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ ClassTree.prototype.removeLoader = function () {
3434

3535
ClassTree.prototype.classSelected = function (element, className) {
3636

37-
var self = this;
38-
3937
this.SELECTED_CLASS_NAME = className;
4038

4139
if (element !== this.SELECTED_ELEMENT) {
@@ -52,6 +50,22 @@ ClassTree.prototype.classSelected = function (element, className) {
5250

5351
};
5452

53+
ClassTree.prototype.packageSelected = function (element, packageName) {
54+
55+
if (element !== this.SELECTED_ELEMENT) {
56+
if (this.SELECTED_ELEMENT) this.SELECTED_ELEMENT.classList.remove("selected");
57+
this.SELECTED_ELEMENT = element;
58+
}
59+
60+
if (!element.classList.contains("selected")) {
61+
element.classList.add("selected");
62+
this.cacheUMLExplorer.classView.loadPackage(packageName);
63+
}
64+
65+
this.cacheUMLExplorer.elements.className.textContent = packageName;
66+
67+
};
68+
5569
ClassTree.prototype.updateTree = function (treeObject) {
5670

5771
var self = this,
@@ -80,14 +94,19 @@ ClassTree.prototype.updateTree = function (treeObject) {
8094
var append = function (rootElement, elementName, isPackage, path) {
8195

8296
var el1 = div(),
83-
el2, el3;
97+
el2, el3, el4;
8498

8599
if (isPackage) {
86100
el1.className = "tv-package";
87101
(el2 = div()).className = "tv-package-name minimized"; el2.textContent = elementName;
88102
(el3 = div()).className = "tv-package-content";
89103
el1.appendChild(el2); el1.appendChild(el3);
90104
el2.addEventListener("click", packageClick);
105+
el2.appendChild(el4 = div());
106+
el4.className = "tv-rightListIcon icon list";
107+
el4.addEventListener("click", function () {
108+
self.packageSelected(el1, (path ? path + "." : path) + elementName);
109+
});
91110
} else {
92111
el1.className = "tv-class-name";
93112
el1.textContent = elementName;

web/js/ClassView.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ ClassView.prototype.render = function (data) {
132132
}
133133

134134
for (p in data["inheritance"]) {
135-
relFrom = classes[p].instance;
135+
relFrom = (classes[p] || {}).instance;
136136
for (pp in data["inheritance"][p]) {
137137
relTo = (classes[pp] || {}).instance;
138138
if (relFrom && relTo) {
@@ -173,7 +173,25 @@ ClassView.prototype.loadClass = function (className) {
173173
self.removeLoader();
174174
if (err) {
175175
self.showLoader("Unable to get " + self.cacheUMLExplorer.classTree.SELECTED_CLASS_NAME);
176-
console.error(err);
176+
console.error.call(console, err);
177+
} else {
178+
self.cacheUMLExplorer.classView.render(data);
179+
}
180+
});
181+
182+
};
183+
184+
ClassView.prototype.loadPackage = function (packageName) {
185+
186+
var self = this;
187+
188+
this.showLoader();
189+
this.cacheUMLExplorer.source.getPackageView(packageName, function (err, data) {
190+
//console.log(data);
191+
self.removeLoader();
192+
if (err) {
193+
self.showLoader("Unable to get package " + packageName);
194+
console.error.call(console, err);
177195
} else {
178196
self.cacheUMLExplorer.classView.render(data);
179197
}

web/js/Source.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ Source.prototype.getClassView = function (className, callback) {
2626

2727
};
2828

29+
/**
30+
* Return class view.
31+
* @param {string} packageName
32+
* @param {Source~dataCallback} callback
33+
*/
34+
Source.prototype.getPackageView = function (packageName, callback) {
35+
36+
lib.load(this.URL + "/GetPackageView/" + encodeURIComponent(packageName), null, callback);
37+
38+
};
39+
2940
/**
3041
* This callback handles data received directly from server.
3142
* @callback Source~dataCallback

0 commit comments

Comments
 (0)