diff --git a/app/Policies/OAuthProviderPolicy.php b/app/Policies/OAuthProviderPolicy.php
index e3b0dce9..1102ee29 100644
--- a/app/Policies/OAuthProviderPolicy.php
+++ b/app/Policies/OAuthProviderPolicy.php
@@ -2,6 +2,7 @@
namespace App\Policies;
+use App\Models\Integration\FormIntegration;
use App\Models\OAuthProvider;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
@@ -57,6 +58,10 @@ class OAuthProviderPolicy
*/
public function delete(User $user, OAuthProvider $provider)
{
+ $integrations = FormIntegration::where('oauth_id', $provider->id)->get();
+ if ($integrations->count() > 0) {
+ return $this->denyWithStatus(400, 'This connection cannot be removed because there is already an integration using it.');
+ }
return $provider->user()->is($user);
}
diff --git a/client/components/open/integrations/components/GoogleSheetsIntegrationActions.vue b/client/components/open/integrations/components/GoogleSheetsIntegrationActions.vue
index 6679a666..a6fa81fd 100644
--- a/client/components/open/integrations/components/GoogleSheetsIntegrationActions.vue
+++ b/client/components/open/integrations/components/GoogleSheetsIntegrationActions.vue
@@ -14,7 +14,10 @@
-
+
diff --git a/client/components/open/integrations/components/IntegrationCard.vue b/client/components/open/integrations/components/IntegrationCard.vue
index efd4ac4f..da84f11b 100644
--- a/client/components/open/integrations/components/IntegrationCard.vue
+++ b/client/components/open/integrations/components/IntegrationCard.vue
@@ -37,6 +37,7 @@
:is="actionsComponent"
v-if="actionsComponent"
:integration="integration"
+ :form="form"
/>
@@ -87,6 +87,7 @@ const props = defineProps({
})
const providersStore = useOAuthProvidersStore()
+const service = computed(() => providersStore.getService(props.provider?.provider))
const alert = useAlert()
function disconnect() {
diff --git a/client/components/settings/ProviderModal.vue b/client/components/settings/ProviderModal.vue
index 4ca6ac5f..7b355eed 100644
--- a/client/components/settings/ProviderModal.vue
+++ b/client/components/settings/ProviderModal.vue
@@ -65,15 +65,7 @@ defineProps({
const emit = defineEmits(['close'])
const providersStore = useOAuthProvidersStore()
-
-const services = [
- {
- name: 'google',
- title: 'Google',
- icon: 'mdi:google',
- enabled: true
- },
-]
+const services = computed(() => providersStore.services)
function connect(service) {
providersStore.connect(service.name)
diff --git a/client/pages/forms/[slug]/show.vue b/client/pages/forms/[slug]/show.vue
index 7c7f250b..056c8771 100644
--- a/client/pages/forms/[slug]/show.vue
+++ b/client/pages/forms/[slug]/show.vue
@@ -200,7 +200,7 @@
class="mr-6"
>
@@ -277,18 +277,22 @@ const tabsList = [
{
name: "Submissions",
route: "forms-slug-show-submissions",
+ params: { 'slug': slug }
},
{
name: "Integrations",
route: "forms-slug-show-integrations",
+ params: { 'slug': slug }
},
{
name: "Analytics",
route: "forms-slug-show-stats",
+ params: { 'slug': slug }
},
{
name: "Share",
route: "forms-slug-show-share",
+ params: { 'slug': slug }
},
]
diff --git a/client/stores/oauth_providers.js b/client/stores/oauth_providers.js
index 126107a8..9ed53ad9 100644
--- a/client/stores/oauth_providers.js
+++ b/client/stores/oauth_providers.js
@@ -7,6 +7,21 @@ export const useOAuthProvidersStore = defineStore("oauth_providers", () => {
const contentStore = useContentStore()
const alert = useAlert()
+ const services = computed(() => {
+ return [
+ {
+ name: 'google',
+ title: 'Google',
+ icon: 'mdi:google',
+ enabled: true
+ }
+ ]
+ })
+
+ const getService = (service) => {
+ return services.value.find((item) => item.name === service)
+ }
+
const fetchOAuthProviders = () => {
contentStore.resetState()
contentStore.startLoading()
@@ -50,6 +65,8 @@ export const useOAuthProvidersStore = defineStore("oauth_providers", () => {
return {
...contentStore,
+ services,
+ getService,
fetchOAuthProviders,
providers,
connect