mirror of https://github.com/Fabio286/antares.git
feat: copy element names on sidebar from context menu, closes #718
This commit is contained in:
parent
879de91516
commit
f13d4e6dce
|
@ -133,6 +133,7 @@ import BaseIcon from '@/components/BaseIcon.vue';
|
||||||
import BaseVirtualScroll from '@/components/BaseVirtualScroll.vue';
|
import BaseVirtualScroll from '@/components/BaseVirtualScroll.vue';
|
||||||
import { useFilters } from '@/composables/useFilters';
|
import { useFilters } from '@/composables/useFilters';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
|
import { copyText } from '@/libs/copyText';
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
import { HistoryRecord, useHistoryStore } from '@/stores/history';
|
import { HistoryRecord, useHistoryStore } from '@/stores/history';
|
||||||
|
|
||||||
|
@ -173,7 +174,7 @@ watch(searchTerm, () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
const copyQuery = (sql: string) => {
|
const copyQuery = (sql: string) => {
|
||||||
navigator.clipboard.writeText(sql);
|
copyText(sql);
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteQuery = (query: HistoryRecord[]) => {
|
const deleteQuery = (query: HistoryRecord[]) => {
|
||||||
|
|
|
@ -161,6 +161,7 @@ import ModalProcessesListContext from '@/components/ModalProcessesListContext.vu
|
||||||
import ModalProcessesListRow from '@/components/ModalProcessesListRow.vue';
|
import ModalProcessesListRow from '@/components/ModalProcessesListRow.vue';
|
||||||
import { useFocusTrap } from '@/composables/useFocusTrap';
|
import { useFocusTrap } from '@/composables/useFocusTrap';
|
||||||
import Schema from '@/ipc-api/Schema';
|
import Schema from '@/ipc-api/Schema';
|
||||||
|
import { copyText } from '@/libs/copyText';
|
||||||
import { useConnectionsStore } from '@/stores/connections';
|
import { useConnectionsStore } from '@/stores/connections';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
|
|
||||||
|
@ -322,13 +323,13 @@ const closeContext = () => {
|
||||||
const copyCell = () => {
|
const copyCell = () => {
|
||||||
const row = results.value.find(row => Number(row.id) === selectedRow.value);
|
const row = results.value.find(row => Number(row.id) === selectedRow.value);
|
||||||
const valueToCopy = row[selectedCell.value.field];
|
const valueToCopy = row[selectedCell.value.field];
|
||||||
navigator.clipboard.writeText(valueToCopy);
|
copyText(valueToCopy);
|
||||||
};
|
};
|
||||||
|
|
||||||
const copyRow = () => {
|
const copyRow = () => {
|
||||||
const row = results.value.find(row => Number(row.id) === selectedRow.value);
|
const row = results.value.find(row => Number(row.id) === selectedRow.value);
|
||||||
const rowToCopy = JSON.parse(JSON.stringify(row));
|
const rowToCopy = JSON.parse(JSON.stringify(row));
|
||||||
navigator.clipboard.writeText(JSON.stringify(rowToCopy));
|
copyText(JSON.stringify(rowToCopy));
|
||||||
};
|
};
|
||||||
|
|
||||||
const closeModal = () => emit('close');
|
const closeModal = () => emit('close');
|
||||||
|
|
|
@ -15,6 +15,14 @@
|
||||||
:size="18"
|
:size="18"
|
||||||
/> {{ t('connection.disconnect') }}</span>
|
/> {{ t('connection.disconnect') }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="context-element" @click.stop="showAppearanceModal">
|
||||||
|
<span class="d-flex">
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light mt-1 mr-1"
|
||||||
|
icon-name="mdiBrushVariant"
|
||||||
|
:size="18"
|
||||||
|
/> {{ t('application.appearance') }}</span>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="!contextConnection.isFolder"
|
v-if="!contextConnection.isFolder"
|
||||||
class="context-element"
|
class="context-element"
|
||||||
|
@ -27,14 +35,6 @@
|
||||||
:size="18"
|
:size="18"
|
||||||
/> {{ t('general.duplicate') }}</span>
|
/> {{ t('general.duplicate') }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="context-element" @click.stop="showAppearanceModal">
|
|
||||||
<span class="d-flex">
|
|
||||||
<BaseIcon
|
|
||||||
class="text-light mt-1 mr-1"
|
|
||||||
icon-name="mdiBrushVariant"
|
|
||||||
:size="18"
|
|
||||||
/> {{ t('application.appearance') }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="context-element" @click="showConfirmModal">
|
<div class="context-element" @click="showConfirmModal">
|
||||||
<span class="d-flex">
|
<span class="d-flex">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
|
|
|
@ -55,6 +55,14 @@
|
||||||
/> {{ t('general.disable') }}
|
/> {{ t('general.disable') }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="context-element" @click="copyName(selectedMisc.name)">
|
||||||
|
<span class="d-flex">
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light mt-1 mr-1"
|
||||||
|
icon-name="mdiContentCopy"
|
||||||
|
:size="18"
|
||||||
|
/> {{ t('general.copyName') }}</span>
|
||||||
|
</div>
|
||||||
<div class="context-element" @click="showDeleteModal">
|
<div class="context-element" @click="showDeleteModal">
|
||||||
<span class="d-flex">
|
<span class="d-flex">
|
||||||
<BaseIcon
|
<BaseIcon
|
||||||
|
@ -108,6 +116,7 @@ import Functions from '@/ipc-api/Functions';
|
||||||
import Routines from '@/ipc-api/Routines';
|
import Routines from '@/ipc-api/Routines';
|
||||||
import Schedulers from '@/ipc-api/Schedulers';
|
import Schedulers from '@/ipc-api/Schedulers';
|
||||||
import Triggers from '@/ipc-api/Triggers';
|
import Triggers from '@/ipc-api/Triggers';
|
||||||
|
import { copyText } from '@/libs/copyText';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
|
||||||
|
@ -163,6 +172,11 @@ const deleteMessage = computed(() => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const copyName = (name: string) => {
|
||||||
|
copyText(name);
|
||||||
|
closeContext();
|
||||||
|
};
|
||||||
|
|
||||||
const showDeleteModal = () => {
|
const showDeleteModal = () => {
|
||||||
isDeleteModal.value = true;
|
isDeleteModal.value = true;
|
||||||
};
|
};
|
||||||
|
|
|
@ -102,6 +102,14 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="context-element" @click="copyName(selectedSchema)">
|
||||||
|
<span class="d-flex">
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light mt-1 mr-1"
|
||||||
|
icon-name="mdiContentCopy"
|
||||||
|
:size="18"
|
||||||
|
/> {{ t('general.copyName') }}</span>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="workspace.customizations.schemaExport"
|
v-if="workspace.customizations.schemaExport"
|
||||||
class="context-element"
|
class="context-element"
|
||||||
|
@ -198,6 +206,7 @@ import ModalEditSchema from '@/components/ModalEditSchema.vue';
|
||||||
import ModalImportSchema from '@/components/ModalImportSchema.vue';
|
import ModalImportSchema from '@/components/ModalImportSchema.vue';
|
||||||
import Application from '@/ipc-api/Application';
|
import Application from '@/ipc-api/Application';
|
||||||
import Schema from '@/ipc-api/Schema';
|
import Schema from '@/ipc-api/Schema';
|
||||||
|
import { copyText } from '@/libs/copyText';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useSchemaExportStore } from '@/stores/schemaExport';
|
import { useSchemaExportStore } from '@/stores/schemaExport';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
@ -268,6 +277,11 @@ const openCreateSchedulerTab = () => {
|
||||||
emit('open-create-scheduler-tab');
|
emit('open-create-scheduler-tab');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const copyName = (name: string) => {
|
||||||
|
copyText(name);
|
||||||
|
closeContext();
|
||||||
|
};
|
||||||
|
|
||||||
const showDeleteModal = () => {
|
const showDeleteModal = () => {
|
||||||
isDeleteModal.value = true;
|
isDeleteModal.value = true;
|
||||||
};
|
};
|
||||||
|
|
|
@ -15,6 +15,14 @@
|
||||||
:size="18"
|
:size="18"
|
||||||
/> {{ t('application.settings') }}</span>
|
/> {{ t('application.settings') }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="context-element" @click="copyName(selectedTable.name)">
|
||||||
|
<span class="d-flex">
|
||||||
|
<BaseIcon
|
||||||
|
class="text-light mt-1 mr-1"
|
||||||
|
icon-name="mdiContentCopy"
|
||||||
|
:size="18"
|
||||||
|
/> {{ t('general.copyName') }}</span>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="selectedTable && selectedTable.type === 'table' && customizations.schemaExport"
|
v-if="selectedTable && selectedTable.type === 'table' && customizations.schemaExport"
|
||||||
class="context-element"
|
class="context-element"
|
||||||
|
@ -130,6 +138,7 @@ import ConfirmModal from '@/components/BaseConfirmModal.vue';
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
import BaseIcon from '@/components/BaseIcon.vue';
|
import BaseIcon from '@/components/BaseIcon.vue';
|
||||||
import Tables from '@/ipc-api/Tables';
|
import Tables from '@/ipc-api/Tables';
|
||||||
|
import { copyText } from '@/libs/copyText';
|
||||||
import { useNotificationsStore } from '@/stores/notifications';
|
import { useNotificationsStore } from '@/stores/notifications';
|
||||||
import { useSchemaExportStore } from '@/stores/schemaExport';
|
import { useSchemaExportStore } from '@/stores/schemaExport';
|
||||||
import { useWorkspacesStore } from '@/stores/workspaces';
|
import { useWorkspacesStore } from '@/stores/workspaces';
|
||||||
|
@ -170,6 +179,11 @@ const showTableExportModal = () => {
|
||||||
closeContext();
|
closeContext();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const copyName = (name: string) => {
|
||||||
|
copyText(name);
|
||||||
|
closeContext();
|
||||||
|
};
|
||||||
|
|
||||||
const showDeleteModal = () => {
|
const showDeleteModal = () => {
|
||||||
isDeleteModal.value = true;
|
isDeleteModal.value = true;
|
||||||
};
|
};
|
||||||
|
|
|
@ -52,6 +52,7 @@ import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
import BaseContextMenu from '@/components/BaseContextMenu.vue';
|
||||||
import BaseIcon from '@/components/BaseIcon.vue';
|
import BaseIcon from '@/components/BaseIcon.vue';
|
||||||
|
import { copyText } from '@/libs/copyText';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { useConsoleStore } from '@/stores/console';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
@ -100,7 +101,7 @@ const contextMenu = (event: MouseEvent, wLog: {date: Date; sql: string}) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const copyQuery = () => {
|
const copyQuery = () => {
|
||||||
navigator.clipboard.writeText(contextQuery.value);
|
copyText(contextQuery.value);
|
||||||
isContext.value = false;
|
isContext.value = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -270,6 +270,7 @@ import BaseSelect from '@/components/BaseSelect.vue';
|
||||||
import BaseVirtualScroll from '@/components/BaseVirtualScroll.vue';
|
import BaseVirtualScroll from '@/components/BaseVirtualScroll.vue';
|
||||||
import TableContext from '@/components/WorkspaceTabQueryTableContext.vue';
|
import TableContext from '@/components/WorkspaceTabQueryTableContext.vue';
|
||||||
import WorkspaceTabQueryTableRow from '@/components/WorkspaceTabQueryTableRow.vue';
|
import WorkspaceTabQueryTableRow from '@/components/WorkspaceTabQueryTableRow.vue';
|
||||||
|
import { copyText } from '@/libs/copyText';
|
||||||
import { unproxify } from '@/libs/unproxify';
|
import { unproxify } from '@/libs/unproxify';
|
||||||
import { useConsoleStore } from '@/stores/console';
|
import { useConsoleStore } from '@/stores/console';
|
||||||
import { useSettingsStore } from '@/stores/settings';
|
import { useSettingsStore } from '@/stores/settings';
|
||||||
|
@ -571,7 +572,7 @@ const copyCell = () => {
|
||||||
let valueToCopy = row[cellName];
|
let valueToCopy = row[cellName];
|
||||||
if (typeof valueToCopy === 'object')
|
if (typeof valueToCopy === 'object')
|
||||||
valueToCopy = JSON.stringify(valueToCopy);
|
valueToCopy = JSON.stringify(valueToCopy);
|
||||||
navigator.clipboard.writeText(valueToCopy);
|
copyText(valueToCopy);
|
||||||
};
|
};
|
||||||
|
|
||||||
const copyRow = (format: string) => {
|
const copyRow = (format: string) => {
|
||||||
|
@ -593,7 +594,7 @@ const copyRow = (format: string) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format === 'json')
|
if (format === 'json')
|
||||||
navigator.clipboard.writeText(JSON.stringify(contentToCopy));
|
copyText(JSON.stringify(contentToCopy));
|
||||||
else if (format === 'sql') {
|
else if (format === 'sql') {
|
||||||
if (!Array.isArray(contentToCopy)) contentToCopy = [contentToCopy];
|
if (!Array.isArray(contentToCopy)) contentToCopy = [contentToCopy];
|
||||||
|
|
||||||
|
@ -605,7 +606,7 @@ const copyRow = (format: string) => {
|
||||||
},
|
},
|
||||||
table: getTable(resultsetIndex.value)
|
table: getTable(resultsetIndex.value)
|
||||||
});
|
});
|
||||||
navigator.clipboard.writeText(sqlInserts);
|
copyText(sqlInserts);
|
||||||
}
|
}
|
||||||
else if (format === 'csv') {
|
else if (format === 'csv') {
|
||||||
const csv = [];
|
const csv = [];
|
||||||
|
@ -617,7 +618,7 @@ const copyRow = (format: string) => {
|
||||||
for (const row of contentToCopy)
|
for (const row of contentToCopy)
|
||||||
csv.push(Object.values(row).map(col => typeof col === 'string' ? `"${col}"` : col).join(';'));
|
csv.push(Object.values(row).map(col => typeof col === 'string' ? `"${col}"` : col).join(';'));
|
||||||
|
|
||||||
navigator.clipboard.writeText(csv.join('\n'));
|
copyText(csv.join('\n'));
|
||||||
}
|
}
|
||||||
else if (format === 'html') {
|
else if (format === 'html') {
|
||||||
const arrayContent = new Array<string[]>();
|
const arrayContent = new Array<string[]>();
|
||||||
|
@ -640,7 +641,7 @@ const copyRow = (format: string) => {
|
||||||
if (!Array.isArray(contentToCopy)) contentToCopy = [contentToCopy];
|
if (!Array.isArray(contentToCopy)) contentToCopy = [contentToCopy];
|
||||||
const printer = json2php.make({ linebreak: '\n', indent: '\t', shortArraySyntax: true });
|
const printer = json2php.make({ linebreak: '\n', indent: '\t', shortArraySyntax: true });
|
||||||
const phpString = printer(contentToCopy);
|
const phpString = printer(contentToCopy);
|
||||||
navigator.clipboard.writeText(phpString);
|
copyText(phpString);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -878,7 +879,7 @@ const onKey = async (e: KeyboardEvent) => {
|
||||||
const copyType = defaultCopyType.value;
|
const copyType = defaultCopyType.value;
|
||||||
if (selectedRows.value.length >= 1) {
|
if (selectedRows.value.length >= 1) {
|
||||||
if (selectedRows.value.length === 1 && copyType === 'cell')
|
if (selectedRows.value.length === 1 && copyType === 'cell')
|
||||||
await navigator.clipboard.writeText(scrollElement.value.querySelector('.td.selected').innerText);
|
await copyText(scrollElement.value.querySelector('.td.selected').innerText);
|
||||||
else if (selectedRows.value.length > 1 && copyType === 'cell')
|
else if (selectedRows.value.length > 1 && copyType === 'cell')
|
||||||
copyRow('html');
|
copyRow('html');
|
||||||
else
|
else
|
||||||
|
|
|
@ -65,7 +65,8 @@ export const enUS = {
|
||||||
actionSuccessful: '{action} successful',
|
actionSuccessful: '{action} successful',
|
||||||
outputFormat: 'Output format',
|
outputFormat: 'Output format',
|
||||||
singleFile: 'Single {ext} file',
|
singleFile: 'Single {ext} file',
|
||||||
zipCompressedFile: 'ZIP compressed {ext} file'
|
zipCompressedFile: 'ZIP compressed {ext} file',
|
||||||
|
copyName: 'Copy name'
|
||||||
},
|
},
|
||||||
connection: { // Database connection
|
connection: { // Database connection
|
||||||
connectionName: 'Connection name',
|
connectionName: 'Connection name',
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
/**
|
||||||
|
* Copy a string on clipboard
|
||||||
|
* @param text
|
||||||
|
*/
|
||||||
|
export const copyText = (text: string) => {
|
||||||
|
navigator.clipboard.writeText(text);
|
||||||
|
};
|
Loading…
Reference in New Issue