Compare commits

...

14 Commits

Author SHA1 Message Date
fatonramadani
76266f3efb Apply automatic changes 2024-01-08 10:37:39 +00:00
Faton Ramadani
2cdda619de Merge branch 'main' into operator-menu 2024-01-08 11:35:59 +01:00
Faton Ramadani
37744ff583 Merge branch 'main' into operator-menu 2024-01-02 06:38:21 +01:00
Faton Ramadani
dbe14757d4 Merge branch 'main' of https://github.com/windmill-labs/windmill 2024-01-02 06:38:12 +01:00
Faton Ramadani
12bd4af3ee Merge branch 'main' into operator-menu 2023-12-29 16:54:12 +01:00
Faton Ramadani
9cdaf9c201 feat(frontend): wip operator menu 2023-12-29 16:52:28 +01:00
Faton Ramadani
ec094e8897 feat(frontend): wip operator menu 2023-12-29 16:48:09 +01:00
Faton Ramadani
cf61e09b90 feat(frontend): wip operator menu 2023-12-29 16:22:02 +01:00
Faton Ramadani
6a0ae83b49 feat(frontend): wip operator menu 2023-12-29 15:44:08 +01:00
Faton Ramadani
2f4be74e94 feat(frontend): wip operator menu 2023-12-29 15:42:03 +01:00
Guillaume Bouvignies
28811023a4 feat: PIP_LOCAL_DEPENDENCIES now accepts regex and is configurable from the UI (#2931)
* feat: PIP_LOCAL_DEPENDENCIES now accepts regex

* Add worker config FE
2023-12-29 22:02:46 +09:00
Faton Ramadani
e80534ca65 fix(frontend): fix wording (#2930)
* fix(frontend): fix wording

* fix(frontend): fix wording
2023-12-29 21:58:06 +09:00
Henri Courdent
95be0155dc Carousel link and trigger frontend (#2929)
Co-authored-by: Faton Ramadani <faton.ramadani14@gmail.com>
2023-12-29 12:24:00 +01:00
Faton Ramadani
004781cd3d fix(frontend): Fix decision tree (#2928)
* fix(frontend): wip

* fix(frontend): wip

* fix(frontend): decision tree history

* fix(frontend): fix wording
2023-12-29 03:33:23 +01:00
4 changed files with 214 additions and 85 deletions

8
backend/Cargo.lock generated
View File

@@ -3937,9 +3937,9 @@ dependencies = [
[[package]]
name = "libz-ng-sys"
version = "1.1.12"
version = "1.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3dd9f43e75536a46ee0f92b758f6b63846e594e86638c61a9251338a65baea63"
checksum = "601c27491de2c76b43c9f52d639b2240bfb9b02112009d3b754bfa90d891492d"
dependencies = [
"cmake",
"libc",
@@ -3947,9 +3947,9 @@ dependencies = [
[[package]]
name = "libz-sys"
version = "1.1.12"
version = "1.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b"
checksum = "5f526fdd09d99e19742883e43de41e1aa9e36db0c7ab7f935165d611c5cccc66"
dependencies = [
"cc",
"libc",

View File

@@ -8,6 +8,7 @@
export let placement: any = 'bottom-start'
export let justifyEnd: boolean = false
export let lightMode: boolean = false
const [floatingRef, floatingContent] = createFloatingActions({
strategy: 'fixed',
@@ -35,7 +36,10 @@
leaveTo="transform opacity-0 scale-95"
>
<MenuItems
class="border w-56 origin-top-right rounded-md bg-surface shadow-md focus:outline-none"
class={twMerge(
'border w-56 origin-top-right rounded-md shadow-md focus:outline-none',
lightMode ? 'bg-surface-inverse' : 'bg-surface'
)}
>
<div class="my-1">
<slot />

View File

@@ -30,6 +30,7 @@
import { clearStores } from '$lib/storeUtils'
import { goto } from '$app/navigation'
import ConfirmationModal from '../common/confirmationModal/ConfirmationModal.svelte'
import { twMerge } from 'tailwind-merge'
$: mainMenuLinks = [
{ label: 'Home', href: '/', icon: Home },
@@ -150,20 +151,24 @@
]
export let isCollapsed: boolean = false
export let noGap: boolean = false
let leaveWorkspaceModal = false
</script>
<nav
class="grow flex flex-col overflow-x-hidden scrollbar-hidden px-2 md:pb-2 gap-16 justify-between"
class={twMerge(
'grow flex flex-col overflow-x-hidden scrollbar-hidden px-2 md:pb-2 justify-between',
noGap ? 'gap-0' : 'gap-16'
)}
>
<div class="space-y-1 pt-4 mb-6 md:mb-10">
<div class={twMerge('space-y-1 pt-4 ', noGap ? 'md:mb-0 mb-0' : 'mb-6 md:mb-10')}>
{#each mainMenuLinks as menuLink (menuLink.href ?? menuLink.label)}
<MenuLink class="!text-xs" {...menuLink} {isCollapsed} />
{/each}
</div>
<div class="flex flex-col h-full justify-end">
<div class="space-y-0.5 mb-6 md:mb-10">
<div class={twMerge('space-y-0.5 mb-6 md:mb-10', noGap ? 'md:mb-0 mb-0' : 'mb-6 md:mb-10')}>
<UserMenu {isCollapsed} />
{#each secondaryMenuLinks as menuLink (menuLink.href ?? menuLink.label)}
{#if menuLink.subItems}
@@ -176,7 +181,7 @@
<div class="py-1" role="none">
{#if subItem?.['action']}
<button
class="{subItem['class']} px-4 py-2 !text-2xs"
class="text-secondary block px-4 py-2 text-xs hover:bg-surface-hover hover:text-primary"
on:click={subItem?.['action']}
>
<div class="flex flex-row items-center gap-2">
@@ -190,7 +195,9 @@
{:else}
<a
href={subItem.href}
class="text-secondary block px-4 py-2 text-2xs hover:bg-surface-hover hover:text-primary"
class={twMerge(
'text-secondary block px-4 py-2 text-2xs hover:bg-surface-hover hover:text-primary'
)}
role="menuitem"
tabindex="-1"
>

View File

@@ -11,7 +11,7 @@
WorkspaceService
} from '$lib/gen'
import { classNames } from '$lib/utils'
import { slide } from 'svelte/transition'
import WorkspaceMenu from '$lib/components/sidebar/WorkspaceMenu.svelte'
import SidebarContent from '$lib/components/sidebar/SidebarContent.svelte'
import {
@@ -34,9 +34,11 @@
import { SUPERADMIN_SETTINGS_HASH, USER_SETTINGS_HASH } from '$lib/components/sidebar/settings'
import { isCloudHosted } from '$lib/cloud'
import { syncTutorialsTodos } from '$lib/tutorialUtils'
import { ArrowLeft } from 'lucide-svelte'
import { ArrowLeft, Menu as MenuIcon } from 'lucide-svelte'
import { getUserExt } from '$lib/user'
import { workspacedOpenai } from '$lib/components/copilot/lib'
import Button from '$lib/components/common/button/Button.svelte'
import { twMerge } from 'tailwind-merge'
OpenAPI.WITH_CREDENTIALS = true
let menuOpen = false
@@ -201,6 +203,8 @@
}, 5000)
}
}
let menuSlide: boolean = false
</script>
<svelte:window bind:innerWidth />
@@ -219,39 +223,206 @@
<SuperadminSettings bind:this={superadminSettings} />
{/if}
<div>
<div
class={classNames(
'relative md:hidden',
menuOpen ? 'z-40' : 'pointer-events-none',
devOnly ? 'hidden' : ''
)}
role="dialog"
aria-modal="true"
>
{#if !$userStore?.operator}
<div
class={classNames(
'fixed inset-0 dark:bg-[#1e232e] bg-[#202125] dark:bg-opacity-75 bg-opacity-75 transition-opacity ease-linear duration-300 z-40 !dark',
menuOpen ? 'opacity-100' : 'opacity-0'
'relative md:hidden',
menuOpen ? 'z-40' : 'pointer-events-none',
devOnly ? 'hidden' : ''
)}
/>
<div class="fixed inset-0 flex z-40">
role="dialog"
aria-modal="true"
>
<div
class={classNames(
'relative flex-1 flex flex-col max-w-min w-full bg-surface transition ease-in-out duration-300 transform',
menuOpen ? 'translate-x-0' : '-translate-x-full'
'fixed inset-0 dark:bg-[#1e232e] bg-[#202125] dark:bg-opacity-75 bg-opacity-75 transition-opacity ease-linear duration-300 z-40 !dark',
menuOpen ? 'opacity-100' : 'opacity-0'
)}
/>
<div class="fixed inset-0 flex z-40">
<div
class={classNames(
'relative flex-1 flex flex-col max-w-min w-full bg-surface transition ease-in-out duration-300 transform',
menuOpen ? 'translate-x-0' : '-translate-x-full'
)}
>
<div
class={classNames(
'absolute top-0 right-0 -mr-12 pt-2 ease-in-out duration-300',
menuOpen ? 'opacity-100' : 'opacity-0'
)}
>
<button
type="button"
on:click={() => {
menuOpen = !menuOpen
}}
class="ml-1 flex items-center justify-center h-8 w-8 rounded-full focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white border border-white"
>
<svg
class="h-6 w-6 text-white"
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="2"
stroke="currentColor"
aria-hidden="true"
>
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
<div class="dark:bg-[#1e232e] bg-[#202125] h-full !dark">
<div
class="flex gap-x-2 flex-shrink-0 p-4 font-semibold text-gray-200 w-10"
class:w-40={!isCollapsed}
>
<WindmillIcon white={true} height="20px" width="20px" />
{#if !isCollapsed}Windmill{/if}
</div>
<div class="px-2 py-4 space-y-2 border-y border-gray-500">
<WorkspaceMenu />
<FavoriteMenu {favoriteLinks} />
</div>
<SidebarContent {isCollapsed} />
</div>
</div>
</div>
</div>
<div
id="sidebar"
class={classNames(
'hidden md:flex md:flex-col md:fixed md:inset-y-0 transition-all ease-in-out duration-200 shadow-md z-40 ',
isCollapsed ? 'md:w-12' : 'md:w-40',
devOnly ? '!hidden' : ''
)}
>
<div
class="flex-1 flex flex-col min-h-0 h-screen shadow-lg dark:bg-[#1e232e] bg-[#202125] !dark"
>
<button
on:click={() => {
goto('/')
}}
>
<div
class="flex-row flex-shrink-0 px-3.5 py-3.5 text-opacity-70 h-12 flex items-center gap-1.5"
class:w-40={!isCollapsed}
>
<div class:mr-1={!isCollapsed}>
<WindmillIcon white={true} height="20px" width="20px" />
</div>
{#if !isCollapsed}
<div class="text-sm mt-0.5 text-white"> Windmill </div>
{/if}
</div>
</button>
<div class="px-2 py-4 space-y-2 border-y border-gray-700">
<WorkspaceMenu {isCollapsed} />
<FavoriteMenu {favoriteLinks} {isCollapsed} />
</div>
<SidebarContent {isCollapsed} />
<div class="flex-shrink-0 flex px-4 pb-3.5">
<button
on:click={() => {
isCollapsed = !isCollapsed
}}
>
<ArrowLeft
size={16}
class={classNames(
'flex-shrink-0 h-4 w-4 transition-all ease-in-out duration-200 text-white',
isCollapsed ? 'rotate-180' : 'rotate-0'
)}
/>
</button>
</div>
</div>
</div>
{:else}
<div class="relative">
<div class="absolute top-2 left-2 z-50">
<Button
color="dark"
on:click={() => {
menuSlide = true
}}
startIcon={{ icon: MenuIcon }}
iconOnly
/>
</div>
</div>
{#if menuSlide}
<div
id="sidebar"
class={classNames(
'hidden md:flex md:flex-col md:fixed md:inset-y-0 transition-all ease-in-out duration-200 shadow-md z-40 ',
isCollapsed ? 'md:w-12' : 'md:w-40',
devOnly ? '!hidden' : '',
'z5000'
)}
transition:slide={{ axis: 'x', duration: 100 }}
>
<div
class="flex-1 flex flex-col min-h-0 h-screen shadow-lg dark:bg-[#1e232e] bg-[#202125] !dark"
>
<button
on:click={() => {
goto('/')
}}
>
<div
class="flex-row flex-shrink-0 px-3.5 py-3.5 text-opacity-70 h-12 flex items-center gap-1.5"
class:w-40={!isCollapsed}
>
<div class:mr-1={!isCollapsed}>
<WindmillIcon white={true} height="20px" width="20px" />
</div>
{#if !isCollapsed}
<div class="text-sm mt-0.5 text-white"> Windmill </div>
{/if}
</div>
</button>
<div class="px-2 py-4 space-y-2 border-y border-gray-700">
<WorkspaceMenu {isCollapsed} />
<FavoriteMenu {favoriteLinks} {isCollapsed} />
</div>
<SidebarContent {isCollapsed} />
</div>
</div>
{/if}
{/if}
<div
class={classNames(
'fixed inset-0 dark:bg-[#1e232e] bg-[#202125] dark:bg-opacity-75 bg-opacity-75 transition-opacity ease-linear duration-300 !dark',
menuSlide ? 'opacity-100 z-40' : 'opacity-0'
)}
>
<div class={twMerge('fixed inset-0 flex ', menuSlide ? ' z-40' : '-z-0')}>
<div
class={classNames(
'relative flex-1 flex flex-col max-w-min w-full bg-surface transition ease-in-out duration-100 transform',
menuSlide ? 'translate-x-0' : '-translate-x-full'
)}
>
<div
class={classNames(
'absolute top-0 right-0 -mr-12 pt-2 ease-in-out duration-300',
menuOpen ? 'opacity-100' : 'opacity-0'
'absolute top-0 right-0 -mr-12 pt-2 ease-in-out duration-100',
menuSlide ? 'opacity-100' : 'opacity-0'
)}
>
<button
type="button"
on:click={() => {
menuOpen = !menuOpen
menuSlide = !menuSlide
}}
class="ml-1 flex items-center justify-center h-8 w-8 rounded-full focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white border border-white"
>
@@ -287,64 +458,11 @@
</div>
</div>
</div>
<div
id="sidebar"
class={classNames(
'hidden md:flex md:flex-col md:fixed md:inset-y-0 transition-all ease-in-out duration-200 shadow-md z-40 ',
isCollapsed ? 'md:w-12' : 'md:w-40',
devOnly ? '!hidden' : ''
)}
>
<div
class="flex-1 flex flex-col min-h-0 h-screen shadow-lg dark:bg-[#1e232e] bg-[#202125] !dark"
>
<button
on:click={() => {
goto('/')
}}
>
<div
class="flex-row flex-shrink-0 px-3.5 py-3.5 text-opacity-70 h-12 flex items-center gap-1.5"
class:w-40={!isCollapsed}
>
<div class:mr-1={!isCollapsed}>
<WindmillIcon white={true} height="20px" width="20px" />
</div>
{#if !isCollapsed}
<div class="text-sm mt-0.5 text-white"> Windmill </div>
{/if}
</div>
</button>
<div class="px-2 py-4 space-y-2 border-y border-gray-700">
<WorkspaceMenu {isCollapsed} />
<FavoriteMenu {favoriteLinks} {isCollapsed} />
</div>
<SidebarContent {isCollapsed} />
<div class="flex-shrink-0 flex px-4 pb-3.5">
<button
on:click={() => {
isCollapsed = !isCollapsed
}}
>
<ArrowLeft
size={16}
class={classNames(
'flex-shrink-0 h-4 w-4 transition-all ease-in-out duration-200 text-white',
isCollapsed ? 'rotate-180' : 'rotate-0'
)}
/>
</button>
</div>
</div>
</div>
<div
id="content"
class={classNames(
'w-full flex flex-col flex-1 h-full',
devOnly ? '!pl-0' : isCollapsed ? 'md:pl-12' : 'md:pl-40',
devOnly || $userStore?.operator ? '!pl-0' : isCollapsed ? 'md:pl-12' : 'md:pl-40',
'transition-all ease-in-out duration-200'
)}
>