mirror of
https://github.com/drawdb-io/drawdb.git
synced 2025-09-01 10:25:13 +00:00
disable menubar items when in read only mode
This commit is contained in:
@@ -615,6 +615,9 @@ export default function ControlPanel({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
const del = () => {
|
const del = () => {
|
||||||
|
if (layout.readonly) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
switch (selectedElement.element) {
|
switch (selectedElement.element) {
|
||||||
case ObjectType.TABLE:
|
case ObjectType.TABLE:
|
||||||
deleteTable(selectedElement.id);
|
deleteTable(selectedElement.id);
|
||||||
@@ -630,6 +633,9 @@ export default function ControlPanel({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
const duplicate = () => {
|
const duplicate = () => {
|
||||||
|
if (layout.readonly) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
switch (selectedElement.element) {
|
switch (selectedElement.element) {
|
||||||
case ObjectType.TABLE: {
|
case ObjectType.TABLE: {
|
||||||
const copiedTable = tables.find((t) => t.id === selectedElement.id);
|
const copiedTable = tables.find((t) => t.id === selectedElement.id);
|
||||||
@@ -685,6 +691,9 @@ export default function ControlPanel({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
const paste = () => {
|
const paste = () => {
|
||||||
|
if (layout.readonly) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
navigator.clipboard.readText().then((text) => {
|
navigator.clipboard.readText().then((text) => {
|
||||||
let obj = null;
|
let obj = null;
|
||||||
try {
|
try {
|
||||||
@@ -718,6 +727,9 @@ export default function ControlPanel({
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
const cut = () => {
|
const cut = () => {
|
||||||
|
if (layout.readonly) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
copy();
|
copy();
|
||||||
del();
|
del();
|
||||||
};
|
};
|
||||||
@@ -747,10 +759,12 @@ export default function ControlPanel({
|
|||||||
save: {
|
save: {
|
||||||
function: save,
|
function: save,
|
||||||
shortcut: "Ctrl+S",
|
shortcut: "Ctrl+S",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
save_as: {
|
save_as: {
|
||||||
function: saveDiagramAs,
|
function: saveDiagramAs,
|
||||||
shortcut: "Ctrl+Shift+S",
|
shortcut: "Ctrl+Shift+S",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
save_as_template: {
|
save_as_template: {
|
||||||
function: () => {
|
function: () => {
|
||||||
@@ -775,6 +789,7 @@ export default function ControlPanel({
|
|||||||
function: () => {
|
function: () => {
|
||||||
setModal(MODAL.RENAME);
|
setModal(MODAL.RENAME);
|
||||||
},
|
},
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
delete_diagram: {
|
delete_diagram: {
|
||||||
warning: {
|
warning: {
|
||||||
@@ -805,6 +820,7 @@ export default function ControlPanel({
|
|||||||
{
|
{
|
||||||
function: fileImport,
|
function: fileImport,
|
||||||
name: "JSON",
|
name: "JSON",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
function: () => {
|
function: () => {
|
||||||
@@ -812,6 +828,7 @@ export default function ControlPanel({
|
|||||||
setImportFrom(IMPORT_FROM.DBML);
|
setImportFrom(IMPORT_FROM.DBML);
|
||||||
},
|
},
|
||||||
name: "DBML",
|
name: "DBML",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
@@ -824,6 +841,7 @@ export default function ControlPanel({
|
|||||||
setImportDb(DB.MYSQL);
|
setImportDb(DB.MYSQL);
|
||||||
},
|
},
|
||||||
name: "MySQL",
|
name: "MySQL",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
function: () => {
|
function: () => {
|
||||||
@@ -831,6 +849,7 @@ export default function ControlPanel({
|
|||||||
setImportDb(DB.POSTGRES);
|
setImportDb(DB.POSTGRES);
|
||||||
},
|
},
|
||||||
name: "PostgreSQL",
|
name: "PostgreSQL",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
function: () => {
|
function: () => {
|
||||||
@@ -838,6 +857,7 @@ export default function ControlPanel({
|
|||||||
setImportDb(DB.SQLITE);
|
setImportDb(DB.SQLITE);
|
||||||
},
|
},
|
||||||
name: "SQLite",
|
name: "SQLite",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
function: () => {
|
function: () => {
|
||||||
@@ -845,6 +865,7 @@ export default function ControlPanel({
|
|||||||
setImportDb(DB.MARIADB);
|
setImportDb(DB.MARIADB);
|
||||||
},
|
},
|
||||||
name: "MariaDB",
|
name: "MariaDB",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
function: () => {
|
function: () => {
|
||||||
@@ -852,6 +873,7 @@ export default function ControlPanel({
|
|||||||
setImportDb(DB.MSSQL);
|
setImportDb(DB.MSSQL);
|
||||||
},
|
},
|
||||||
name: "MSSQL",
|
name: "MSSQL",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
function: () => {
|
function: () => {
|
||||||
@@ -860,6 +882,7 @@ export default function ControlPanel({
|
|||||||
},
|
},
|
||||||
name: "Oracle",
|
name: "Oracle",
|
||||||
label: "Beta",
|
label: "Beta",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
@@ -868,6 +891,7 @@ export default function ControlPanel({
|
|||||||
|
|
||||||
setModal(MODAL.IMPORT_SRC);
|
setModal(MODAL.IMPORT_SRC);
|
||||||
},
|
},
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
export_source: {
|
export_source: {
|
||||||
...(database === DB.GENERIC && {
|
...(database === DB.GENERIC && {
|
||||||
@@ -1159,10 +1183,12 @@ export default function ControlPanel({
|
|||||||
undo: {
|
undo: {
|
||||||
function: undo,
|
function: undo,
|
||||||
shortcut: "Ctrl+Z",
|
shortcut: "Ctrl+Z",
|
||||||
|
disabled: layout.readOnly || undoStack.length === 0,
|
||||||
},
|
},
|
||||||
redo: {
|
redo: {
|
||||||
function: redo,
|
function: redo,
|
||||||
shortcut: "Ctrl+Y",
|
shortcut: "Ctrl+Y",
|
||||||
|
disabled: layout.readOnly || redoStack.length === 0,
|
||||||
},
|
},
|
||||||
clear: {
|
clear: {
|
||||||
warning: {
|
warning: {
|
||||||
@@ -1194,14 +1220,17 @@ export default function ControlPanel({
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
edit: {
|
edit: {
|
||||||
function: edit,
|
function: edit,
|
||||||
shortcut: "Ctrl+E",
|
shortcut: "Ctrl+E",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
cut: {
|
cut: {
|
||||||
function: cut,
|
function: cut,
|
||||||
shortcut: "Ctrl+X",
|
shortcut: "Ctrl+X",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
copy: {
|
copy: {
|
||||||
function: copy,
|
function: copy,
|
||||||
@@ -1210,14 +1239,17 @@ export default function ControlPanel({
|
|||||||
paste: {
|
paste: {
|
||||||
function: paste,
|
function: paste,
|
||||||
shortcut: "Ctrl+V",
|
shortcut: "Ctrl+V",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
duplicate: {
|
duplicate: {
|
||||||
function: duplicate,
|
function: duplicate,
|
||||||
shortcut: "Ctrl+D",
|
shortcut: "Ctrl+D",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
delete: {
|
delete: {
|
||||||
function: del,
|
function: del,
|
||||||
shortcut: "Del",
|
shortcut: "Del",
|
||||||
|
disabled: layout.readOnly,
|
||||||
},
|
},
|
||||||
copy_as_image: {
|
copy_as_image: {
|
||||||
function: copyAsImage,
|
function: copyAsImage,
|
||||||
@@ -1762,7 +1794,7 @@ export default function ControlPanel({
|
|||||||
// https://stackoverflow.com/a/70976017/1137077
|
// https://stackoverflow.com/a/70976017/1137077
|
||||||
e.target.releasePointerCapture(e.pointerId);
|
e.target.releasePointerCapture(e.pointerId);
|
||||||
}}
|
}}
|
||||||
onClick={() => setModal(MODAL.RENAME)}
|
onClick={!layout.readOnly && (() => setModal(MODAL.RENAME))}
|
||||||
>
|
>
|
||||||
<span>
|
<span>
|
||||||
{(window.name.split(" ")[0] === "t"
|
{(window.name.split(" ")[0] === "t"
|
||||||
@@ -1775,7 +1807,7 @@ export default function ControlPanel({
|
|||||||
</Tag>
|
</Tag>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
{(showEditName || modal === MODAL.RENAME) && <IconEdit />}
|
{(showEditName || modal === MODAL.RENAME) && !layout.readOnly && <IconEdit />}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<div className="flex justify-start text-md select-none me-2">
|
<div className="flex justify-start text-md select-none me-2">
|
||||||
@@ -1804,6 +1836,7 @@ export default function ControlPanel({
|
|||||||
key={i}
|
key={i}
|
||||||
onClick={e.function}
|
onClick={e.function}
|
||||||
className="flex justify-between"
|
className="flex justify-between"
|
||||||
|
disabled={e.disabled}
|
||||||
>
|
>
|
||||||
<span>{e.name}</span>
|
<span>{e.name}</span>
|
||||||
{e.label && (
|
{e.label && (
|
||||||
@@ -1857,6 +1890,7 @@ export default function ControlPanel({
|
|||||||
return (
|
return (
|
||||||
<Dropdown.Item
|
<Dropdown.Item
|
||||||
key={index}
|
key={index}
|
||||||
|
disabled={menu[category][item].disabled}
|
||||||
onClick={menu[category][item].function}
|
onClick={menu[category][item].function}
|
||||||
style={
|
style={
|
||||||
menu[category][item].shortcut && {
|
menu[category][item].shortcut && {
|
||||||
|
@@ -95,6 +95,10 @@ export default function Versions({ open, title, setTitle }) {
|
|||||||
setVersion(sha);
|
setVersion(sha);
|
||||||
setLayout((prev) => ({ ...prev, readOnly: true }));
|
setLayout((prev) => ({ ...prev, readOnly: true }));
|
||||||
|
|
||||||
|
if (!version.data.files[VERSION_FILENAME]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const content = version.data.files[VERSION_FILENAME].content;
|
const content = version.data.files[VERSION_FILENAME].content;
|
||||||
const parsedDiagram = JSON.parse(content);
|
const parsedDiagram = JSON.parse(content);
|
||||||
|
|
||||||
@@ -112,10 +116,11 @@ export default function Versions({ open, title, setTitle }) {
|
|||||||
setEnums(parsedDiagram.enums);
|
setEnums(parsedDiagram.enums);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Toast.error("failed_to_load_diagram");
|
Toast.error(t("failed_to_load_diagram"));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[
|
[
|
||||||
|
t,
|
||||||
gistId,
|
gistId,
|
||||||
setTables,
|
setTables,
|
||||||
setRelationships,
|
setRelationships,
|
||||||
@@ -178,6 +183,11 @@ export default function Versions({ open, title, setTitle }) {
|
|||||||
if (!gistId) return true;
|
if (!gistId) return true;
|
||||||
|
|
||||||
const previousVersion = await get(gistId);
|
const previousVersion = await get(gistId);
|
||||||
|
|
||||||
|
if (!previousVersion.data.files[VERSION_FILENAME]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const previousDiagram = JSON.parse(
|
const previousDiagram = JSON.parse(
|
||||||
previousVersion.data.files[VERSION_FILENAME]?.content,
|
previousVersion.data.files[VERSION_FILENAME]?.content,
|
||||||
);
|
);
|
||||||
@@ -209,7 +219,6 @@ export default function Versions({ open, title, setTitle }) {
|
|||||||
} else {
|
} else {
|
||||||
const id = await create(VERSION_FILENAME, diagramToString());
|
const id = await create(VERSION_FILENAME, diagramToString());
|
||||||
setGistId(id);
|
setGistId(id);
|
||||||
console.log("new gist created", id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete cacheRef[gistId];
|
delete cacheRef[gistId];
|
||||||
@@ -217,7 +226,7 @@ export default function Versions({ open, title, setTitle }) {
|
|||||||
|
|
||||||
await getRevisions();
|
await getRevisions();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Toast.error("failed_to_record_version");
|
Toast.error(t("failed_to_record_version"));
|
||||||
} finally {
|
} finally {
|
||||||
setIsRecording(false);
|
setIsRecording(false);
|
||||||
}
|
}
|
||||||
|
@@ -274,7 +274,8 @@ const en = {
|
|||||||
load_more: "Load more",
|
load_more: "Load more",
|
||||||
clear_cache: "Clear cache",
|
clear_cache: "Clear cache",
|
||||||
cache_cleared: "Cache cleared",
|
cache_cleared: "Cache cleared",
|
||||||
failed_to_record_version: "Failed to record version"
|
failed_to_record_version: "Failed to record version",
|
||||||
|
failed_to_load_diagram: "Failed to load diagram",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user