Merge pull request #798 from runtipi/release/2.0.7

Release/2.0.7
This commit is contained in:
Nicolas Meienberger 2023-10-23 08:51:21 +02:00 committed by GitHub
commit d5766070c4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
61 changed files with 639 additions and 2610 deletions

View file

@ -15,7 +15,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Create Tag
id: create_tag
@ -32,13 +32,13 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v2
@ -47,7 +47,7 @@ jobs:
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push images
uses: docker/build-push-action@v4
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
@ -62,14 +62,14 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- uses: pnpm/action-setup@v2.2.4
- uses: pnpm/action-setup@v2.4.0
name: Install pnpm
id: pnpm-install
with:
@ -99,7 +99,7 @@ jobs:
run: pnpm -r --filter cli package
- name: Upload CLI
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: cli
path: packages/cli/dist
@ -110,7 +110,7 @@ jobs:
steps:
- name: Download CLI
uses: actions/download-artifact@v2
uses: actions/download-artifact@v3
with:
name: cli
path: cli

View file

@ -14,7 +14,7 @@ jobs:
tag: ${{ steps.get_tag.outputs.tag }}
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v3
@ -32,13 +32,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v2
@ -47,7 +47,7 @@ jobs:
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push images
uses: docker/build-push-action@v4
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
@ -61,14 +61,14 @@ jobs:
needs: get-tag
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- uses: pnpm/action-setup@v2.2.4
- uses: pnpm/action-setup@v2.4.0
name: Install pnpm
id: pnpm-install
with:
@ -98,7 +98,7 @@ jobs:
run: pnpm -r --filter cli package
- name: Upload CLI
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: cli
path: packages/cli/dist
@ -111,7 +111,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Create Tag
id: create_tag
@ -129,7 +129,7 @@ jobs:
id: ${{ steps.create_release.outputs.id }}
steps:
- name: Download CLI
uses: actions/download-artifact@v2
uses: actions/download-artifact@v3
with:
name: cli
path: cli

View file

@ -38,14 +38,14 @@ jobs:
--health-retries 5
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- uses: pnpm/action-setup@v2.2.4
- uses: pnpm/action-setup@v2.4.0
name: Install pnpm
id: pnpm-install
with:
@ -101,14 +101,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- uses: pnpm/action-setup@v2.2.4
- uses: pnpm/action-setup@v2.4.0
name: Install pnpm
id: pnpm-install
with:

View file

@ -15,6 +15,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: 'Checkout Repository'
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: 'Dependency Review'
uses: actions/dependency-review-action@v3

View file

@ -29,7 +29,7 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install SSH key
uses: shimataro/ssh-key-action@v2
@ -110,9 +110,9 @@ jobs:
runs-on: ubuntu-latest
needs: [deploy]
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2.2.4
- uses: pnpm/action-setup@v2.4.0
name: Install pnpm
id: pnpm-install
with:
@ -181,7 +181,7 @@ jobs:
uses: actions/configure-pages@v3
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
uses: actions/upload-pages-artifact@v2
with:
path: playwright-report/

View file

@ -9,13 +9,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v2
@ -31,7 +31,7 @@ jobs:
echo "tag=${TAG}" >> $GITHUB_OUTPUT
- name: Build and push images
uses: docker/build-push-action@v4
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64

View file

@ -9,7 +9,7 @@ jobs:
tag: ${{ steps.get_tag.outputs.tag }}
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v3
@ -28,13 +28,13 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v2
@ -43,7 +43,7 @@ jobs:
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push images
uses: docker/build-push-action@v4
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
@ -58,14 +58,14 @@ jobs:
needs: get-tag
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v3
with:
node-version: 18
- uses: pnpm/action-setup@v2.2.4
- uses: pnpm/action-setup@v2.4.0
name: Install pnpm
id: pnpm-install
with:
@ -95,7 +95,7 @@ jobs:
run: pnpm -r --filter cli package
- name: Upload CLI
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: cli
path: packages/cli/dist
@ -107,7 +107,7 @@ jobs:
tagname: ${{ steps.create_tag.outputs.tagname }}
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Create Tag
id: create_tag
@ -124,7 +124,7 @@ jobs:
id: ${{ steps.create_release.outputs.id }}
steps:
- name: Download CLI
uses: actions/download-artifact@v2
uses: actions/download-artifact@v3
with:
name: cli
path: cli
@ -175,7 +175,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Promote release
uses: actions/github-script@v4
uses: actions/github-script@v6
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |

View file

@ -1,6 +1,6 @@
{
"name": "runtipi",
"version": "2.0.6",
"version": "2.0.7",
"description": "A homeserver for everyone",
"scripts": {
"knip": "knip",
@ -32,7 +32,7 @@
"tsc": "tsc"
},
"dependencies": {
"@hookform/resolvers": "^3.3.1",
"@hookform/resolvers": "^3.3.2",
"@otplib/core": "^12.0.1",
"@otplib/plugin-crypto": "^12.0.1",
"@otplib/plugin-thirty-two": "^12.0.1",
@ -43,8 +43,8 @@
"@radix-ui/react-tabs": "^1.0.4",
"@runtipi/postgres-migrations": "^5.3.0",
"@runtipi/shared": "workspace:^",
"@tabler/core": "1.0.0-beta19",
"@tabler/icons-react": "^2.38.0",
"@tabler/core": "1.0.0-beta20",
"@tabler/icons-react": "^2.39.0",
"argon2": "^0.31.1",
"bullmq": "^4.12.3",
"clsx": "^2.0.0",
@ -52,10 +52,10 @@
"drizzle-orm": "^0.28.6",
"fs-extra": "^11.1.1",
"lodash.merge": "^4.6.2",
"next": "13.5.4",
"next": "13.5.5",
"next-client-cookies": "^1.0.5",
"next-intl": "^2.20.2",
"next-safe-action": "^3.4.0",
"next-safe-action": "^4.0.1",
"pg": "^8.11.3",
"qrcode.react": "^3.1.0",
"react": "18.2.0",
@ -70,7 +70,7 @@
"rehype-raw": "^7.0.0",
"remark-breaks": "^4.0.0",
"remark-gfm": "^4.0.0",
"sass": "^1.69.2",
"sass": "^1.69.4",
"semver": "^7.5.4",
"sharp": "0.32.6",
"swr": "^2.2.4",
@ -78,7 +78,7 @@
"uuid": "^9.0.1",
"validator": "^13.11.0",
"winston": "^3.11.0",
"zod": "^3.21.4",
"zod": "^3.22.4",
"zustand": "^4.4.3"
},
"devDependencies": {
@ -92,17 +92,17 @@
"@total-typescript/shoehorn": "^0.1.1",
"@total-typescript/ts-reset": "^0.5.1",
"@types/fs-extra": "^11.0.2",
"@types/jest": "^29.5.5",
"@types/jest": "^29.5.6",
"@types/lodash.merge": "^4.6.7",
"@types/node": "20.8.4",
"@types/pg": "^8.10.5",
"@types/react": "18.2.28",
"@types/react": "18.2.31",
"@types/react-dom": "18.2.13",
"@types/semver": "^7.5.3",
"@types/uuid": "^9.0.5",
"@types/validator": "^13.11.2",
"@typescript-eslint/eslint-plugin": "^6.7.5",
"@typescript-eslint/parser": "^6.7.5",
"@typescript-eslint/eslint-plugin": "^6.8.0",
"@typescript-eslint/parser": "^6.8.0",
"@vitejs/plugin-react": "^4.1.0",
"@vitest/coverage-v8": "^0.34.6",
"dotenv-cli": "^7.3.0",
@ -118,7 +118,7 @@
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-testing-library": "^6.0.2",
"eslint-plugin-testing-library": "^6.1.0",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"knip": "^2.33.1",
@ -148,8 +148,6 @@
},
"homepage": "https://github.com/runtipi/runtipi#readme",
"pnpm": {
"patchedDependencies": {
"next-safe-action@3.4.0": "patches/next-safe-action@3.4.0.patch"
}
"patchedDependencies": {}
}
}

View file

@ -1,6 +1,6 @@
{
"name": "@runtipi/cli",
"version": "2.0.6",
"version": "2.0.7",
"description": "",
"main": "index.js",
"bin": "dist/index.js",
@ -59,6 +59,6 @@
"semver": "^7.5.4",
"systeminformation": "^5.21.11",
"web-push": "^3.6.6",
"zod": "^3.21.4"
"zod": "^3.22.4"
}
}

View file

@ -152,10 +152,10 @@ export class AppExecutors {
try {
this.logger.info(`Stopping app ${appId}`);
this.logger.info(`Regenerating app.env file for app ${appId}`);
await this.ensureAppDir(appId);
if (!skipEnvGeneration) {
this.logger.info(`Regenerating app.env file for app ${appId}`);
await generateEnvFile(appId, config);
}
await compose(appId, 'rm --force --stop');

View file

@ -97,6 +97,7 @@ export const generateEnvFile = async (appId: string, config: Record<string, unkn
} else {
envMap.set('APP_DOMAIN', `${internalIp}:${parsedConfig.data.port}`);
envMap.set('APP_HOST', internalIp);
envMap.set('APP_PROTOCOL', 'http');
}
// Create app-data folder if it doesn't exist

View file

@ -4,7 +4,7 @@ import { program } from 'commander';
import chalk from 'chalk';
import { description, version } from '../package.json';
import { startWorker } from './services/watcher/watcher';
import { SystemExecutors } from './executors';
import { AppExecutors, SystemExecutors } from './executors';
const main = async () => {
program.description(description).version(version);
@ -69,6 +69,25 @@ const main = async () => {
await systemExecutors.cleanLogs();
});
// Start app: ./cli app start <app>
// Stop app: ./cli app stop <app>
program
.command('app [command] <app>')
.description('App management')
.action(async (command, app) => {
const appExecutors = new AppExecutors();
switch (command) {
case 'start':
await appExecutors.startApp(app, {});
break;
case 'stop':
await appExecutors.stopApp(app, {}, true);
break;
default:
console.log(chalk.red('✗'), 'Unknown command');
}
});
program.parse(process.argv);
};

View file

@ -11,7 +11,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"winston": "^3.9.0",
"zod": "^3.21.4"
"winston": "^3.11.0",
"zod": "^3.22.4"
}
}

File diff suppressed because it is too large Load diff

View file

@ -36,8 +36,8 @@ export function LoginContainer() {
});
if (totpSessionId) {
return <TotpForm loading={verifyTotpMutation.isExecuting} onSubmit={(totpCode) => verifyTotpMutation.execute({ totpCode, totpSessionId })} />;
return <TotpForm loading={verifyTotpMutation.status === 'executing'} onSubmit={(totpCode) => verifyTotpMutation.execute({ totpCode, totpSessionId })} />;
}
return <LoginForm loading={loginMutation.isExecuting} onSubmit={({ email, password }) => loginMutation.execute({ username: email, password })} />;
return <LoginForm loading={loginMutation.status === 'executing'} onSubmit={({ email, password }) => loginMutation.execute({ username: email, password })} />;
}

View file

@ -20,5 +20,5 @@ export const RegisterContainer: React.FC = () => {
},
});
return <RegisterForm onSubmit={({ email, password }) => registerMutation.execute({ username: email, password })} loading={registerMutation.isExecuting} />;
return <RegisterForm onSubmit={({ email, password }) => registerMutation.execute({ username: email, password })} loading={registerMutation.status === 'executing'} />;
};

View file

@ -30,11 +30,11 @@ export const ResetPasswordContainer: React.FC = () => {
},
});
if (resetPasswordMutation.res.data?.success && resetPasswordMutation.res.data?.email) {
if (resetPasswordMutation.result.data?.success && resetPasswordMutation.result.data?.email) {
return (
<>
<h2 className="h2 text-center mb-3">{t('auth.reset-password.success-title')}</h2>
<p>{t('auth.reset-password.success', { email: resetPasswordMutation.res.data.email })}</p>
<p>{t('auth.reset-password.success', { email: resetPasswordMutation.result.data.email })}</p>
<Button onClick={() => router.push('/login')} type="button" className="btn btn-primary w-100">
{t('auth.reset-password.back-to-login')}
</Button>
@ -44,7 +44,7 @@ export const ResetPasswordContainer: React.FC = () => {
return (
<ResetPasswordForm
loading={resetPasswordMutation.isExecuting}
loading={resetPasswordMutation.status === 'executing' || cancelRequestMutation.status === 'executing'}
onCancel={() => cancelRequestMutation.execute()}
onSubmit={({ password }) => resetPasswordMutation.execute({ newPassword: password })}
/>

View file

@ -193,7 +193,7 @@ export const AppDetailsContainer: React.FC<IProps> = ({ app, localDomain }) => {
<div className="w-100 d-flex flex-column ms-md-3 align-items-center align-items-md-start">
<div>
<span className="mt-1 me-1">{t('apps.app-details.version')}: </span>
<span className="badge bg-gray mt-2">{app.info.version}</span>
<span className="badge bg-muted mt-2 text-white">{app.info.version}</span>
</div>
<span className="mt-1 text-muted text-center mb-2">{app.info.short_desc}</span>
<div className="mb-1">{customStatus !== 'missing' && <AppStatus status={customStatus} />}</div>

View file

@ -36,7 +36,7 @@ export const AppDetailsTabs: React.FC<IProps> = ({ info }) => {
</DataGridItem>
<DataGridItem title={t('categories-title')}>
{info.categories.map((c) => (
<div key={c} className="badge bg-green me-1">
<div key={c} className="badge text-white bg-green me-1">
{t(`categories.${c}`)}
</div>
))}
@ -45,7 +45,7 @@ export const AppDetailsTabs: React.FC<IProps> = ({ info }) => {
{info.supported_architectures && (
<DataGridItem title={t('supported-arch')}>
{info.supported_architectures.map((a) => (
<div key={a} className="badge bg-red me-1">
<div key={a} className="badge text-white bg-red me-1">
{a.toLowerCase()}
</div>
))}

View file

@ -27,7 +27,7 @@ export const AppStoreTile: React.FC<{ app: App }> = ({ app }) => {
<h3 className="text-bold h-3 mb-2">{limitText(app.name, 20)}</h3>
<p className="text-muted text-nowrap mb-2">{limitText(app.short_desc, 30)}</p>
{app.categories?.map((category) => (
<div className={`badge me-1 bg-${colorSchemeForCategory[category]}`} key={`${app.id}-${category}`}>
<div className={`text-white badge me-1 bg-${colorSchemeForCategory[category]}`} key={`${app.id}-${category}`}>
{t(`categories.${category}`)}
</div>
))}

View file

@ -55,7 +55,7 @@ export const colorSchemeForCategory: Record<AppCategory, string> = {
development: 'red',
utilities: 'muted',
photography: 'purple',
security: 'organge',
security: 'orange',
social: 'yellow',
featured: 'lime',
data: 'green',
@ -63,7 +63,7 @@ export const colorSchemeForCategory: Record<AppCategory, string> = {
music: 'cyan',
finance: 'dark',
gaming: 'pink',
ai: 'gray',
ai: 'muted',
};
type AppCategoryEntry = {

View file

@ -38,7 +38,7 @@ export const NavBar: React.FC<IProps> = ({ isUpdateAvailable }) => {
{renderItem(t('app-store'), 'app-store', IconBrandAppstore)}
{renderItem(t('settings'), 'settings', IconSettings)}
</ul>
{Boolean(isUpdateAvailable) && <span className="ms-2 badge bg-green d-none d-lg-block">{t('update-available')}</span>}
{Boolean(isUpdateAvailable) && <span className="ms-2 badge text-white bg-green d-none d-lg-block">{t('update-available')}</span>}
</div>
</div>
);

View file

@ -36,7 +36,7 @@ export const PageTitle = ({ apps }: Props) => {
return (
<>
<div className="page-pretitle">{renderBreadcrumbs()}</div>
<h2 className="page-title">{title}</h2>
<h2 className="page-title mt-1">{title}</h2>
</>
);
};

View file

@ -1,3 +1,4 @@
.title {
min-height: 50px;
min-width: 200px;
}

View file

@ -29,11 +29,11 @@ export default async function DashboardLayout({ children }: { children: React.Re
<div className="page-wrapper">
<div className="page-header d-print-none">
<div className="container-xl">
<div className={clsx(styles.title, 'align-items-stretch align-items-md-center d-flex flex-column flex-md-row ')}>
<div className="me-3 text-white">
<div className={clsx(styles.title, 'row g-2 align-items-center')}>
<div className="col text-white">
<PageTitle apps={apps} />
</div>
<div className="flex-fill">
<div className="flex-fill col-auto ms-auto d-print-none">
<LayoutActions />
</div>
</div>

View file

@ -58,17 +58,30 @@ export const ChangePasswordForm = () => {
return (
<form onSubmit={handleSubmit(onSubmit)} className="mb-4 w-100 ">
<Input disabled={changePasswordMutation.isExecuting} {...register('currentPassword')} error={errors.currentPassword?.message} type="password" placeholder={t('form.current-password')} />
<Input disabled={changePasswordMutation.isExecuting} {...register('newPassword')} error={errors.newPassword?.message} className="mt-2" type="password" placeholder={t('form.new-password')} />
<Input
disabled={changePasswordMutation.isExecuting}
disabled={changePasswordMutation.status === 'executing'}
{...register('currentPassword')}
error={errors.currentPassword?.message}
type="password"
placeholder={t('form.current-password')}
/>
<Input
disabled={changePasswordMutation.status === 'executing'}
{...register('newPassword')}
error={errors.newPassword?.message}
className="mt-2"
type="password"
placeholder={t('form.new-password')}
/>
<Input
disabled={changePasswordMutation.status === 'executing'}
{...register('newPasswordConfirm')}
error={errors.newPasswordConfirm?.message}
className="mt-2"
type="password"
placeholder={t('form.confirm-password')}
/>
<Button disabled={changePasswordMutation.isExecuting} className="mt-3" type="submit">
<Button disabled={changePasswordMutation.status === 'executing'} className="mt-3" type="submit">
{t('form.change-password')}
</Button>
</form>

View file

@ -103,7 +103,7 @@ export const OtpForm = (props: { totpEnabled: boolean }) => {
return (
<>
{!key && <Switch onCheckedChange={handleTotp} checked={totpEnabled} label={t('enable-2fa')} />}
{getTotpUriMutation.isExecuting && (
{getTotpUriMutation.status === 'executing' && (
<div className="progress w-50">
<div className="progress-bar progress-bar-indeterminate bg-green" />
</div>
@ -123,7 +123,7 @@ export const OtpForm = (props: { totpEnabled: boolean }) => {
>
<p className="text-muted">{t('password-needed-hint')}</p>
<Input name="password" type="password" onChange={(e) => setPassword(e.target.value)} placeholder={t('form.password')} />
<Button loading={getTotpUriMutation.isExecuting} type="submit" className="btn-success mt-3">
<Button loading={getTotpUriMutation.status === 'executing'} type="submit" className="btn-success mt-3">
{t('enable-2fa')}
</Button>
</form>
@ -144,7 +144,7 @@ export const OtpForm = (props: { totpEnabled: boolean }) => {
>
<p className="text-muted">{t('password-needed-hint')}</p>
<Input name="password" type="password" onChange={(e) => setPassword(e.target.value)} placeholder={t('form.password')} />
<Button loading={disableTotpMutation.isExecuting} type="submit" className="btn-danger mt-3">
<Button loading={disableTotpMutation.status === 'executing'} type="submit" className="btn-danger mt-3">
{t('disable-2fa')}
</Button>
</form>

View file

@ -32,7 +32,7 @@ export const SettingsContainer = ({ initialValues, currentLocale }: Props) => {
return (
<div className="card-body">
<SettingsForm initalValues={initialValues} currentLocale={currentLocale} loading={updateSettingsMutation.isExecuting} onSubmit={onSubmit} />
<SettingsForm initalValues={initialValues} currentLocale={currentLocale} loading={updateSettingsMutation.status === 'executing'} onSubmit={onSubmit} />
</div>
);
};

View file

@ -12,14 +12,23 @@ type Props = {
export const ThemeProvider = (props: Props) => {
const { children, initialTheme } = props;
const cookies = useCookies();
const { theme } = useUIStore();
const { theme, setDarkMode } = useUIStore();
useEffect(() => {
if (theme) {
cookies.set('theme', theme || initialTheme || 'light', { path: '/' });
cookies.set('theme', theme || initialTheme || 'light', { path: '/', expires: 365 });
document.body.dataset.bsTheme = theme;
} else if (!cookies.get('theme')) {
// Detect system theme
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
setDarkMode(systemTheme === 'dark');
cookies.set('theme', systemTheme, { path: '/', expires: 365 });
document.body.dataset.bsTheme = systemTheme;
}
}, [cookies, initialTheme, theme]);
const cookieTheme = cookies.get('theme');
setDarkMode(cookieTheme === 'dark');
}, [cookies, initialTheme, setDarkMode, theme]);
return children;
};

View file

@ -15,7 +15,7 @@ export const Button = React.forwardRef<HTMLButtonElement, IProps>(({ type, class
const styles = { width: width ? `${width}px` : 'auto' };
return (
<button style={styles} onClick={onClick} disabled={disabled || loading} ref={ref} className={clsx('btn', className, { disabled: disabled || loading })} type={type} {...rest}>
{loading ? <span className="spinner-border spinner-border-sm mb-1 mx-2" role="status" data-testid="loader" aria-hidden="true" /> : children}
{loading ? <span className="spinner-border spinner-border-sm mx-2" role="status" data-testid="loader" aria-hidden="true" /> : children}
</button>
);
});

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Die Domain {domain} ist bereits in Verwendung von der App {id}",
"could-not-get-latest-version": "Konnte aktuellste Version nicht abfragen",
"current-version-is-latest": "Die aktuelle Version ist bereits auf dem neuesten Stand",
"major-version-update": "Die Hauptversion hat sich geändert. Bitte aktualisieren Sie manuell. (Anleitung auf GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Wartung",
"maintenance-subtitle": "Beliebte Aktionen, die Sie auf Ihrer Instanz durchführen können",
"restart": "Neustart",
"update": "Aktualisieren zu {version}",
"already-latest": "Bereits auf dem neuesten Stand"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "Meine Apps",
"app-store": "App Store",
"settings": "Einstellungen",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Ο τομέας {domain} χρησιμοποιείται ήδη από την εφαρμογή {id}",
"could-not-get-latest-version": "Αδυναμία λήψης της τελευταίας έκδοσης",
"current-version-is-latest": "Η τρέχουσα έκδοση είναι ενημερωμένη",
"major-version-update": "Η κύρια έκδοση έχει αλλάξει. Παρακαλούμε ενημερώστε χειροκίνητα (οδηγίες στο GitHub)"
"major-version-update": "Η κύρια έκδοση έχει αλλάξει. Παρακαλούμε ενημερώστε χειροκίνητα (οδηγίες σε σημειώσεις έκδοσης)",
"demo-mode-limit": "Μόνο 6 εφαρμογές μπορούν να εγκατασταθούν στη λειτουργία επίδειξης. Παρακαλώ απεγκαταστήστε μια άλλη εφαρμογή για να εγκαταστήσετε μια νέα."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Συντήρηση",
"maintenance-subtitle": "Κοινές ενέργειες για να εκτελέσετε",
"restart": "Επανεκκίνηση",
"update": "Αναβάθμιση στην έκδοση {version}",
"already-latest": "Ήδη ενημερωμένο"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Πίνακας Ελέγχου",
"apps": "Οι εφαρμογές μου",
"my-apps": "Οι εφαρμογές μου",
"app-store": "Κατάστημα εφαρμογών",
"settings": "Ρυθμίσεις",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "El dominio {domain} ya está en uso por la aplicación {id}",
"could-not-get-latest-version": "No se pudo obtener la última versión",
"current-version-is-latest": "La versión ya está actualizada",
"major-version-update": "La versión principal ha cambiado. Por favor, actualice manualmente (instrucciones en GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Mantenimiento",
"maintenance-subtitle": "Acciones comunes a realizar en tu instancia",
"restart": "Reiniciar",
"update": "Actualizar a {version}",
"already-latest": "Ya está actualizado"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "Mis aplicaciones",
"app-store": "Tienda de aplicaciones",
"settings": "Configuración",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Le domaine {domain} est déjà utilisé par l'application {id}",
"could-not-get-latest-version": "Impossible d'obtenir la dernière version",
"current-version-is-latest": "La version actuelle est déjà à jour",
"major-version-update": "La version majeure a changé. Veuillez mettre à jour manuellement (instructions sur GitHub)"
"major-version-update": "La version majeure a changé. Veuillez mettre à jour manuellement (instructions dans les notes de version)",
"demo-mode-limit": "Seulement 6 applications peuvent être installées en mode démo. Veuillez désinstaller une autre application pour en installer une nouvelle."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Actions courantes à effectuer sur votre instance",
"restart": "Redémarrer",
"update": "Mettre à jour vers {version}",
"already-latest": "Déjà à jour"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Tableau de bord",
"apps": "Mes Applications",
"my-apps": "Mes applications",
"app-store": "App Store",
"settings": "Paramètres",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "A(z) {domain} domaint már használja a(z) {id} alkalmazás",
"could-not-get-latest-version": "Nem sikerült letölteni a legújabb verziót",
"current-version-is-latest": "A jelenlegi verzió már naprakész",
"major-version-update": "A fő verzió megváltozott. Kérjük, frissítse manuálisan (utasítások a GitHubon)"
"major-version-update": "A fő verzió megváltozott, kérjük frissítse manuálisan (utasítások a kiadás megjegyzéseiben)",
"demo-mode-limit": "A demo verzióban csak 6 applikáció telepíthető. Kérjük töröljön egy applikációt, hogy újat telepíthessen."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Karbantartás",
"maintenance-subtitle": "Általános műveletek ezen a példányon",
"restart": "Újraindítás",
"update": "Frissítés erre {version}",
"already-latest": "Már naprakész"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Irányítópult",
"apps": "My Apps",
"my-apps": "Alkalmazásaim",
"app-store": "Alkalmazásbolt",
"settings": "Beállítások",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Il dominio {domain} è già in uso dall'app {id}",
"could-not-get-latest-version": "Impossibile ottenere l'ultima versione",
"current-version-is-latest": "La versione corrente è già la più recente",
"major-version-update": "La version major è cambiata. Aggiorna manualmente (istruzioni su GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Manutenzione",
"maintenance-subtitle": "Azioni comuni da eseguire sulla tua istanza",
"restart": "Riavvia",
"update": "Aggiorna alla {version}",
"already-latest": "Già aggiornato"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "Le mie App",
"app-store": "App Store",
"settings": "Impostazioni",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "ドメイン {domain} はすでにアプリ {id} によって使用されています",
"could-not-get-latest-version": "最新バージョンを取得できませんでした",
"current-version-is-latest": "現在のバージョンは既に最新です",
"major-version-update": "メジャーバージョンが変更されました。GitHubの手順に従って、手動で更新してください。"
"major-version-update": "メジャーバージョンが変更されました。リリースノートの手順に従って、手動で更新してください。",
"demo-mode-limit": "デモモードには、6つのアプリのみインストールできます。新しいアプリをインストールするには、他のアプリをアンインストールしてください。"
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "メンテナンス",
"maintenance-subtitle": "あなたのインスタンスで実行する一般的なアクション",
"restart": "再起動",
"update": "{version} に更新",
"already-latest": "既に最新です"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "ダッシュボード",
"apps": "マイアプリ",
"my-apps": "マイアプリ",
"app-store": "アプリストア",
"settings": "設定",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domena {domain} jest już w użyciu przez aplikację {id}",
"could-not-get-latest-version": "Nie udało się pobrać najnowszej wersji",
"current-version-is-latest": "Bieżąca wersja jest już aktualna",
"major-version-update": "Główna wersja uległa zmianie. Proszę zaktualizować ręcznie (instrukcje na GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Przerwa techniczna",
"maintenance-subtitle": "Wspólne działania do wykonania na twojej instancji",
"restart": "Uruchom ponownie",
"update": "Zaktualizuj do {version}",
"already-latest": "Już aktualne"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Panel nawigacyjny",
"apps": "My Apps",
"my-apps": "Moje aplikacje",
"app-store": "Sklep z aplikacjami",
"settings": "Ustawienia",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domeniul {domain} este deja utilizat de către aplicația {id}",
"could-not-get-latest-version": "Nu s-a putut obține cea mai recentă versiune",
"current-version-is-latest": "Versiunea curentă este deja actualizată",
"major-version-update": "Versiunea majoră s-a schimbat. Vă rugăm să actualizați manual (instrucțiuni pe GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Mentenanță",
"maintenance-subtitle": "Acțiuni comune de efectuat în instanța ta",
"restart": "Repornire",
"update": "Actualizează la {version}",
"already-latest": "Actualizat deja"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Panou de bord",
"apps": "My Apps",
"my-apps": "Aplicaţiile mele",
"app-store": "Magazin Aplicații",
"settings": "Setări",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Домен {domain} уже используется приложением {id}",
"could-not-get-latest-version": "Не удалось получить последнюю версию",
"current-version-is-latest": "Текущая версия уже актуальна",
"major-version-update": "Мажорная версия изменилась. Пожалуйста, обновите вручную (инструкции на GitHub)"
"major-version-update": "Основная версия была изменена. Пожалуйста, обновите вручную (инструкции в примечаниях к релизу)",
"demo-mode-limit": "Только 6 приложений могут быть установлены в демо режиме. Пожалуйста, удалите другое приложение, чтобы установить новое."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Обслуживание",
"maintenance-subtitle": "Общие действия для выполнения на вашем экземпляре",
"restart": "Перезапустить",
"update": "Обновить до {version}",
"already-latest": "Уже обновлено"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Обзор",
"apps": "My Apps",
"my-apps": "Мои приложения",
"app-store": "Магазин приложений",
"settings": "Настройки",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domän {domain} används redan av appen {id}",
"could-not-get-latest-version": "Kunde inte hämta senaste versionen",
"current-version-is-latest": "Den nuvarande versionen är redan uppdaterad",
"major-version-update": "Huvudversionen har ändrats. Vänligen uppdatera manuellt (instruktioner på GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Endast 6 appar kan installeras i demoläget. Avinstallera en annan app för att installera en ny."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Underhåll",
"maintenance-subtitle": "Vanliga åtgärder att utföra på din instans",
"restart": "Starta om",
"update": "Uppdatera till {version}",
"already-latest": "Redan uppdaterad"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Kontrollpanel",
"apps": "My Apps",
"my-apps": "Mina appar",
"app-store": "App Store",
"settings": "Inställningar",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "{domain} alan adı zaten {id} uygulaması tarafından kullanılıyor",
"could-not-get-latest-version": "En son sürüm alınamadı",
"current-version-is-latest": "Son versiyon zaten yüklü",
"major-version-update": "Ana sürüm değişti. Lütfen manuel olarak güncelleyin (GitHub'daki talimatlar)"
"major-version-update": "Ana sürüm değişti. Lütfen manuel olarak güncelleyin (sürüm notlarındaki talimatlar)",
"demo-mode-limit": "Demo modunda yalnızca 6 uygulama yüklenebilir. Yeni bir uygulama yüklemek için lütfen başka bir uygulamayı kaldırın."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Bakım",
"maintenance-subtitle": "Sunucunuz üzerinde gerçekleştirilecek ana işlemler",
"restart": "Yeniden Başlat",
"update": "{version} Sürümüne güncelle",
"already-latest": "Zaten güncel"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Kontrol Paneli",
"apps": "Uygulamalarım",
"my-apps": "Uygulamalarım",
"app-store": "Uygulama mağazası",
"settings": "Ayarlar",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Domain {domain} is already in use by app {id}",
"could-not-get-latest-version": "Could not get latest version",
"current-version-is-latest": "Current version is already up to date",
"major-version-update": "The major version has changed. Please update manually (instructions on GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Maintenance",
"maintenance-subtitle": "Common actions to perform on your instance",
"restart": "Restart",
"update": "Update to {version}",
"already-latest": "Already up to date"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Dashboard",
"apps": "My Apps",
"my-apps": "My Apps",
"app-store": "App Store",
"settings": "Settings",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "Tên miền {domain} đã được sử dụng bởi ứng dụng {id}",
"could-not-get-latest-version": "Không thể kiểm tra phiên bản mới nhất",
"current-version-is-latest": "Phiên bản hiện tại đã được cập nhật",
"major-version-update": "Ứng dụng được cập nhật phiên bản lớn. Vui lòng cập nhật thủ công (hướng dẫn được tim thấy ở GitHub)"
"major-version-update": "The major version has changed. Please update manually (instructions in release notes)",
"demo-mode-limit": "Only 6 apps can be installed in the demo mode. Please uninstall an other app to install a new one."
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "Bảo trì",
"maintenance-subtitle": "Những thao tác thường sử dụng trên máy chủ của bạn",
"restart": "Khởi động lại",
"update": "Cập nhật lên phiên bản {version}",
"already-latest": "Đã cập nhật"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "Bảng điều khiển",
"apps": "My Apps",
"my-apps": "Ứng dụng của tôi",
"app-store": "Cửa hàng ứng dụng",
"settings": "Cài đặt",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "域名 {domain} 已被应用程序 {id} 使用",
"could-not-get-latest-version": "无法获取最新版本",
"current-version-is-latest": "当前版本已经是最新版本",
"major-version-update": "主要版本已更新。请手动更新 (参照GitHub上的指示)"
"major-version-update": "主要版本已更新。请手动更新 (参照更新记录上的指示)",
"demo-mode-limit": "在演示模式下只能安装6个应用。请卸载其他应用来安装新应用。"
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "维护",
"maintenance-subtitle": "在您的实例中执行的常见操作",
"restart": "重启",
"update": "更新到 {version}",
"already-latest": "已是最新版本"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "控制面板",
"apps": "我的应用",
"my-apps": "我的应用",
"app-store": "应用市场",
"settings": "设置",

View file

@ -33,7 +33,8 @@
"domain-already-in-use": "域名 {domain} 已被應用程序 {id} 使用",
"could-not-get-latest-version": "無法檢查最新版本",
"current-version-is-latest": "當前版本已經是最新的",
"major-version-update": "主要版本已更改。 請手動更新参照GitHub 上的說明)"
"major-version-update": "主要版本已更改。 請手動更新(参照更新說明)",
"demo-mode-limit": "在演示模式下只能安裝6個應用。請卸載其他應用來安裝新應用。"
},
"success": {}
},
@ -228,7 +229,6 @@
"maintenance-title": "維護",
"maintenance-subtitle": "在您的實例上執行的常見操作",
"restart": "重新啟動",
"update": "更新到 {{version}}",
"already-latest": "已是最新版本"
},
"settings": {
@ -286,6 +286,7 @@
},
"header": {
"dashboard": "儀表板",
"apps": "我的應用程式",
"my-apps": "我的應用程式",
"app-store": "應用程式商店",
"settings": "設定",

View file

@ -25,8 +25,7 @@ export const useUIStore = create<UIStore>((set) => ({
setDarkMode: (darkMode: boolean) => {
if (darkMode) {
set({ theme: 'dark' });
}
if (!darkMode) {
} else {
set({ theme: 'light' });
}
set({ darkMode });