Skip to content

Commit a96b736

Browse files
authored
enable extraction of inline elements in schema editor and redis password (#541)
* enable extraction of inlined elements in schema diagram * add password to redis and make mongodb password depend on environment variable * apply formatting changes --------- Co-authored-by: Logende <Logende@users.noreply.github.com>
1 parent 8b44dd1 commit a96b736

6 files changed

Lines changed: 87 additions & 15 deletions

File tree

backend/app.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,14 @@
3232
db = client[MONGO_DB]
3333

3434
# Set up Redis connection
35-
REDIS_URL = os.getenv('REDIS_URL', 'redis://localhost:6379/0')
35+
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost')
36+
REDIS_PORT = os.getenv('REDIS_PORT', 6379)
37+
REDIS_PASS = os.getenv('REDIS_PASS', None)
38+
39+
# Construct the Redis URL including the password
40+
REDIS_URL = f"redis://:{REDIS_PASS}@{REDIS_HOST}:{REDIS_PORT}/0"
41+
42+
# Initialize Redis client
3643
redis_client = redis.Redis.from_url(REDIS_URL)
3744

3845
# Set up Flask-Limiter with Redis

docker-compose.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ services:
2424
- app-network
2525
environment:
2626
FLASK_ENV: development
27-
MONGO_INITDB_ROOT_USERNAME: root
28-
MONGO_INITDB_ROOT_PASSWORD: example
27+
MONGO_USER: root
28+
MONGO_PASS: ${MONGO_PASSWORD}
2929
MONGO_HOST: mongo
3030
MONGO_PORT: 27017
3131
MONGO_DB: metaconfigurator
3232
REDIS_URL: redis://redis:6379/0
33+
REDIS_PASS: ${REDIS_PASSWORD}
3334

3435
mongo:
3536
image: mongo:latest
@@ -39,7 +40,7 @@ services:
3940
restart: unless-stopped
4041
environment:
4142
MONGO_INITDB_ROOT_USERNAME: root
42-
MONGO_INITDB_ROOT_PASSWORD: example
43+
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}
4344
MONGO_INITDB_DATABASE: metaconfigurator
4445
volumes:
4546
- mongo-data:/data/db
@@ -51,6 +52,8 @@ services:
5152
ports:
5253
- "6379:6379"
5354
restart: unless-stopped
55+
environment:
56+
REDIS_PASSWORD: ${REDIS_PASSWORD}
5457
networks:
5558
- app-network
5659

meta_configurator/src/components/panels/schema-diagram/SchemaEnumNode.vue

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import {
33
SchemaElementData,
44
SchemaEnumNodeData,
5+
SchemaObjectNodeData,
56
} from '@/components/panels/schema-diagram/schemaDiagramTypes';
67
import type {Path} from '@/utility/path';
78
import {Handle, Position} from '@vue-flow/core';
@@ -25,6 +26,7 @@ const emit = defineEmits<{
2526
(e: 'select_element', path: Path): void;
2627
(e: 'update_enum_name', objectData: SchemaElementData, oldName: string, newName: string): void;
2728
(e: 'update_enum_values', data: SchemaEnumNodeData, newValues: string[]): void;
29+
(e: 'extract_inlined_element', objectData: SchemaEnumNodeData): void;
2830
(e: 'delete_element', objectData: SchemaElementData): void;
2931
}>();
3032
@@ -38,11 +40,16 @@ function isEnumEditable() {
3840
return isHighlighted();
3941
}
4042
43+
function isDefinedInDefinitions() {
44+
if (props.data.absolutePath.length < 2) {
45+
return false;
46+
}
47+
const parentKey = props.data.absolutePath[props.data.absolutePath.length - 2];
48+
return parentKey === '$defs' || parentKey === 'definitions';
49+
}
50+
4151
function isHighlighted() {
42-
return (
43-
props.selectedData &&
44-
pathToString(props.selectedData.absolutePath) === pathToString(props.data.absolutePath)
45-
);
52+
return props.selectedData && props.selectedData == props.data;
4653
}
4754
4855
function updateEnumName() {
@@ -61,6 +68,10 @@ function deleteEnum() {
6168
emit('delete_element', props.data);
6269
}
6370
71+
function extractInlinedObject() {
72+
emit('extract_inlined_element', props.data);
73+
}
74+
6475
function deleteEnumItem(index: number) {
6576
enumValues.value.splice(index, 1);
6677
emit('update_enum_values', props.data, enumValues.value);
@@ -79,19 +90,30 @@ function addEnumItem() {
7990
<Handle type="target" :position="props.targetPosition!" class="vue-flow__handle"></Handle>
8091
<p>&lt;enumeration&gt;</p>
8192

82-
<div v-if="!isEnumEditable()">
93+
<div v-if="!isEnumEditable() || !isDefinedInDefinitions()">
8394
<b>
8495
{{ props.data.name }}
8596
</b>
8697

98+
<Button
99+
v-if="!isDefinedInDefinitions() && isHighlighted()"
100+
class="vue-flow-object-button"
101+
size="small"
102+
v-tooltip.bottom="'Extract inlined Object to definitions (will enable renaming and more)'"
103+
@mousedown.stop
104+
@click.stop
105+
@click="_ => extractInlinedObject()">
106+
<FontAwesomeIcon :icon="'fa-wrench fa-solid'" />
107+
</Button>
108+
87109
<hr />
88110

89111
<p v-if="useSettings().schemaDiagram.showEnumValues" v-for="value in props.data!.values">
90112
{{ value }}
91113
</p>
92114
</div>
93115

94-
<div v-if="isEnumEditable()">
116+
<div v-else>
95117
<InputText
96118
type="text"
97119
class="vue-flow-enum-name-inputtext"

meta_configurator/src/components/panels/schema-diagram/SchemaObjectAttribute.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ function getHandleTop() {
9191
<span class="vue-flow__node-schemaattribute-type">: {{ props.data.typeDescription }}</span>
9292
</div>
9393

94-
<div v-if="isHighlighted()">
94+
<div v-else>
9595
<InputText
9696
type="text"
9797
class="vue-flow-attribute-input-dimensions"

meta_configurator/src/components/panels/schema-diagram/SchemaObjectNode.vue

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup lang="ts">
22
import {
33
SchemaElementData,
4+
SchemaEnumNodeData,
45
SchemaObjectAttributeData,
56
SchemaObjectNodeData,
67
} from '@/components/panels/schema-diagram/schemaDiagramTypes';
@@ -26,6 +27,7 @@ const emit = defineEmits<{
2627
(e: 'select_element', path: Path): void;
2728
(e: 'zoom_into_element', path: Path): void;
2829
(e: 'delete_element', objectData: SchemaElementData): void;
30+
(e: 'extract_inlined_element', objectData: SchemaObjectNodeData): void;
2931
(
3032
e: 'update_object_name',
3133
objectData: SchemaObjectNodeData,
@@ -52,6 +54,14 @@ function isNameEditable() {
5254
return (isHighlighted() || isAttributeHighlighted()) && props.data.hasUserDefinedName;
5355
}
5456
57+
function isDefinedInDefinitions() {
58+
if (props.data.absolutePath.length < 2) {
59+
return false;
60+
}
61+
const parentKey = props.data.absolutePath[props.data.absolutePath.length - 2];
62+
return parentKey === '$defs' || parentKey === 'definitions';
63+
}
64+
5565
function clickedNode() {
5666
emit('select_element', props.data.absolutePath);
5767
}
@@ -90,6 +100,10 @@ function deleteObject() {
90100
deleteElement(props.data);
91101
}
92102
103+
function extractInlinedObject() {
104+
emit('extract_inlined_element', props.data);
105+
}
106+
93107
function deleteElement(data: SchemaElementData) {
94108
emit('delete_element', data);
95109
}
@@ -121,13 +135,23 @@ function isAttributeHighlighted() {
121135
@dblclick="doubleClickedNode()">
122136
<Handle type="target" :position="props.targetPosition!" class="vue-flow__handle"></Handle>
123137

124-
<div v-if="!isNameEditable()">
138+
<div v-if="!isNameEditable() || !isDefinedInDefinitions()">
125139
<b>
126140
{{ props.data.name }}
127141
</b>
142+
<Button
143+
v-if="!isDefinedInDefinitions() && (isHighlighted() || isAttributeHighlighted())"
144+
class="vue-flow-object-button"
145+
size="small"
146+
v-tooltip.bottom="'Extract inlined Object to definitions (will enable renaming and more)'"
147+
@mousedown.stop
148+
@click.stop
149+
@click="_ => extractInlinedObject()">
150+
<FontAwesomeIcon :icon="'fa-wrench fa-solid'" />
151+
</Button>
128152
</div>
129153

130-
<div v-if="isNameEditable()">
154+
<div v-else>
131155
<InputText
132156
type="text"
133157
class="vue-flow-object-name-inputtext"

meta_configurator/src/components/panels/schema-diagram/VueFlowPanel.vue

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
} from '@/components/panels/schema-diagram/typeUtils';
3737
import Button from 'primevue/button';
3838
import {pathToJsonPointer} from '@/utility/pathUtils';
39+
import {dataAt} from '@/utility/resolveDataAtPath';
3940
4041
const emit = defineEmits<{
4142
(e: 'update_current_path', path: Path): void;
@@ -234,6 +235,19 @@ function updateObjectOrEnumName(objectData: SchemaElementData, oldName: string,
234235
// TODO: when renaming happens, also force update in the GUI
235236
}
236237
238+
function extractInlinedElement(elementData: SchemaObjectNodeData | SchemaEnumNodeData) {
239+
const oldElementPath = elementData.absolutePath;
240+
const dataAtPath = dataAt(oldElementPath, schemaData.data.value);
241+
const newElementId = findAvailableId(['$defs'], elementData.name, true);
242+
schemaData.setDataAt(newElementId, dataAtPath);
243+
const referenceToNewElement = '#' + pathToJsonPointer(newElementId);
244+
schemaData.setDataAt(oldElementPath, {
245+
$ref: referenceToNewElement,
246+
});
247+
elementData.absolutePath = newElementId;
248+
selectElement(newElementId);
249+
}
250+
237251
function updateAttributeName(attributeData: SchemaNodeData, oldName: string, newName: string) {
238252
// change name in node before replacing name in schema. Otherwise, when the schema change is detected, it would also compute
239253
// that a new node was added (because different name) and then rebuild whole graph.
@@ -285,11 +299,11 @@ function updateEnumValues(enumData: SchemaEnumNodeData, newValues: string[]) {
285299
schemaData.setDataAt(enumData.absolutePath, enumSchema);
286300
}
287301
288-
function findAvailableId(path: Path, prefix: string): Path {
302+
function findAvailableId(path: Path, prefix: string, preferWithoutNumber: boolean = false): Path {
289303
let num: number = 1;
290304
let success = false;
291305
while (num <= 100) {
292-
const id = prefix + num;
306+
const id = num == 1 && preferWithoutNumber ? prefix : prefix + num;
293307
const fullPath = [...path, id];
294308
success = schemaData.dataAt(fullPath) === undefined;
295309
if (success) {
@@ -373,6 +387,7 @@ function addEnum() {
373387
@update_attribute_type="updateAttributeType"
374388
@delete_element="deleteElement"
375389
@add_attribute="addAttribute"
390+
@extract_inlined_element="extractInlinedElement"
376391
:source-position="props.sourcePosition"
377392
:target-position="props.targetPosition"
378393
:selected-data="selectedData"
@@ -385,6 +400,7 @@ function addEnum() {
385400
@update_enum_name="updateObjectOrEnumName"
386401
@update_enum_values="updateEnumValues"
387402
@delete_element="deleteElement"
403+
@extract_inlined_element="extractInlinedElement"
388404
:source-position="props.sourcePosition"
389405
:target-position="props.targetPosition"
390406
:selected-data="selectedData" />

0 commit comments

Comments
 (0)