mirror of
https://github.com/GNS3/gns3-web-ui.git
synced 2025-05-07 02:58:33 +00:00
Fix CSS styles when provided wrong from server
This commit is contained in:
parent
a1f8066b0d
commit
4ca6c05f31
@ -43,6 +43,7 @@
|
|||||||
"angular2-indexeddb": "^1.2.2",
|
"angular2-indexeddb": "^1.2.2",
|
||||||
"bootstrap": "4.1.0",
|
"bootstrap": "4.1.0",
|
||||||
"core-js": "^2.5.5",
|
"core-js": "^2.5.5",
|
||||||
|
"css-tree": "^1.0.0-alpha.28",
|
||||||
"d3-ng2-service": "^2.1.0",
|
"d3-ng2-service": "^2.1.0",
|
||||||
"electron-settings": "^3.1.4",
|
"electron-settings": "^3.1.4",
|
||||||
"material-design-icons": "^3.0.1",
|
"material-design-icons": "^3.0.1",
|
||||||
|
30
src/app/cartography/shared/helpers/css-fixer.spec.ts
Normal file
30
src/app/cartography/shared/helpers/css-fixer.spec.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
import { CssFixer } from "./css-fixer";
|
||||||
|
|
||||||
|
describe('CssFixer', () => {
|
||||||
|
let fixer: CssFixer;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixer = new CssFixer();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fix font-size', () => {
|
||||||
|
const css = "font-size: 10.0;";
|
||||||
|
expect(fixer.fix(css)).toEqual("font-size:10.0pt");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not fix font-size when pt unit is defined', () => {
|
||||||
|
const css = "font-size: 10.0pt;";
|
||||||
|
expect(fixer.fix(css)).toEqual("font-size:10.0pt");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not fix font-size when px unit is defined', () => {
|
||||||
|
const css = "font-size: 10.0px;";
|
||||||
|
expect(fixer.fix(css)).toEqual("font-size:10.0px");
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fix font-size with other attributes', () => {
|
||||||
|
const css = "font: Verdana; font-size: 10.0;";
|
||||||
|
expect(fixer.fix(css)).toEqual("font:Verdana;font-size:10.0pt");
|
||||||
|
});
|
||||||
|
});
|
29
src/app/cartography/shared/helpers/css-fixer.ts
Normal file
29
src/app/cartography/shared/helpers/css-fixer.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import * as csstree from 'css-tree';
|
||||||
|
|
||||||
|
import { Injectable } from "@angular/core";
|
||||||
|
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class CssFixer {
|
||||||
|
|
||||||
|
public fix(styles: string) {
|
||||||
|
const ast = csstree.parse(styles, {
|
||||||
|
'context': 'declarationList'
|
||||||
|
});
|
||||||
|
|
||||||
|
// fixes font-size when unit (pt|px) is not defined
|
||||||
|
ast.children.forEach((child) => {
|
||||||
|
if (child.property === 'font-size') {
|
||||||
|
child.value.children.forEach((value) => {
|
||||||
|
if (value.type === 'Number') {
|
||||||
|
const fontSize = value.value.toString();
|
||||||
|
if (!(fontSize.indexOf("pt") >= 0 || fontSize.indexOf("px") >= 0)) {
|
||||||
|
value.value = `${fontSize}pt`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return csstree.generate(ast);
|
||||||
|
}
|
||||||
|
}
|
@ -85,7 +85,7 @@ describe('InterfaceLabelsWidget', () => {
|
|||||||
expect(sourceInterface.getAttribute('x')).toEqual('110');
|
expect(sourceInterface.getAttribute('x')).toEqual('110');
|
||||||
expect(sourceInterface.getAttribute('y')).toEqual('220');
|
expect(sourceInterface.getAttribute('y')).toEqual('220');
|
||||||
expect(sourceInterface.getAttribute('transform')).toEqual('rotate(5, 110, 220)');
|
expect(sourceInterface.getAttribute('transform')).toEqual('rotate(5, 110, 220)');
|
||||||
expect(sourceInterface.getAttribute('style')).toEqual('font-size: 12px');
|
expect(sourceInterface.getAttribute('style')).toEqual('font-size:12px');
|
||||||
expect(sourceInterface.getAttribute('class')).toContain('noselect');
|
expect(sourceInterface.getAttribute('class')).toContain('noselect');
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
import { SVGSelection } from "../models/types";
|
import { SVGSelection } from "../models/types";
|
||||||
import { Link } from "../models/link";
|
import { Link } from "../models/link";
|
||||||
import { InterfaceLabel } from "../models/interface-label";
|
import { InterfaceLabel } from "../models/interface-label";
|
||||||
|
import { CssFixer } from "../helpers/css-fixer";
|
||||||
|
|
||||||
|
|
||||||
export class InterfaceLabelWidget {
|
export class InterfaceLabelWidget {
|
||||||
|
private cssFixer: CssFixer;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.cssFixer = new CssFixer();
|
||||||
|
}
|
||||||
|
|
||||||
draw(selection: SVGSelection) {
|
draw(selection: SVGSelection) {
|
||||||
|
|
||||||
const labels = selection
|
const labels = selection
|
||||||
@ -40,7 +47,7 @@ export class InterfaceLabelWidget {
|
|||||||
.text((l: InterfaceLabel) => l.text)
|
.text((l: InterfaceLabel) => l.text)
|
||||||
.attr('x', (l: InterfaceLabel) => l.x)
|
.attr('x', (l: InterfaceLabel) => l.x)
|
||||||
.attr('y', (l: InterfaceLabel) => l.y)
|
.attr('y', (l: InterfaceLabel) => l.y)
|
||||||
.attr('style', (l: InterfaceLabel) => l.style)
|
.attr('style', (l: InterfaceLabel) => this.cssFixer.fix(l.style))
|
||||||
.attr('transform', (l: InterfaceLabel) => `rotate(${l.rotation}, ${l.x}, ${l.y})`);
|
.attr('transform', (l: InterfaceLabel) => `rotate(${l.rotation}, ${l.x}, ${l.y})`);
|
||||||
|
|
||||||
labels
|
labels
|
||||||
|
@ -6,6 +6,7 @@ import { Node } from "../models/node";
|
|||||||
import { SVGSelection } from "../models/types";
|
import { SVGSelection } from "../models/types";
|
||||||
import { Symbol } from "../models/symbol";
|
import { Symbol } from "../models/symbol";
|
||||||
import { Layer } from "../models/layer";
|
import { Layer } from "../models/layer";
|
||||||
|
import { CssFixer } from "../helpers/css-fixer";
|
||||||
|
|
||||||
|
|
||||||
export class NodesWidget implements Widget {
|
export class NodesWidget implements Widget {
|
||||||
@ -17,9 +18,11 @@ export class NodesWidget implements Widget {
|
|||||||
private onNodeDraggingCallbacks: ((event: any, node: Node) => void)[] = [];
|
private onNodeDraggingCallbacks: ((event: any, node: Node) => void)[] = [];
|
||||||
|
|
||||||
private symbols: Symbol[];
|
private symbols: Symbol[];
|
||||||
|
private cssFixer: CssFixer;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.symbols = [];
|
this.symbols = [];
|
||||||
|
this.cssFixer = new CssFixer();
|
||||||
}
|
}
|
||||||
|
|
||||||
public setOnContextMenuCallback(onContextMenuCallback: (event: any, node: Node) => void) {
|
public setOnContextMenuCallback(onContextMenuCallback: (event: any, node: Node) => void) {
|
||||||
@ -57,7 +60,7 @@ export class NodesWidget implements Widget {
|
|||||||
selection
|
selection
|
||||||
.select<SVGTextElement>('text.label')
|
.select<SVGTextElement>('text.label')
|
||||||
// .attr('y', (n: Node) => n.label.y - n.height / 2. + 10) // @todo: server computes y in auto way
|
// .attr('y', (n: Node) => n.label.y - n.height / 2. + 10) // @todo: server computes y in auto way
|
||||||
.attr('style', (n: Node) => n.label.style)
|
.attr('style', (n: Node) => this.cssFixer.fix(n.label.style))
|
||||||
.text((n: Node) => n.label.text)
|
.text((n: Node) => n.label.text)
|
||||||
.attr('x', function (this: SVGTextElement, n: Node) {
|
.attr('x', function (this: SVGTextElement, n: Node) {
|
||||||
if (n.label.x === null) {
|
if (n.label.x === null) {
|
||||||
|
11
yarn.lock
11
yarn.lock
@ -2244,6 +2244,13 @@ css-selector-tokenizer@^0.7.0:
|
|||||||
fastparse "^1.1.1"
|
fastparse "^1.1.1"
|
||||||
regexpu-core "^1.0.0"
|
regexpu-core "^1.0.0"
|
||||||
|
|
||||||
|
css-tree@^1.0.0-alpha.28:
|
||||||
|
version "1.0.0-alpha.28"
|
||||||
|
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f"
|
||||||
|
dependencies:
|
||||||
|
mdn-data "~1.1.0"
|
||||||
|
source-map "^0.5.3"
|
||||||
|
|
||||||
css-what@2.1:
|
css-what@2.1:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
|
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
|
||||||
@ -5556,6 +5563,10 @@ md5@^2.2.1:
|
|||||||
crypt "~0.0.1"
|
crypt "~0.0.1"
|
||||||
is-buffer "~1.1.1"
|
is-buffer "~1.1.1"
|
||||||
|
|
||||||
|
mdn-data@~1.1.0:
|
||||||
|
version "1.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.1.tgz#79586c90321787e5a2e51eb6823bb448949bc1ab"
|
||||||
|
|
||||||
media-typer@0.3.0:
|
media-typer@0.3.0:
|
||||||
version "0.3.0"
|
version "0.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
|
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user