disable menubar items when in read only mode

This commit is contained in:
1ilit
2025-08-24 21:06:50 +04:00
parent 35941d245f
commit dc29d9b0ad
3 changed files with 50 additions and 6 deletions

View File

@@ -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 && {

View File

@@ -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);
} }

View File

@@ -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",
}, },
}; };