Team functionality (#459)

* add api enpoints for adding, removing, updating user to workspace and leaving workspace

* feat: updates client site workspace settings

* refactor and add domain setting ui in modal

* move workspace user functionality to its own component

* adds tests

* fix linting

* updates select input to FlatSelectInput

* moves workspace user role edit to seperated component

* move user adding to its own component

* adds check to usure users exist before checking is admin

* fix loading users

* feat: invite user to team functionality

* fix token coulmn

* fix self host mode changes

* tests for  user invite

* Refactor back-end

* Rename variables

* Improve some styling elements + refactor workspace settings

* More styling

* More UI polishing

* More UI fixes

* PHP linting

* Implemented most of the logic for team-functionnality

* Fix user avatar URL

* WIP remove users on cancellation

* Finished pricing for team functionality

* Fix tests

* Fix linting

* Added pricing_enabled helper

* Fix pricing_enabled shortcut

* Debug CI

* Disable pricing when testing

---------

Co-authored-by: LL-Etiane <lukongleinyuyetiane@gmail.com>
Co-authored-by: Lukong Etiane <83535251+LL-Etiane@users.noreply.github.com>
Co-authored-by: Julien Nahum <julien@nahum.net>
This commit is contained in:
Favour Olayinka
2024-07-04 16:21:36 +01:00
committed by GitHub
parent 383fff7b2c
commit 90ff91b1e9
64 changed files with 2503 additions and 596 deletions

View File

@@ -13,11 +13,11 @@
namespace App\Models\Billing{
/**
* App\Models\Billing\Subscription
*
*
* @property int $id
* @property int $user_id
* @property string $name
* @property string $type
* @property string $stripe_id
* @property string $stripe_status
* @property string|null $stripe_price
@@ -32,14 +32,12 @@ namespace App\Models\Billing{
* @property-read \App\Models\User|null $user
* @method static \Illuminate\Database\Eloquent\Builder|Subscription active()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription canceled()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription cancelled()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription ended()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription expiredTrial()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription incomplete()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription notCanceled()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription notCancelled()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription notOnGracePeriod()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription notOnTrial()
* @method static \Illuminate\Database\Eloquent\Builder|Subscription onGracePeriod()
@@ -50,12 +48,12 @@ namespace App\Models\Billing{
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereEndsAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereQuantity($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereStripeId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereStripePrice($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereStripeStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereTrialEndsAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Subscription whereUserId($value)
*/
@@ -64,12 +62,12 @@ namespace App\Models\Billing{
namespace App\Models\Forms\AI{
/**
* App\Models\Forms\AI\AiFormCompletion
*
*
* @property int $id
* @property string $form_prompt
* @property string $status
* @property mixed|null $result
* @property string|null $result
* @property string $ip
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
@@ -89,7 +87,7 @@ namespace App\Models\Forms\AI{
namespace App\Models\Forms{
/**
* App\Models\Forms\Form
*
*
* @property int $id
* @property int $workspace_id
@@ -98,7 +96,6 @@ namespace App\Models\Forms{
* @property array $properties
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property bool $notifies
* @property string|null $description
* @property string $submit_button_text
* @property bool $re_fillable
@@ -109,43 +106,35 @@ namespace App\Models\Forms{
* @property bool $hide_title
* @property string $submitted_text
* @property string $dark_mode
* @property string|null $webhook_url
* @property bool $send_submission_confirmation
* @property string|null $logo_picture
* @property string|null $cover_picture
* @property string|null $redirect_url
* @property string|null $custom_code
* @property string|null $notification_emails
* @property string $theme
* @property array|null $database_fields_update
* @property string $width
* @property bool $transparent_background
* @property \Illuminate\Support\Carbon|null $closes_at
* @property string|null $closed_text
* @property string $notification_subject
* @property string $notification_body
* @property bool $notifications_include_submission
* @property bool $use_captcha
* @property bool $can_be_indexed
* @property string|null $password
* @property string $notification_sender
* @property array|null $tags
* @property array $tags
* @property \Illuminate\Support\Carbon|null $deleted_at
* @property int $creator_id
* @property-read array|null $removed_properties
* @property-read array $removed_properties
* @property int|null $max_submissions_count
* @property string|null $max_submissions_reached_text
* @property string|null $slack_webhook_url
* @property string $visibility
* @property bool $editable_submissions
* @property string|null $discord_webhook_url
* @property string $editable_submissions_button_text
* @property bool $confetti_on_submission
* @property object $seo_meta
* @property object|null $notification_settings
* @property bool $auto_save
* @property string|null $custom_domain
* @property bool $show_progress_bar
* @property string $size
* @property string $border_radius
* @property-read \App\Models\User $creator
* @property-read mixed $edit_url
* @property-read mixed $form_pending_submission_key
@@ -154,12 +143,11 @@ namespace App\Models\Forms{
* @property-read mixed $is_pro
* @property-read mixed $max_file_size
* @property-read mixed $max_number_of_submissions_reached
* @property-read mixed $notifies_discord
* @property-read mixed $notifies_slack
* @property-read mixed $notifies_webhook
* @property-read mixed $share_url
* @property-read int|null $submissions_count
* @property-read int|null $views_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Integration\FormIntegration> $integrations
* @property-read int|null $integrations_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Forms\FormStatistic> $statistics
* @property-read int|null $statistics_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Forms\FormSubmission> $submissions
@@ -173,6 +161,7 @@ namespace App\Models\Forms{
* @method static \Illuminate\Database\Eloquent\Builder|Form onlyTrashed()
* @method static \Illuminate\Database\Eloquent\Builder|Form query()
* @method static \Illuminate\Database\Eloquent\Builder|Form whereAutoSave($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereBorderRadius($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereCanBeIndexed($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereClosedText($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereClosesAt($value)
@@ -187,7 +176,6 @@ namespace App\Models\Forms{
* @method static \Illuminate\Database\Eloquent\Builder|Form whereDatabaseFieldsUpdate($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereDeletedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereDescription($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereDiscordWebhookUrl($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereEditableSubmissions($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereEditableSubmissionsButtonText($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereHideTitle($value)
@@ -196,23 +184,15 @@ namespace App\Models\Forms{
* @method static \Illuminate\Database\Eloquent\Builder|Form whereMaxSubmissionsCount($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereMaxSubmissionsReachedText($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereNoBranding($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereNotificationBody($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereNotificationEmails($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereNotificationSender($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereNotificationSettings($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereNotificationSubject($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereNotificationsIncludeSubmission($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereNotifies($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form wherePassword($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereProperties($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereReFillButtonText($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereReFillable($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereRedirectUrl($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereRemovedProperties($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereSendSubmissionConfirmation($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereSeoMeta($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereShowProgressBar($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereSlackWebhookUrl($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereSize($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereSlug($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereSubmitButtonText($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereSubmittedText($value)
@@ -224,7 +204,6 @@ namespace App\Models\Forms{
* @method static \Illuminate\Database\Eloquent\Builder|Form whereUppercaseLabels($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereUseCaptcha($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereVisibility($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereWebhookUrl($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereWidth($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form whereWorkspaceId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Form withTrashed()
@@ -235,7 +214,7 @@ namespace App\Models\Forms{
namespace App\Models\Forms{
/**
* App\Models\Forms\FormStatistic
*
*
* @property int $id
* @property int $form_id
@@ -255,7 +234,7 @@ namespace App\Models\Forms{
namespace App\Models\Forms{
/**
* App\Models\Forms\FormSubmission
*
*
* @property int $id
* @property int $form_id
@@ -277,7 +256,7 @@ namespace App\Models\Forms{
namespace App\Models\Forms{
/**
* App\Models\Forms\FormView
*
*
* @property int $id
* @property int $form_id
@@ -297,7 +276,7 @@ namespace App\Models\Forms{
namespace App\Models\Integration{
/**
* App\Models\Integration\FormIntegration
*
*
* @property int $id
* @property int $form_id
@@ -311,6 +290,8 @@ namespace App\Models\Integration{
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Integration\FormIntegrationsEvent> $events
* @property-read int|null $events_count
* @property-read \App\Models\Forms\Form|null $form
* @property-read \App\Models\OAuthProvider|null $provider
* @method static \Database\Factories\Integration\FormIntegrationFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder|FormIntegration newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|FormIntegration newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|FormIntegration query()
@@ -329,7 +310,7 @@ namespace App\Models\Integration{
namespace App\Models\Integration{
/**
* App\Models\Integration\FormIntegrationsEvent
*
*
* @property int $id
* @property int $integration_id
@@ -353,7 +334,7 @@ namespace App\Models\Integration{
namespace App\Models\Integration{
/**
* App\Models\Integration\FormZapierWebhook
*
*
* @property int $id
* @property int $form_id
@@ -380,7 +361,7 @@ namespace App\Models\Integration{
namespace App\Models{
/**
* App\Models\License
*
*
* @property int $id
* @property string $license_key
@@ -392,6 +373,7 @@ namespace App\Models{
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read int|null $custom_domain_limit_count
* @property-read int $max_file_size
* @property-read int|null $max_users_count
* @property-read \App\Models\User|null $user
* @method static \Illuminate\Database\Eloquent\Builder|License active()
* @method static \Illuminate\Database\Eloquent\Builder|License newModelQuery()
@@ -411,26 +393,33 @@ namespace App\Models{
namespace App\Models{
/**
* App\Models\OAuthProvider
*
*
* @property int $id
* @property int $user_id
* @property string $provider
* @property \App\Integrations\OAuth\OAuthProviderService $provider
* @property string $provider_user_id
* @property string|null $access_token
* @property string|null $refresh_token
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property string|null $email
* @property string|null $name
* @property \Illuminate\Support\Carbon|null $token_expires_at
* @property-read \App\Models\User $user
* @method static \Database\Factories\OAuthProviderFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider query()
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereAccessToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereEmail($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereProvider($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereProviderUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereRefreshToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereTokenExpiresAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|OAuthProvider whereUserId($value)
*/
@@ -439,7 +428,7 @@ namespace App\Models{
namespace App\Models{
/**
* App\Models\Template
*
*
* @property int $id
* @property \Illuminate\Support\Carbon|null $created_at
@@ -482,7 +471,7 @@ namespace App\Models{
namespace App\Models{
/**
* App\Models\User
*
*
* @property int $id
* @property string $name
@@ -520,8 +509,10 @@ namespace App\Models{
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Workspace> $workspaces
* @property-read int|null $workspaces_count
* @method static \Database\Factories\UserFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder|User hasExpiredGenericTrial()
* @method static \Illuminate\Database\Eloquent\Builder|User newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|User newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|User onGenericTrial()
* @method static \Illuminate\Database\Eloquent\Builder|User query()
* @method static \Illuminate\Database\Eloquent\Builder|User whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|User whereEmail($value)
@@ -543,7 +534,64 @@ namespace App\Models{
namespace App\Models{
/**
* App\Models\Workspace
*
*
* @property int $id
* @property int $workspace_id
* @property string $email
* @property string $role
* @property string $token
* @property string $status
* @property string|null $valid_until
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \App\Models\Workspace|null $workspace
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite notExpired()
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite pending()
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite query()
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereEmail($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereRole($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereValidUntil($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserInvite whereWorkspaceId($value)
*/
class UserInvite extends \Eloquent {}
}
namespace App\Models{
/**
*
*
* @property int $id
* @property int $workspace_id
* @property int $user_id
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property string $role
* @property-read \App\Models\User $user
* @property-read \App\Models\Workspace $workspace
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace query()
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace whereRole($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace whereUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|UserWorkspace whereWorkspaceId($value)
*/
class UserWorkspace extends \Eloquent {}
}
namespace App\Models{
/**
*
*
* @property int $id
* @property \Illuminate\Support\Carbon|null $created_at
@@ -557,10 +605,15 @@ namespace App\Models{
* @property-read mixed $is_enterprise
* @property-read mixed $is_pro
* @property-read mixed $is_risky
* @property-read mixed $is_trialing
* @property-read mixed $max_file_size
* @property-read mixed $max_user_count_limit
* @property-read mixed $submissions_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\UserInvite> $invites
* @property-read int|null $invites_count
* @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\User> $users
* @property-read int|null $users_count
* @method static \Database\Factories\WorkspaceFactory factory($count = null, $state = [])
* @method static \Illuminate\Database\Eloquent\Builder|Workspace newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Workspace newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Workspace query()