Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
13d0712
UI fixes for mobile
Usamavirk444 May 8, 2026
c246886
fix/SW-164: add scrollbar support for assignee and member selector dr…
hanzla-khalid1 May 8, 2026
5547b4f
SW-164: fix: resolve intermittent assignee dropdown member loading i…
hanzla-khalid1 May 8, 2026
4ce2b6d
SW-164: build fix
hanzla-khalid1 May 8, 2026
ae26f89
mobile fixes for project screen
Usamavirk444 May 8, 2026
bd3f073
tab also work as mobile
Usamavirk444 May 8, 2026
8e1573f
SW-164: resolved comments
hanzla-khalid1 May 11, 2026
1e61bf6
UI fixes
Usamavirk444 May 11, 2026
f05cd8b
UI fixes
Usamavirk444 May 11, 2026
a801f91
SW-164: improvements
hanzla-khalid1 May 11, 2026
f7aba87
UI fixes
Usamavirk444 May 11, 2026
fe5bf47
cross button fix
Usamavirk444 May 11, 2026
3428254
SW-164: fix
hanzla-khalid1 May 11, 2026
ca63313
Merge branch 'release/v1.2.1' of https://github.com/ETLOnline/spark i…
Usamavirk444 May 11, 2026
e531727
fill the user points that have no communty id
Usamavirk444 May 12, 2026
b823071
SW-164: resolved comments
hanzla-khalid1 May 12, 2026
9999022
fail ticket now every url save
Usamavirk444 May 12, 2026
80bfc30
fail ticket now every url save
Usamavirk444 May 12, 2026
180a08b
Merge branch 'release/v1.2.1' of https://github.com/ETLOnline/spark i…
Usamavirk444 May 12, 2026
9112771
Merge pull request #850 from ETLOnline/fix/SW-164-member-dropdown-in-…
Usamavirk444 May 12, 2026
ead6909
Merge pull request #851 from ETLOnline/bugfix/SW-326-UI-fixes-mobile-…
Usamavirk444 May 12, 2026
445410c
Merge pull request #853 from ETLOnline/bugfix/SW-330-RP-leadboard-ran…
Usamavirk444 May 12, 2026
1c9685c
Merge pull request #854 from ETLOnline/bugfix/SW-221-ui-url-fixes
Usamavirk444 May 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/app/(dashboard)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export default async function DashboardLayout({
<AppSidebar collapsible="icon" />
<SidebarInset>
<Header />
<div className="flex flex-1 flex-col gap-4 px-4 !w-full h-full">
<div className="flex flex-1 flex-col gap-4 sm:px-4 !w-full h-full">
{children}
</div>
</SidebarInset>
Expand Down
6 changes: 3 additions & 3 deletions src/app/(dashboard)/project/[id]/(project-layout)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ async function layout({ children, params }: Props) {
: undefined

return (
<div className="flex flex-col md:grid md:grid-cols-12 w-full h-[calc(100vh-6rem)] overflow-hidden">
<div className="flex flex-col md:grid md:grid-cols-12 w-full md:h-[calc(100vh-6rem)] md:overflow-hidden">
{userRole || isAdmin ? (
<>
<div className="md:col-span-2 md:border-r md:overflow-y-auto border-b md:border-b-0 mb-2 shrink-0">
Expand All @@ -57,8 +57,8 @@ async function layout({ children, params }: Props) {
/>
</div>

<div className="flex-1 md:col-span-10 overflow-hidden min-h-0">
<div className="grid grid-cols-1 h-full px-2 md:px-4">
<div className="flex-1 md:col-span-10 md:overflow-hidden min-h-0">
<div className="grid grid-cols-1 md:h-full px-2 md:px-4">
{children}
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,11 @@ function ProjectSidebar({ statusList, currProject, currSpace }: Props) {
className={`flex flex-row items-center gap-2 p-2 rounded transition-colors
${pathName.includes(page.key) ? "bg-sidebar-accent text-sidebar-accent-foreground" : "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground"}`}
>
<DynamicIcon name={page.icon as IconName} className="h-4 w-4" />
{page.title}
<DynamicIcon
name={page.icon as IconName}
className="h-4 w-4 shrink-0"
/>
<span className="truncate min-w-0">{page.title}</span>
</SidebarMenuItem>
</Link>
)
Expand Down
25 changes: 25 additions & 0 deletions src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,40 @@
@tailwind components;
@tailwind utilities;

html,
body {
font-family: Arial, Helvetica, sans-serif;
overflow-x: hidden;
}

/* Prevent iOS auto-zoom on input focus */
@media (max-width: 1023px) {
input,
textarea,
select {
font-size: max(1rem, 16px) !important;
}
}

@layer utilities {
.text-balance {
text-wrap: balance;
}

.ProseMirror {
overflow-wrap: anywhere;
word-break: break-word;
overflow-x: hidden;
}

.hide-scrollbar {
-ms-overflow-style: none;
scrollbar-width: none;
}
.hide-scrollbar::-webkit-scrollbar {
display: none;
}

.spark-gradient-panel-bg {
@apply bg-gradient-to-r from-primary/20 to-purple-500/20;
}
Expand Down
209 changes: 117 additions & 92 deletions src/components/Dashboard/Chat/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -770,9 +770,9 @@ export function ChatScreen({ currentChatSSR, allChatsSSR }: ChatScreenProps) {

return (
<>
<div className="flex h-[calc(100vh-7rem)] gap-4">
<div className="flex h-[calc(100dvh-7rem)] gap-4">
{/* Contacts list - visible on desktop, hidden on mobile */}
<Card className="w-80 flex-shrink-0 border-r hidden md:flex md:flex-col h-full">
<Card className="w-80 flex-shrink-0 border-r hidden lg:flex lg:flex-col h-full">
<CardHeader className="px-3">
<CardTitle className="flex items-center justify-between">
Chats
Expand Down Expand Up @@ -808,7 +808,7 @@ export function ChatScreen({ currentChatSSR, allChatsSSR }: ChatScreenProps) {
<Button
variant="ghost"
size="icon"
className="md:hidden mr-2"
className="lg:hidden mr-2"
>
<Menu />
<span className="sr-only">Toggle contacts</span>
Expand Down Expand Up @@ -933,13 +933,13 @@ export function ChatScreen({ currentChatSSR, allChatsSSR }: ChatScreenProps) {
<>
<CardContent className="flex-1 min-h-0 p-4 flex flex-col">
{authUser && currentChat && !fetchingChatMessages ? (
<ScrollArea className="flex-1 pr-4 mt-2">
<ScrollArea className="flex-1 min-h-0 pr-4 mt-2">
{messages
.filter((msg) => msg.chat_id === currentChat?.id)
.map((message) => (
<div
key={message.id}
className={`mb-4 flex items-start ${
className={`mb-4 flex items-start w-full overflow-x-hidden ${
message.sender_id === authUser?.unique_id
? "justify-end"
: "justify-start"
Expand All @@ -956,11 +956,11 @@ export function ChatScreen({ currentChatSSR, allChatsSSR }: ChatScreenProps) {
<p className="text-4xl">{message.message}</p>
</div>
) : (
<div className="flex group gap-2">
<div className=" group flex flex-col">
<div className="flex group gap-2 min-w-0 max-w-[85%]">
<div className="group flex flex-col min-w-0">
{/* MESSAGE BUBBLE */}
<div
className={`relative rounded-lg py-2 pl-2 pr-2 flex flex-row gap-2 rich-editor ${
className={`relative rounded-lg py-2 pl-2 pr-2 flex flex-row gap-2 rich-editor break-words overflow-hidden ${
message.sender_id === authUser?.unique_id
? "bg-primary text-primary-foreground group-hover:pr-6"
: "bg-muted"
Expand Down Expand Up @@ -1048,18 +1048,18 @@ export function ChatScreen({ currentChatSSR, allChatsSSR }: ChatScreenProps) {
target="_blank"
>
<div
className={`flex items-center ${
className={`flex items-center gap-2 overflow-hidden w-full max-w-full ${
message.sender_id ===
authUser?.unique_id
? "bg-primary text-primary-foreground"
: "bg-muted text-white"
} space-x-2 p-2 rounded-lg`}
} p-2 rounded-lg`}
>
<FileIcon className="h-8 w-8" />
<span className="font-medium">
<FileIcon className="h-8 w-8 shrink-0" />
<span className="font-medium min-w-0 truncate">
{fileName}
</span>
<span className="text-xs">
<span className="text-xs shrink-0">
{formatFileSize(
Number(fileSize)
)}
Expand Down Expand Up @@ -1155,23 +1155,44 @@ export function ChatScreen({ currentChatSSR, allChatsSSR }: ChatScreenProps) {
)}
</CardContent>
<CardFooter className="p-4 relative">
{/* Attachment panel floats above the footer bar. overflow-hidden prevents
the internal grid pattern from creating a scrollbar. */}
{openAttachment && (
<div className="absolute bottom-full left-0 right-0 mb-1 z-50 bg-background border border-border rounded-t-xl shadow-lg max-h-[50dvh] overflow-y-auto md:max-h-none md:overflow-hidden">
{uploadLoding && (
<div className="absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-t-xl bg-background/80 backdrop-blur-sm">
<Loader />
<p className="text-sm text-muted-foreground">
Uploading file…
</p>
</div>
)}
<FileUpload
accept="image/*,application/*"
onChange={handleFileUpload}
showClose={true}
onClose={handleCloseAttachment}
/>
</div>
)}

<form
onSubmit={(e) => {
e.preventDefault()
handleSendMessage()
}}
className="flex w-full space-x-2 items-end"
className="flex flex-col md:flex-row md:items-end gap-2 w-full"
>
<div className="flex-1" key={currentChat?.id || "no-chat"}>
<div
className="w-full min-w-0 overflow-x-hidden md:flex-1"
key={currentChat?.id || "no-chat"}
>
{openAttachment ? (
<div className=" flex flex-col">
<FileUpload
accept="image/*,application/*"
onChange={handleFileUpload}
showClose={true}
onClose={handleCloseAttachment}
/>
</div>
<p className="text-sm text-muted-foreground px-1 py-1.5 italic truncate">
{fileString
? "File ready — click Send to upload"
: "Select a file above…"}
</p>
) : (
<RichTextEditor
value={richMessageContent}
Expand Down Expand Up @@ -1199,75 +1220,79 @@ export function ChatScreen({ currentChatSSR, allChatsSSR }: ChatScreenProps) {
)}
</div>

<Button
type="button"
variant="ghost"
size="icon"
title={
showRichEditorToolbar
? "Hide Formatting Menu (Enter sends)"
: "Show Formatting Menu (Enter adds line)"
}
onClick={handleRichEditor}
className={`p-1 ${
showRichEditorToolbar
? "bg-secondary"
: "hover:bg-secondary/50"
}`}
>
<PencilLine className="h-5 w-5" />
<span className="sr-only">Toggle Formatting Menu</span>
</Button>

<Button
type="button"
variant="ghost"
size="icon"
disabled={openAttachment}
onClick={() => setOpenAttachment(true)}
title="Attach file"
>
<Paperclip className="h-4 w-4" />
</Button>
<Popover>
<PopoverTrigger asChild>
<Button
type="button"
variant="ghost"
size="icon"
title="Insert Emoji"
className="p-1"
>
<SmileIcon className="h-5 w-5" />
</Button>
</PopoverTrigger>
<PopoverContent side="top" align="end" className="p-0">
<EmojiPicker
className="h-[342px]"
onEmojiSelect={({ emoji }: any) =>
handleEmojiSelect(emoji)
}
>
<EmojiPickerSearch />
<EmojiPickerContent />
<EmojiPickerFooter />
</EmojiPicker>
</PopoverContent>
</Popover>

<Button
type="submit"
size="icon"
disabled={
newMessageLoading || currentMessageContent.trim() === ""
}
>
{newMessageLoading ? (
<Loader />
) : (
<Send className="h-4 w-4" />
)}
</Button>
<div className="flex items-center justify-end md:justify-start gap-1 shrink-0">
<Button
type="button"
variant="ghost"
size="icon"
title={
showRichEditorToolbar
? "Hide Formatting Menu (Enter sends)"
: "Show Formatting Menu (Enter adds line)"
}
onClick={handleRichEditor}
className={`p-1 ${
showRichEditorToolbar
? "bg-secondary"
: "hover:bg-secondary/50"
}`}
>
<PencilLine className="h-5 w-5" />
<span className="sr-only">Toggle Formatting Menu</span>
</Button>

<Button
type="button"
variant="ghost"
size="icon"
disabled={openAttachment}
onClick={() => setOpenAttachment(true)}
title="Attach file"
>
<Paperclip className="h-4 w-4" />
</Button>

<Popover>
<PopoverTrigger asChild>
<Button
type="button"
variant="ghost"
size="icon"
title="Insert Emoji"
className="p-1"
>
<SmileIcon className="h-5 w-5" />
</Button>
</PopoverTrigger>
<PopoverContent side="top" align="end" className="p-0">
<EmojiPicker
className="h-[342px]"
onEmojiSelect={({ emoji }: any) =>
handleEmojiSelect(emoji)
}
>
<EmojiPickerSearch />
<EmojiPickerContent />
<EmojiPickerFooter />
</EmojiPicker>
</PopoverContent>
</Popover>

<Button
type="submit"
size="icon"
disabled={
newMessageLoading ||
(currentMessageContent.trim() === "" && !fileString)
}
>
{newMessageLoading ? (
<Loader />
) : (
<Send className="h-4 w-4" />
)}
</Button>
</div>
</form>
</CardFooter>
</>
Expand Down
Loading