diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json index 6e623eec4..6c3a95376 100644 --- a/dashboard/package-lock.json +++ b/dashboard/package-lock.json @@ -25,7 +25,7 @@ "jquery": "^3.7.1", "marked": "^15.0.7", "moment-timezone": "^0.5.48", - "pankow": "^2.11.0", + "pankow": "^2.11.1", "sass": "^1.86.0", "vite": "^6.2.3", "vue": "^3.5.13", @@ -2350,9 +2350,9 @@ } }, "node_modules/pankow": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/pankow/-/pankow-2.11.0.tgz", - "integrity": "sha512-kmsWLndbDvrkphJG1fX8IEVV78/RyVmL2IXTmTnp0ypVvS5N7qNcn8Km4bsT8Wao/4GbB6ufUX+/lOdPB1lCug==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/pankow/-/pankow-2.11.1.tgz", + "integrity": "sha512-Hw9fHwcm2v02rts1/2Q0FOGlinCqZb4pm7nL6eHBw1g0NBIYso8Tp8B5fJyX0DtB+zzaZJ9x4BsoDu4za4HmFw==", "license": "ISC", "dependencies": { "@fontsource/inter": "^5.2.5", @@ -4144,9 +4144,9 @@ } }, "pankow": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/pankow/-/pankow-2.11.0.tgz", - "integrity": "sha512-kmsWLndbDvrkphJG1fX8IEVV78/RyVmL2IXTmTnp0ypVvS5N7qNcn8Km4bsT8Wao/4GbB6ufUX+/lOdPB1lCug==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/pankow/-/pankow-2.11.1.tgz", + "integrity": "sha512-Hw9fHwcm2v02rts1/2Q0FOGlinCqZb4pm7nL6eHBw1g0NBIYso8Tp8B5fJyX0DtB+zzaZJ9x4BsoDu4za4HmFw==", "requires": { "@fontsource/inter": "^5.2.5", "@fortawesome/fontawesome-free": "^6.7.2", diff --git a/dashboard/package.json b/dashboard/package.json index 6a4236b7b..2b4107b83 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -26,7 +26,7 @@ "jquery": "^3.7.1", "marked": "^15.0.7", "moment-timezone": "^0.5.48", - "pankow": "^2.11.0", + "pankow": "^2.11.1", "sass": "^1.86.0", "vite": "^6.2.3", "vue": "^3.5.13", diff --git a/dashboard/src/components/InvitationDialog.vue b/dashboard/src/components/InvitationDialog.vue new file mode 100644 index 000000000..a2d3d5298 --- /dev/null +++ b/dashboard/src/components/InvitationDialog.vue @@ -0,0 +1,77 @@ + + + diff --git a/dashboard/src/models/UsersModel.js b/dashboard/src/models/UsersModel.js index 9bd413050..77bbfa494 100644 --- a/dashboard/src/models/UsersModel.js +++ b/dashboard/src/models/UsersModel.js @@ -157,6 +157,17 @@ function create() { if (result.status !== 202) return [result]; return [null]; }, + async inviteLink(id) { + let result; + try { + result = await fetcher.get(`${API_ORIGIN}/api/v1/users/${id}/invite_link`, { access_token: accessToken }); + } catch (e) { + return [e]; + } + + if (result.status !== 200) return [result]; + return [null, result.body.inviteLink]; + }, }; } diff --git a/dashboard/src/views/UsersView.vue b/dashboard/src/views/UsersView.vue index 55f15ce51..ed8b3a416 100644 --- a/dashboard/src/views/UsersView.vue +++ b/dashboard/src/views/UsersView.vue @@ -11,6 +11,7 @@ import Section from '../components/Section.vue'; import UserDialog from '../components/UserDialog.vue'; import GroupDialog from '../components/GroupDialog.vue'; import ImpersonateDialog from '../components/ImpersonateDialog.vue'; +import InvitationDialog from '../components/InvitationDialog.vue'; import PasswordResetDialog from '../components/PasswordResetDialog.vue'; import UsersModel from '../models/UsersModel.js'; import GroupsModel from '../models/GroupsModel.js'; @@ -146,8 +147,9 @@ function onEditOrAddUser(user = null) { userDialog.value.open(user); } +const invitationDialog = useTemplateRef('invitationDialog'); function onInvitation(user) { - // TODO + invitationDialog.value.open(user); } function onEditOrAddGroup(group = null) { @@ -218,6 +220,7 @@ onMounted(async () => { +