Compare commits

..
1 Commits
Author SHA1 Message Date
charlesgauthereau da5c65d5a6 chore(release): 1.1.11 2026-01-11 13:41:24 +01:00
9 changed files with 88 additions and 99 deletions
+8 -34
View File
@@ -7,10 +7,6 @@ on:
required: false required: false
type: string type: string
default: 'solucetechnologies/portabase' default: 'solucetechnologies/portabase'
image_name2:
required: false
type: string
default: 'portabase/portabase'
add_latest: add_latest:
required: false required: false
type: boolean type: boolean
@@ -28,10 +24,6 @@ on:
required: true required: true
DOCKER_PASSWORD: DOCKER_PASSWORD:
required: true required: true
DOCKER_USERNAME_2:
required: true
DOCKER_PASSWORD_2:
required: true
jobs: jobs:
build-and-push: build-and-push:
@@ -45,45 +37,27 @@ jobs:
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set tags - name: Set tags
id: set-tags id: set-tags
run: | run: |
REF_NAME=${GITHUB_REF#refs/tags/} REF_NAME=${GITHUB_REF#refs/tags/}
TAGS="${{ inputs.image_name }}:$REF_NAME" TAGS="${{ inputs.image_name }}:$REF_NAME"
TAGS2="${{ inputs.image_name2 }}:$REF_NAME"
if [[ "${{ inputs.add_latest }}" == "true" ]]; then if [[ "${{ inputs.add_latest }}" == "true" ]]; then
TAGS="$TAGS,${{ inputs.image_name }}:latest" TAGS="$TAGS,${{ inputs.image_name }}:latest"
fi fi
echo "tags=$TAGS" >> $GITHUB_OUTPUT echo "tags=$TAGS" >> $GITHUB_OUTPUT
echo "tags=$TAGS2" >> $GITHUB_OUTPUT
- name: Build and push Docker image
- name: Log in to Docker Hub account 1
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push to solucetechnologies/portabase
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
context: . context: .
file: ${{ inputs.dockerfile }} file: ${{ inputs.dockerfile }}
push: true push: true
tags: ${{ steps.set-tags.outputs.tags1 }} tags: ${{ steps.set-tags.outputs.tags }}
target: ${{ inputs.target }}
- name: Log in to Docker Hub account 2
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_USERNAME_2 }}
password: ${{ secrets.DOCKER_PASSWORD_2 }}
- name: Build and push to portabase/portabase
uses: docker/build-push-action@v6
with:
context: .
file: ${{ inputs.dockerfile }}
push: true
tags: ${{ steps.set-tags.outputs.tags2 }}
target: ${{ inputs.target }} target: ${{ inputs.target }}
-2
View File
@@ -17,8 +17,6 @@ jobs:
secrets: secrets:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
DOCKER_USERNAME_2: ${{ secrets.DOCKER_USERNAME_2 }}
DOCKER_PASSWORD_2: ${{ secrets.DOCKER_PASSWORD_2 }}
github_release: github_release:
needs: docker_publish needs: docker_publish
-2
View File
@@ -18,8 +18,6 @@ jobs:
secrets: secrets:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
DOCKER_USERNAME_2: ${{ secrets.DOCKER_USERNAME_2 }}
DOCKER_PASSWORD_2: ${{ secrets.DOCKER_PASSWORD_2 }}
github_release: github_release:
needs: docker_publish needs: docker_publish
+1 -1
View File
@@ -26,5 +26,5 @@ keywords:
- web-ui - web-ui
- agent - agent
license: Apache-2.0 license: Apache-2.0
version: 1.1.12-rc.2 version: 1.1.11
date-released: "2026-01-11" date-released: "2026-01-11"
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "portabase", "name": "portabase",
"version": "1.1.12-rc.2", "version": "1.1.11",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev --turbopack -p 8887", "dev": "next dev --turbopack -p 8887",
@@ -95,6 +95,8 @@ export const EmailForm = (props: EmailFormProps) => {
return ( return (
<TooltipProvider> <TooltipProvider>
<Card>
<CardContent>
<Form <Form
form={form} form={form}
className="flex flex-col gap-4 mt-3" className="flex flex-col gap-4 mt-3"
@@ -180,6 +182,23 @@ export const EmailForm = (props: EmailFormProps) => {
)} )}
/> />
<div className="flex justify-between gap-4"> <div className="flex justify-between gap-4">
{/*{props.defaultValues?.smtpFrom && (*/}
{/* <ButtonWithLoading*/}
{/* type="button"*/}
{/* isPending={mutationSendEmailTest.isPending}*/}
{/* onClick={async () => {*/}
{/* await mutationSendEmailTest.mutateAsync();*/}
{/* }}*/}
{/* icon={<Send/>}*/}
{/* size="default"*/}
{/* className="bg-green-600 hover:bg-green-700 text-white font-medium shadow-sm transition-all"*/}
{/* >Send email test</ButtonWithLoading>*/}
{/*)}*/}
{props.defaultValues?.smtpFrom && ( {props.defaultValues?.smtpFrom && (
<Tooltip> <Tooltip>
<TooltipTrigger asChild> <TooltipTrigger asChild>
@@ -208,13 +227,14 @@ export const EmailForm = (props: EmailFormProps) => {
)} )}
</Tooltip> </Tooltip>
)} )}
<div className="flex justify-end">
<Button type="submit"> <Button
Save type="submit"
</Button> >Save</Button>
</div>
</div> </div>
</Form> </Form>
</CardContent>
</Card>
</TooltipProvider> </TooltipProvider>
); );
}; };
@@ -8,8 +8,6 @@ import {formatDateLastContact} from "@/utils/date-formatting";
import {AgentWith} from "@/db/schema/08_agent"; import {AgentWith} from "@/db/schema/08_agent";
import {Activity, ChevronRight, Copy, Check, Fingerprint, Server, Database, ShieldCheck} from "lucide-react"; import {Activity, ChevronRight, Copy, Check, Fingerprint, Server, Database, ShieldCheck} from "lucide-react";
import {Badge} from "@/components/ui/badge"; import {Badge} from "@/components/ui/badge";
import {truncateWords} from "@/utils/text";
import {useIsMobile} from "@/hooks/use-mobile";
export type agentCardProps = { export type agentCardProps = {
data: AgentWith; data: AgentWith;
@@ -17,7 +15,6 @@ export type agentCardProps = {
export const AgentCard = (props: agentCardProps) => { export const AgentCard = (props: agentCardProps) => {
const {data: agent} = props; const {data: agent} = props;
const isMobile = useIsMobile();
const [isCopied, setIsCopied] = useState(false); const [isCopied, setIsCopied] = useState(false);
const handleCopy = (e: React.MouseEvent) => { const handleCopy = (e: React.MouseEvent) => {
@@ -41,7 +38,7 @@ export const AgentCard = (props: agentCardProps) => {
<div className="flex-1 min-w-0 flex flex-col gap-1.5"> <div className="flex-1 min-w-0 flex flex-col gap-1.5">
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<h3 className="text-lg font-black text-foreground group-hover:text-primary transition-colors truncate tracking-tight "> <h3 className="text-lg font-black text-foreground group-hover:text-primary transition-colors truncate tracking-tight ">
{isMobile ? truncateWords(agent.name, 2) : agent.name} {agent.name}
</h3> </h3>
{agent.version && ( {agent.version && (
<Badge variant="secondary" className="h-5 px-1.5 text-[10px] font-bold tracking-wider"> <Badge variant="secondary" className="h-5 px-1.5 text-[10px] font-bold tracking-wider">
@@ -57,53 +57,54 @@ export const AgentForm = (props: agentFormProps) => {
}); });
return ( return (
<TooltipProvider> <TooltipProvider>
<Form <Card>
form={form} <CardContent>
className="flex flex-col gap-4" <Form
onSubmit={async (values) => { form={form}
await mutation.mutateAsync(values); className="flex flex-col gap-4 mt-3"
}} onSubmit={async (values) => {
> await mutation.mutateAsync(values);
<FormField }}
control={form.control} >
name="name" <FormField
defaultValue="" control={form.control}
render={({field}) => ( name="name"
<FormItem> defaultValue=""
<FormLabel>Name</FormLabel> render={({field}) => (
<FormControl> <FormItem>
<Input placeholder="Agent 1" {...field} /> <FormLabel>Name</FormLabel>
</FormControl> <FormControl>
<FormDescription>Your agent project name</FormDescription> <Input placeholder="Agent 1" {...field} />
<FormMessage/> </FormControl>
</FormItem> <FormDescription>Your agent project name</FormDescription>
)} <FormMessage/>
/> </FormItem>
<FormField )}
control={form.control} />
defaultValue="" <FormField
name="description" control={form.control}
render={({field}) => ( defaultValue=""
<FormItem> name="description"
<FormLabel>Description</FormLabel> render={({field}) => (
<FormControl> <FormItem>
<Input placeholder="This agent is for the client exemple.com" {...field} <FormLabel>Description</FormLabel>
value={field.value ?? ""}/> <FormControl>
</FormControl> <Input placeholder="This agent is for the client exemple.com" {...field}
<FormDescription>Enter your project agent description</FormDescription> value={field.value ?? ""}/>
<FormMessage/> </FormControl>
</FormItem> <FormDescription>Enter your project agent description</FormDescription>
)} <FormMessage/>
/> </FormItem>
<div className="flex justify-end"> )}
<Button type="submit"> />
{isCreate ? "Create" : "Update"} <Button>{isCreate ? `Create agent` : `Save agent`}</Button>
</Button> </Form>
</div> </CardContent>
</Form> </Card>
</TooltipProvider> </TooltipProvider>
); );
}; };
@@ -78,6 +78,9 @@ export const ProjectForm = (props: projectFormProps) => {
}); });
return ( return (
<Card>
<CardHeader></CardHeader>
<CardContent>
<Form <Form
form={form} form={form}
className="flex flex-col gap-4" className="flex flex-col gap-4"
@@ -121,11 +124,9 @@ export const ProjectForm = (props: projectFormProps) => {
</FormItem> </FormItem>
)} )}
/> />
<div className="flex justify-end"> <Button>{isCreate ? `Create Project` : `Update Project`}</Button>
<Button type="submit">
{isCreate ? "Create" : "Update"}
</Button>
</div>
</Form> </Form>
</CardContent>
</Card>
); );
}; };