Skip to content

Commit 92d391c

Browse files
committed
Fixed label placement controls
1 parent f078712 commit 92d391c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+209
-97
lines changed

server/kite9-server-java/src/main/java/com/kite9/server/persistence/github/AbstractGithubEntityConverter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public String getTitle() {
5151

5252
@Override
5353
public String getIcon() {
54-
return "/github/kite9-org/kite9/templates/admin/icons/github.png?v=v0.14";
54+
return "/github/kite9-org/kite9/templates/admin/icons/github.png?v=v0.15";
5555
}
5656

5757
@Override
@@ -89,7 +89,7 @@ public String getTitle() {
8989

9090
@Override
9191
public String getIcon() {
92-
return "/github/kite9-org/kite9/templates/admin/icons/github.png?v=v0.14";
92+
return "/github/kite9-org/kite9/templates/admin/icons/github.png?v=v0.15";
9393
}
9494

9595
@Override
@@ -281,9 +281,9 @@ private String getIconUrl(Link l, GHContent c) {
281281
if (fs.getFormatFor(c.getName()) instanceof DiagramFileFormat) {
282282
return l.getHref();
283283
} else if (hasIcon(c.getName())) {
284-
return "/github/kite9-org/kite9/templates/admin/icons/"+getExtension(c.getName())+".svg?v=v0.14";
284+
return "/github/kite9-org/kite9/templates/admin/icons/"+getExtension(c.getName())+".svg?v=v0.15";
285285
} else {
286-
return "/github/kite9-org/kite9/templates/admin/icons/unknown.svg?v=v0.14";
286+
return "/github/kite9-org/kite9/templates/admin/icons/unknown.svg?v=v0.15";
287287
}
288288
}
289289

server/kite9-server-java/src/main/java/com/kite9/server/persistence/local/AbstractPublicEntityConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ private String getExtension(String name) {
121121
@Override
122122
public String getIcon() {
123123
if (hasIcon(d.getFilename())) {
124-
return "/github/kite9-org/kite9/templates/admin/icons/"+getExtension(d.getFilename())+".svg?v=v0.14";
124+
return "/github/kite9-org/kite9/templates/admin/icons/"+getExtension(d.getFilename())+".svg?v=v0.15";
125125
} else {
126-
return "/github/kite9-org/kite9/templates/admin/icons/unknown.svg?v=v0.14";
126+
return "/github/kite9-org/kite9/templates/admin/icons/unknown.svg?v=v0.15";
127127
}
128128
}
129129

server/kite9-server-java/src/main/java/com/kite9/server/web/HateoasADLHttpMessageWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ protected Document generateRestXML(RepresentationModel<?> t) throws XMLStreamExc
171171
}
172172

173173
private void handleTemplateNaming(Document out) {
174-
out.getDocumentElement().setAttributeNS(Kite9Namespaces.XSL_TEMPLATE_NAMESPACE, "xslt:template", "/github/kite9-org/kite9/templates/admin/admin-template.xsl?v=v0.14");
174+
out.getDocumentElement().setAttributeNS(Kite9Namespaces.XSL_TEMPLATE_NAMESPACE, "xslt:template", "/github/kite9-org/kite9/templates/admin/admin-template.xsl?v=v0.15");
175175
}
176176

177177
/**

server/kite9-server-java/src/main/resources/page-template.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<meta property="og:title" content="Kite9 Diagrams" />
99
<meta property="og:description"
1010
content="Kite9 draws diagrams, automatically. UML, Risk-First, Templated, SVG, Flow-Charts, System Diagrams." />
11-
<meta property="og:image" content="https://www.kite9.org/github/kite9-org/kite9/templates/admin/kite9-preview.png?v=v0.14" />
11+
<meta property="og:image" content="https://www.kite9.org/github/kite9-org/kite9/templates/admin/kite9-preview.png?v=v0.15" />
1212
<meta property="og:image:type" content="image/png" />
1313
<meta property="og:image:width" content="718" />
1414
<meta property="og:image:height" content="372" />
@@ -18,7 +18,7 @@
1818
<meta property="twitter:title" content="Kite9" />
1919
<meta property="twitter:description"
2020
content="Kite9 draws diagrams, automatically. UML, Risk-First, Templated, SVG, Flow-Charts, System Diagrams." />
21-
<meta property="twitter:image:src" content="https://www.kite9.org/github/kite9-org/kite9/templates/admin/kite9-preview.png?v=v0.14" />
21+
<meta property="twitter:image:src" content="https://www.kite9.org/github/kite9-org/kite9/templates/admin/kite9-preview.png?v=v0.15" />
2222
<meta property="twitter:image:width" content="718" />
2323
<meta property="twitter:image:height" content="372" />
2424
<meta charset="UTF-8" />

server/kite9-server-java/src/main/resources/static/public/behaviours/labels/add/labels-add.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ export function createInsertLabelStep(e, templateUri, command) {
1111
const info = parseInfo(e);
1212
const end = info.end;
1313
const linkId = info.terminates ? info.terminates : e.getAttribute("id");
14+
const customLabel = e.getAttribute("k9-label");
1415
const newId = createUniqueId();
16+
const labelUri = customLabel ? customLabel : templateUri;
1517

1618
command.push({
1719
"type": 'InsertUrl',
1820
"fragmentId": linkId,
19-
"uriStr": templateUri,
21+
"uriStr": labelUri,
2022
"newId" : newId,
2123
});
2224

Lines changed: 81 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,101 @@
11
import { getMainSvg } from '/public/bundles/screen.js'
2+
import { parseStyle } from '/public/bundles/css.js'
23
import { hasLastSelected, parseInfo, getContainingDiagram, reverseDirection, createUniqueId } from '/public/bundles/api.js'
34

5+
const PLACEMENTS = [ "top-left", "top", "top-right", "left", "none", "right", "bottom-left", "bottom", "bottom-right" ];
6+
const STYLE_NAME = '--kite9-label-placement'
47

5-
export function labelableSelector() {
6-
const labelables = Array.from(getMainSvg().querySelectorAll("[k9-ui~=label].selected"));
7-
return labelables;
8+
function getPlacement(command, e) {
9+
const adlElement = command.getADLDom(e.getAttribute("id"));
10+
var style = parseStyle(adlElement.getAttribute("style"));
11+
var l = style[STYLE_NAME];
12+
return l;
813
}
914

10-
export function createPlaceLabelStep(e, templateUri, command) {
11-
const info = parseInfo(e);
12-
const end = info.end;
13-
const linkId = info.terminates ? info.terminates : e.getAttribute("id");
14-
const newId = createUniqueId();
15+
function drawPlacement(event, cm, placement, selected) {
16+
if (placement == null) {
17+
placement = "none";
18+
}
1519

16-
command.push({
17-
"type": 'InsertUrl',
18-
"fragmentId": linkId,
19-
"uriStr": templateUri,
20-
"newId" : newId,
21-
});
20+
var out = cm.addControl(event, "/public/behaviours/labels/place/" + placement.toLowerCase().replace("_","-") + ".svg",
21+
"placement (" + placement + ")",
22+
undefined);
2223

23-
if (end) {
24-
command.push({
25-
"type": "ReplaceAttr",
26-
"fragmentId": newId,
27-
"name": "end",
28-
"to" : end,
29-
"from" : e.getAttribute("end")
30-
});
24+
var img = out.children[0];
25+
26+
if (selected == placement) {
27+
img.setAttribute("class", "selected");
3128
}
29+
30+
return img;
3231
}
3332

3433

35-
export function initPlaceLabelContextMenuCallback(command, templateUri, selector, action) {
34+
export function initPlaceLabelContextMenuCallback(placementProperty, command, selector) {
3635

3736
if (selector == undefined) {
38-
selector = labelableSelector;
39-
}
40-
41-
if (action == undefined) {
42-
action = createInsertLabelStep;
37+
selector = function () {
38+
return getMainSvg().querySelectorAll("[id][k9-ui~=place].selected");
39+
}
4340
}
4441

4542
/**
46-
* Provides a label option for the context menu
43+
* Provides a placement option for the context menu
4744
*/
48-
return function(event, contextMenu) {
49-
50-
const selectedElements = hasLastSelected(selector());
51-
52-
if (selectedElements.length > 0) {
53-
contextMenu.addControl(event, "/public/behaviours/labels/place/place.svg", "Add Label",
54-
function(e2, selector) {
55-
contextMenu.destroy();
56-
selectedElements.forEach(e => action(e, templateUri, command));
57-
command.perform();
58-
}
59-
)
45+
return function (event, contextMenu) {
46+
47+
const e = hasLastSelected(selector());
48+
49+
if (e.length> 0) {
50+
const ls = hasLastSelected(e, true);
51+
const placement = getPlacement(command, ls);
52+
var img = drawPlacement(event, contextMenu, placement);
53+
54+
img.addEventListener("click", formEvent => {
55+
contextMenu.clear();
56+
placementProperty.populateForm(formEvent, contextMenu, e);
57+
});
6058
}
59+
};
60+
}
61+
62+
export function initLabelPlacementPropertyFormCallback(command) {
63+
64+
return function(propertyOwner, contextEvent, contextMenu, selectedElements) {
65+
const ls = hasLastSelected(selectedElements, true);
66+
const placement = getPlacement(command, ls);
67+
68+
PLACEMENTS.forEach(s => {
69+
var img2 = drawPlacement(event, contextMenu, s, placement);
70+
if (placement != s) {
71+
img2.setAttribute("title", s);
72+
img2.addEventListener("click", (formEvent) => propertyOwner.setProperty(contextEvent, formEvent, contextMenu, selectedElements));
73+
}
74+
});
75+
}
76+
}
77+
78+
export function initLabelPlacementPropertySetCallback(command) {
79+
80+
return function(propertyOwner, contextEvent, formEvent, contextMenu, selectedElements) {
81+
82+
const placement = formEvent.currentTarget.getAttribute("title");
83+
selectedElements.forEach(e => {
84+
85+
const existing = getPlacement(command, e);
86+
const id = e.getAttribute("id");
87+
88+
if (PLACEMENTS.includes(placement)) {
89+
command.push({
90+
fragmentId: id,
91+
type: 'ReplaceStyle',
92+
name: STYLE_NAME,
93+
to: placement,
94+
from: getPlacement(command, e)
95+
});
96+
}
97+
});
98+
6199
}
62-
}
100+
}
101+
Lines changed: 5 additions & 0 deletions
Loading

server/kite9-server-java/src/main/resources/static/public/behaviours/updatable/adlResolver.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export function createAdlToSVGResolver(transition, command, metadata) {
66

77
const XSL_TEMPLATE_NAMESPACE = "http://www.kite9.org/schema/xslt";
88
const ADL_NAMESPACE = "http://www.kite9.org/schema/adl";
9-
const DEFAULT_TEMPLATE = "/github/kite9-org/kite9/templates/basic/basic-template.xsl?v=v0.14";
9+
const DEFAULT_TEMPLATE = "/github/kite9-org/kite9/templates/basic/basic-template.xsl?v=v0.15";
1010
const META_NAMESPACE = "http://www.kite9.org/schema/metadata";
1111

1212

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/** From: https://github.com/joshwnj/style-attr */
2+
3+
export function parseStyle(raw, opts) {
4+
opts = opts || {}
5+
raw = raw || ""
6+
7+
var preserveNumbers = opts.preserveNumbers;
8+
var trim = function (s) { return s.trim(); };
9+
var obj = {};
10+
11+
getKeyValueChunks(raw)
12+
.map(trim)
13+
.filter(Boolean)
14+
.forEach(function (item) {
15+
// split with `.indexOf` rather than `.split` because the value may also contain colons.
16+
var pos = item.indexOf(':');
17+
var key = item.substr(0, pos).trim();
18+
var val = item.substr(pos + 1).trim();
19+
if (preserveNumbers && isNumeric(val)) {
20+
val = Number(val);
21+
}
22+
23+
obj[key] = val;
24+
});
25+
26+
return obj;
27+
}
28+
29+
function isNumeric(n) {
30+
return !isNaN(parseFloat(n)) && isFinite(n);
31+
}
32+
33+
function getKeyValueChunks(raw) {
34+
var chunks = [];
35+
var offset = 0;
36+
var sep = ';';
37+
var hasUnclosedUrl = /url\([^\)]+$/;
38+
var chunk = '';
39+
var nextSplit;
40+
while (offset < raw.length) {
41+
nextSplit = raw.indexOf(sep, offset);
42+
if (nextSplit === -1) { nextSplit = raw.length; }
43+
44+
chunk += raw.substring(offset, nextSplit);
45+
46+
// data URIs can contain semicolons, so make sure we get the whole thing
47+
if (hasUnclosedUrl.test(chunk)) {
48+
chunk += ';';
49+
offset = nextSplit + 1;
50+
continue;
51+
}
52+
53+
chunks.push(chunk);
54+
chunk = '';
55+
offset = nextSplit + 1;
56+
}
57+
58+
return chunks;
59+
}

server/kite9-server-java/src/main/resources/static/public/examples/basic.adl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<diagram xslt:template="/github/kite9-org/kite9/templates/basic/basic-template.xsl?v=v0.14"
1+
<diagram xslt:template="/github/kite9-org/kite9/templates/basic/basic-template.xsl?v=v0.15"
22
xmlns="http://www.kite9.org/schema/adl"
33
xmlns:xslt="http://www.kite9.org/schema/xslt" id="dia">
44

@@ -7,6 +7,7 @@
77
<container id="bigbox" layout="horizontal" style="fill: green; fill-opacity: 0.8; ">
88
<box id="b2" ><textarea id="t2">,</textarea></box>
99
<box id="b3" ><textarea id="t3">b3 line</textarea></box>
10+
<label id="l1">Box title</label>
1011
</container>
1112

1213
<link id="link1" r="r">

server/kite9-server-java/src/main/resources/static/public/examples/formats.adl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
<svg:defs>
66
<svg:style type="text/css">
7-
@import url('/github/kite9-org/kite9/templates/formats/formats-textures.css?v=v0.14');
7+
@import url('/github/kite9-org/kite9/templates/formats/formats-textures.css?v=v0.15');
88
</svg:style>
99
</svg:defs>
1010

server/kite9-server-java/src/main/resources/static/public/templates/editor/editor.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,10 @@ import { command, metadata, transition, instrumentation, dragger, contextMenu, p
4242

4343
const
4444
containment = new Containment(),
45-
layout = new Property("layout");
45+
layout = new Property("layout"),
46+
placement = new Property("placement");
4647

47-
export { command, metadata, transition, instrumentation, dragger, contextMenu, containment, palette, layout };
48+
export { command, metadata, transition, instrumentation, dragger, contextMenu, containment, palette, layout, placement };
4849

4950
function initEditor() {
5051

@@ -54,7 +55,9 @@ function initEditor() {
5455

5556
if (metadata.isEditor()) {
5657
command.add(initUndoableCommandCallback(command));
58+
5759
layout.setCallback(() => command.perform());
60+
placement.setCallback(() => command.perform());
5861

5962
dragger.dropWith(initCompleteDragable(command));
6063
dragger.dragLocator(initDragableDragLocator());

server/kite9-server-java/src/main/resources/static/public/templates/labels/labels-components.xsl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@
1010
<xsl:param name="text"><text><xsl:value-of select="text()" /></text></xsl:param>
1111
<xsl:call-template name="formats-text-shape-inline">
1212
<xsl:with-param name="k9-texture">none</xsl:with-param>
13-
<xsl:with-param name="k9-highlight"></xsl:with-param>
1413
<xsl:with-param name="k9-elem">label</xsl:with-param>
15-
<xsl:with-param name="k9-contains" />
1614
<xsl:with-param name="k9-palette">label</xsl:with-param>
17-
<xsl:with-param name="k9-ui">delete edit xml</xsl:with-param>
15+
<xsl:with-param name="k9-ui">delete edit xml place</xsl:with-param>
1816
</xsl:call-template>
1917

2018
</xsl:template>

server/kite9-server-java/src/main/resources/static/public/templates/labels/labels.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
import { once } from '/public/bundles/ensure.js'
2+
3+
import { command, placement, contextMenu, metadata } from '/public/templates/editor/editor.js'
24
import { initAddLabelContextMenuCallback } from '/public/behaviours/labels/add/labels-add.js'
3-
import { initPlaceLabelContextMenuCallback } from '/public/behaviours/labels/place/labels-place.js'
4-
import { command, metadata, contextMenu } from '/public/templates/adl/adl.js'
5+
import { initPlaceLabelContextMenuCallback, initLabelPlacementPropertyFormCallback, initLabelPlacementPropertySetCallback } from '/public/behaviours/labels/place/labels-place.js'
56

67
function initLabels() {
78

89
if (metadata.isEditor()) {
10+
11+
placement.formCallback(initLabelPlacementPropertyFormCallback(command));
12+
placement.setCallback(initLabelPlacementPropertySetCallback(command));
913

1014
contextMenu.add(initAddLabelContextMenuCallback(command, document.params['label-template-uri']));
15+
contextMenu.add(initPlaceLabelContextMenuCallback(placement, command));
1116

1217
}
1318
}

server/kite9-server-java/src/test/java/com/kite9/server/adl/PrivateGithubIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
@ContextConfiguration
1818
public class PrivateGithubIT extends AbstractRestIT {
1919

20-
public static final String JS = "/github/kite9-org/examples/some.js?v=v0.14";
20+
public static final String JS = "/github/kite9-org/examples/some.js?v=v0.15";
2121
public static final String DIR = "/github/kite9-org/examples";
2222

2323

0 commit comments

Comments
 (0)