vite.config güncellemesi
This commit is contained in:
parent
70592958f1
commit
e801f95496
47 changed files with 208 additions and 88 deletions
BIN
ui/public/img/logo/logo-192.png
Normal file
BIN
ui/public/img/logo/logo-192.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
BIN
ui/public/img/logo/logo-512.png
Normal file
BIN
ui/public/img/logo/logo-512.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
57
ui/src/components/UpdateNotifier.tsx
Normal file
57
ui/src/components/UpdateNotifier.tsx
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
// src/components/UpdateNotifier.jsx
|
||||
import { useState, useEffect } from 'react'
|
||||
|
||||
const UpdateNotifier = () => {
|
||||
const [updateAvailable, setUpdateAvailable] = useState(false)
|
||||
|
||||
useEffect(() => {
|
||||
if ('serviceWorker' in navigator) {
|
||||
const checkUpdate = () => {
|
||||
navigator.serviceWorker.getRegistration().then(registration => {
|
||||
if (registration) {
|
||||
registration.addEventListener('updatefound', () => {
|
||||
setUpdateAvailable(true)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
checkUpdate()
|
||||
const interval = setInterval(checkUpdate, 30000) // 30 saniyede bir kontrol
|
||||
return () => clearInterval(interval)
|
||||
}
|
||||
}, [])
|
||||
|
||||
const handleUpdate = () => {
|
||||
window.location.reload()
|
||||
}
|
||||
|
||||
if (!updateAvailable) return null
|
||||
|
||||
return (
|
||||
<div style={{
|
||||
position: 'fixed',
|
||||
bottom: '20px',
|
||||
right: '20px',
|
||||
padding: '12px',
|
||||
background: '#FF99C8',
|
||||
color: 'white',
|
||||
borderRadius: '8px',
|
||||
zIndex: 1000
|
||||
}}>
|
||||
<p>Yeni güncelleme mevcut!</p>
|
||||
<button onClick={handleUpdate} style={{
|
||||
background: 'white',
|
||||
color: '#FF99C8',
|
||||
border: 'none',
|
||||
padding: '8px 16px',
|
||||
borderRadius: '4px',
|
||||
cursor: 'pointer'
|
||||
}}>
|
||||
Yenile
|
||||
</button>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default UpdateNotifier
|
||||
|
|
@ -15,6 +15,7 @@ import useLocale from '@/utils/hooks/useLocale'
|
|||
import { useDynamicRoutes } from '@/routes/dynamicRoutesContext'
|
||||
import { useLocation } from 'react-router-dom'
|
||||
import { hasSubdomain } from '@/utils/subdomain'
|
||||
import UpdateNotifier from '../UpdateNotifier'
|
||||
|
||||
export type LayoutType =
|
||||
| typeof LAYOUT_TYPE_CLASSIC
|
||||
|
|
@ -91,6 +92,7 @@ const Layout = () => {
|
|||
return (
|
||||
<Suspense fallback={<div className="flex flex-auto flex-col h-[100vh]"><Loading loading /></div>}>
|
||||
<AppLayout />
|
||||
<UpdateNotifier />
|
||||
</Suspense>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ const FooterContent = () => {
|
|||
}}
|
||||
title="🎉 Yeni Güncelleme"
|
||||
>
|
||||
Platform Sistemi güncellendi.
|
||||
Sözsoft Kurs Platform Sistemi güncellendi.
|
||||
<p>Detayları, "Güncelleme Günlüğü" ekranında görebilirsiniz.</p>
|
||||
</UiDialog>
|
||||
)}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
const { VITE_CDN_URL } = import.meta.env
|
||||
|
||||
export const APP_NAME = 'Platform'
|
||||
export const APP_NAME = 'Sözsoft Kurs Platform'
|
||||
export const PERSIST_STORE_NAME = 'admin'
|
||||
export const REDIRECT_URL_KEY = 'redirectUrl'
|
||||
export const DEFAULT_API_NAME = 'Default'
|
||||
|
|
|
|||
|
|
@ -17,9 +17,9 @@ const AccessDenied = () => {
|
|||
return (
|
||||
<Container className="h-full">
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Access Denied')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<div className="h-full flex flex-col items-center justify-center p-28">
|
||||
<DoubleSidedImage
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@ const Dashboard = () => {
|
|||
|
||||
return (
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Dashboard')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,9 +13,9 @@ const NotFoundPage = () => {
|
|||
return (
|
||||
<div className="p-28">
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Not Found')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<div className="flex items-center justify-center font-inter">
|
||||
<div className="text-[8rem] sm:text-[10rem] md:text-[12rem] font-bold bg-gradient-to-br from-primary to-secondary bg-clip-text animate-pulse">
|
||||
|
|
|
|||
|
|
@ -82,9 +82,9 @@ const ActivityLog = () => {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Abp.Identity.ActivityLogs')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<AdaptableCard>
|
||||
|
|
|
|||
|
|
@ -263,9 +263,9 @@ function ChartEdit() {
|
|||
return chartValues && roleList && userList && permissionOptions ? (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={chartCode}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<Formik
|
||||
|
|
|
|||
|
|
@ -131,9 +131,9 @@ const Wizard = () => {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Listforms.Wizard')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<div className="grid lg:grid-cols-2 xl:grid-cols-3">
|
||||
|
|
|
|||
|
|
@ -150,9 +150,9 @@ const FormEdit = () => {
|
|||
return listFormCode && listFormValues && customizations && roleList && userList ? (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={`${listFormCode} - ${translate(`::${listFormValues.title}`)}`}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<div className="lg:flex items-center justify-between mb-4 gap-3">
|
||||
<div className="mb-4 lg:mb-0">
|
||||
|
|
|
|||
|
|
@ -456,9 +456,9 @@ const OrganizationUnits = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::Abp.Identity.OrganizationUnits')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<Loading type="cover" loading={loading}>
|
||||
<Container>
|
||||
|
|
|
|||
|
|
@ -68,9 +68,9 @@ const Profile = () => {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Abp.Identity.Profile')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<AdaptableCard>
|
||||
<Tabs value={currentTab} onChange={(val) => onTabChange(val)}>
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ const Roles = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::AbpIdentity.Roles')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<Button
|
||||
onClick={() => {
|
||||
|
|
|
|||
|
|
@ -43,9 +43,9 @@ const Tenants = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::AbpTenantManagement.Tenants')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<Loading type="cover" loading={loading}>
|
||||
<Container>
|
||||
|
|
|
|||
|
|
@ -104,9 +104,9 @@ function UserDetails() {
|
|||
return userDetails ? (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={userDetails.email}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<Container>
|
||||
<Tabs defaultValue="user">
|
||||
|
|
|
|||
|
|
@ -218,9 +218,9 @@ const Users = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::AbpIdentity.Users')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<Container>
|
||||
<AdaptableCard>
|
||||
|
|
|
|||
|
|
@ -266,9 +266,9 @@ const Assistant = () => {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Abp.Identity.Ai')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<LoadAiPostsFromLocalStorage />
|
||||
|
|
|
|||
|
|
@ -55,9 +55,9 @@ const ExtendLogin = () => {
|
|||
return emailSent ? (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('AbpAccount::' + 'Abp.Account.ExtendLogin')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<div>
|
||||
<h3 className="mb-1">{translate('::Abp.Account.ExtendLogin.Title')}</h3>
|
||||
|
|
@ -71,9 +71,9 @@ const ExtendLogin = () => {
|
|||
) : (
|
||||
<div>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Abp.Account.ExtendLogin')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<div className="mb-6">
|
||||
<h3 className="mb-1">{translate('::Abp.Account.ExtendLogin')}</h3>
|
||||
|
|
|
|||
|
|
@ -59,9 +59,9 @@ const ForgotPassword = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Abp.Account.ForgotPassword')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<motion.div
|
||||
initial={{ opacity: 0, x: 100 }}
|
||||
|
|
|
|||
|
|
@ -198,9 +198,9 @@ const Login = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('AbpAccount::' + 'Login')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<motion.div
|
||||
initial={{ opacity: 0, x: 100 }}
|
||||
|
|
|
|||
|
|
@ -62,9 +62,9 @@ const Register = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('AbpAccount::' + 'Register')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<div className="mb-4">
|
||||
|
|
|
|||
|
|
@ -79,9 +79,9 @@ const ResetPassword = () => {
|
|||
return (
|
||||
<div>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('AbpAccount::' + 'ResetPassword')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<div className="mb-6">
|
||||
{resetComplete ? (
|
||||
|
|
|
|||
|
|
@ -36,9 +36,9 @@ const SendConfirmationCode = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Abp.Account.SendConfirmationCode')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<div className="mb-8">
|
||||
|
|
|
|||
|
|
@ -22,9 +22,9 @@ const VerifyConfirmationCode = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Abp.Account.VerifyConfirmationCode')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<div>
|
||||
|
|
|
|||
|
|
@ -44,9 +44,9 @@ const Chart = (props: ChartProps) => {
|
|||
<Container className={DX_CLASSNAMES}>
|
||||
{!isSubForm && chartOptions && (
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + chartOptions.title.text)}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
)}
|
||||
{_chartCode && chartOptions && (
|
||||
|
|
|
|||
|
|
@ -257,9 +257,9 @@ const ClassList: React.FC = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Classroom.List')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<Container>
|
||||
{/* Main Content */}
|
||||
|
|
|
|||
|
|
@ -26,9 +26,9 @@ const Dashboard: React.FC = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Classroom.Dashboard')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<div className="flex items-center justify-center p-4">
|
||||
<motion.div
|
||||
|
|
|
|||
|
|
@ -163,9 +163,9 @@ const ClassroomPlannerPage: React.FC = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Classroom.Planning')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
/>
|
||||
<Container>
|
||||
{/* Header */}
|
||||
|
|
|
|||
|
|
@ -854,9 +854,9 @@ const RoomDetail: React.FC = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Classroom.RoomDetail')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
{teacherDisconnected && (
|
||||
|
|
|
|||
|
|
@ -11,9 +11,9 @@ const DashboardPage: React.FC = () => {
|
|||
return (
|
||||
<>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.DeveloperKit')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<DeveloperLayout>
|
||||
<EntityProvider>
|
||||
|
|
|
|||
|
|
@ -56,9 +56,9 @@ const Changelog = () => {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.ChangeLog')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<AdaptableCard>
|
||||
<h4>Platform Güncelleme Günlüğü</h4>
|
||||
|
|
|
|||
|
|
@ -61,9 +61,9 @@ const FormEdit = (
|
|||
<Container>
|
||||
{!isSubForm && (
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + gridDto?.gridOptions.title)}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
)}
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
|
|
|
|||
|
|
@ -147,9 +147,9 @@ const FormNew = (
|
|||
<Container>
|
||||
{!isSubForm && (
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + gridDto?.gridOptions.title)}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
)}
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
|
|
|
|||
|
|
@ -56,9 +56,9 @@ const FormView = (
|
|||
<Container>
|
||||
{!isSubForm && (
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + gridDto?.gridOptions.title)}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
)}
|
||||
<div className="flex items-center justify-between mb-4">
|
||||
|
|
|
|||
|
|
@ -52,9 +52,9 @@ export function Forum() {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Forum')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
{error && (
|
||||
|
|
|
|||
|
|
@ -58,9 +58,9 @@ export function Management() {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.ForumManagement')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
{error && (
|
||||
|
|
|
|||
|
|
@ -514,9 +514,9 @@ const Grid = (props: GridProps) => {
|
|||
<Container className={DX_CLASSNAMES}>
|
||||
{!isSubForm && (
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + gridDto?.gridOptions.title)}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
)}
|
||||
{gridDto && columnData && (
|
||||
|
|
|
|||
|
|
@ -248,9 +248,9 @@ const Pivot = (props: GridProps) => {
|
|||
<Container className={DX_CLASSNAMES}>
|
||||
{!isSubForm && (
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + gridDto?.gridOptions.title)}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
)}
|
||||
{gridDto && columnData && (
|
||||
|
|
|
|||
|
|
@ -88,9 +88,9 @@ export const MenuManager = () => {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Menus.Manager')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<div className="bg-white rounded px-4 sm:px-4 lg:px-6 py-6">
|
||||
|
|
|
|||
|
|
@ -57,9 +57,9 @@ const Checkout: React.FC = () => {
|
|||
return (
|
||||
<div className="min-h-screen bg-gray-50">
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'Public.nav.checkout')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
{/* Hero Section */}
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@ const DashboardPage: React.FC = () => {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Reports')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<Dashboard />
|
||||
</Container>
|
||||
|
|
|
|||
|
|
@ -10,9 +10,9 @@ const ReportViewerPage: React.FC = () => {
|
|||
return (
|
||||
<Container>
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Reports')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
<ReportViewer />
|
||||
</Container>
|
||||
|
|
|
|||
|
|
@ -120,9 +120,9 @@ const Settings = () => {
|
|||
return (
|
||||
<Container className="h-full">
|
||||
<Helmet
|
||||
titleTemplate="%s | Kurs Platform"
|
||||
titleTemplate="%s | Sözsoft Kurs Platform"
|
||||
title={translate('::' + 'App.Settings')}
|
||||
defaultTitle="Kurs Platform"
|
||||
defaultTitle="Sözsoft Kurs Platform"
|
||||
></Helmet>
|
||||
|
||||
<div className="flex flex-col md:flex-row gap-4">
|
||||
|
|
|
|||
|
|
@ -25,7 +25,10 @@ export default defineConfig(async ({ mode }) => {
|
|||
// Kayıt kodunu otomatik enjekte et (virtual:pwa-register yazmadan da çalışır)
|
||||
injectRegister: 'auto',
|
||||
// Dev ortamında SW'yi aç, prod'da kapalı tut (build edilmiş SW prod'da zaten aktif olur)
|
||||
devOptions: { enabled: mode !== 'production' },
|
||||
devOptions: {
|
||||
enabled: mode !== 'production',
|
||||
type: 'module' // Modern module worker kullan
|
||||
},
|
||||
|
||||
workbox: {
|
||||
// Büyük asset'leri de cache'leyebil
|
||||
|
|
@ -40,10 +43,44 @@ export default defineConfig(async ({ mode }) => {
|
|||
|
||||
// SPA fallback'i API çağrılarına uygulama
|
||||
navigateFallbackDenylist: [/^\/api\//],
|
||||
|
||||
// ⭐⭐ BU KISMI EKLEYİN: Cache sorununu çözecek runtime caching
|
||||
runtimeCaching: [
|
||||
{
|
||||
urlPattern: /\.(?:js|css|html|json)$/,
|
||||
handler: 'NetworkFirst',
|
||||
options: {
|
||||
cacheName: 'static-resources',
|
||||
expiration: {
|
||||
maxEntries: 50,
|
||||
maxAgeSeconds: 24 * 60 * 60 // 24 saat
|
||||
},
|
||||
cacheableResponse: {
|
||||
statuses: [0, 200]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
urlPattern: /\.(?:png|jpg|jpeg|svg|gif|webp|ico)$/,
|
||||
handler: 'CacheFirst',
|
||||
options: {
|
||||
cacheName: 'images',
|
||||
expiration: {
|
||||
maxEntries: 100,
|
||||
maxAgeSeconds: 30 * 24 * 60 * 60 // 30 gün
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
// ⭐ YENİ EKLENEN: Additional navigation route for SPA
|
||||
navigateFallback: '/index.html',
|
||||
navigateFallbackAllowlist: [/^(?!\/__).*/]
|
||||
},
|
||||
|
||||
manifest: {
|
||||
name: 'Platform',
|
||||
name: 'Sözsoft Kurs Platform',
|
||||
short_name: 'Sözsoft Kurs Platform',
|
||||
theme_color: '#FF99C8',
|
||||
background_color: '#f0e7db',
|
||||
display: 'standalone',
|
||||
|
|
@ -52,9 +89,23 @@ export default defineConfig(async ({ mode }) => {
|
|||
src: '/img/logo/logo-400.png',
|
||||
sizes: '400x400',
|
||||
type: 'image/png',
|
||||
purpose: 'any',
|
||||
purpose: 'any maskable'
|
||||
},
|
||||
{
|
||||
src: '/img/logo/logo-192.png',
|
||||
sizes: '192x192',
|
||||
type: 'image/png',
|
||||
purpose: 'any maskable'
|
||||
},
|
||||
{
|
||||
src: '/img/logo/logo-512.png',
|
||||
sizes: '512x512',
|
||||
type: 'image/png',
|
||||
purpose: 'any maskable'
|
||||
}
|
||||
],
|
||||
categories: ['business', 'productivity'],
|
||||
description: 'Sözsoft Kurs Platform Application'
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
|
@ -62,6 +113,11 @@ export default defineConfig(async ({ mode }) => {
|
|||
server: {
|
||||
open: true,
|
||||
port: 3000,
|
||||
// ⭐ YENİ EKLENEN: Hot reload için polling
|
||||
watch: {
|
||||
usePolling: true,
|
||||
interval: 1000
|
||||
}
|
||||
},
|
||||
|
||||
assetsInclude: ['**/*.md'],
|
||||
|
|
@ -77,6 +133,7 @@ export default defineConfig(async ({ mode }) => {
|
|||
build: {
|
||||
outDir: 'dist',
|
||||
sourcemap: false,
|
||||
emptyOutDir: true, // ✅ Build öncesi otomatik temizlik
|
||||
},
|
||||
|
||||
preview: {
|
||||
|
|
@ -89,6 +146,10 @@ export default defineConfig(async ({ mode }) => {
|
|||
|
||||
define: {
|
||||
'process.env': {},
|
||||
// ⭐ YENİ EKLENEN: Version tracking için global değişkenler
|
||||
__APP_VERSION__: JSON.stringify(process.env.npm_package_version || '1.0.0'),
|
||||
__BUILD_DATE__: JSON.stringify(new Date().toISOString()),
|
||||
__APP_MODE__: JSON.stringify(mode)
|
||||
},
|
||||
}
|
||||
})
|
||||
Loading…
Reference in a new issue