mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-23 20:45:59 +00:00
cloud fixes
This commit is contained in:
@@ -70,7 +70,10 @@ module.exports = {
|
|||||||
|
|
||||||
grantFolder_meta: true,
|
grantFolder_meta: true,
|
||||||
async grantFolder({ inviteLink }) {
|
async grantFolder({ inviteLink }) {
|
||||||
const m = inviteLink.match(/^dbgate\:\/\/folder\/v1\/([a-zA-Z]+)\?mode=(read|write|admin)$/);
|
const m = inviteLink.match(/^dbgate\:\/\/folder\/v1\/([a-zA-Z0-9]+)\?mode=(read|write|admin)$/);
|
||||||
|
if (!m) {
|
||||||
|
throw new Error('Invalid invite link format');
|
||||||
|
}
|
||||||
const invite = m[1];
|
const invite = m[1];
|
||||||
const mode = m[2];
|
const mode = m[2];
|
||||||
|
|
||||||
@@ -93,6 +96,12 @@ module.exports = {
|
|||||||
return resp;
|
return resp;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getInviteToken_meta: true,
|
||||||
|
async getInviteToken({ folid, role }) {
|
||||||
|
const resp = await callCloudApiGet(`invite-token/${folid}/${role}`);
|
||||||
|
return resp;
|
||||||
|
},
|
||||||
|
|
||||||
refreshContent_meta: true,
|
refreshContent_meta: true,
|
||||||
async refreshContent() {
|
async refreshContent() {
|
||||||
socket.emitChanged('cloud-content-changed');
|
socket.emitChanged('cloud-content-changed');
|
||||||
|
|||||||
@@ -56,13 +56,15 @@ function startCloudTokenChecking(sid, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// console.log(`Checking cloud token for session: ${DBGATE_IDENTITY_URL}/api/get-token/${sid}`);
|
||||||
const resp = await axios.default.get(`${DBGATE_IDENTITY_URL}/api/get-token/${sid}`, {
|
const resp = await axios.default.get(`${DBGATE_IDENTITY_URL}/api/get-token/${sid}`, {
|
||||||
headers: {
|
headers: {
|
||||||
...getLicenseHttpHeaders(),
|
...getLicenseHttpHeaders(),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
// console.log('CHECK RESP:', resp.data);
|
||||||
|
|
||||||
if (resp.data.status == 'ok') {
|
if (resp.data.email) {
|
||||||
clearInterval(interval);
|
clearInterval(interval);
|
||||||
callback(resp.data);
|
callback(resp.data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
import { showModal } from '../modals/modalTools';
|
import { showModal } from '../modals/modalTools';
|
||||||
import InputTextModal from '../modals/InputTextModal.svelte';
|
import InputTextModal from '../modals/InputTextModal.svelte';
|
||||||
import ConfirmModal from '../modals/ConfirmModal.svelte';
|
import ConfirmModal from '../modals/ConfirmModal.svelte';
|
||||||
|
import { showSnackbarInfo } from '../utility/snackbar';
|
||||||
|
|
||||||
let publicFilter = '';
|
let publicFilter = '';
|
||||||
let cloudFilter = '';
|
let cloudFilter = '';
|
||||||
@@ -56,9 +57,10 @@
|
|||||||
|
|
||||||
return data;
|
return data;
|
||||||
});
|
});
|
||||||
$: contentGroupTitleMap = _.fromPairs(($cloudContentList || []).map(x => [x.folid, x.name]));
|
$: contentGroupMap = _.keyBy($cloudContentList || [], x => x.folid);
|
||||||
|
|
||||||
// $: console.log('cloudContentFlat', cloudContentFlat);
|
// $: console.log('cloudContentFlat', cloudContentFlat);
|
||||||
|
// $: console.log('contentGroupMap', contentGroupMap);
|
||||||
|
|
||||||
async function handleRefreshContent() {
|
async function handleRefreshContent() {
|
||||||
await apiCall('cloud/refresh-content');
|
await apiCall('cloud/refresh-content');
|
||||||
@@ -115,7 +117,7 @@
|
|||||||
function createGroupContextMenu(folder) {
|
function createGroupContextMenu(folder) {
|
||||||
const handleRename = () => {
|
const handleRename = () => {
|
||||||
showModal(InputTextModal, {
|
showModal(InputTextModal, {
|
||||||
value: contentGroupTitleMap[folder],
|
value: contentGroupMap[folder]?.name,
|
||||||
label: 'New folder name',
|
label: 'New folder name',
|
||||||
header: 'Rename folder',
|
header: 'Rename folder',
|
||||||
onConfirm: async name => {
|
onConfirm: async name => {
|
||||||
@@ -129,7 +131,7 @@
|
|||||||
|
|
||||||
const handleDelete = () => {
|
const handleDelete = () => {
|
||||||
showModal(ConfirmModal, {
|
showModal(ConfirmModal, {
|
||||||
message: `Really delete folder ${contentGroupTitleMap[folder]}? All folder content will be deleted!`,
|
message: `Really delete folder ${contentGroupMap[folder]?.name}? All folder content will be deleted!`,
|
||||||
header: 'Delete folder',
|
header: 'Delete folder',
|
||||||
onConfirm: () => {
|
onConfirm: () => {
|
||||||
apiCall('cloud/delete-folder', {
|
apiCall('cloud/delete-folder', {
|
||||||
@@ -139,9 +141,39 @@
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleCopyInviteLink = async role => {
|
||||||
|
const { inviteToken } = await apiCall(`cloud/get-invite-token`, {
|
||||||
|
folid: folder,
|
||||||
|
role,
|
||||||
|
});
|
||||||
|
const inviteLink = `dbgate://folder/v1/${inviteToken}?mode=${role}`;
|
||||||
|
navigator.clipboard.writeText(inviteLink);
|
||||||
|
showSnackbarInfo(`Invite link (${role}) copied to clipboard`);
|
||||||
|
};
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
contentGroupMap[folder]?.role == 'admin' && [
|
||||||
{ text: 'Rename', onClick: handleRename },
|
{ text: 'Rename', onClick: handleRename },
|
||||||
{ text: 'Delete', onClick: handleDelete },
|
{ text: 'Delete', onClick: handleDelete },
|
||||||
|
],
|
||||||
|
contentGroupMap[folder]?.role == 'admin' &&
|
||||||
|
!contentGroupMap[folder]?.isPrivate && {
|
||||||
|
text: 'Copy invite link',
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
text: 'Admin',
|
||||||
|
onClick: () => handleCopyInviteLink('admin'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Write',
|
||||||
|
onClick: () => handleCopyInviteLink('write'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Read',
|
||||||
|
onClick: () => handleCopyInviteLink('read'),
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -172,7 +204,7 @@
|
|||||||
module={cloudContentAppObject}
|
module={cloudContentAppObject}
|
||||||
emptyGroupNames={emptyCloudContent}
|
emptyGroupNames={emptyCloudContent}
|
||||||
groupFunc={data => data.folid}
|
groupFunc={data => data.folid}
|
||||||
mapGroupTitle={folid => contentGroupTitleMap[folid]}
|
mapGroupTitle={folid => contentGroupMap[folid]?.name}
|
||||||
filter={publicFilter}
|
filter={publicFilter}
|
||||||
subItemsComponent={() => SubCloudItemsList}
|
subItemsComponent={() => SubCloudItemsList}
|
||||||
expandIconFunc={plusExpandIcon}
|
expandIconFunc={plusExpandIcon}
|
||||||
|
|||||||
Reference in New Issue
Block a user