diff --git a/frontend/src/demo/index.js b/frontend/src/demo/index.js index 2485c032c8ebe220850b5bcf65f19ebfc4a89d2a..0d0d43294fa94e6108bbedb8b9014a1c0344d97e 100644 --- a/frontend/src/demo/index.js +++ b/frontend/src/demo/index.js @@ -39,9 +39,9 @@ const paper = new dia.Paper({ gridSize: 10, drawGrid: true, defaultLink: (elementView, magnet) => { - console.log("absssss", elementView, "aaa", magnet); return new shapes.standard.Link({ attrs: { + // markup: util.svg`<rect @selector="body" />`, line: { stroke: '#fbf5d0', // strokeWidth: 1, @@ -60,22 +60,29 @@ const paper = new dia.Paper({ 'd': 'M 10 -5 0 0 10 5 Z' } }, - // label: { - // x: '50', - // y: '50', - // textAnchor: 'middle', - // textVerticalAnchor: 'middle', - // fontSize: 14, - // fill: '#333333', - // text: "111", - // position: { - // distance: 0.66, - // offset: { - // x: -40, - // y: 80 - // } - // } + // body: { + // width: '90', + // height: '40', + // x: 5, + // y: 5, + // strokeWidth: 2, + // stroke: '#000000', + // transparent: true, + // fill: '#FFFFFF', // }, + // newline: { + // // connection: true, + // stroke: "#fbf5d0", + // strokeLinejoin: "round", + // strokeWidth: 20, + // marker: { + // 'type': 'path', + // 'stroke': 'red', + // 'strokeWidth': 50, + // 'fill': 'white', + // 'd': 'M 10 -5 0 0 10 5 Z' + // } + // } }, }); }, @@ -288,7 +295,6 @@ graph.on('add', function(cell) { // }, // }, setTimeout(this, 1000)) } else if (cell.attributes.type === 'myApp.Relationship') { - console.log("new schemaID: ", schemaID); console.log('Relationship'); let new_relationship_name = window.prompt("Please enter the name of the new relationship:", ""); new_relationship = { @@ -323,9 +329,9 @@ graph.on('add', function(cell) { // console.log(cell.attributes.target); console.log("Link"); if (cell.attributes.target.id == undefined) { - console.log("This shoud be an attribute"); + // console.log("This shoud be an attribute"); } else { - console.log("The target is an element"); + // console.log("The target is an element"); } } else { console.log("Other elements"); @@ -333,11 +339,6 @@ graph.on('add', function(cell) { }) paper.on('cell:pointerdblclick', function(elementView, evt) { - // evt.stopPropagation(); - // if (elementView.model.type) { - - // } - console.log(elementView.model.attributes.type === 'myApp.WeakEntity'); if (elementView.model.attributes.type === 'myApp.WeakEntity') { // elementView.model.remove(); let new_weak_entity_name = window.prompt("Please enter the new name of the weak entity:", ""); @@ -433,7 +434,13 @@ const WeakEntity = dia.Element.define('myApp.WeakEntity', { height: '50', strokeWidth: 2, stroke: '#000000', - fill: '#FFFFFF' + fill: '#FFFFFF', + + // type: 'path', + // stroke: '#000000', + // strokeWidth: 5, + // fill: 'white', + // d: 'M 10 -5 0 0 10 5 Z' }, label: { x: '50', @@ -487,6 +494,7 @@ const WeakEntity = dia.Element.define('myApp.WeakEntity', { // markup: // util.svg` // <rect @selector="outer" /> + // <path @selector="inner" d='M 10 -5 0 0 10 5 Z' /> // <text @selector="label" /> // ` }); @@ -580,7 +588,6 @@ stencil.render().load({ }); stencil.on('myApp.StrongEntity:pointerclick', () => { - console.log("111"); // new_entity = { // "schemaID": "1123", // "name": "new-strong-entity", @@ -680,8 +687,16 @@ const options = { labelPosition: [ { value: 1, content: 'attribute' }, // { value: 0.5, content: 'Cardinality' }, - { offset: 300, content: 'left' }, + { offset: 300, content: 'left' } + ], + whetherOptional: [ + { text: "Yes", content: 'Yes' }, + { text: "No", content: 'No' } ], + whetherPrimaryKey: [ + { text: "Yes", content: 'Yes' }, + { text: "No", content: 'No' } + ] } paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { @@ -705,8 +720,18 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { item: { type: 'object', properties: { + body: { + d: { + 'type': 'path', + 'stroke': 'red', + 'strokeWidth': 5, + 'fill': 'white', + value: 'M 10 -5 0 0 10 5 Z' + } + }, attrs: { text: { + // textDecoration: 'underline', text: { type: 'content-editable', label: 'Attribute Name', @@ -725,8 +750,22 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { options: options.colorPaletteReset, // defaultValue: '#f6f6f6', // white label: 'Text Color', - index: 5 - } + index: 6 + }, + primary: { + type: 'select-box', + defaultValue: 'No', + options: options.whetherPrimaryKey || [], + label: 'Primary key', + index: 2, + }, + optional: { + type: 'select-box', + defaultValue: 'No', + options: options.whetherOptional || [], + label: 'Optional', + index: 3, + }, }, rect: { fill: { @@ -734,14 +773,21 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { options: options.colorPaletteReset, label: 'Fill', defaultValue: '#f6f6f6', - index: 3 + index: 5, }, stroke: { type: 'color-palette', options: options.colorPaletteReset, label: 'Outline', - index: 4 - } + index: 6, + }, + // d: { + // 'type': 'path', + // 'stroke': 'red', + // 'strokeWidth': 5, + // 'fill': 'white', + // 'd': 'M 10 -5 0 0 10 5 Z' + // } } }, position: { @@ -751,7 +797,7 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { offset: 200, label: 'Position', placeholder: 'Custom', - index: 2, + index: 4, attrs: { label: { 'data-tooltip': 'Position the label relative to the source of the link', @@ -769,24 +815,6 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { } } }, - // attrs: { - // // line: { stroke: '#fbf5d0' }, - // label: { - // textAnchor: 'middle', - // textVerticalAnchor: 'middle', - // fontSize: 14, - // fill: '#333333', - // text: "111", - // }, - // }, - // 'attrs/label/text': { - // // type: 'text', - // // label: 'Cardinality constraint', - // text: "123", - // // group: 'basic', - // // index: 1, - // // event: 'link:setLabel' - // }, 'attrs/line/sourceMarker': { d: { type: 'select-box', @@ -840,15 +868,6 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { // } // } }, - // label: { - // 'attrs/text': { - // type: 'text', - // label: 'Cardinality constraint', - // group: 'basic', - // index: 1, - // event: 'link:setLabel' - // } - // }, groups: { basic: { label: 'Basic', @@ -862,7 +881,6 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { // label: 'Target marker', // index: 4 // }, - } }); @@ -944,24 +962,6 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { } } }, - // attrs: { - // // line: { stroke: '#fbf5d0' }, - // label: { - // textAnchor: 'middle', - // textVerticalAnchor: 'middle', - // fontSize: 14, - // fill: '#333333', - // text: "111", - // }, - // }, - // 'attrs/label/text': { - // // type: 'text', - // // label: 'Cardinality constraint', - // text: "123", - // // group: 'basic', - // // index: 1, - // // event: 'link:setLabel' - // }, 'attrs/line/sourceMarker': { d: { type: 'select-box', @@ -979,51 +979,7 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { // index: 2 // } }, - // 'attrs/line': { - // targetMarker: { - // d: { - // // type: 'select-box', - // // options: options.arrowheadSize, - // // group: 'marker-target', - // // label: 'Target arrowhead', - // // index: 1, - // }, - // stroke: {'black'}, - // fill: 'yellow', - // } - // } - - // 'attrs/line/targetMarker': { - // d: { - // type: 'select-box', - // options: options.arrowheadSize, - // group: 'marker-target', - // label: 'Target arrowhead', - // index: 1, - // stroke: 'black' - // }, - - // 'stroke': 'black', - // 'fill': 'yellow', - // fill: { - // type: 'color-palette', - // options: options.colorPaletteReset, - // group: 'marker-target', - // label: 'Color', - // when: { ne: { 'attrs/line/targetMarker/d': 'M 0 0 0 0' }}, - // index: 2 - // } - // } }, - // label: { - // 'attrs/text': { - // type: 'text', - // label: 'Cardinality constraint', - // group: 'basic', - // index: 1, - // event: 'link:setLabel' - // } - // }, groups: { basic: { label: 'Basic', @@ -1037,7 +993,6 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { // label: 'Target marker', // index: 4 // }, - } }); } @@ -1078,7 +1033,6 @@ paper.on('element:pointerclick link:pointerclick', (elementView, evt) => { }); paper.on('link:setLabel:pointerclick', function(elementView, evt) { - console.log("1111111111111"); // Stop any further actions with the element view e.g. dragging // evt.stopPropagation(); // if (confirm('Are you sure you want to delete this element?')) { @@ -1122,10 +1076,10 @@ paper.on('element:pointerclick', (elementView) => { }); halo.on('action:link:pointerup', (linkView, evt, evt2) => { - console.log("I'm here!"); - console.log(linkView); - console.log(evt); - console.log(evt2); + console.log("I'm here!!!!!"); + // console.log(linkView); + // console.log(evt); + // console.log(evt2); }); }); @@ -1177,7 +1131,6 @@ toolbar.on({ 'print:pointerclick': () => console.log("print"), 'create:pointerclick': () => { let new_schema_name = window.prompt("Please enter the name of the new schema:", ""); - console.log(new_schema_name); request = { "name": new_schema_name } @@ -1235,8 +1188,6 @@ toolbar.on({ document.querySelector('.toolbar-container').appendChild(toolbar.el); toolbar.render(); -console.log("schemaID: ", schemaID); - // Working With Diagrams Programmatically // -------------------------------------- @@ -1260,7 +1211,7 @@ const newShape = new MyShape({ graph.addCell(newShape); // Get element from the graph and change its properties. -console.log(myShape === graph.getElements()[0]); +// console.log(myShape === graph.getElements()[0]); myShape.prop('attrs/label/text', 'My Updated Shape'); myShape.prop('size/width', 150); myShape.prop('level', 2); @@ -1288,77 +1239,13 @@ graph.addCell(myLink); graph.on('change add remove', (cell) => { // const diagramJSONString = JSON.stringify(graph.toJSON()); // console.log('Diagram JSON', diagramJSONString); - console.log(cell); + console.log("change: ", cell); if (cell.attributes.type == 'standard.Link') { if (cell.attributes.target.id == undefined) { - console.log("why im here?"); - if (cell.attributes.labels) { - - // // Need to check the relative position of the new attribute - // // There are four cases: 1. top; 2. right; 3. bottom; 4. left - // // So we need to fetch the source element to get the original position - - // let source_id = cell.attributes.source.id; - // let all_elements = graph.getCells(); - // let source_x = 0; - // let source_y = 0; - // for (idx in all_elements) { - // if (all_elements[idx].id == source_id) { - - // if (all_elements[idx].attributes.type == "myApp.WeakEntity") { - // source_x = all_elements[idx].attributes.position.x + all_elements[idx].attributes.attrs.outer.width / 2; - // source_y = all_elements[idx].attributes.position.y + all_elements[idx].attributes.attrs.outer.height / 2; - // } else if (all_elements[idx].attributes.type == "myApp.StrongEntity") { - // source_x = all_elements[idx].attributes.position.x + all_elements[idx].attributes.attrs.body.width / 2; - // source_y = all_elements[idx].attributes.position.y + all_elements[idx].attributes.attrs.body.height / 2; - // } else if (all_elements[idx].attributes.type == "myApp.Relationship") { - // source_x = all_elements[idx].attributes.position.x + 35; - // source_y = all_elements[idx].attributes.position.y + 35; - // } - // } - // } + if (cell.attributes.labels) { - // let target_x = cell.attributes.target.x; - // let target_y = cell.attributes.target.y; - - // let final_x = 0; - // let final_y = 0; - // // console.log("target_x: ", target_x); - // // console.log("target_y: ", target_y); - // // console.log("source_x: ", source_x); - // // console.log("source_y: ", source_y); - - // if (target_x >= source_x) { - // if (Math.abs(target_x - source_x) >= Math.abs(target_y - source_y)) { - // final_x = 30; - // final_y = 0; - // } else { - // if (target_y <= source_y) { - // final_x = 0; - // final_y = -25; - // } else { - // final_x = 0; - // final_y = 25; - // } - // } - // } else { - // if (Math.abs(target_x - source_x) >= Math.abs(target_y - source_y)) { - // final_x = -30; - // final_y = 0; - // } else { - // if (target_y <= source_y) { - // final_x = 0; - // final_y = -25; - // } else { - // final_x = 0; - // final_y = 25; - // } - - // } - // } const position = calculateLabelPosition(cell); - console.log("position: ", position); cell.attributes.labels[0].position = { distance: 1, @@ -1367,7 +1254,73 @@ graph.on('change add remove', (cell) => { y: position.final_y } }; + + if (cell.attributes.labels[0].attrs) { + const original_text = cell.attributes.labels[0].attrs.text.text; + console.log("first: ", cell.attributes); + if (cell.attributes.labels[0].attrs.text.optional == 'Yes') { + cell.attributes.labels[0].attrs.text.text = original_text.includes('?') ? original_text : original_text + "?"; + cell.attributes.labels[0].position.offset.x -= 8; + cell.attributes.labels[0].position.offset.y -= 8; + } else if (cell.attributes.labels[0].attrs.text.optional == 'No') { + cell.attributes.labels[0].attrs.text.text = original_text.includes('?') ? original_text.substring(0, original_text.length - 1) : original_text; + cell.attributes.labels[0].position.offset.x -= 8; + cell.attributes.labels[0].position.offset.y -= 8; + } + + console.log("second: ", cell.attributes); + const new_attribute_name = cell.attributes.labels[0].attrs.text.text; + console.log("123: ", new_attribute_name); + if (cell.attributes.labels[0].attrs.text.primary == 'Yes') { + let underline_string = ""; + let count = 0; + for (char in new_attribute_name) { + console.log(count); + underline_string += "_"; + count++; + } + cell.attributes.labels[0] = { + attrs: { + text: { + text: new_attribute_name, + primary: "Yes" + }, + outer: { + stroke: '#FFFFFF', + fill: '#FFFFFF', + text: underline_string, + }, + }, + markup: util.svg`<text @selector="text" fill="#FFFFFF"/> <text @selector="outer" fill="#FFFFFF"/>`, + position: { + distance: 1, + offset: { + x: position.final_x - 8, + y: position.final_y - 8 + } + } + }; + } else if (cell.attributes.labels[0].attrs.text.primary == 'No') { + cell.attributes.labels[0] = { + attrs: { + text: { + text: new_attribute_name, + primary: "No" + }, + }, + markup: util.svg`<text @selector="text" fill="#FFFFFF"/>`, + position: { + distance: 1, + offset: { + x: position.final_x - 8, + y: position.final_y - 8 + } + } + }; + } + } } + console.log("points"); cell.attributes.attrs.line.targetMarker.d = 'M 0, 0 m -7, 0 a 7,7 0 1,0 14,0 a 7,7 0 1,0 -14,0'; // let new_strong_entity_name = window.prompt("Please enter the name of the new strong entity:", ""); @@ -1401,7 +1354,7 @@ graph.on('change add remove', (cell) => { // }) function calculateLabelPosition(cell) { - + // Need to check the relative position of the new attribute // There are four cases: 1. top; 2. right; 3. bottom; 4. left // So we need to fetch the source element to get the original position @@ -1475,10 +1428,11 @@ function calculateLabelPosition(cell) { } paper.on('link:pointerup', (cell, evt) => { - console.log("This is link:pointerup:", cell); + // console.log("This is link:pointerup:", cell); // evt.stopPropagation(); if (!cell.model.attributes.labels) { let new_attribute_name = window.prompt("Please enter the name of the attribute:", ""); + cell.addLabel({}); const position = calculateLabelPosition(cell.model); @@ -1486,18 +1440,32 @@ paper.on('link:pointerup', (cell, evt) => { cell.model.attributes.labels[0] = { attrs: { text: { - text: new_attribute_name - } + text: new_attribute_name, + optional: "No", + primary: "No", + }, + // outer: { + // // width: '90', + // // height: '40', + // // x: 5, + // // y: 5, + // // strokeWidth: 2, + // stroke: '#FFFFFF', + // fill: '#FFFFFF', + // text: underline_string, + // }, + }, + markup: util.svg`<text @selector="text" fill="#FFFFFF"/> `, position: { distance: 1, offset: { - x: position.final_x, - y: position.final_y + x: position.final_x - 8, + y: position.final_y - 8 } } }; - console.log("new label: ", cell); + // console.log("new label: ", cell); } })