feat: system-wide github apps

This commit is contained in:
Andras Bacsai 2022-09-28 10:34:27 +02:00
parent 9662bc29fb
commit ee67e163b1
11 changed files with 200 additions and 50 deletions

View File

@ -0,0 +1,26 @@
-- RedefineTables
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_GitSource" (
"id" TEXT NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"forPublic" BOOLEAN NOT NULL DEFAULT false,
"type" TEXT,
"apiUrl" TEXT,
"htmlUrl" TEXT,
"customPort" INTEGER NOT NULL DEFAULT 22,
"organization" TEXT,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
"githubAppId" TEXT,
"gitlabAppId" TEXT,
"isSystemWide" BOOLEAN NOT NULL DEFAULT false,
CONSTRAINT "GitSource_gitlabAppId_fkey" FOREIGN KEY ("gitlabAppId") REFERENCES "GitlabApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT "GitSource_githubAppId_fkey" FOREIGN KEY ("githubAppId") REFERENCES "GithubApp" ("id") ON DELETE SET NULL ON UPDATE CASCADE
);
INSERT INTO "new_GitSource" ("apiUrl", "createdAt", "customPort", "forPublic", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt") SELECT "apiUrl", "createdAt", "customPort", "forPublic", "githubAppId", "gitlabAppId", "htmlUrl", "id", "name", "organization", "type", "updatedAt" FROM "GitSource";
DROP TABLE "GitSource";
ALTER TABLE "new_GitSource" RENAME TO "GitSource";
CREATE UNIQUE INDEX "GitSource_githubAppId_key" ON "GitSource"("githubAppId");
CREATE UNIQUE INDEX "GitSource_gitlabAppId_key" ON "GitSource"("gitlabAppId");
PRAGMA foreign_key_check;
PRAGMA foreign_keys=ON;

View File

@ -299,6 +299,7 @@ model GitSource {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
githubAppId String? @unique githubAppId String? @unique
gitlabAppId String? @unique gitlabAppId String? @unique
isSystemWide Boolean @default(false)
gitlabApp GitlabApp? @relation(fields: [gitlabAppId], references: [id]) gitlabApp GitlabApp? @relation(fields: [gitlabAppId], references: [id])
githubApp GithubApp? @relation(fields: [githubAppId], references: [id]) githubApp GithubApp? @relation(fields: [githubAppId], references: [id])
application Application[] application Application[]

View File

@ -135,7 +135,7 @@ export async function showDashboard(request: FastifyRequest) {
include: { destinationDocker: true, teams: true }, include: { destinationDocker: true, teams: true },
}); });
const gitSources = await prisma.gitSource.findMany({ const gitSources = await prisma.gitSource.findMany({
where: { teams: { some: { id: teamId === "0" ? undefined : teamId } } }, where: { OR: [{ teams: { some: { id: teamId === "0" ? undefined : teamId } } }, { isSystemWide: true }] },
include: { teams: true }, include: { teams: true },
}); });
const destinations = await prisma.destinationDocker.findMany({ const destinations = await prisma.destinationDocker.findMany({

View File

@ -9,7 +9,7 @@ export async function listSources(request: FastifyRequest) {
try { try {
const teamId = request.user?.teamId; const teamId = request.user?.teamId;
const sources = await prisma.gitSource.findMany({ const sources = await prisma.gitSource.findMany({
where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } }, where: { OR: [{ teams: { some: { id: teamId === "0" ? undefined : teamId } } }, { isSystemWide: true }] },
include: { teams: true, githubApp: true, gitlabApp: true } include: { teams: true, githubApp: true, gitlabApp: true }
}); });
return { return {
@ -22,11 +22,11 @@ export async function listSources(request: FastifyRequest) {
export async function saveSource(request, reply) { export async function saveSource(request, reply) {
try { try {
const { id } = request.params const { id } = request.params
let { name, htmlUrl, apiUrl, customPort } = request.body let { name, htmlUrl, apiUrl, customPort, isSystemWide } = request.body
if (customPort) customPort = Number(customPort) if (customPort) customPort = Number(customPort)
await prisma.gitSource.update({ await prisma.gitSource.update({
where: { id }, where: { id },
data: { name, htmlUrl, apiUrl, customPort } data: { name, htmlUrl, apiUrl, customPort, isSystemWide }
}); });
return reply.code(201).send() return reply.code(201).send()
} catch ({ status, message }) { } catch ({ status, message }) {
@ -56,7 +56,7 @@ export async function getSource(request: FastifyRequest<OnlyId>) {
} }
const source = await prisma.gitSource.findFirst({ const source = await prisma.gitSource.findFirst({
where: { id, teams: { some: { id: teamId === '0' ? undefined : teamId } } }, where: { id, OR: [{ teams: { some: { id: teamId === "0" ? undefined : teamId } } }, { isSystemWide: true }] },
include: { githubApp: true, gitlabApp: true } include: { githubApp: true, gitlabApp: true }
}); });
if (!source) { if (!source) {
@ -104,7 +104,7 @@ export async function saveGitHubSource(request: FastifyRequest<SaveGitHubSource>
const { teamId } = request.user const { teamId } = request.user
const { id } = request.params const { id } = request.params
let { name, htmlUrl, apiUrl, organization, customPort } = request.body let { name, htmlUrl, apiUrl, organization, customPort, isSystemWide } = request.body
if (customPort) customPort = Number(customPort) if (customPort) customPort = Number(customPort)
if (id === 'new') { if (id === 'new') {
@ -117,6 +117,7 @@ export async function saveGitHubSource(request: FastifyRequest<SaveGitHubSource>
apiUrl, apiUrl,
organization, organization,
customPort, customPort,
isSystemWide,
type: 'github', type: 'github',
teams: { connect: { id: teamId } } teams: { connect: { id: teamId } }
} }

View File

@ -7,6 +7,7 @@ export interface SaveGitHubSource extends OnlyId {
apiUrl: string, apiUrl: string,
organization: string, organization: string,
customPort: number, customPort: number,
isSystemWide: boolean
} }
} }
export interface SaveGitLabSource extends OnlyId { export interface SaveGitLabSource extends OnlyId {

View File

@ -3,6 +3,7 @@
import Tooltip from './Tooltip.svelte'; import Tooltip from './Tooltip.svelte';
export let id: any; export let id: any;
export let customClass: any = null;
export let setting: any; export let setting: any;
export let title: any; export let title: any;
export let description: any; export let description: any;
@ -24,7 +25,7 @@
</label> </label>
</div> </div>
</div> </div>
<div class:text-center={isCenter} class="flex justify-center"> <div class:text-center={isCenter} class={`flex justify-center ${customClass}`}>
<div <div
on:click on:click
aria-pressed="false" aria-pressed="false"

View File

@ -362,7 +362,7 @@
</svg> </svg>
</button> </button>
<Tooltip triggeredBy="#forceredeploy">Force Redeploy (without cache)</Tooltip> <Tooltip triggeredBy="#forceredeploy">Force Redeploy (without cache)</Tooltip>
{:else if $isDeploymentEnabled} {:else if $isDeploymentEnabled && !$page.url.pathname.startsWith(`/applications/${id}/configuration/`)}
<button <button
class="icons flex items-center font-bold" class="icons flex items-center font-bold"
disabled={!$isDeploymentEnabled} disabled={!$isDeploymentEnabled}

View File

@ -53,7 +53,6 @@
return source; return source;
} }
}); });
async function handleSubmit(gitSourceId: string) { async function handleSubmit(gitSourceId: string) {
try { try {
await post(`/applications/${id}/configuration/source`, { gitSourceId }); await post(`/applications/${id}/configuration/source`, { gitSourceId });
@ -71,7 +70,7 @@
<div class="max-w-screen-2xl mx-auto px-9"> <div class="max-w-screen-2xl mx-auto px-9">
<div class="title pb-8">Git App</div> <div class="title pb-8">Git App</div>
<div class="flex flex-wrap justify-center"> <div class="flex flex-wrap justify-center">
{#if !filteredSources || ownSources.length === 0} {#if !filteredSources}
<div class="flex-col"> <div class="flex-col">
<div class="pb-2 text-center font-bold"> <div class="pb-2 text-center font-bold">
{$t('application.configuration.no_configurable_git')} {$t('application.configuration.no_configurable_git')}
@ -169,11 +168,68 @@
<button <button
disabled={source.gitlabApp && !source.gitlabAppId} disabled={source.gitlabApp && !source.gitlabAppId}
type="submit" type="submit"
class="disabled:opacity-95 bg-coolgray-200 disabled:text-white box-selection hover:bg-orange-700 group" class="relative disabled:opacity-95 bg-coolgray-200 disabled:text-white box-selection hover:bg-orange-700 group"
class:border-red-500={source.gitlabApp && !source.gitlabAppId} class:border-red-500={source.gitlabApp && !source.gitlabAppId}
class:border-0={source.gitlabApp && !source.gitlabAppId} class:border-0={source.gitlabApp && !source.gitlabAppId}
class:border-l-4={source.gitlabApp && !source.gitlabAppId} class:border-l-4={source.gitlabApp && !source.gitlabAppId}
> >
<div class="absolute top-0 left-0 -m-5 flex">
{#if source?.type === 'gitlab'}
<svg viewBox="0 0 128 128" class="h-10 w-10">
<path
fill="#FC6D26"
d="M126.615 72.31l-7.034-21.647L105.64 7.76c-.716-2.206-3.84-2.206-4.556 0l-13.94 42.903H40.856L26.916 7.76c-.717-2.206-3.84-2.206-4.557 0L8.42 50.664 1.385 72.31a4.792 4.792 0 001.74 5.358L64 121.894l60.874-44.227a4.793 4.793 0 001.74-5.357"
/><path fill="#E24329" d="M64 121.894l23.144-71.23H40.856L64 121.893z" /><path
fill="#FC6D26"
d="M64 121.894l-23.144-71.23H8.42L64 121.893z"
/><path
fill="#FCA326"
d="M8.42 50.663L1.384 72.31a4.79 4.79 0 001.74 5.357L64 121.894 8.42 50.664z"
/><path
fill="#E24329"
d="M8.42 50.663h32.436L26.916 7.76c-.717-2.206-3.84-2.206-4.557 0L8.42 50.664z"
/><path fill="#FC6D26" d="M64 121.894l23.144-71.23h32.437L64 121.893z" /><path
fill="#FCA326"
d="M119.58 50.663l7.035 21.647a4.79 4.79 0 01-1.74 5.357L64 121.894l55.58-71.23z"
/><path
fill="#E24329"
d="M119.58 50.663H87.145l13.94-42.902c.717-2.206 3.84-2.206 4.557 0l13.94 42.903z"
/>
</svg>
{:else if source?.type === 'github'}
<svg viewBox="0 0 128 128" class="h-10 w-10">
<g fill="#ffffff"
><path
fill-rule="evenodd"
clip-rule="evenodd"
d="M64 5.103c-33.347 0-60.388 27.035-60.388 60.388 0 26.682 17.303 49.317 41.297 57.303 3.017.56 4.125-1.31 4.125-2.905 0-1.44-.056-6.197-.082-11.243-16.8 3.653-20.345-7.125-20.345-7.125-2.747-6.98-6.705-8.836-6.705-8.836-5.48-3.748.413-3.67.413-3.67 6.063.425 9.257 6.223 9.257 6.223 5.386 9.23 14.127 6.562 17.573 5.02.542-3.903 2.107-6.568 3.834-8.076-13.413-1.525-27.514-6.704-27.514-29.843 0-6.593 2.36-11.98 6.223-16.21-.628-1.52-2.695-7.662.584-15.98 0 0 5.07-1.623 16.61 6.19C53.7 35 58.867 34.327 64 34.304c5.13.023 10.3.694 15.127 2.033 11.526-7.813 16.59-6.19 16.59-6.19 3.287 8.317 1.22 14.46.593 15.98 3.872 4.23 6.215 9.617 6.215 16.21 0 23.194-14.127 28.3-27.574 29.796 2.167 1.874 4.097 5.55 4.097 11.183 0 8.08-.07 14.583-.07 16.572 0 1.607 1.088 3.49 4.148 2.897 23.98-7.994 41.263-30.622 41.263-57.294C124.388 32.14 97.35 5.104 64 5.104z"
/><path
d="M26.484 91.806c-.133.3-.605.39-1.035.185-.44-.196-.685-.605-.543-.906.13-.31.603-.395 1.04-.188.44.197.69.61.537.91zm2.446 2.729c-.287.267-.85.143-1.232-.28-.396-.42-.47-.983-.177-1.254.298-.266.844-.14 1.24.28.394.426.472.984.17 1.255zM31.312 98.012c-.37.258-.976.017-1.35-.52-.37-.538-.37-1.183.01-1.44.373-.258.97-.025 1.35.507.368.545.368 1.19-.01 1.452zm3.261 3.361c-.33.365-1.036.267-1.552-.23-.527-.487-.674-1.18-.343-1.544.336-.366 1.045-.264 1.564.23.527.486.686 1.18.333 1.543zm4.5 1.951c-.147.473-.825.688-1.51.486-.683-.207-1.13-.76-.99-1.238.14-.477.823-.7 1.512-.485.683.206 1.13.756.988 1.237zm4.943.361c.017.498-.563.91-1.28.92-.723.017-1.308-.387-1.315-.877 0-.503.568-.91 1.29-.924.717-.013 1.306.387 1.306.88zm4.598-.782c.086.485-.413.984-1.126 1.117-.7.13-1.35-.172-1.44-.653-.086-.498.422-.997 1.122-1.126.714-.123 1.354.17 1.444.663zm0 0"
/></g
>
</svg>
{/if}
{#if source.isSystemWide}
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-10 w-10"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<circle cx="12" cy="12" r="9" />
<line x1="3.6" y1="9" x2="20.4" y2="9" />
<line x1="3.6" y1="15" x2="20.4" y2="15" />
<path d="M11.5 3a17 17 0 0 0 0 18" />
<path d="M12.5 3a17 17 0 0 1 0 18" />
</svg>
{/if}
</div>
<div class="font-bold text-xl text-center truncate">{source.name}</div> <div class="font-bold text-xl text-center truncate">{source.name}</div>
{#if source.gitlabApp && !source.gitlabAppId} {#if source.gitlabApp && !source.gitlabAppId}
<div class="font-bold text-center truncate text-red-500 group-hover:text-white"> <div class="font-bold text-center truncate text-red-500 group-hover:text-white">

View File

@ -642,9 +642,6 @@
{#if filtered.applications.length > 0} {#if filtered.applications.length > 0}
<div class="divider w-32 mx-auto" /> <div class="divider w-32 mx-auto" />
{/if} {/if}
<div class="flex items-center mt-10">
<h1 class="text-lg font-bold">Other Teams</h1>
</div>
{/if} {/if}
{#if filtered.otherApplications.length > 0} {#if filtered.otherApplications.length > 0}
<div <div
@ -830,9 +827,6 @@
{#if filtered.services.length > 0} {#if filtered.services.length > 0}
<div class="divider w-32 mx-auto" /> <div class="divider w-32 mx-auto" />
{/if} {/if}
<div class="flex items-center mt-10">
<h1 class="text-lg font-bold">Other Teams</h1>
</div>
{/if} {/if}
{#if filtered.otherServices.length > 0} {#if filtered.otherServices.length > 0}
<div <div
@ -991,9 +985,6 @@
{#if filtered.databases.length > 0} {#if filtered.databases.length > 0}
<div class="divider w-32 mx-auto" /> <div class="divider w-32 mx-auto" />
{/if} {/if}
<div class="flex items-center mt-10">
<h1 class="text-lg font-bold">Other Teams</h1>
</div>
{/if} {/if}
{#if filtered.otherDatabases.length > 0} {#if filtered.otherDatabases.length > 0}
<div <div
@ -1079,9 +1070,9 @@
<a class="no-underline mb-5" href={`/sources/${source.id}`}> <a class="no-underline mb-5" href={`/sources/${source.id}`}>
<div class="w-full rounded p-5 bg-coolgray-200 hover:bg-sources indicator duration-150"> <div class="w-full rounded p-5 bg-coolgray-200 hover:bg-sources indicator duration-150">
<div class="w-full flex flex-row"> <div class="w-full flex flex-row">
<div class="absolute top-0 left-0 -m-5 h-10 w-10"> <div class="absolute top-0 left-0 -m-5 flex">
{#if source?.type === 'gitlab'} {#if source?.type === 'gitlab'}
<svg viewBox="0 0 128 128"> <svg viewBox="0 0 128 128" class="h-10 w-10">
<path <path
fill="#FC6D26" fill="#FC6D26"
d="M126.615 72.31l-7.034-21.647L105.64 7.76c-.716-2.206-3.84-2.206-4.556 0l-13.94 42.903H40.856L26.916 7.76c-.717-2.206-3.84-2.206-4.557 0L8.42 50.664 1.385 72.31a4.792 4.792 0 001.74 5.358L64 121.894l60.874-44.227a4.793 4.793 0 001.74-5.357" d="M126.615 72.31l-7.034-21.647L105.64 7.76c-.716-2.206-3.84-2.206-4.556 0l-13.94 42.903H40.856L26.916 7.76c-.717-2.206-3.84-2.206-4.557 0L8.42 50.664 1.385 72.31a4.792 4.792 0 001.74 5.358L64 121.894l60.874-44.227a4.793 4.793 0 001.74-5.357"
@ -1103,7 +1094,7 @@
/> />
</svg> </svg>
{:else if source?.type === 'github'} {:else if source?.type === 'github'}
<svg viewBox="0 0 128 128"> <svg viewBox="0 0 128 128" class="h-10 w-10">
<g fill="#ffffff" <g fill="#ffffff"
><path ><path
fill-rule="evenodd" fill-rule="evenodd"
@ -1115,6 +1106,26 @@
> >
</svg> </svg>
{/if} {/if}
{#if source.isSystemWide}
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-10 w-10"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<circle cx="12" cy="12" r="9" />
<line x1="3.6" y1="9" x2="20.4" y2="9" />
<line x1="3.6" y1="15" x2="20.4" y2="15" />
<path d="M11.5 3a17 17 0 0 0 0 18" />
<path d="M12.5 3a17 17 0 0 1 0 18" />
</svg>
{/if}
</div> </div>
<div class="w-full flex flex-col"> <div class="w-full flex flex-col">
<div class="h-10"> <div class="h-10">
@ -1139,9 +1150,6 @@
{#if filtered.gitSources.length > 0} {#if filtered.gitSources.length > 0}
<div class="divider w-32 mx-auto" /> <div class="divider w-32 mx-auto" />
{/if} {/if}
<div class="flex items-center mt-10">
<h1 class="text-lg font-bold">Other Teams</h1>
</div>
{/if} {/if}
{#if filtered.otherGitSources.length > 0} {#if filtered.otherGitSources.length > 0}
<div <div
@ -1151,9 +1159,9 @@
<a class="no-underline mb-5" href={`/sources/${source.id}`}> <a class="no-underline mb-5" href={`/sources/${source.id}`}>
<div class="w-full rounded p-5 bg-coolgray-200 hover:bg-sources indicator duration-150"> <div class="w-full rounded p-5 bg-coolgray-200 hover:bg-sources indicator duration-150">
<div class="w-full flex flex-row"> <div class="w-full flex flex-row">
<div class="absolute top-0 left-0 -m-5 h-10 w-10"> <div class="absolute top-0 left-0 -m-5 flex">
{#if source?.type === 'gitlab'} {#if source?.type === 'gitlab'}
<svg viewBox="0 0 128 128"> <svg viewBox="0 0 128 128" class="h-10 w-10">
<path <path
fill="#FC6D26" fill="#FC6D26"
d="M126.615 72.31l-7.034-21.647L105.64 7.76c-.716-2.206-3.84-2.206-4.556 0l-13.94 42.903H40.856L26.916 7.76c-.717-2.206-3.84-2.206-4.557 0L8.42 50.664 1.385 72.31a4.792 4.792 0 001.74 5.358L64 121.894l60.874-44.227a4.793 4.793 0 001.74-5.357" d="M126.615 72.31l-7.034-21.647L105.64 7.76c-.716-2.206-3.84-2.206-4.556 0l-13.94 42.903H40.856L26.916 7.76c-.717-2.206-3.84-2.206-4.557 0L8.42 50.664 1.385 72.31a4.792 4.792 0 001.74 5.358L64 121.894l60.874-44.227a4.793 4.793 0 001.74-5.357"
@ -1175,7 +1183,7 @@
/> />
</svg> </svg>
{:else if source?.type === 'github'} {:else if source?.type === 'github'}
<svg viewBox="0 0 128 128"> <svg viewBox="0 0 128 128" class="h-10 w-10">
<g fill="#ffffff" <g fill="#ffffff"
><path ><path
fill-rule="evenodd" fill-rule="evenodd"
@ -1187,6 +1195,26 @@
> >
</svg> </svg>
{/if} {/if}
{#if source.isSystemWide}
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-10 w-10"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<circle cx="12" cy="12" r="9" />
<line x1="3.6" y1="9" x2="20.4" y2="9" />
<line x1="3.6" y1="15" x2="20.4" y2="15" />
<path d="M11.5 3a17 17 0 0 0 0 18" />
<path d="M12.5 3a17 17 0 0 1 0 18" />
</svg>
{/if}
</div> </div>
<div class="w-full flex flex-col"> <div class="w-full flex flex-col">
<div class="h-10"> <div class="h-10">
@ -1290,9 +1318,6 @@
{#if filtered.destinations.length > 0} {#if filtered.destinations.length > 0}
<div class="divider w-32 mx-auto" /> <div class="divider w-32 mx-auto" />
{/if} {/if}
<div class="flex items-center mt-10">
<h1 class="text-lg font-bold">Other Teams</h1>
</div>
{/if} {/if}
{#if filtered.otherDestinations.length > 0} {#if filtered.otherDestinations.length > 0}
<div <div

View File

@ -8,6 +8,7 @@
import { addToast, appSession } from '$lib/store'; import { addToast, appSession } from '$lib/store';
import { dev } from '$app/env'; import { dev } from '$app/env';
import Explainer from '$lib/components/Explainer.svelte'; import Explainer from '$lib/components/Explainer.svelte';
import Setting from '$lib/components/Setting.svelte';
const { id } = $page.params; const { id } = $page.params;
@ -21,7 +22,8 @@
await post(`/sources/${id}`, { await post(`/sources/${id}`, {
name: source.name, name: source.name,
htmlUrl: source.htmlUrl.replace(/\/$/, ''), htmlUrl: source.htmlUrl.replace(/\/$/, ''),
apiUrl: source.apiUrl.replace(/\/$/, '') apiUrl: source.apiUrl.replace(/\/$/, ''),
isSystemWide: source.isSystemWide
}); });
return addToast({ return addToast({
message: 'Configuration saved.', message: 'Configuration saved.',
@ -43,7 +45,8 @@
htmlUrl: source.htmlUrl.replace(/\/$/, ''), htmlUrl: source.htmlUrl.replace(/\/$/, ''),
apiUrl: source.apiUrl.replace(/\/$/, ''), apiUrl: source.apiUrl.replace(/\/$/, ''),
organization: source.organization, organization: source.organization,
customPort: source.customPort customPort: source.customPort,
isSystemWide: source.isSystemWide
}); });
const { organization, htmlUrl } = source; const { organization, htmlUrl } = source;
const { fqdn, ipv4, ipv6 } = settings; const { fqdn, ipv4, ipv6 } = settings;
@ -88,6 +91,16 @@
return errorNotification(error); return errorNotification(error);
} }
} }
async function changeSettings(name: any, save: boolean) {
if ($appSession.teamId === '0') {
if (name === 'isSystemWide') {
source.isSystemWide = !source.isSystemWide;
}
if (save) {
await handleSubmit();
}
}
}
</script> </script>
<div class="mx-auto max-w-6xl lg:px-6 px-3"> <div class="mx-auto max-w-6xl lg:px-6 px-3">
@ -104,13 +117,13 @@
{/if} {/if}
</div> </div>
<div class="grid gap-2 grid-cols-2 auto-rows-max"> <div class="grid gap-2 grid-cols-2 auto-rows-max">
<label for="name" class="text-base font-bold text-stone-100">Name</label> <label for="name">Name</label>
<input class="w-full" name="name" id="name" required bind:value={source.name} /> <input class="w-full" name="name" id="name" required bind:value={source.name} />
<label for="htmlUrl" class="text-base font-bold text-stone-100">HTML URL</label> <label for="htmlUrl">HTML URL</label>
<input class="w-full" name="htmlUrl" id="htmlUrl" required bind:value={source.htmlUrl} /> <input class="w-full" name="htmlUrl" id="htmlUrl" required bind:value={source.htmlUrl} />
<label for="apiUrl" class="text-base font-bold text-stone-100">API URL</label> <label for="apiUrl">API URL</label>
<input class="w-full" name="apiUrl" id="apiUrl" required bind:value={source.apiUrl} /> <input class="w-full" name="apiUrl" id="apiUrl" required bind:value={source.apiUrl} />
<label for="customPort" class="text-base font-bold text-stone-100" <label for="customPort"
>Custom SSH Port <Explainer >Custom SSH Port <Explainer
explanation={'If you use a self-hosted version of Git, you can provide custom port for all the Git related actions.'} explanation={'If you use a self-hosted version of Git, you can provide custom port for all the Git related actions.'}
/></label /></label
@ -124,7 +137,7 @@
required required
value={source.customPort} value={source.customPort}
/> />
<label for="organization" class="pt-2 text-base font-bold text-stone-100" <label for="organization" class="pt-2"
>Organization >Organization
<Explainer <Explainer
explanation={"Fill it if you would like to use an organization's as your Git Source. Otherwise your user will be used."} explanation={"Fill it if you would like to use an organization's as your Git Source. Otherwise your user will be used."}
@ -137,14 +150,25 @@
placeholder="eg: coollabsio" placeholder="eg: coollabsio"
bind:value={source.organization} bind:value={source.organization}
/> />
<Setting
customClass="pt-4"
id="autodeploy"
isCenter={false}
bind:setting={source.isSystemWide}
on:click={() => changeSettings('isSystemWide', false)}
title="System Wide Git Source"
description="System Wide Git Sources are available to all the users in your Coolify instance. <br><br> <span class='font-bold text-warning'>Use with caution, as it can be a security risk.</span>"
/>
</div> </div>
</form> </form>
{:else if source.githubApp?.installationId} {:else if source.githubApp?.installationId}
<form on:submit|preventDefault={handleSubmit} class="py-4"> <form on:submit|preventDefault={handleSubmit} class="py-4">
<div class="flex lg:flex-row lg:justify-between flex-col space-y-3 w-full lg:items-center"> <div class="flex lg:flex-row lg:justify-between flex-col space-y-3 w-full lg:items-center">
<h1 class="title">{$t('general')}</h1> <h1 class="title">{$t('general')}</h1>
{#if $appSession.isAdmin} {#if $appSession.isAdmin && $appSession.teamId === '0'}
<div class="flex flex-col lg:flex-row lg:space-x-4 lg:w-fit space-y-2 lg:space-y-0 w-full"> <div
class="flex flex-col lg:flex-row lg:space-x-4 lg:w-fit space-y-2 lg:space-y-0 w-full"
>
<button class="btn btn-sm bg-sources" type="submit" disabled={loading} <button class="btn btn-sm bg-sources" type="submit" disabled={loading}
>{loading ? 'Saving...' : 'Save'}</button >{loading ? 'Saving...' : 'Save'}</button
> >
@ -159,9 +183,16 @@
{/if} {/if}
</div> </div>
<div class="grid gap-2 grid-cols-2 auto-rows-max mt-4"> <div class="grid gap-2 grid-cols-2 auto-rows-max mt-4">
<label for="name" class="text-base font-bold text-stone-100">{$t('forms.name')}</label> <label for="name">{$t('forms.name')}</label>
<input class="w-full" name="name" id="name" required bind:value={source.name} /> <input
<label for="htmlUrl" class="text-base font-bold text-stone-100">HTML URL</label> class="w-full"
name="name"
id="name"
required
bind:value={source.name}
disabled={$appSession.teamId !== '0'}
/>
<label for="htmlUrl">HTML URL</label>
<input <input
class="w-full" class="w-full"
name="htmlUrl" name="htmlUrl"
@ -171,7 +202,7 @@
required required
bind:value={source.htmlUrl} bind:value={source.htmlUrl}
/> />
<label for="apiUrl" class="text-base font-bold text-stone-100">API URL</label> <label for="apiUrl">API URL</label>
<input <input
class="w-full" class="w-full"
name="apiUrl" name="apiUrl"
@ -181,7 +212,7 @@
readonly={source.githubAppId} readonly={source.githubAppId}
bind:value={source.apiUrl} bind:value={source.apiUrl}
/> />
<label for="customPort" class="text-base font-bold text-stone-100" <label for="customPort"
>Custom SSH Port <Explainer >Custom SSH Port <Explainer
explanation="If you use a self-hosted version of Git, you can provide custom port for all the Git related actions." explanation="If you use a self-hosted version of Git, you can provide custom port for all the Git related actions."
/></label /></label
@ -195,9 +226,7 @@
required required
value={source.customPort} value={source.customPort}
/> />
<label for="organization" class="pt-2 text-base font-bold text-stone-100" <label for="organization" class="pt-2">Organization</label>
>Organization</label
>
<input <input
class="w-full" class="w-full"
readonly readonly
@ -207,6 +236,16 @@
placeholder="eg: coollabsio" placeholder="eg: coollabsio"
bind:value={source.organization} bind:value={source.organization}
/> />
<Setting
customClass="pt-4"
id="autodeploy"
isCenter={false}
disabled={$appSession.teamId !== '0'}
bind:setting={source.isSystemWide}
on:click={() => changeSettings('isSystemWide', true)}
title="System Wide Git Source"
description="System Wide Git Sources are available to all the users in your Coolify instance. <br><br> <span class='font-bold text-warning'>Use with caution, as it can be a security risk.</span>"
/>
</div> </div>
</form> </form>
{:else} {:else}

View File

@ -53,7 +53,7 @@
} }
</script> </script>
{#if id !== 'new'} {#if id !== 'new' && $appSession.teamId === '0'}
<nav class="nav-side"> <nav class="nav-side">
<button <button
id="delete" id="delete"