From bac78eec46512c0728ea4a278b42421ae5c85c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Wed, 13 Aug 2025 17:58:33 +0300 Subject: [PATCH] =?UTF-8?q?Css=20d=C3=BCzenleme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/dev-dist/sw.js | 2 +- ui/src/components/layouts/DeveloperLayout.tsx | 15 +- .../VerticalCollapsedMenuItem.tsx | 4 +- ui/src/utils/hooks/useMenuData.ts | 3 +- ui/src/views/admin/listForm/Wizard.tsx | 786 ++++++------- .../organization-unit/OrganizationUnits.tsx | 414 ++++--- .../views/admin/user-management/Details.tsx | 1039 +++++++++-------- ui/src/views/ai/Assistant.tsx | 6 +- ui/src/views/forum/Forum.tsx | 5 +- ui/src/views/forum/Management.tsx | 5 +- ui/src/views/forum/admin/AdminView.tsx | 28 +- ui/src/views/menu/MenuManager.tsx | 8 +- 12 files changed, 1165 insertions(+), 1150 deletions(-) diff --git a/ui/dev-dist/sw.js b/ui/dev-dist/sw.js index 88827ea8..f962f04f 100644 --- a/ui/dev-dist/sw.js +++ b/ui/dev-dist/sw.js @@ -82,7 +82,7 @@ define(['./workbox-54d0af47'], (function (workbox) { 'use strict'; "revision": "3ca0b8505b4bec776b69afdba2768812" }, { "url": "index.html", - "revision": "0.rs1dfl4jqho" + "revision": "0.u7hl29mc92g" }], {}); workbox.cleanupOutdatedCaches(); workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { diff --git a/ui/src/components/layouts/DeveloperLayout.tsx b/ui/src/components/layouts/DeveloperLayout.tsx index 67fe01b4..ad839355 100644 --- a/ui/src/components/layouts/DeveloperLayout.tsx +++ b/ui/src/components/layouts/DeveloperLayout.tsx @@ -1,14 +1,9 @@ import React from 'react' -import { - LayoutDashboard, - Database, - Zap, - Server, - Puzzle, -} from 'lucide-react' +import { LayoutDashboard, Database, Zap, Server, Puzzle } from 'lucide-react' import { useLocalization } from '@/utils/hooks/useLocalization' import { useLocation, useNavigate } from 'react-router-dom' import { ROUTES_ENUM } from '@/routes/route.constant' +import { Container } from '../shared' interface DeveloperLayoutProps { children: React.ReactNode @@ -53,11 +48,11 @@ const DeveloperLayout: React.FC = ({ children }) => { ] return ( -
+
{/* Sidebar */} -
+
-
+ ) } diff --git a/ui/src/components/template/VerticalMenuContent/VerticalCollapsedMenuItem.tsx b/ui/src/components/template/VerticalMenuContent/VerticalCollapsedMenuItem.tsx index 167d397f..a43d3f39 100644 --- a/ui/src/components/template/VerticalMenuContent/VerticalCollapsedMenuItem.tsx +++ b/ui/src/components/template/VerticalMenuContent/VerticalCollapsedMenuItem.tsx @@ -55,10 +55,10 @@ const DefaultItem = ({ nav, onLinkClick }: DefaultItemProps) => { } target={subNav.isExternalLink ? '_blank' : ''} > - {nav.title} + {subNav.title} ) : ( - {nav.title} + {subNav.title} )} diff --git a/ui/src/utils/hooks/useMenuData.ts b/ui/src/utils/hooks/useMenuData.ts index daad67d3..85b0c014 100644 --- a/ui/src/utils/hooks/useMenuData.ts +++ b/ui/src/utils/hooks/useMenuData.ts @@ -1,4 +1,5 @@ import { MenuItem } from '@/@types/menu' +import isDisabled from '@/components/ui/DatePicker/tables/components/props/isDisabled' import { getMenus, MenuService } from '@/services/menu.service' import { useStoreActions } from '@/store/store' import { useState, useEffect } from 'react' @@ -57,7 +58,7 @@ export const useMenuData = () => { const response = await getMenus() if (response.data) { - const hierarchicalMenu = buildHierarchy(response.data.items) + const hierarchicalMenu = buildHierarchy(response.data.items || []) setMenuItems(hierarchicalMenu) } } catch (err) { diff --git a/ui/src/views/admin/listForm/Wizard.tsx b/ui/src/views/admin/listForm/Wizard.tsx index caa21459..4e1d53f2 100644 --- a/ui/src/views/admin/listForm/Wizard.tsx +++ b/ui/src/views/admin/listForm/Wizard.tsx @@ -129,90 +129,124 @@ const Wizard = () => { const navigate = useNavigate() return ( - <> -
- - + + - { - setSubmitting(true) - try { - await postListFormWizard({ ...values }) - toast.push( - - {translate('::ListForms.FormBilgileriKaydedildi')} - , - { - placement: 'top-center', - }, - ) - setSubmitting(false) - setTimeout(() => { - navigate( - ROUTES_ENUM.protected.saas.listFormManagement.edit.replace( - ':listFormCode', - values.listFormCode, - ), - ) - }, 500) - } catch (error: any) { - toast.push(, { +
+ { + setSubmitting(true) + try { + await postListFormWizard({ ...values }) + toast.push( + + {translate('::ListForms.FormBilgileriKaydedildi')} + , + { placement: 'top-center', - }) - } - }} - > - {({ touched, errors, isSubmitting, values }) => ( -
- + }, + ) + setSubmitting(false) + setTimeout(() => { + navigate( + ROUTES_ENUM.protected.saas.listFormManagement.edit.replace( + ':listFormCode', + values.listFormCode, + ), + ) + }, 500) + } catch (error: any) { + toast.push(, { + placement: 'top-center', + }) + } + }} + > + {({ touched, errors, isSubmitting, values }) => ( + + + + + + + + {({ field, form }: FieldProps) => ( + o.value === values.permissionGroupName) ?? { - label: values.permissionGroupName, - value: values.permissionGroupName, + values.menuParentCode + ? (menuList?.find((o) => o.value === values.menuParentCode) ?? { + label: values.menuParentCode, + value: values.menuParentCode, }) : null } onChange={(option) => { form.setFieldValue(field.name, option?.value) - setIsPermissionGroupNew( + setIsMenuNew( !!option?.value && !menuList.some((a) => a.value === option?.value), ) }} @@ -220,342 +254,292 @@ const Wizard = () => { )} -
- - - {({ field, form }: FieldProps) => ( - o.value === values.dataSourceCode, - ) ?? { - label: values.dataSourceCode, - value: values.dataSourceCode, - }) - : null - } - onChange={(option) => { - form.setFieldValue(field.name, option?.value) - setIsDataSourceNew( - !!option?.value && - !dataSourceList.some((a) => a.value === option?.value), - ) - }} - /> - )} - - - {isDataSourceNew && ( - - - - )} -
-
- - - {({ field, form }: FieldProps) => ( - o.value === values.keyFieldDbSourceType, - )} - onChange={(o) => form.setFieldValue(field.name, o?.value)} - /> - )} - - -
-
- - - - - - -
-
- - - - - - -
-
- - - - - - -
- -
- - )} -
- + + +
+ {isMenuNew && ( +
+ + + + + + +
+ )} +
+ + + {({ field, form }: FieldProps) => ( + o.value === field.value)} + onChange={(o) => form.setFieldValue(field.name, o?.value)} + /> + )} + + + + + +
+
+ + + + + + {({ field, form }: FieldProps) => ( + { - setTreeSearch(e.target.value) - }} - /> - { - if (dragIds.length > 0) { - handleMove(dragIds[0], parentId ?? '') - } - }} - onRename={({ id, name }) => { - handleEdit(id, name) - }} - className="mt-2 cursor-pointer" - searchTerm={treeSearch} - indent={10} - searchMatch={(node, term) => - node.data.name.toLowerCase().includes(term.toLowerCase()) + +
+ } + > + { + setTreeSearch(e.target.value) + }} + /> + { + if (dragIds.length > 0) { + handleMove(dragIds[0], parentId ?? '') } - width={'100%'} - > - {Node} - - - - - - }> - {translate('::AbpIdentity.Users')} - - }> - {translate('::AbpIdentity.Roles')} - - - - {activeOu ? ( - { - e.preventDefault() - const response = await getUsers(0, 1000) - setUserSelectionList(response.data?.items ?? []) - }} - > - - - } - > - - {!!ouMembers.length && ( - - - - - - - - - )} - - {ouMembers.map((user) => ( - - - - - - - ))} - - -
Adı SoyadıE-PostaDurum
- - - - {user.name} {user.surname} - - {user.email}{user.isActive ? 'Aktif' : 'Pasif'}
-
- ) : ( -
- {translate('::Abp.Identity.OrganizationUnit.Users.Description')} -
- )} -
- - {activeOu ? ( - { - e.preventDefault() - const response = await getRoles(0, 1000) - setRoleSelectionList(response.data?.items ?? []) - }} - > - - - } - > - - {!!ouRoles.length && ( - - - - - - - )} - - {ouRoles.map((role) => ( - - - - - ))} - - -
Rol
- - {role.name}
-
- ) : ( -
- {translate('::Abp.Identity.OrganizationUnit.Roles.Description')} -
- )} -
-
-
-
- + }} + onRename={({ id, name }) => { + handleEdit(id, name) + }} + className="mt-2 cursor-pointer" + searchTerm={treeSearch} + indent={10} + searchMatch={(node, term) => + node.data.name.toLowerCase().includes(term.toLowerCase()) + } + width={'100%'} + > + {Node} + + + + + + }> + {translate('::AbpIdentity.Users')} + + }> + {translate('::AbpIdentity.Roles')} + + + + {activeOu ? ( + { + e.preventDefault() + const response = await getUsers(0, 1000) + setUserSelectionList(response.data?.items ?? []) + }} + > + + + } + > + + {!!ouMembers.length && ( + + + + + + + + + )} + + {ouMembers.map((user) => ( + + + + + + + ))} + + +
Adı SoyadıE-PostaDurum
+ + + + {user.name} {user.surname} + + {user.email}{user.isActive ? 'Aktif' : 'Pasif'}
+
+ ) : ( +
+ {translate('::Abp.Identity.OrganizationUnit.Users.Description')} +
+ )} +
+ + {activeOu ? ( + { + e.preventDefault() + const response = await getRoles(0, 1000) + setRoleSelectionList(response.data?.items ?? []) + }} + > + + + } + > + + {!!ouRoles.length && ( + + + + + + + )} + + {ouRoles.map((role) => ( + + + + + ))} + + +
Rol
+ + {role.name}
+
+ ) : ( +
+ {translate('::Abp.Identity.OrganizationUnit.Roles.Description')} +
+ )} +
+
+
+
diff --git a/ui/src/views/admin/user-management/Details.tsx b/ui/src/views/admin/user-management/Details.tsx index aafac9b2..2f3780ad 100644 --- a/ui/src/views/admin/user-management/Details.tsx +++ b/ui/src/views/admin/user-management/Details.tsx @@ -38,7 +38,7 @@ import { MdDelete } from 'react-icons/md' import { useParams } from 'react-router-dom' import * as Yup from 'yup' import { SelectBoxOption } from '@/shared/types' -import { ConfirmDialog } from '@/components/shared' +import { ConfirmDialog, Container } from '@/components/shared' import { AssignedClaimViewModel, UserInfoViewModel } from '@/proxy/admin/models' export interface ClaimTypeDto { @@ -109,558 +109,577 @@ function UserDetails() { title={userDetails.email} defaultTitle="Kurs Platform" > - - - }> - {translate('::Abp.Identity.User.UserInformation')} - - }> - {translate('::Abp.Identity.User.LockoutManagement')} - - }> - {translate('::Abp.Identity.User.ClaimTypes')} - - - -
- { - setSubmitting(true) - await putUserDetail({ ...values }) + + + + }> + {translate('::Abp.Identity.User.UserInformation')} + + }> + {translate('::Abp.Identity.User.LockoutManagement')} + + }> + {translate('::Abp.Identity.User.ClaimTypes')} + + + +
+ { + setSubmitting(true) + await putUserDetail({ ...values }) - toast.push( - - {translate('Kaydet')} - , - { - placement: 'top-center', - }, - ) + toast.push( + + {translate('Kaydet')} + , + { + placement: 'top-center', + }, + ) - getUser() - setSubmitting(false) - }} - > - {({ touched, errors, resetForm, isSubmitting, values }) => { - const userRoleNames = values.userRoleNames - const roles = values.roles - const branches = values.branches + getUser() + setSubmitting(false) + }} + > + {({ touched, errors, resetForm, isSubmitting, values }) => { + const userRoleNames = values.userRoleNames + const roles = values.roles + const branches = values.branches - return ( -
-
- -
- {/* Personal Information */} -
- - - -
+ return ( + +
+ +
+ {/* Personal Information */} +
+ + + +
- {/* Personal Information */} -
- - - -
+ {/* Personal Information */} +
+ + + +
- {/* Şube Management */} -
-
- {translate('::Abp.Identity.User.UserInformation.BranchManagement')} -
-
- - {({ form, remove, push }) => ( -
- {branches && branches.length > 0 - ? branches.map((_, index: number) => ( -
- - - -
- )) - : null} -
+ {/* Şube Management */} +
+
+ {translate('::Abp.Identity.User.UserInformation.BranchManagement')} +
+
+ + {({ form, remove, push }) => ( +
+ {branches && branches.length > 0 + ? branches.map((_, index: number) => ( +
+ + + +
+ )) + : null} +
+ )} +
+
+
+ + {/* Role Management */} +
+
+ {translate('::Abp.Identity.User.UserInformation.RoleManagement')} +
+
+ + {({ form, remove, push }) => ( +
+ {roles && roles.length > 0 + ? roles.map((_, index: number) => ( +
+ + + +
+ )) + : null} +
+ )} +
+
+
+ + {/* Contact Information */} +
+
+ {translate( + '::Abp.Identity.User.UserInformation.ContactInformation', )} - +
+ + + + + + + + + +
+ + {/* Account Timestamps */} +
+
+ {translate('::Abp.Identity.User.UserInformation.AccountTimestamps')} +
+ + + {({ field, form }: FieldProps) => ( + { + form.setFieldValue( + field.name, + date + ? dayjs(date).format('YYYY-MM-DDTHH:mm:ss[Z]') + : null, + ) + }} + /> + )} + + + + + {({ field, form }: FieldProps) => ( + + )} + + + + + {({ field, form }: FieldProps) => ( + + )} + +
+ +
- {/* Role Management */} -
-
- {translate('::Abp.Identity.User.UserInformation.RoleManagement')} -
-
- - {({ form, remove, push }) => ( -
- {roles && roles.length > 0 - ? roles.map((_, index: number) => ( -
- - - -
- )) - : null} -
- )} -
-
-
+
+ +
+ + ) + }} + +
+ + +
+ { + setSubmitting(true) - {/* Contact Information */} -
-
- {translate('::Abp.Identity.User.UserInformation.ContactInformation')} -
- - - - - - - - - -
+ await putUserLookout({ ...values }) - {/* Account Timestamps */} -
-
- {translate('::Abp.Identity.User.UserInformation.AccountTimestamps')} -
- - - {({ field, form }: FieldProps) => ( - { - form.setFieldValue( - field.name, - date ? dayjs(date).format('YYYY-MM-DDTHH:mm:ss[Z]') : null, - ) - }} - /> - )} - - - - - {({ field, form }: FieldProps) => ( - - )} - - - - - {({ field, form }: FieldProps) => ( - - )} - - -
-
-
-
+ toast.push( + + {'Lockout bilgileri kaydedildi.'} + , + { + placement: 'top-center', + }, + ) -
- -
- - ) - }} - -
- - -
- { - setSubmitting(true) + getUser() - await putUserLookout({ ...values }) + setSubmitting(false) + }} + > + {({ touched, errors, resetForm, isSubmitting, values }) => { + const userRoleNames = values.userRoleNames + return ( +
+
+ +
+ {/* Account Status */} +
+
+ {translate('::Abp.Identity.User.LockoutManagement.AccountStatus')} +
+ + + - toast.push( - - {'Lockout bilgileri kaydedildi.'} - , - { - placement: 'top-center', - }, - ) - - getUser() - - setSubmitting(false) - }} - > - {({ touched, errors, resetForm, isSubmitting, values }) => { - const userRoleNames = values.userRoleNames - return ( - -
- -
- {/* Account Status */} -
-
- {translate('::Abp.Identity.User.LockoutManagement.AccountStatus')} -
- - - - - - - + > + + - - - + > + + - - - + > + + - - - -
+ > + + +
- {/* Login & Lockout Settings */} -
-
- {translate( - '::Abp.Identity.User.LockoutManagement.LoginAndLockoutSettings', - )} -
- - - {({ field, form }: FieldProps) => ( - { - form.setFieldValue( - field.name, - date ? dayjs(date).format('YYYY-MM-DDTHH:mm:ss[Z]') : null, - ) - }} - /> + {/* Login & Lockout Settings */} +
+
+ {translate( + '::Abp.Identity.User.LockoutManagement.LoginAndLockoutSettings', )} - - +
+ + + {({ field, form }: FieldProps) => ( + { + form.setFieldValue( + field.name, + date + ? dayjs(date).format('YYYY-MM-DDTHH:mm:ss[Z]') + : null, + ) + }} + /> + )} + + - - - + > + + - - - + > + + - - - {({ field, form }: FieldProps) => ( - { - form.setFieldValue( - field.name, - date ? dayjs(date).format('YYYY-MM-DDTHH:mm:ss[Z]') : null, - ) - }} - /> + - + > + + {({ field, form }: FieldProps) => ( + { + form.setFieldValue( + field.name, + date + ? dayjs(date).format('YYYY-MM-DDTHH:mm:ss[Z]') + : null, + ) + }} + /> + )} + + - - - + > + + - - - + + + +
-
- -
+ +
-
- -
- - ) - }} - -
- - -
- - - - - - - - - - {userDetails.claims.filter((a) => a.isAssigned === true) && - userDetails.claims.filter((a) => a.isAssigned === true).length > 0 ? ( - userDetails.claims.map((claim) => ( - - - - - - )) - ) : ( +
+ +
+ + ) + }} + + + + +
+
- {translate('::Abp.Identity.User.ClaimType')}{translate('::Abp.Identity.User.ClaimValue')}
- {claim.claimType}{claim.claimValue}
+ - + + + - )} - -
- {translate('::Abp.Identity.User.NoClaimsFound')} - + {translate('::Abp.Identity.User.ClaimType')}{translate('::Abp.Identity.User.ClaimValue')}
-
-
- + + + {userDetails.claims.filter((a) => a.isAssigned === true) && + userDetails.claims.filter((a) => a.isAssigned === true).length > 0 ? ( + userDetails.claims.map((claim) => ( + + +
+
+ + setOpen(false)} onRequestClose={() => setOpen(false)}> { // Render return ( - <> + -
{messages.length === 0 && ( @@ -359,7 +359,7 @@ const Assistant = () => {
- +
) } diff --git a/ui/src/views/forum/Forum.tsx b/ui/src/views/forum/Forum.tsx index 13b08689..ee75759e 100644 --- a/ui/src/views/forum/Forum.tsx +++ b/ui/src/views/forum/Forum.tsx @@ -3,6 +3,7 @@ import { useStoreState } from '@/store/store' import React, { useState, useEffect } from 'react' import { useForumData } from './useForumData' import { ForumView } from './forum/ForumView' +import { Container } from '@/components/shared' export function Forum() { const { user, tenant } = useStoreState((state) => state.auth) @@ -45,7 +46,7 @@ export function Forum() { }, [error, clearError]) return ( -
+ {error && (
@@ -76,7 +77,7 @@ export function Forum() { onTopicSelect={setSelectedTopic} onViewStateChange={setForumViewState} /> -
+ ) } diff --git a/ui/src/views/forum/Management.tsx b/ui/src/views/forum/Management.tsx index 0d2591d7..f171d3c3 100644 --- a/ui/src/views/forum/Management.tsx +++ b/ui/src/views/forum/Management.tsx @@ -1,6 +1,7 @@ import { useEffect } from 'react' import { useForumData } from './useForumData' import { AdminView } from './admin/AdminView' +import { Container } from '@/components/shared' export function Management() { const { @@ -52,7 +53,7 @@ export function Management() { }, [error, clearError]) return ( -
+ {error && (
@@ -90,7 +91,7 @@ export function Management() { onMarkPostAsAcceptedAnswer={(id) => markPostAsAcceptedAnswer(id).then(() => {})} onUnmarkPostAsAcceptedAnswer={(id) => unmarkPostAsAcceptedAnswer(id).then(() => {})} /> -
+ ) } diff --git a/ui/src/views/forum/admin/AdminView.tsx b/ui/src/views/forum/admin/AdminView.tsx index b5b07aa9..934fb8c7 100644 --- a/ui/src/views/forum/admin/AdminView.tsx +++ b/ui/src/views/forum/admin/AdminView.tsx @@ -75,20 +75,36 @@ export function AdminView({ onUnmarkPostAsAcceptedAnswer, }: AdminViewProps) { const [activeSection, setActiveSection] = useState('stats') - const { translate } = useLocalization(); + const { translate } = useLocalization() const navigationItems = [ - { id: 'stats' as AdminSection, label: translate('::App.Forum.Dashboard.Dashboard'), icon: BarChart3 }, - { id: 'categories' as AdminSection, label: translate('::App.Forum.Dashboard.Categories'), icon: Folder }, - { id: 'topics' as AdminSection, label: translate('::App.Forum.Dashboard.Topics'), icon: MessageSquare }, - { id: 'posts' as AdminSection, label: translate('::App.Forum.Dashboard.Posts'), icon: FileText }, + { + id: 'stats' as AdminSection, + label: translate('::App.Forum.Dashboard.Dashboard'), + icon: BarChart3, + }, + { + id: 'categories' as AdminSection, + label: translate('::App.Forum.Dashboard.Categories'), + icon: Folder, + }, + { + id: 'topics' as AdminSection, + label: translate('::App.Forum.Dashboard.Topics'), + icon: MessageSquare, + }, + { + id: 'posts' as AdminSection, + label: translate('::App.Forum.Dashboard.Posts'), + icon: FileText, + }, ] return (
{/* Sidebar Navigation */} -
+