mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-17 14:29:48 +02:00
Merge pull request #4361 from tcbuzor/feature-4146-eraggregation
add master detail relationship support
This commit is contained in:
@@ -20,6 +20,7 @@ const Cardinality = {
|
|||||||
ZERO_OR_MORE: 'ZERO_OR_MORE',
|
ZERO_OR_MORE: 'ZERO_OR_MORE',
|
||||||
ONE_OR_MORE: 'ONE_OR_MORE',
|
ONE_OR_MORE: 'ONE_OR_MORE',
|
||||||
ONLY_ONE: 'ONLY_ONE',
|
ONLY_ONE: 'ONLY_ONE',
|
||||||
|
MD_PARENT: 'MD_PARENT',
|
||||||
};
|
};
|
||||||
|
|
||||||
const Identification = {
|
const Identification = {
|
||||||
|
@@ -7,6 +7,8 @@ const ERMarkers = {
|
|||||||
ONE_OR_MORE_END: 'ONE_OR_MORE_END',
|
ONE_OR_MORE_END: 'ONE_OR_MORE_END',
|
||||||
ZERO_OR_MORE_START: 'ZERO_OR_MORE_START',
|
ZERO_OR_MORE_START: 'ZERO_OR_MORE_START',
|
||||||
ZERO_OR_MORE_END: 'ZERO_OR_MORE_END',
|
ZERO_OR_MORE_END: 'ZERO_OR_MORE_END',
|
||||||
|
MD_PARENT_END: 'MD_PARENT_END',
|
||||||
|
MD_PARENT_START: 'MD_PARENT_START',
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -18,6 +20,30 @@ const ERMarkers = {
|
|||||||
const insertMarkers = function (elem, conf) {
|
const insertMarkers = function (elem, conf) {
|
||||||
let marker;
|
let marker;
|
||||||
|
|
||||||
|
elem
|
||||||
|
.append('defs')
|
||||||
|
.append('marker')
|
||||||
|
.attr('id', ERMarkers.MD_PARENT_START)
|
||||||
|
.attr('refX', 0)
|
||||||
|
.attr('refY', 7)
|
||||||
|
.attr('markerWidth', 190)
|
||||||
|
.attr('markerHeight', 240)
|
||||||
|
.attr('orient', 'auto')
|
||||||
|
.append('path')
|
||||||
|
.attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
||||||
|
|
||||||
|
elem
|
||||||
|
.append('defs')
|
||||||
|
.append('marker')
|
||||||
|
.attr('id', ERMarkers.MD_PARENT_END)
|
||||||
|
.attr('refX', 19)
|
||||||
|
.attr('refY', 7)
|
||||||
|
.attr('markerWidth', 20)
|
||||||
|
.attr('markerHeight', 28)
|
||||||
|
.attr('orient', 'auto')
|
||||||
|
.append('path')
|
||||||
|
.attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
|
||||||
|
|
||||||
elem
|
elem
|
||||||
.append('defs')
|
.append('defs')
|
||||||
.append('marker')
|
.append('marker')
|
||||||
|
@@ -478,6 +478,9 @@ const drawRelationshipFromLayout = function (svg, rel, g, insert, diagObj) {
|
|||||||
case diagObj.db.Cardinality.ONLY_ONE:
|
case diagObj.db.Cardinality.ONLY_ONE:
|
||||||
svgPath.attr('marker-end', 'url(' + url + '#' + erMarkers.ERMarkers.ONLY_ONE_END + ')');
|
svgPath.attr('marker-end', 'url(' + url + '#' + erMarkers.ERMarkers.ONLY_ONE_END + ')');
|
||||||
break;
|
break;
|
||||||
|
case diagObj.db.Cardinality.MD_PARENT:
|
||||||
|
svgPath.attr('marker-end', 'url(' + url + '#' + erMarkers.ERMarkers.MD_PARENT_END + ')');
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (rel.relSpec.cardB) {
|
switch (rel.relSpec.cardB) {
|
||||||
@@ -502,6 +505,9 @@ const drawRelationshipFromLayout = function (svg, rel, g, insert, diagObj) {
|
|||||||
case diagObj.db.Cardinality.ONLY_ONE:
|
case diagObj.db.Cardinality.ONLY_ONE:
|
||||||
svgPath.attr('marker-start', 'url(' + url + '#' + erMarkers.ERMarkers.ONLY_ONE_START + ')');
|
svgPath.attr('marker-start', 'url(' + url + '#' + erMarkers.ERMarkers.ONLY_ONE_START + ')');
|
||||||
break;
|
break;
|
||||||
|
case diagObj.db.Cardinality.MD_PARENT:
|
||||||
|
svgPath.attr('marker-start', 'url(' + url + '#' + erMarkers.ERMarkers.MD_PARENT_START + ')');
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now label the relationship
|
// Now label the relationship
|
||||||
|
@@ -57,6 +57,7 @@ accDescr\s*"{"\s* { this.begin("acc_descr_multili
|
|||||||
o\| return 'ZERO_OR_ONE';
|
o\| return 'ZERO_OR_ONE';
|
||||||
o\{ return 'ZERO_OR_MORE';
|
o\{ return 'ZERO_OR_MORE';
|
||||||
\|\{ return 'ONE_OR_MORE';
|
\|\{ return 'ONE_OR_MORE';
|
||||||
|
\s*u return 'MD_PARENT';
|
||||||
\.\. return 'NON_IDENTIFYING';
|
\.\. return 'NON_IDENTIFYING';
|
||||||
\-\- return 'IDENTIFYING';
|
\-\- return 'IDENTIFYING';
|
||||||
"to" return 'IDENTIFYING';
|
"to" return 'IDENTIFYING';
|
||||||
@@ -170,6 +171,7 @@ cardinality
|
|||||||
| 'ZERO_OR_MORE' { $$ = yy.Cardinality.ZERO_OR_MORE; }
|
| 'ZERO_OR_MORE' { $$ = yy.Cardinality.ZERO_OR_MORE; }
|
||||||
| 'ONE_OR_MORE' { $$ = yy.Cardinality.ONE_OR_MORE; }
|
| 'ONE_OR_MORE' { $$ = yy.Cardinality.ONE_OR_MORE; }
|
||||||
| 'ONLY_ONE' { $$ = yy.Cardinality.ONLY_ONE; }
|
| 'ONLY_ONE' { $$ = yy.Cardinality.ONLY_ONE; }
|
||||||
|
| 'MD_PARENT' { $$ = yy.Cardinality.MD_PARENT; }
|
||||||
;
|
;
|
||||||
|
|
||||||
relType
|
relType
|
||||||
|
@@ -718,5 +718,14 @@ describe('when parsing ER diagram it...', function () {
|
|||||||
const rels = erDb.getRelationships();
|
const rels = erDb.getRelationships();
|
||||||
expect(rels[0].roleA).toBe('places');
|
expect(rels[0].roleA).toBe('places');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should represent parent-child relationship correctly', function () {
|
||||||
|
erDiagram.parser.parse('erDiagram\nPROJECT u--o{ TEAM_MEMBER : "parent"');
|
||||||
|
const rels = erDb.getRelationships();
|
||||||
|
expect(Object.keys(erDb.getEntities()).length).toBe(2);
|
||||||
|
expect(rels.length).toBe(1);
|
||||||
|
expect(rels[0].relSpec.cardB).toBe(erDb.Cardinality.MD_PARENT);
|
||||||
|
expect(rels[0].relSpec.cardA).toBe(erDb.Cardinality.ZERO_OR_MORE);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -33,6 +33,17 @@ const getStyles = (options) =>
|
|||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
fill: ${options.textColor};
|
fill: ${options.textColor};
|
||||||
}
|
}
|
||||||
|
#MD_PARENT_START {
|
||||||
|
fill: #f5f5f5 !important;
|
||||||
|
stroke: ${options.lineColor} !important;
|
||||||
|
stroke-width: 1;
|
||||||
|
}
|
||||||
|
#MD_PARENT_END {
|
||||||
|
fill: #f5f5f5 !important;
|
||||||
|
stroke: ${options.lineColor} !important;
|
||||||
|
stroke-width: 1;
|
||||||
|
}
|
||||||
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export default getStyles;
|
export default getStyles;
|
||||||
|
Reference in New Issue
Block a user