6
This commit is contained in:
parent
6c4fe526f8
commit
ff0821d034
@ -4,7 +4,7 @@ import { MenuAsideItem } from './interfaces'
|
|||||||
const menuAside: MenuAsideItem[] = [
|
const menuAside: MenuAsideItem[] = [
|
||||||
{
|
{
|
||||||
href: '/studio',
|
href: '/studio',
|
||||||
label: 'AI Music Generator Creator',
|
label: 'Music Studio',
|
||||||
icon: icon.mdiMusicNotePlus,
|
icon: icon.mdiMusicNotePlus,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -133,6 +133,14 @@ const menuAside: MenuAsideItem[] = [
|
|||||||
icon: 'mdiLock' in icon ? icon['mdiLock' as keyof typeof icon] : icon.mdiTable ?? icon.mdiTable,
|
icon: 'mdiLock' in icon ? icon['mdiLock' as keyof typeof icon] : icon.mdiTable ?? icon.mdiTable,
|
||||||
permissions: 'READ_SYSTEM_SETTINGS'
|
permissions: 'READ_SYSTEM_SETTINGS'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
href: '/admin_access_keys/admin_access_keys-list',
|
||||||
|
label: 'Admin access keys',
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore
|
||||||
|
icon: 'mdiKey' in icon ? icon['mdiKey' as keyof typeof icon] : icon.mdiTable ?? icon.mdiTable,
|
||||||
|
permissions: 'READ_ADMIN_ACCESS_KEYS'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
href: '/profile',
|
href: '/profile',
|
||||||
label: 'Profile',
|
label: 'Profile',
|
||||||
|
|||||||
@ -41,6 +41,7 @@ const Dashboard = () => {
|
|||||||
const [media_assets, setMedia_assets] = React.useState(loadingMessage);
|
const [media_assets, setMedia_assets] = React.useState(loadingMessage);
|
||||||
const [playback_sessions, setPlayback_sessions] = React.useState(loadingMessage);
|
const [playback_sessions, setPlayback_sessions] = React.useState(loadingMessage);
|
||||||
const [system_settings, setSystem_settings] = React.useState(loadingMessage);
|
const [system_settings, setSystem_settings] = React.useState(loadingMessage);
|
||||||
|
const [admin_access_keys, setAdmin_access_keys] = React.useState(loadingMessage);
|
||||||
|
|
||||||
|
|
||||||
const [widgetsRole, setWidgetsRole] = React.useState({
|
const [widgetsRole, setWidgetsRole] = React.useState({
|
||||||
@ -53,8 +54,8 @@ const Dashboard = () => {
|
|||||||
|
|
||||||
|
|
||||||
async function loadData() {
|
async function loadData() {
|
||||||
const entities = ['users','roles','permissions','languages','music_styles','eras','ai_voices','lyric_templates','songs','song_voice_tracks','lyric_sync_segments','generation_jobs','media_assets','playback_sessions','system_settings',];
|
const entities = ['users','roles','permissions','languages','music_styles','eras','ai_voices','lyric_templates','songs','song_voice_tracks','lyric_sync_segments','generation_jobs','media_assets','playback_sessions','system_settings','admin_access_keys',];
|
||||||
const fns = [setUsers,setRoles,setPermissions,setLanguages,setMusic_styles,setEras,setAi_voices,setLyric_templates,setSongs,setSong_voice_tracks,setLyric_sync_segments,setGeneration_jobs,setMedia_assets,setPlayback_sessions,setSystem_settings,];
|
const fns = [setUsers,setRoles,setPermissions,setLanguages,setMusic_styles,setEras,setAi_voices,setLyric_templates,setSongs,setSong_voice_tracks,setLyric_sync_segments,setGeneration_jobs,setMedia_assets,setPlayback_sessions,setSystem_settings,setAdmin_access_keys,];
|
||||||
|
|
||||||
const requests = entities.map((entity, index) => {
|
const requests = entities.map((entity, index) => {
|
||||||
|
|
||||||
@ -106,7 +107,7 @@ const Dashboard = () => {
|
|||||||
main>
|
main>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
href="/studio"
|
href="/studio"
|
||||||
label="Open AI Music Generator"
|
label="Open Music Studio"
|
||||||
icon={icon.mdiMusicNotePlus}
|
icon={icon.mdiMusicNotePlus}
|
||||||
color="info"
|
color="info"
|
||||||
/>
|
/>
|
||||||
@ -575,6 +576,34 @@ const Dashboard = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</Link>}
|
</Link>}
|
||||||
|
|
||||||
|
{hasPermission(currentUser, 'READ_ADMIN_ACCESS_KEYS') && <Link href={'/admin_access_keys/admin_access_keys-list'}>
|
||||||
|
<div
|
||||||
|
className={`${corners !== 'rounded-full'? corners : 'rounded-3xl'} dark:bg-dark-900 ${cardsStyle} dark:border-dark-700 p-6`}
|
||||||
|
>
|
||||||
|
<div className="flex justify-between align-center">
|
||||||
|
<div>
|
||||||
|
<div className="text-lg leading-tight text-gray-500 dark:text-gray-400">
|
||||||
|
Admin access keys
|
||||||
|
</div>
|
||||||
|
<div className="text-3xl leading-tight font-semibold">
|
||||||
|
{admin_access_keys}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<BaseIcon
|
||||||
|
className={`${iconsColor}`}
|
||||||
|
w="w-16"
|
||||||
|
h="h-16"
|
||||||
|
size={48}
|
||||||
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||||
|
// @ts-ignore
|
||||||
|
path={'mdiKey' in icon ? icon['mdiKey' as keyof typeof icon] : icon.mdiTable || icon.mdiTable}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Link>}
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -10,12 +10,12 @@ import { mdiMusic, mdiAccountKey, mdiPlayCircle, mdiCloudDownload, mdiAutoFix }
|
|||||||
import BaseIcon from '../components/BaseIcon';
|
import BaseIcon from '../components/BaseIcon';
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
const title = 'AI Music Generator Creator Pro';
|
const title = 'Music Studio Pro';
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-slate-950 text-white min-h-screen font-sans selection:bg-emerald-500/30">
|
<div className="bg-slate-950 text-white min-h-screen font-sans selection:bg-emerald-500/30">
|
||||||
<Head>
|
<Head>
|
||||||
<title>{getPageTitle('AI Music Generator Creator')}</title>
|
<title>{getPageTitle('Music Studio')}</title>
|
||||||
</Head>
|
</Head>
|
||||||
|
|
||||||
{/* Hero Section */}
|
{/* Hero Section */}
|
||||||
@ -31,16 +31,16 @@ export default function Home() {
|
|||||||
<div className="z-10 container mx-auto px-6 flex flex-col items-center justify-center text-center py-20">
|
<div className="z-10 container mx-auto px-6 flex flex-col items-center justify-center text-center py-20">
|
||||||
<div className="inline-flex items-center space-x-2 px-3 py-1 rounded-full bg-emerald-500/10 border border-emerald-500/20 mb-8 animate-fade-in">
|
<div className="inline-flex items-center space-x-2 px-3 py-1 rounded-full bg-emerald-500/10 border border-emerald-500/20 mb-8 animate-fade-in">
|
||||||
<BaseIcon path={mdiAutoFix} size={16} className="text-emerald-400" />
|
<BaseIcon path={mdiAutoFix} size={16} className="text-emerald-400" />
|
||||||
<span className="text-xs font-medium text-emerald-400 tracking-wider uppercase">Next-Gen AI Generation</span>
|
<span className="text-xs font-medium text-emerald-400 tracking-wider uppercase">Next-Gen Audio Engineering</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h1 className="text-5xl md:text-7xl font-extrabold tracking-tight mb-6 bg-clip-text text-transparent bg-gradient-to-b from-white to-slate-400">
|
<h1 className="text-5xl md:text-7xl font-extrabold tracking-tight mb-6 bg-clip-text text-transparent bg-gradient-to-b from-white to-slate-400">
|
||||||
Professional AI <br /> Music Generator
|
Professional <br /> Music Studio
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p className="max-w-2xl text-lg md:text-xl text-slate-400 mb-10 leading-relaxed">
|
<p className="max-w-2xl text-lg md:text-xl text-slate-400 mb-10 leading-relaxed">
|
||||||
Generate studio-quality songs in seconds. Choose your style, era, and voice.
|
Create studio-quality songs in seconds. Choose your style, era, and voice.
|
||||||
Lyrics synchronization across 200+ languages with synchronized AI vocals.
|
Advanced music generation across 200+ languages with synchronized vocals.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:space-x-6">
|
<div className="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:space-x-6">
|
||||||
@ -54,7 +54,7 @@ export default function Home() {
|
|||||||
<Link href="/login">
|
<Link href="/login">
|
||||||
<button className="px-8 py-4 bg-slate-800 hover:bg-slate-700 text-white font-bold rounded-xl border border-slate-700 transition-all duration-300 flex items-center justify-center">
|
<button className="px-8 py-4 bg-slate-800 hover:bg-slate-700 text-white font-bold rounded-xl border border-slate-700 transition-all duration-300 flex items-center justify-center">
|
||||||
<BaseIcon path={mdiAccountKey} size={24} className="mr-2" />
|
<BaseIcon path={mdiAccountKey} size={24} className="mr-2" />
|
||||||
ADMIN LOGIN
|
LOGIN
|
||||||
</button>
|
</button>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
@ -64,7 +64,7 @@ export default function Home() {
|
|||||||
{ label: '200+ Languages', icon: mdiMusic },
|
{ label: '200+ Languages', icon: mdiMusic },
|
||||||
{ label: 'Studio Voices', icon: mdiMusic },
|
{ label: 'Studio Voices', icon: mdiMusic },
|
||||||
{ label: 'Sync Lyrics', icon: mdiMusic },
|
{ label: 'Sync Lyrics', icon: mdiMusic },
|
||||||
{ label: 'MP4 Download', icon: mdiCloudDownload }
|
{ label: 'High-Quality Download', icon: mdiCloudDownload }
|
||||||
].map((feature, i) => (
|
].map((feature, i) => (
|
||||||
<div key={i} className="flex flex-col items-center p-4 rounded-2xl bg-slate-900/50 border border-slate-800">
|
<div key={i} className="flex flex-col items-center p-4 rounded-2xl bg-slate-900/50 border border-slate-800">
|
||||||
<div className="w-10 h-10 rounded-full bg-emerald-500/10 flex items-center justify-center mb-3 text-emerald-400">
|
<div className="w-10 h-10 rounded-full bg-emerald-500/10 flex items-center justify-center mb-3 text-emerald-400">
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState } from 'react';
|
||||||
import type { ReactElement } from 'react';
|
import type { ReactElement } from 'react';
|
||||||
import Head from 'next/head';
|
import Head from 'next/head';
|
||||||
@ -44,7 +42,7 @@ export default function Login() {
|
|||||||
password: '60682486',
|
password: '60682486',
|
||||||
remember: true })
|
remember: true })
|
||||||
|
|
||||||
const title = 'AI Music Studio Admin'
|
const title = 'Music Studio Admin'
|
||||||
|
|
||||||
// Fetch Pexels image/video
|
// Fetch Pexels image/video
|
||||||
useEffect( () => {
|
useEffect( () => {
|
||||||
@ -273,4 +271,4 @@ export default function Login() {
|
|||||||
|
|
||||||
Login.getLayout = function getLayout(page: ReactElement) {
|
Login.getLayout = function getLayout(page: ReactElement) {
|
||||||
return <LayoutGuest>{page}</LayoutGuest>;
|
return <LayoutGuest>{page}</LayoutGuest>;
|
||||||
};
|
};
|
||||||
@ -149,7 +149,7 @@ const StudioPage = () => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<HeadInstance>
|
<HeadInstance>
|
||||||
<title>{getPageTitle('AI Music Generator Creator')}</title>
|
<title>{getPageTitle('Music Studio')}</title>
|
||||||
</HeadInstance>
|
</HeadInstance>
|
||||||
|
|
||||||
<audio
|
<audio
|
||||||
@ -159,7 +159,7 @@ const StudioPage = () => {
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<SectionMain>
|
<SectionMain>
|
||||||
<SectionTitleLineWithButton icon={mdiMusic} title="AI Music Generator Creator" main>
|
<SectionTitleLineWithButton icon={mdiMusic} title="Music Studio" main>
|
||||||
<BaseButton
|
<BaseButton
|
||||||
href="/songs/songs-list"
|
href="/songs/songs-list"
|
||||||
label="Library"
|
label="Library"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user