mirror of
https://github.com/D4M13N-D3V/neroshitron.git
synced 2025-03-14 10:05:04 +00:00
Compare commits
63 Commits
Author | SHA1 | Date | |
---|---|---|---|
2e19d5fdeb | |||
63f31e0f4c | |||
f75d889ee8 | |||
8877362484 | |||
082c161959 | |||
5d96002a2e | |||
65ddd704f0 | |||
b12d095e3e | |||
581ceb028a | |||
7ac84fc0cf | |||
164aec1c51 | |||
420e029d66 | |||
d94f3b825b | |||
7635178e3c | |||
a9968ccb03 | |||
4d86b8aeed | |||
19bee6998a | |||
fcf83c6435 | |||
32ba288463 | |||
334db37d18 | |||
1112191b61 | |||
52b7771994 | |||
9e76f9315b | |||
c9bf8e8431 | |||
691292becc | |||
e8fa3d2ce0 | |||
fd76220269 | |||
e9e4f25520 | |||
234cc989f1 | |||
e6a81a3bdf | |||
96aeca6242 | |||
a6d050c35f | |||
f790a03c27 | |||
6f5bf90a0b | |||
e5daff376a | |||
a0a38389a6 | |||
85c066baec | |||
9c6bdddd22 | |||
87ba2e032d | |||
28414630a4 | |||
534cbf2957 | |||
481b4f698c | |||
172a3015af | |||
6564be1a60 | |||
fdcaccfbd6 | |||
6541bd94fe | |||
82fdd61170 | |||
caca715cc0 | |||
74335ff6cf | |||
3206a19f7a | |||
e48d3ebafb | |||
168c835a23 | |||
0127d00021 | |||
02872252b5 | |||
b6736651c5 | |||
78a25ab398 | |||
58d384a3fc | |||
76a09c8e8c | |||
73836c5893 | |||
4c972778cd | |||
795fc0f5f7 | |||
e4dde90da4 | |||
fa6bf10249 |
47
README.md
47
README.md
@ -49,51 +49,6 @@ Configuration is done through the Owncast administration page located on your se
|
|||||||

|

|
||||||
|
|
||||||
# Database Diagram
|
# Database Diagram
|
||||||

|

|
||||||
|
|
||||||
# React Components
|
|
||||||
## Gallery Component
|
|
||||||
The `Gallery` component is a React component used to display a gallery of images. It fetches images from an API and displays them in a Masonry layout.
|
|
||||||
### Props
|
|
||||||
- `id` (number): The ID of the gallery to fetch images from.
|
|
||||||
- `closeMenu` (function): A function to close the menu.
|
|
||||||
### State
|
|
||||||
- `isSingle` (boolean): A state to check if only a single image is to be displayed.
|
|
||||||
- `loaded` (object): A state to keep track of loaded images.
|
|
||||||
- `selectedImage` (string | null): A state to keep track of the selected image.
|
|
||||||
- `images` (string[]): A state to store the fetched images.
|
|
||||||
- `galleryId` (number): A state to store the gallery ID.
|
|
||||||
### Functions
|
|
||||||
- `getData`: An async function to fetch images from the API.
|
|
||||||
- `generateRandomString`: A function to generate a random string of a given length.
|
|
||||||
- `handleDownload`: A function to handle the download of an image.
|
|
||||||
### Usage
|
|
||||||
The example below will load the images of the the gallery with an ID of `58201557-b392-471e-ac55-dcf6171cd18d` and will call the function for `setIsOpen(false)` when the back button is clicked.
|
|
||||||
```tsx
|
|
||||||
<Gallery id={"58201557-b392-471e-ac55-dcf6171cd18d"} closeMenu={() => setIsOpen(false)}></Gallery>
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## GalleryThumbnail Component
|
|
||||||
The `GalleryThumbnail` component is a React component used to display a thumbnail of a gallery. It fetches the thumbnail image from an API and displays it. When clicked, it triggers a callback function with the gallery ID.
|
|
||||||
### Props
|
|
||||||
|
|
||||||
- `id` (string): The ID of the gallery to fetch the thumbnail for.
|
|
||||||
- `onSelect` (function): A function to be called when the thumbnail is clicked. The gallery ID is passed as an argument.
|
|
||||||
- `title` (string) : The name of the gallery.
|
|
||||||
- `subscription` (subscription) : The name of the subscription required for the gallery.
|
|
||||||
|
|
||||||
### State
|
|
||||||
|
|
||||||
- `galleryId` (string): A state to store the gallery ID.
|
|
||||||
- `thumbnailUrl` (string): A state to store the fetched thumbnail URL.
|
|
||||||
- `isLoading` (boolean): A state to keep track of the loading status.
|
|
||||||
### Functions
|
|
||||||
|
|
||||||
- `openGallery`: A function to call the `onSelect` prop with the gallery ID.
|
|
||||||
- `getData`: An async function to fetch the thumbnail from the API.
|
|
||||||
### Usage
|
|
||||||
This will render a thumbnail for the gallery with the ID of "1". When the thumbnail is clicked, it will log the gallery ID to the console.
|
|
||||||
```tsx
|
|
||||||
<GalleryThumbnail id="1" onSelect={(id) => //console.log(id)} />
|
|
||||||
```
|
|
||||||
|
41
app/admin/page.tsx
Normal file
41
app/admin/page.tsx
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
"use client";
|
||||||
|
import { createClient } from "@/utils/supabase/client";
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
function PageComponent() {
|
||||||
|
const supabase = createClient();
|
||||||
|
const getData = async () => {
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getData();
|
||||||
|
}, []);
|
||||||
|
const router = useRouter();
|
||||||
|
return (
|
||||||
|
<div className="w-full text-white flex justify-center items-center animate-in">
|
||||||
|
<div className="w-2/3 lg:w-1/3 rounded-md bg-primary p-8 mt-32 shadow-lg opacity-90 backdrop-blur-lg">
|
||||||
|
<div className="w-full flex justify-center">
|
||||||
|
<span className="text-2xl pb-4">System Settings</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-center ">
|
||||||
|
<button onClick={()=>{ router.push("/admin/tiers") }} className="bg-secondary hover:bg-secondary-dark rounded p-2 mr-1 w-full">Tiers Management</button>
|
||||||
|
<button onClick={()=>{ router.push("/gallery/admin") }} className="ml-1 bg-secondary hover:bg-secondary-dark rounded p-2 w-full">Gallery Management</button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-center pt-2">
|
||||||
|
<button onClick={()=>{ router.push("/admin/theme") }} className="mr-1 bg-secondary hover:bg-secondary-dark rounded p-2 mr-1 w-full">Theme Settings</button>
|
||||||
|
<button className="bg-secondary hover:bg-secondary-dark rounded p-2 ml-1 w-full">User Management</button>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-center pt-2">
|
||||||
|
<button className="bg-secondary hover:bg-secondary-dark rounded p-2 w-full mr-1">Payment/Payout Settings</button>
|
||||||
|
<button className="bg-secondary hover:bg-secondary-dark rounded p-2 w-full ml-1">Comissions Settings</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PageComponent;
|
||||||
|
|
||||||
|
|
||||||
|
|
474
app/admin/theme/page.tsx
Normal file
474
app/admin/theme/page.tsx
Normal file
@ -0,0 +1,474 @@
|
|||||||
|
"use client";
|
||||||
|
import { createClient } from "@/utils/supabase/client";
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
|
function PageComponent() {
|
||||||
|
const router = useRouter();
|
||||||
|
const supabase = createClient();
|
||||||
|
|
||||||
|
const [primary, setPrimary] = useState('#201240');
|
||||||
|
const [primaryLight, setPrimaryLight] = useState('#403260');
|
||||||
|
const [primaryDark, setPrimaryDark] = useState('#100120');
|
||||||
|
const [secondary, setSecondary] = useState('#4F3D70');
|
||||||
|
const [secondaryLight, setSecondaryLight] = useState('#6F5D90');
|
||||||
|
const [secondaryDark, setSecondaryDark] = useState('#2F1D50');
|
||||||
|
const [error, setError] = useState('#862117');
|
||||||
|
const [errorLight, setErrorLight] = useState('#C44C4C');
|
||||||
|
const [errorDark, setErrorDark] = useState('#5C0D0D');
|
||||||
|
const [changed, setChanged] = useState(false);
|
||||||
|
const [success, setSuccess] = useState('#00C9A6');
|
||||||
|
const [successLight, setSuccessLight] = useState('#20E9C6');
|
||||||
|
const [successDark, setSuccessDark] = useState('#00A986');
|
||||||
|
const [warning, setWarning] = useState('#E17558');
|
||||||
|
const [warningLight, setWarningLight] = useState('#E39578');
|
||||||
|
const [warningDark, setWarningDark] = useState('#C15538');
|
||||||
|
const [info, setInfo] = useState('#222140');
|
||||||
|
const [infoLight, setInfoLight] = useState('#424260');
|
||||||
|
const [infoDark, setInfoDark] = useState('#020120');
|
||||||
|
const [saving, setSaving] = useState(false);
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
var primaryConfig = await getColorConfig('primary');
|
||||||
|
setPrimary(primaryConfig.value);
|
||||||
|
var primaryLightConfig = await getColorConfig('primary-light');
|
||||||
|
setPrimaryLight(primaryLightConfig.value);
|
||||||
|
var primaryDarkConfig = await getColorConfig('primary-dark');
|
||||||
|
setPrimaryDark(primaryDarkConfig.value);
|
||||||
|
var secondaryConfig = await getColorConfig('secondary');
|
||||||
|
setSecondary(secondaryConfig.value);
|
||||||
|
var secondaryLightConfig = await getColorConfig('secondary-light');
|
||||||
|
setSecondaryLight(secondaryLightConfig.value);
|
||||||
|
var secondaryDarkConfig = await getColorConfig('secondary-dark');
|
||||||
|
setSecondaryDark(secondaryDarkConfig.value);
|
||||||
|
var errorConfig = await getColorConfig('error');
|
||||||
|
setError(errorConfig.value);
|
||||||
|
var errorLightConfig = await getColorConfig('error-light');
|
||||||
|
setErrorLight(errorLightConfig.value);
|
||||||
|
var errorDarkConfig = await getColorConfig('error-dark');
|
||||||
|
setErrorDark(errorDarkConfig.value);
|
||||||
|
var successConfig = await getColorConfig('success');
|
||||||
|
setSuccess(successConfig.value);
|
||||||
|
var successLightConfig = await getColorConfig('success-light');
|
||||||
|
setSuccessLight(successLightConfig.value);
|
||||||
|
var successDarkConfig = await getColorConfig('success-dark');
|
||||||
|
setSuccessDark(successDarkConfig.value);
|
||||||
|
var warningConfig = await getColorConfig('warning');
|
||||||
|
setWarning(warningConfig.value);
|
||||||
|
var warningLightConfig = await getColorConfig('warning-light');
|
||||||
|
setWarningLight(warningLightConfig.value);
|
||||||
|
var warningDarkConfig = await getColorConfig('warning-dark');
|
||||||
|
setWarningDark(warningDarkConfig.value);
|
||||||
|
var infoConfig = await getColorConfig('info');
|
||||||
|
setInfo(infoConfig.value);
|
||||||
|
var infoLightConfig = await getColorConfig('info-light');
|
||||||
|
setInfoLight(infoLightConfig.value);
|
||||||
|
var infoDarkConfig = await getColorConfig('info-dark');
|
||||||
|
setInfoDark(infoDarkConfig.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getColorConfig = async (name: string) => {
|
||||||
|
try {
|
||||||
|
const response = await fetch(`/api/admin/interface-configs?name=${name}`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Failed to call GET request');
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
throw new Error('Failed to call GET request');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const setColorConfig = async (name: string, value:string) => {
|
||||||
|
try {
|
||||||
|
const response = await fetch(`/api/admin/interface-configs`, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ name, value }),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('Failed to call GET request');
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
return data;
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
throw new Error('Failed to call GET request');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const save = async () => {
|
||||||
|
setSaving(true);
|
||||||
|
await Promise.all([
|
||||||
|
setColorConfig('primary', primary),
|
||||||
|
setColorConfig('primary-light', primaryLight),
|
||||||
|
setColorConfig('primary-dark', primaryDark),
|
||||||
|
setColorConfig('secondary', secondary),
|
||||||
|
setColorConfig('secondary-light', secondaryLight),
|
||||||
|
setColorConfig('secondary-dark', secondaryDark),
|
||||||
|
setColorConfig('error', error),
|
||||||
|
setColorConfig('error-light', errorLight),
|
||||||
|
setColorConfig('error-dark', errorDark),
|
||||||
|
setColorConfig('success', success),
|
||||||
|
setColorConfig('success-light', successLight),
|
||||||
|
setColorConfig('success-dark', successDark),
|
||||||
|
setColorConfig('warning', warning),
|
||||||
|
setColorConfig('warning-light', warningLight),
|
||||||
|
setColorConfig('warning-dark', warningDark),
|
||||||
|
setColorConfig('info', info),
|
||||||
|
setColorConfig('info-light', infoLight),
|
||||||
|
setColorConfig('info-dark', infoDark)
|
||||||
|
]);
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const colorChange = async ()=>{
|
||||||
|
setChanged(true)
|
||||||
|
document.documentElement.style.setProperty(`--color-primary`, primary);
|
||||||
|
document.documentElement.style.setProperty(`--color-primary-light`, primaryLight);
|
||||||
|
document.documentElement.style.setProperty(`--color-primary-dark`, primaryDark);
|
||||||
|
document.documentElement.style.setProperty(`--color-secondary`, secondary);
|
||||||
|
document.documentElement.style.setProperty(`--color-secondary-light`, secondaryLight);
|
||||||
|
document.documentElement.style.setProperty(`--color-secondary-dark`, secondaryDark);
|
||||||
|
document.documentElement.style.setProperty(`--color-error`, error);
|
||||||
|
document.documentElement.style.setProperty(`--color-error-light`, errorLight);
|
||||||
|
document.documentElement.style.setProperty(`--color-error-dark`, errorDark);
|
||||||
|
document.documentElement.style.setProperty(`--color-success`, success);
|
||||||
|
document.documentElement.style.setProperty(`--color-success-light`, successLight);
|
||||||
|
document.documentElement.style.setProperty(`--color-success-dark`, successDark);
|
||||||
|
document.documentElement.style.setProperty(`--color-warning`, warning);
|
||||||
|
document.documentElement.style.setProperty(`--color-warning-light`, warningLight);
|
||||||
|
document.documentElement.style.setProperty(`--color-warning-dark`, warningDark);
|
||||||
|
document.documentElement.style.setProperty(`--color-info`, info);
|
||||||
|
document.documentElement.style.setProperty(`--color-info-light`, infoLight);
|
||||||
|
document.documentElement.style.setProperty(`--color-info-dark`, infoDark);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="w-5/6 h-1/2 text-white lg:flex justify-center items-center animate-in overflow-y-hidden">
|
||||||
|
<div className=" w-5/6 md:w-4/6 lg:w-3/6 xl:w-2/6 rounded-md bg-primary opacity-90 p-12 m-1 mt-24 shadow-lg backdrop-blur">
|
||||||
|
<div className="w-full relative">
|
||||||
|
<span className="text-2xl pb-4">Color Settings</span>
|
||||||
|
<button onClick={()=>{router.push("/admin")}} className={`float-right bg-error hover:bg-error-light ml-2 rounded p-2`}>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor"
|
||||||
|
className="md:hidden size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3" />
|
||||||
|
</svg>
|
||||||
|
<span className="hidden md:block">Back</span>
|
||||||
|
</button>
|
||||||
|
<button onClick={save} disabled={!changed}
|
||||||
|
className={`float-right ${changed ? "bg-success hover:bg-success-light" : "bg-success-dark"} rounded p-2`}>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor"
|
||||||
|
className="md:hidden size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="m4.5 12.75 6 6 9-13.5" />
|
||||||
|
</svg>
|
||||||
|
<span className="hidden md:block">{saving?"Saving...":"Save"}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Primary Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={primary}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setPrimary(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={primary}
|
||||||
|
onChange={(e) => { setPrimary(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Primary Light Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={primaryLight}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setPrimaryLight(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={primaryLight}
|
||||||
|
onChange={(e) => { setPrimaryLight(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Primary Dark Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={primaryDark}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setPrimaryDark(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={primaryDark}
|
||||||
|
onChange={(e) => { setPrimaryDark(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Secondary Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={secondary}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setSecondary(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={secondary}
|
||||||
|
onChange={(e) => { setSecondary(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Secondary Dark Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={secondaryDark}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setSecondaryDark(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={secondaryDark}
|
||||||
|
onChange={(e) => { setSecondaryDark(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Secondary Light Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={secondaryLight}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setSecondaryLight(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={secondaryLight}
|
||||||
|
onChange={(e) => { setSecondaryLight(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Error Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={error}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setError(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={error}
|
||||||
|
onChange={(e) => { setError(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Error Dark Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={errorDark}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setErrorDark(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={errorDark}
|
||||||
|
onChange={(e) => { setErrorDark(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Error Light Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={errorLight}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setErrorLight(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={errorLight}
|
||||||
|
onChange={(e) => { setErrorLight(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Success Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={success}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setSuccess(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={success}
|
||||||
|
onChange={(e) => { setSuccess(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Success Dark Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={successDark}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setSuccessDark(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={successDark}
|
||||||
|
onChange={(e) => { setSuccessDark(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full relative">
|
||||||
|
<label htmlFor="primaryInput">Success Light Color</label>
|
||||||
|
<div className="flex">
|
||||||
|
<input
|
||||||
|
value={successLight}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md rounded-r-none bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setSuccessLight(e.target.value); colorChange(); }}
|
||||||
|
placeholder="Choose the primary color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={successLight}
|
||||||
|
onChange={(e) => { setSuccessLight(e.target.value); colorChange(); }}
|
||||||
|
required
|
||||||
|
|
||||||
|
type="color"
|
||||||
|
className="w-10 h-10 rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PageComponent;
|
||||||
|
|
||||||
|
|
||||||
|
|
124
app/admin/tiers/create/page.tsx
Normal file
124
app/admin/tiers/create/page.tsx
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
"use client";
|
||||||
|
import { createClient } from "@/utils/supabase/client";
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
|
function PageComponent() {
|
||||||
|
const supabase = createClient();
|
||||||
|
const router = useRouter();
|
||||||
|
const [name, setName] = useState<string>('');
|
||||||
|
const [price, setPrice] = useState<number>(0);
|
||||||
|
const [description, setDescription] = useState<string>('');
|
||||||
|
const [color, setColor] = useState<string>('#000000');
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const handleSubmit = async (e: React.FormEvent) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const data = {
|
||||||
|
name,
|
||||||
|
price,
|
||||||
|
color,
|
||||||
|
description
|
||||||
|
};
|
||||||
|
const response = await fetch('/api/tiers', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data)
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
const responseData = await response.json();
|
||||||
|
window.location.href = "/admin/tiers";
|
||||||
|
} else {
|
||||||
|
console.log(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="w-full p-8 h-1/2 text-white lg:flex justify-center items-center animate-in">
|
||||||
|
<div className="w-full lg:w-1/3 rounded-md bg-primary opacity-90 p-12 m-1 mt-32 shadow-lg backdrop-blur">
|
||||||
|
<form onSubmit={handleSubmit}>
|
||||||
|
<div className="w-full flex">
|
||||||
|
<span className="text-2xl pb-4">Creating New Tier</span>
|
||||||
|
</div>
|
||||||
|
<div className="w-full flex">
|
||||||
|
<input
|
||||||
|
value={name}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
onChange={(e) => { setName(e.target.value) }}
|
||||||
|
className="mr-2 rounded-md bg-info-bright p-2 w-1/2 text-black shadow-lg"
|
||||||
|
placeholder="Tag Name"
|
||||||
|
/>
|
||||||
|
<div className="flex border border-gray-300 w-1/2 rounded-md">
|
||||||
|
<span className="flex items-center bg-gray-100 rounded-l-md border-r px-3 text-gray-500">
|
||||||
|
$
|
||||||
|
</span>
|
||||||
|
<input
|
||||||
|
value={price}
|
||||||
|
onChange={(e) => { setPrice(Number(e.target.value)) }}
|
||||||
|
required
|
||||||
|
placeholder="Price in USD per month"
|
||||||
|
type="number"
|
||||||
|
className="flex-1 min-w-0 bg-info-bright rounded-r-md px-3 py-2 text-black focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full pt-2 justify-center flex">
|
||||||
|
<textarea
|
||||||
|
value={description}
|
||||||
|
onChange={(e) => { setDescription(e.target.value) }}
|
||||||
|
required
|
||||||
|
placeholder="Description of the tier and what the user gets from subscribing."
|
||||||
|
rows={3}
|
||||||
|
className="w-full rounded-md bg-info-bright p-2 w-1/2 text-black shadow-lg"
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
<div className="w-full pt-2 justify-center flex">
|
||||||
|
<div className="w-1/2 relative">
|
||||||
|
<input
|
||||||
|
value={color}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setColor(e.target.value) }}
|
||||||
|
placeholder="Choose the tiers color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={color}
|
||||||
|
onChange={(e) => { setColor(e.target.value) }}
|
||||||
|
required
|
||||||
|
id="colorInput"
|
||||||
|
type="color"
|
||||||
|
className="absolute right-0 top-0 w-10 h-full rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
className="hover:scale-95 ml-2 shadow-lg w-1/2 h-10 text-center bg-success hover:bg-success-light text-white font-bold rounded flex items-center justify-center"
|
||||||
|
>
|
||||||
|
Create
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => { router.push("/admin/tiers") }}
|
||||||
|
className="hover:scale-95 shadow-lg ml-2 w-1/2 h-10 text-center bg-error-dark hover:bg-error text-white font-bold rounded flex items-center justify-center"
|
||||||
|
>
|
||||||
|
Back
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PageComponent;
|
55
app/admin/tiers/page.tsx
Normal file
55
app/admin/tiers/page.tsx
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
"use client";
|
||||||
|
import { createClient } from "@/utils/supabase/client";
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
|
function PageComponent() {
|
||||||
|
const router = useRouter();
|
||||||
|
const supabase = createClient();
|
||||||
|
const [tiers, setTiers] = useState<any[]>([]);
|
||||||
|
const getData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/tiers');
|
||||||
|
if (response.ok) {
|
||||||
|
const data = await response.json();
|
||||||
|
setTiers(data);
|
||||||
|
} else {
|
||||||
|
console.error('failed to fetch tiers');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching users:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="w-2/3 p-8 h-1/2 text-white lg:flex justify-center items-center animate-in">
|
||||||
|
<div className="w-full lg:w-1/3 rounded-md bg-primary opacity-90 p-8 m-1 mt-32 shadow-lg backdrop-blur">
|
||||||
|
<div className="w-full flex justify-center">
|
||||||
|
<span className="text-2xl pb-4">Tiers Management</span>
|
||||||
|
</div>
|
||||||
|
<div className="w-full flex justify-center">
|
||||||
|
<button onClick={() => { router.push("/admin/tiers/create") }} className="bg-success hover:bg-success-light rounded p-2 w-full">New Tier</button>
|
||||||
|
<button onClick={() => { router.push("/admin") }} className="bg-error hover:bg-error-light rounded p-2 w-full ml-2">Back</button>
|
||||||
|
</div>
|
||||||
|
<div className="w-full justify-center pt-8">
|
||||||
|
{tiers.map((item, index) => (
|
||||||
|
<div className="w-full flex justify-center">
|
||||||
|
<div key={index} className="text-white w-full text-stroke mt-2">
|
||||||
|
<button onClick={() => { router.push("/admin/tiers/view?name=" + item.name) }} className="py-2 w-full rounded hover:scale-105" style={{ backgroundColor: item.color }}>{item.name} - ${item.price}/month</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PageComponent;
|
||||||
|
|
||||||
|
|
||||||
|
|
141
app/admin/tiers/view/page.tsx
Normal file
141
app/admin/tiers/view/page.tsx
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
"use client";
|
||||||
|
import { createClient } from "@/utils/supabase/client";
|
||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
|
function PageComponent() {
|
||||||
|
const router = useRouter();
|
||||||
|
const supabase = createClient();
|
||||||
|
const [tier, setTier] = useState<any[]>([]);
|
||||||
|
const [users, setUsers] = useState<any[]>([]);
|
||||||
|
const [name, setName] = useState<string>('');
|
||||||
|
const [price, setPrice] = useState<number>(0);
|
||||||
|
const [description, setDescription] = useState<string>('');
|
||||||
|
const [color, setColor] = useState<string>('#000000');
|
||||||
|
const getData = async () => {
|
||||||
|
try {
|
||||||
|
const searchParams = new URLSearchParams(window.location.search);
|
||||||
|
const name = searchParams.get('name');
|
||||||
|
const response = await fetch('/api/tiers/'+name);
|
||||||
|
if (response.ok) {
|
||||||
|
const data = await response.json();
|
||||||
|
setTier(data);
|
||||||
|
setName(data.name);
|
||||||
|
setPrice(data.price);
|
||||||
|
setDescription(data.description);
|
||||||
|
setColor(data.color);
|
||||||
|
} else {
|
||||||
|
console.error('failed to fetch tiers');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching users:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSubmit = async (e: React.FormEvent) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const data = {
|
||||||
|
newName:name,
|
||||||
|
price,
|
||||||
|
color,
|
||||||
|
description
|
||||||
|
};
|
||||||
|
const response = await fetch('/api/tiers/'+name, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data)
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
const responseData = await response.json();
|
||||||
|
window.location.href = "/admin/tiers";
|
||||||
|
} else {
|
||||||
|
console.log(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="w-full p-8 h-1/2 text-white lg:flex justify-center items-center animate-in">
|
||||||
|
<div className="w-full lg:w-1/3 rounded-md bg-primary opacity-90 p-12 m-1 mt-32 shadow-lg backdrop-blur">
|
||||||
|
<form onSubmit={handleSubmit}>
|
||||||
|
<div className="w-full flex">
|
||||||
|
<span className="text-2xl pb-4">Editing Existing Tier</span>
|
||||||
|
</div>
|
||||||
|
<div className="w-full flex">
|
||||||
|
<input
|
||||||
|
value={name}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
onChange={(e) => { setName(e.target.value) }}
|
||||||
|
className="mr-2 rounded-md bg-info-bright p-2 w-1/2 text-black shadow-lg"
|
||||||
|
placeholder="Tag Name"
|
||||||
|
/>
|
||||||
|
<div className="flex border border-gray-300 w-1/2 rounded-md">
|
||||||
|
<span className="flex items-center bg-gray-100 rounded-l-md border-r px-3 text-gray-500">
|
||||||
|
$
|
||||||
|
</span>
|
||||||
|
<input
|
||||||
|
value={price}
|
||||||
|
onChange={(e) => { setPrice(Number(e.target.value)) }}
|
||||||
|
required
|
||||||
|
placeholder="Price in USD per month"
|
||||||
|
type="number"
|
||||||
|
className="flex-1 min-w-0 bg-info-bright rounded-r-md px-3 py-2 text-black focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full pt-2 justify-center flex">
|
||||||
|
<textarea
|
||||||
|
value={description}
|
||||||
|
onChange={(e) => { setDescription(e.target.value) }}
|
||||||
|
required
|
||||||
|
placeholder="Description of the tier and what the user gets from subscribing."
|
||||||
|
rows={3}
|
||||||
|
className="w-full rounded-md bg-info-bright p-2 w-1/2 text-black shadow-lg"
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
<div className="w-full pt-2 justify-center flex">
|
||||||
|
<div className="w-1/2 relative">
|
||||||
|
<input
|
||||||
|
value={color}
|
||||||
|
required
|
||||||
|
type="text"
|
||||||
|
className="w-full rounded-md bg-info-bright p-2 text-black shadow-lg"
|
||||||
|
onChange={(e) => { setColor(e.target.value) }}
|
||||||
|
placeholder="Choose the tiers color"
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
value={color}
|
||||||
|
onChange={(e) => { setColor(e.target.value) }}
|
||||||
|
required
|
||||||
|
id="colorInput"
|
||||||
|
type="color"
|
||||||
|
className="absolute right-0 top-0 w-10 h-full rounded-r p-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<button onClick={() => { }} className="hover:scale-95 shadow-lg ml-2 w-1/2 h-10 text-center bg-warning hover:bg-warning-light text-white font-bold rounded flex items-center justify-center">
|
||||||
|
Update
|
||||||
|
</button>
|
||||||
|
<button type="button" onClick={() => { }} className="hover:scale-95 shadow-lg ml-2 w-1/2 h-10 text-center bg-error hover:bg-error-light text-white font-bold rounded flex items-center justify-center">
|
||||||
|
Delete
|
||||||
|
</button>
|
||||||
|
<button type="button" onClick={() => { router.push("/admin/tiers") }} className="hover:scale-95 shadow-lg ml-2 w-1/2 h-10 text-center bg-error-dark hover:bg-error text-white font-bold rounded flex items-center justify-center">
|
||||||
|
Back
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default PageComponent;
|
||||||
|
|
||||||
|
|
||||||
|
|
26
app/api/admin/interface-configs/route.tsx
Normal file
26
app/api/admin/interface-configs/route.tsx
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { NextApiRequest, NextApiResponse } from 'next';
|
||||||
|
import { createClient } from "@/utils/supabase/server";
|
||||||
|
import { NextResponse } from "next/server";
|
||||||
|
|
||||||
|
|
||||||
|
export async function PUT(request: Request) {
|
||||||
|
const body = await request.json();
|
||||||
|
console.log(body)
|
||||||
|
const supabase = createClient();
|
||||||
|
var value = body.value;
|
||||||
|
const { error } = await supabase.from('interface_configurations').update({ value }).eq('name', body.name);
|
||||||
|
console.log(error)
|
||||||
|
if (error) {
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
return NextResponse.json({});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
|
||||||
|
const url = new URL(request.url as string, 'http://localhost');
|
||||||
|
const name = url.searchParams.get('name') || '';
|
||||||
|
const supabase = createClient();
|
||||||
|
const { data, error } = await supabase.from('interface_configurations').select('*').eq('name', name).single();
|
||||||
|
return NextResponse.json(data);
|
||||||
|
}
|
17
app/api/admin/users/route.tsx
Normal file
17
app/api/admin/users/route.tsx
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { NextApiRequest, NextApiResponse } from 'next';
|
||||||
|
import { createClient } from "@/utils/supabase/server";
|
||||||
|
import { NextResponse } from "next/server";
|
||||||
|
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
try {
|
||||||
|
const supabase = createClient();
|
||||||
|
const { data, error } = await supabase.auth.admin.listUsers();
|
||||||
|
console.log(error)
|
||||||
|
if (error) {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
return NextResponse.json(data);
|
||||||
|
} catch (error) {
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
}
|
34
app/api/galleries/[id]/images/names/route.ts
Normal file
34
app/api/galleries/[id]/images/names/route.ts
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import { NextResponse } from "next/server";
|
||||||
|
import { createClient } from "@/utils/supabase/server";
|
||||||
|
|
||||||
|
export async function GET(
|
||||||
|
request: Request,
|
||||||
|
{ params }: { params: { id: string } }
|
||||||
|
) {
|
||||||
|
const galleryId = params.id;
|
||||||
|
const supabase = createClient();
|
||||||
|
|
||||||
|
const { data: gallery, error: galleryError } = await supabase
|
||||||
|
.from('galleries')
|
||||||
|
.select('*')
|
||||||
|
.eq('name', galleryId)
|
||||||
|
.single();
|
||||||
|
|
||||||
|
// List all files in the galleryId path
|
||||||
|
let { data: files, error } = await supabase.storage
|
||||||
|
.from('galleries')
|
||||||
|
.list(params.id.toLowerCase().replace(/\s+/g, '_'));
|
||||||
|
|
||||||
|
if (files == null || error) {
|
||||||
|
//console.error('Error listing files:', error);
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract file names from the list of files
|
||||||
|
const fileNames = files.map((file) => file.name);
|
||||||
|
|
||||||
|
// Return a JSON response with the array of file names
|
||||||
|
return new Response(JSON.stringify(fileNames), {
|
||||||
|
headers: { 'content-type': 'application/json' },
|
||||||
|
});
|
||||||
|
}
|
@ -18,7 +18,7 @@ export async function GET(
|
|||||||
{ params }: { params: { id: string } }
|
{ params }: { params: { id: string } }
|
||||||
) {
|
) {
|
||||||
|
|
||||||
const galleryId = params.id.toLowerCase().replace(/\s+/g, '_'); const supabase = createClient();
|
const galleryId = params.id; const supabase = createClient();
|
||||||
const user = await supabase.auth.getUser();
|
const user = await supabase.auth.getUser();
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,6 @@ export async function GET(
|
|||||||
request: Request,
|
request: Request,
|
||||||
{ params }: { params: { id: string } }
|
{ params }: { params: { id: string } }
|
||||||
) {
|
) {
|
||||||
const galleryId = params.id.toLowerCase().replace(/\s+/g, '_');
|
|
||||||
const supabase = createClient();
|
const supabase = createClient();
|
||||||
const user = await supabase.auth.getUser();
|
const user = await supabase.auth.getUser();
|
||||||
const url = new URL(request.url);
|
const url = new URL(request.url);
|
||||||
@ -30,15 +29,17 @@ export async function GET(
|
|||||||
.eq('name', params.id)
|
.eq('name', params.id)
|
||||||
.single();
|
.single();
|
||||||
|
|
||||||
let { data: files, error } = await supabase.storage.from('galleries').list(galleryId);
|
var thumbnailFile = gallery.thumbnail_file;
|
||||||
if (files == null || files?.length == 0) {
|
if(thumbnailFile==null || thumbnailFile==""){
|
||||||
|
let { data: files, error } = await supabase.storage.from('galleries').list(params.id);
|
||||||
return NextResponse.error();
|
if (files == null || files?.length == 0) {
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
thumbnailFile = files[0].name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loop through each file, download it, convert it to base64, and add the data URL to the array
|
// Loop through each file, download it, convert it to base64, and add the data URL to the array
|
||||||
let { data: blobdata, error: fileError } = await supabase.storage.from('galleries').download(galleryId + "/" + files[0].name);
|
let { data: blobdata, error: fileError } = await supabase.storage.from('galleries').download(params.id + "/" + thumbnailFile);
|
||||||
|
|
||||||
if (fileError || blobdata == null) {
|
if (fileError || blobdata == null) {
|
||||||
//console.error('Error downloading file:', error);
|
//console.error('Error downloading file:', error);
|
||||||
return NextResponse.error();
|
return NextResponse.error();
|
||||||
@ -54,7 +55,7 @@ export async function GET(
|
|||||||
if(nsfw && gallery.nsfw){
|
if(nsfw && gallery.nsfw){
|
||||||
blobBuffer = await blurImage(blobBuffer);
|
blobBuffer = await blurImage(blobBuffer);
|
||||||
}
|
}
|
||||||
const contentType = files[0].name.endsWith('.png') ? 'image/png' : 'image/jpeg';
|
const contentType = thumbnailFile.endsWith('.png') ? 'image/png' : 'image/jpeg';
|
||||||
const dataUrl = `data:${contentType};base64,${blobBuffer.toString('base64')}`;
|
const dataUrl = `data:${contentType};base64,${blobBuffer.toString('base64')}`;
|
||||||
|
|
||||||
|
|
||||||
|
110
app/api/galleries/admin/[id]/route.ts
Normal file
110
app/api/galleries/admin/[id]/route.ts
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
import { NextResponse } from "next/server";
|
||||||
|
import { createClient } from "@/utils/supabase/server";
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
export async function GET(
|
||||||
|
request: Request,
|
||||||
|
{ params }: { params: { id: string } }
|
||||||
|
) {
|
||||||
|
const id = params.id;
|
||||||
|
const supabase = createClient();
|
||||||
|
const { data: gallery, error } = await supabase.from('galleries').select("*").eq('name', id).single();
|
||||||
|
return NextResponse.json({ gallery });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export async function PUT(
|
||||||
|
request: Request,
|
||||||
|
{ params }: { params: { id: string } }){
|
||||||
|
|
||||||
|
const supabase = createClient();
|
||||||
|
const formData = await request.formData();
|
||||||
|
const tags = JSON.parse(formData.getAll('tags').toString()) as string[];
|
||||||
|
const originalName = formData.get('originalName');
|
||||||
|
const name = formData.get('name')?.toString();
|
||||||
|
const nsfw = formData.get('nsfw')?.toString();
|
||||||
|
const tier = formData.get('tier')?.toString();
|
||||||
|
const thumbnail = formData.get('thumbnail');
|
||||||
|
|
||||||
|
const { error } = await supabase.from('galleries').update({name, tags, nsfw, tier, thumbnail_file:thumbnail}).eq('name', originalName ?? '');
|
||||||
|
|
||||||
|
async function renameFolder(oldFolderName: any, newFolderName: string) {
|
||||||
|
// Get a list of all files in the old folder
|
||||||
|
let { data: oldFiles, error } = await supabase.storage.from('galleries').list(oldFolderName);
|
||||||
|
if (error) {
|
||||||
|
console.error('Error fetching files:', error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move each file to the new folder
|
||||||
|
if (oldFiles) {
|
||||||
|
for (let file of oldFiles) {
|
||||||
|
let oldPath = file.name;
|
||||||
|
let newPath = newFolderName + '/' + oldPath.split('/').pop();
|
||||||
|
|
||||||
|
let { error: moveError } = await supabase.storage.from('galleries').move(oldPath, newPath);
|
||||||
|
if (moveError) {
|
||||||
|
console.error(`Error moving file ${oldPath} to ${newPath}:`, moveError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the old folder
|
||||||
|
let { error: deleteError } = await supabase.storage.from('galleries').remove([oldFolderName]);
|
||||||
|
if (deleteError) {
|
||||||
|
console.error('Error deleting old folder:', deleteError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
renameFolder(originalName, name ?? '');
|
||||||
|
|
||||||
|
if(error){
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
let { data: galleries, error:galleriesError } = await supabase
|
||||||
|
.from('galleries')
|
||||||
|
.select('*');
|
||||||
|
return NextResponse.json({ success: true, galleries });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function DELETE(
|
||||||
|
request: Request,
|
||||||
|
{ params }: { params: { id: string } }
|
||||||
|
) {
|
||||||
|
const id =params.id;
|
||||||
|
const supabase = createClient();
|
||||||
|
const { data: gallery, error } = await supabase.from('galleries').delete().eq('name', id).single();
|
||||||
|
let { data: galleries, error:galleriesError } = await supabase
|
||||||
|
.from('galleries')
|
||||||
|
.select('*');
|
||||||
|
return NextResponse.json({ success: true, galleries });
|
||||||
|
}
|
||||||
|
|
||||||
|
// const tagsResponse = await fetch(`/api/galleries/tags?search=${search}`);
|
||||||
|
// const tagsData = await tagsResponse.json();
|
||||||
|
// const galleriesWithTagData = galleriesData.map((gallery: any) => {
|
||||||
|
// const tags = tagsData.filter((tag: any) => gallery.tags.includes(tag.name));
|
||||||
|
// return { ...gallery, tags };
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
// const formData = new FormData();
|
||||||
|
// formData.append('name', name);
|
||||||
|
// formData.append('tags', JSON.stringify(tags));
|
||||||
|
// files.forEach((file: File) => {
|
||||||
|
// formData.append('files', file);
|
||||||
|
// });
|
||||||
|
|
||||||
|
// const response = await fetch('/api/galleries', {
|
||||||
|
// method: 'POST',
|
||||||
|
// body: formData,
|
||||||
|
// });
|
||||||
|
|
||||||
|
// if (response.ok) {
|
||||||
|
// const data = await response.json();
|
||||||
|
// // Handle success
|
||||||
|
// } else {
|
||||||
|
// // Handle error
|
||||||
|
// }
|
37
app/api/galleries/admin/route.ts
Normal file
37
app/api/galleries/admin/route.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import { NextResponse } from "next/server";
|
||||||
|
import { createClient } from "@/utils/supabase/server";
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
|
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
const supabase = createClient();
|
||||||
|
let { data: galleries, error } = await supabase
|
||||||
|
.from('galleries')
|
||||||
|
.select('*');
|
||||||
|
return NextResponse.json(galleries);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function POST(request: Request) {
|
||||||
|
const supabase = createClient();
|
||||||
|
const formData = await request.formData();
|
||||||
|
const files = formData.getAll('files');
|
||||||
|
const tags = JSON.parse(formData.getAll('tags').toString()) as string[];
|
||||||
|
const name = formData.get('name');
|
||||||
|
const nsfw = formData.get('nsfw');
|
||||||
|
const tier = formData.get('tier');
|
||||||
|
const thumbnail = formData.get('thumbnail');
|
||||||
|
|
||||||
|
for (let i = 0; i < files.length; i++) {
|
||||||
|
const file = files[i] as File; // Cast 'file' to 'File' type
|
||||||
|
supabase.storage.from('galleries').upload(`${name}/${file.name}`, file);
|
||||||
|
}
|
||||||
|
const { data: gallery, error } = await supabase.from('galleries').insert({ name, tags, nsfw, thumbnail_file:thumbnail, tier, column_number: 3 }).single();
|
||||||
|
|
||||||
|
let { data: galleries, error: galleriesError } = await supabase
|
||||||
|
.from('galleries')
|
||||||
|
.select('*');
|
||||||
|
|
||||||
|
return NextResponse.json({ success: true, galleries });
|
||||||
|
}
|
||||||
|
|
@ -17,13 +17,13 @@ export async function POST(request: Request) {
|
|||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Rest of the code...
|
// Rest of the code...
|
||||||
let { data: galleries, error } = await supabase
|
let { data: galleries, error } = await supabase
|
||||||
.from('galleries')
|
.from('galleries')
|
||||||
.select('*')
|
.select('*')
|
||||||
.contains('tags', tags) // Fix: Use contains instead of overlaps
|
.contains('tags', tags) // Fix: Use contains instead of overlaps
|
||||||
.ilike('name', `%${search}%`)
|
.ilike('name', `%${search}%`)
|
||||||
|
|
||||||
return NextResponse.json(galleries);
|
return NextResponse.json(galleries);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,8 +5,28 @@ import { createClient } from "@/utils/supabase/server";
|
|||||||
export async function GET(request: Request) {
|
export async function GET(request: Request) {
|
||||||
const supabase = createClient();
|
const supabase = createClient();
|
||||||
let { data: tags, error } = await supabase
|
let { data: tags, error } = await supabase
|
||||||
.from('tags')
|
.from('tags')
|
||||||
.select('*')
|
.select('*')
|
||||||
|
.order('name', { ascending: true });
|
||||||
return NextResponse.json(tags)
|
return NextResponse.json(tags)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function POST(request: Request) {
|
||||||
|
const supabase = createClient();
|
||||||
|
const data = await request.json();
|
||||||
|
const { data: tag, error } = await supabase.from('tags').insert({ name: data.tag }).single();
|
||||||
|
if (error) {
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
return NextResponse.json(tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function PUT(request: Request) {
|
||||||
|
const supabase = createClient();
|
||||||
|
const data = await request.json();
|
||||||
|
const { data: tag, error } = await supabase.from('tags').delete().eq('name', data.tag).single();
|
||||||
|
if (error) {
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
return NextResponse.json(tag);
|
||||||
|
}
|
36
app/api/tiers/[name]/route.ts
Normal file
36
app/api/tiers/[name]/route.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import { NextResponse } from "next/server";
|
||||||
|
import { createClient } from "@/utils/supabase/server";
|
||||||
|
|
||||||
|
export async function GET(
|
||||||
|
request: Request,
|
||||||
|
{ params }: { params: { name: string } }
|
||||||
|
) {
|
||||||
|
const supabase = createClient();
|
||||||
|
|
||||||
|
const { data: tier, error: galleryError } = await supabase
|
||||||
|
.from('tiers')
|
||||||
|
.select('*')
|
||||||
|
.eq('name', params.name)
|
||||||
|
.single();
|
||||||
|
|
||||||
|
if(galleryError) {
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
|
||||||
|
return NextResponse.json(tier);
|
||||||
|
}
|
||||||
|
export async function PUT(
|
||||||
|
request: Request,
|
||||||
|
{ params }: { params: { name: string } }
|
||||||
|
) {
|
||||||
|
const supabase = createClient();
|
||||||
|
const { newName, price, color, description } = await request.json();
|
||||||
|
console.log(newName)
|
||||||
|
const { error } = await supabase.from('tiers')
|
||||||
|
.update({ name:newName, price, color, description }).eq('name', params.name);
|
||||||
|
if (error) {
|
||||||
|
console.error('Error updating tier:', error);
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
return NextResponse.json({});
|
||||||
|
}
|
26
app/api/tiers/route.ts
Normal file
26
app/api/tiers/route.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { NextResponse } from "next/server";
|
||||||
|
import { createClient } from "@/utils/supabase/server";
|
||||||
|
|
||||||
|
|
||||||
|
export async function GET(request: Request) {
|
||||||
|
const supabase = createClient();
|
||||||
|
const { data, error } = await supabase.from('tiers').select('*');
|
||||||
|
if (error) {
|
||||||
|
console.error('Error fetching tiers:', error);
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
const tiers = data ?? [];
|
||||||
|
return NextResponse.json(tiers);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function POST(request: Request) {
|
||||||
|
const supabase = createClient();
|
||||||
|
const { name, price, color, description } = await request.json();
|
||||||
|
const { data, error } = await supabase.from('tiers').insert([{ name, price, color, description }]);
|
||||||
|
if (error) {
|
||||||
|
console.error('Error inserting tier:', error);
|
||||||
|
return NextResponse.error();
|
||||||
|
}
|
||||||
|
return NextResponse.json(data);
|
||||||
|
}
|
||||||
|
|
@ -1,18 +1,36 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { createClient } from "@/utils/supabase/client";
|
import { createClient } from "@/utils/supabase/client";
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import Search from "@/components/neroshitron/search";
|
import { useRouter } from 'next/navigation';
|
||||||
import Gallery from "@/components/neroshitron/gallery";
|
|
||||||
import Masonry from "react-masonry-css";
|
import Masonry from "react-masonry-css";
|
||||||
import SearchInput from "@/components/neroshitron/search_input";
|
import SearchInput from "@/components/neroshitron/search_input";
|
||||||
|
|
||||||
function PageComponent() {
|
function PageComponent() {
|
||||||
|
const router = useRouter();
|
||||||
const [selectedGallery, setSelectedGallery] = useState<string | null>(null);
|
const [selectedGallery, setSelectedGallery] = useState<string | null>(null);
|
||||||
const [filePreviews, setFilePreviews] = useState<string[]>([]);
|
const [filePreviews, setFilePreviews] = useState<string[]>([]);
|
||||||
|
const [name, setName] = useState<string>('');
|
||||||
|
const [nsfw, setNsfw] = useState<boolean>(false);
|
||||||
|
const [tags, setTags] = useState<string[]>([]);
|
||||||
|
const [tier, setTier] = useState<string>('Free');
|
||||||
|
const [thumbnail, setThumbnail] = useState<string>("");
|
||||||
|
const [files, setFiles] = useState<FileList>();
|
||||||
|
|
||||||
|
const [tiers, setTiers] = useState<any[]>([]);
|
||||||
const supabase = createClient();
|
const supabase = createClient();
|
||||||
const user = supabase.auth.getUser();
|
const user = supabase.auth.getUser();
|
||||||
const getData = async () => {
|
const getData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/tiers');
|
||||||
|
if (response.ok) {
|
||||||
|
const data = await response.json();
|
||||||
|
setTiers(data);
|
||||||
|
} else {
|
||||||
|
console.error('failed to fetch tiers');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching users:', error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getData();
|
getData();
|
||||||
@ -22,6 +40,31 @@ function PageComponent() {
|
|||||||
setSelectedGallery(null);
|
setSelectedGallery(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const createGallery = async () => {
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('name', name);
|
||||||
|
if (files) {
|
||||||
|
Array.from(files).forEach((file: File) => {
|
||||||
|
formData.append('files', file);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
formData.append('tags', JSON.stringify(tags));
|
||||||
|
formData.append('nsfw', nsfw.toString());
|
||||||
|
formData.append('thumbnail', thumbnail);
|
||||||
|
formData.append('tier', tier);
|
||||||
|
const response = await fetch('/api/galleries/admin', {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
const data = await response.json();
|
||||||
|
window.location.href = "/gallery/admin/view?id="+name;
|
||||||
|
} else {
|
||||||
|
console.log(response)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
const files = event.target.files;
|
const files = event.target.files;
|
||||||
if (files) {
|
if (files) {
|
||||||
@ -33,6 +76,7 @@ function PageComponent() {
|
|||||||
if (e.target && e.target.result) {
|
if (e.target && e.target.result) {
|
||||||
previews.push(e.target.result.toString());
|
previews.push(e.target.result.toString());
|
||||||
if (previews.length === files.length) {
|
if (previews.length === files.length) {
|
||||||
|
setFiles(files);
|
||||||
setFilePreviews(previews);
|
setFilePreviews(previews);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -43,38 +87,66 @@ function PageComponent() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full text-white flex justify-center items-center animate-in">
|
<div className="w-full p-8 text-white flex justify-center items-center animate-in">
|
||||||
<div className="w-1/2 rounded-md bg-primary p-12 mt-32">
|
<div className="w-full lg:w-1/2 rounded-md bg-primary opacity-90 backdrop-blur-lg p-12 mt-32 shadow-lg">
|
||||||
|
<div className="w-full flex pb-4">
|
||||||
|
<span className="text-2xl">Creating New Gallery</span>
|
||||||
|
</div>
|
||||||
<div className="w-full flex">
|
<div className="w-full flex">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
className="mb-8 mr-2 rounded-md bg-secondary p-2 w-1/2 text-white"
|
value={name}
|
||||||
|
onChange={(e) => setName(e.target.value)}
|
||||||
|
className="mb-8 mr-2 rounded-md bg-secondary p-2 w-1/2 text-white shadow-lg"
|
||||||
placeholder="Gallery Name"
|
placeholder="Gallery Name"
|
||||||
/>
|
/>
|
||||||
<div className="w-1/4">
|
<div className="w-1/4">
|
||||||
<button onClick={() => window.location.href = "/gallery/admin"} className="w-full bg-error hover:bg-error-light text-white rounded-md p-2">
|
<button onClick={() => router.push("/gallery/admin")} className="w-full bg-error hover:bg-error-light text-white rounded-md p-2 shadow-lg">
|
||||||
Back
|
Back
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-1/4">
|
<div className="w-1/4">
|
||||||
<button className="w-full bg-success hover:bg-success-light text-white rounded-md p-2 ml-2">
|
<button onClick={()=>{createGallery()}} className="w-full bg-success hover:bg-success-light text-white rounded-md p-2 ml-2 shadow-lg ">
|
||||||
Create Gallery
|
<span></span>Create
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full flex">
|
<div className="w-full lg:flex">
|
||||||
<div className="w-1/2 mr-2">
|
<div className="w-full lg:w-1/2">
|
||||||
<SearchInput
|
<div className="w-1/2 absolute pr-14">
|
||||||
placeholderTags={[
|
<SearchInput
|
||||||
{ value: "tags", label: "❗️ click here to add tags" },
|
placeholderTags={[
|
||||||
]}
|
{ value: "tags", label: "❗️ click here to add tags" },
|
||||||
nsfwButtonEnabled={false}
|
]}
|
||||||
searchChanged={(search) => {}}
|
startingTags={tags}
|
||||||
nsfwChanged={(nsfw) => {}}
|
nsfwButtonEnabled={true}
|
||||||
tagsChanged={(tags) => {}}
|
searchChanged={(search) => { }}
|
||||||
/>
|
nsfwChanged={(nsfw) => { }}
|
||||||
|
tagsChanged={(tags) => { setTags(tags) }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-1/2">
|
<div className="w-full lg:w-1/2 lg:pt-0 pt-4">
|
||||||
|
<select value={nsfw ? "NSFW" : "SFW"} className="mb-2 shadow-lg rounded-md bg-secondary p-2 w-full text-white" onChange={e=>{
|
||||||
|
setNsfw(e.target.value === "NSFW");
|
||||||
|
}}>
|
||||||
|
<option value="NSFW" selected={nsfw}>NSFW</option>
|
||||||
|
<option value="SFW" selected={nsfw}>SFW</option>
|
||||||
|
</select>
|
||||||
|
<select onChange={e=>{
|
||||||
|
setTier(e.target.value);
|
||||||
|
}} className="mb-2 shadow-lg mr-2 rounded-md bg-secondary p-2 w-full text-white">
|
||||||
|
<option value="" disabled >Select New Tier</option>
|
||||||
|
{tiers.map((tier, index) => (
|
||||||
|
<option key={index} value={tier.name}>{tier.name}</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
<select onChange={e=>{setThumbnail(e.target.value)}} className="mb-2 shadow-lg mr-2 rounded-md bg-secondary p-2 w-full text-white">
|
||||||
|
<option value="" disabled selected>Select Thumbnail</option>
|
||||||
|
{files && Array.from(files).map((file: File, index: number) => (
|
||||||
|
<option key={index} value={file.name}>{file.name}</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
<input
|
<input
|
||||||
className="relative m-0 block w-full min-w-0 flex-auto cursor-pointer rounded border border-solid border-secondary-lighter bg-transparent bg-clip-padding px-3 py-[0.32rem] text-base font-normal text-surface transition duration-300 ease-in-out file:-mx-3 file:-my-[0.32rem] file:me-3 file:cursor-pointer file:overflow-hidden file:rounded-none file:border-0 file:border-e file:border-solid file:border-inherit file:bg-transparent file:px-3 file:py-[0.32rem] file:text-surface focus:border-primary focus:text-gray-700 focus:shadow-inset focus:outline-none dark:border-white/70 dark:text-white file:dark:text-white"
|
className="relative m-0 block w-full min-w-0 flex-auto cursor-pointer rounded border border-solid border-secondary-lighter bg-transparent bg-clip-padding px-3 py-[0.32rem] text-base font-normal text-surface transition duration-300 ease-in-out file:-mx-3 file:-my-[0.32rem] file:me-3 file:cursor-pointer file:overflow-hidden file:rounded-none file:border-0 file:border-e file:border-solid file:border-inherit file:bg-transparent file:px-3 file:py-[0.32rem] file:text-surface focus:border-primary focus:text-gray-700 focus:shadow-inset focus:outline-none dark:border-white/70 dark:text-white file:dark:text-white"
|
||||||
type="file"
|
type="file"
|
||||||
|
@ -1,21 +1,24 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { createClient } from "@/utils/supabase/client";
|
import { createClient } from "@/utils/supabase/client";
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import Search from "@/components/neroshitron/search";
|
|
||||||
import Gallery from "@/components/neroshitron/gallery";
|
|
||||||
import Masonry from "react-masonry-css";
|
|
||||||
import SearchInput from "@/components/neroshitron/search_input";
|
import SearchInput from "@/components/neroshitron/search_input";
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
function PageComponent() {
|
function PageComponent() {
|
||||||
|
const router = useRouter();
|
||||||
const supabase = createClient();
|
const supabase = createClient();
|
||||||
const user = supabase.auth.getUser();
|
const user = supabase.auth.getUser();
|
||||||
const [galleries, setGalleries] = useState([]);
|
const [tags, setTags] = useState<any[]>([]);
|
||||||
const [nsfwState, setNsfwState] = useState<boolean>(false);
|
const [nsfwState, setNsfwState] = useState<boolean>(false);
|
||||||
const [tagsState, setTagsState] = useState<string[]>([]);
|
const [tagsState, setTagsState] = useState<string[]>([]);
|
||||||
const [searchState, setSearchState] = useState<string>("");
|
const [searchState, setSearchState] = useState<string>("");
|
||||||
|
const [galleries, setGalleries] = useState([]);
|
||||||
|
const [tagSearch, setTagSearch] = useState<string>('');
|
||||||
|
const [newTagName, setNewTagName] = useState<string>('');
|
||||||
const getData = async () => {
|
const getData = async () => {
|
||||||
|
const tagsResponse = await fetch(`/api/galleries/tags`);
|
||||||
|
const tagsData = await tagsResponse.json();
|
||||||
|
setTags(tagsData);
|
||||||
const galleriesResponse = await fetch(`/api/galleries?search=` + searchState + '&nsfw=' + nsfwState, {
|
const galleriesResponse = await fetch(`/api/galleries?search=` + searchState + '&nsfw=' + nsfwState, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
@ -27,53 +30,130 @@ function PageComponent() {
|
|||||||
setGalleries(galleriesData);
|
setGalleries(galleriesData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const createTag = async () => {
|
||||||
|
let formattedTag = newTagName.toLowerCase().replace(" ", "_");
|
||||||
|
const tagsResponse = await fetch(`/api/galleries/tags`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ tag: formattedTag })
|
||||||
|
});
|
||||||
|
const tagsData = await tagsResponse.json();
|
||||||
|
setNewTagName('');
|
||||||
|
getData();
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteTag = async (tagParam: string) => {
|
||||||
|
const tagsResponse = await fetch(`/api/galleries/tags`, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify({ tag:tagParam })
|
||||||
|
});
|
||||||
|
const tagsData = await tagsResponse.json();
|
||||||
|
getData();
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getData();
|
getData();
|
||||||
}, [tagsState]);
|
}, [tagsState, newTagName]);
|
||||||
|
|
||||||
const data = [
|
|
||||||
{ id: 1, name: "Item 1", imageCount: 5, tier: "Tier 1" },
|
|
||||||
{ id: 2, name: "Item 2", imageCount: 10, tier: "Tier 2" },
|
|
||||||
{ id: 3, name: "Item 3", imageCount: 8, tier: "Tier 1" },
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full text-white flex justify-center items-center animate-in">
|
<div className="w-full p-8 h-max text-white lg:flex justify-center items-start animate-in mt-32">
|
||||||
<div className="w-1/2 rounded-md bg-primary p-12 mt-32">
|
<div className="w-full h-max lg:w-1/3 rounded-md bg-primary opacity-90 p-8 m-1 shadow-lg backdrop-blur">
|
||||||
<div className="w-full flex">
|
<span className="text-2xl">Tags Management</span>
|
||||||
<SearchInput placeholderTags={[
|
<div className="w-full flex pt-4">
|
||||||
{ value: "tags", label: "❗️ click here to add tags to search" }
|
<form onSubmit={createTag} className="flex w-full">
|
||||||
]} nsfwButtonEnabled={true} searchChanged={(search) => { setSearchState(search) }} nsfwChanged={(nsfw) => { setNsfwState(nsfw) }} tagsChanged={(tags) => { setTagsState(tags) }} />
|
|
||||||
<a href="/gallery/admin/create" className="ml-2 text-center bg-success hover:bg-success-light text-white w-1/6 font-bold rounded flex items-center justify-center">
|
<input value={newTagName} required type="text" onChange={(e)=>{setNewTagName(e.target.value)}} className=" mb-8 mr-2 rounded-md bg-info-bright p-2 w-1/2 text-black shadow-lg" placeholder="Tag Name" />
|
||||||
Create
|
<button className=" ml-2 shadow-lg w-1/2 h-10 text-center bg-success hover:bg-success-light text-white font-bold rounded flex items-center justify-center">
|
||||||
</a>
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="lg:hidden size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M12 4.5v15m7.5-7.5h-15" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<span className="lg:hidden block">Tag</span>
|
||||||
|
<span className="lg:block hidden">New Tag</span>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<table className="w-full">
|
<div className="w-full flex">
|
||||||
<thead>
|
<input type="text" value={tagSearch} onChange={(e)=>{setTagSearch(e.target.value)}} className=" mb-8 shadow-lg mr-2 rounded-md bg-info-bright p-2 w-full text-black" placeholder="Search all tags by name" />
|
||||||
<tr>
|
</div>
|
||||||
<th className="px-4 py-2" style={{ width: '60%' }}></th>
|
<div className="w-full h-96 overflow-y-scroll no-scrollbar">
|
||||||
<th className="px-4 py-2" style={{width:"15%"}}></th>
|
<table className="w-full bg-primary-light rounded">
|
||||||
<th className="px-4 py-2"></th>
|
|
||||||
<th className="px-4 py-2"></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
<tbody>
|
||||||
{/* Replace this with your data mapping logic */}
|
{tags.filter((value,index,array)=>{
|
||||||
{galleries.map((item: { name: string, imageCount: number, tier: string }) => (
|
return value.name.toLowerCase().includes(tagSearch.toLowerCase());
|
||||||
<tr key={item.name} className="animate-in">
|
}).map((item:any) => (
|
||||||
|
<tr key={item.name} className="hover:bg-secondary-dark animate-in shadow">
|
||||||
<td className="px-4 py-2">{item.name}</td>
|
<td className="px-4 py-2">{item.name}</td>
|
||||||
<td className="px-4 py-2">{item.imageCount}</td>
|
|
||||||
<td className="px-4 py-2">{item.tier.replace("Tier","")}</td>
|
|
||||||
<td className="px-4 py-2">
|
<td className="px-4 py-2">
|
||||||
<a href="/gallery/admin/view" className="bg-secondary hover:bg-secondary-light text-white font-bold py-2 px-4 rounded float-right">
|
<button onClick={()=>{deleteTag(item.name)}} className=" bg-error shadow-lg hover:bg-error-light text-white font-bold py-2 px-4 rounded float-right">
|
||||||
View
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="size-6">
|
||||||
</a>
|
<path strokeLinecap="round" strokeLinejoin="round" d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full h-max lg:w-1/2 rounded-md bg-primary opacity-90 backdrop-blur-lg p-8 m-1 shadow-lg">
|
||||||
|
<div className="w-full pb-2 flex justify-between">
|
||||||
|
<span className="text-2xl">Galleries Management</span>
|
||||||
|
<div>
|
||||||
|
<button onClick={()=>{router.push("/admin/")}} className="ml-2 p-2 shadow-lg h-10 text-center bg-error hover:bg-error-light text-white font-bold rounded">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="xl:hidden size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M12 4.5v15m7.5-7.5h-15" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<span className="xl:block hidden">Back</span>
|
||||||
|
</button>
|
||||||
|
<button onClick={()=>{router.push("/gallery/admin/create")}} className="ml-2 p-2 shadow-lg h-10 text-center bg-success hover:bg-success-light text-white font-bold rounded">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="xl:hidden size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M12 4.5v15m7.5-7.5h-15" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<span className="xl:block hidden">New Gallery</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full pb-2 flex">
|
||||||
|
<div className="absolute w-full z-20 pr-16">
|
||||||
|
<SearchInput
|
||||||
|
startingTags={[]}
|
||||||
|
placeholderTags={[
|
||||||
|
{ value: "tags", label: "❗️ click here to add tags to search" }
|
||||||
|
]} nsfwButtonEnabled={false} searchChanged={(search) => { setSearchState(search) }} nsfwChanged={(nsfw) => { setNsfwState(nsfw) }} tagsChanged={(tags) => { setTagsState(tags) }} />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="w-full h-96 overflow-y-scroll no-scrollbar">
|
||||||
|
<table className="w-full mt-20 bg-primary-light rounded">
|
||||||
|
<tbody>
|
||||||
|
{/* Replace this with your data mapping logic */}
|
||||||
|
{galleries.map((item: { name: string, imageCount: number, tier: string }) => (
|
||||||
|
<tr key={item.name} className="hover:bg-secondary-dark shadow animate-in">
|
||||||
|
<td className="px-4 py-2" style={{ width: '65%' }}>{item.name}</td>
|
||||||
|
<td className="px-4 py-2">{item.imageCount}</td>
|
||||||
|
<td className="px-4 py-2">{item.tier}</td>
|
||||||
|
<td className="px-4 py-2">
|
||||||
|
<button onClick={()=>{ router.push(`/gallery/admin/view?id=${encodeURIComponent(item.name)}`)}} className="bg-secondary shadow-lg hover:bg-secondary-light text-white font-bold py-2 px-4 rounded float-right">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m5.231 13.481L15 17.25m-4.5-15H5.625c-.621 0-1.125.504-1.125 1.125v16.5c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Zm3.75 11.625a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -1,115 +1,269 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { createClient } from "@/utils/supabase/client";
|
import { createClient } from "@/utils/supabase/client";
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import Search from "@/components/neroshitron/search";
|
import { useRouter } from 'next/navigation';
|
||||||
import Gallery from "@/components/neroshitron/gallery";
|
import Gallery from "@/components/neroshitron/gallery";
|
||||||
import Masonry from "react-masonry-css";
|
|
||||||
import SearchInput from "@/components/neroshitron/search_input";
|
import SearchInput from "@/components/neroshitron/search_input";
|
||||||
import GalleryThumbnail from "@/components/neroshitron/gallery_thumbnail";
|
import GalleryThumbnail from "@/components/neroshitron/gallery_thumbnail";
|
||||||
|
|
||||||
function PageComponent() {
|
function PageComponent() {
|
||||||
|
|
||||||
const [selectedGallery, setSelectedGallery] = useState<string | null>("Test Gallery");
|
|
||||||
const [filePreviews, setFilePreviews] = useState<string[]>([]);
|
const [filePreviews, setFilePreviews] = useState<string[]>([]);
|
||||||
const supabase = createClient();
|
const supabase = createClient();
|
||||||
const user = supabase.auth.getUser();
|
const user = supabase.auth.getUser();
|
||||||
|
const [gallery , setGallery] = useState<any>(null);
|
||||||
|
const [originalName, setOriginalGalleryName] = useState<string>('');
|
||||||
|
const [galleryName, setGalleryName] = useState<string>('');
|
||||||
|
const [nsfw, setNsfw] = useState<boolean>(false);
|
||||||
|
const [tags, setTags] = useState<string[]>([]);
|
||||||
|
const [tier, setTier] = useState<string>('Free');
|
||||||
|
const [thumbnail, setThumbnail] = useState<string>();
|
||||||
|
const [fileNames, setFileNames] = useState<string[]>([]);
|
||||||
|
const [selectedTags, setSelectedTags] = useState<string[]>([]);
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
const [tiers, setTiers] = useState<any[]>([]);
|
||||||
|
const [open, setOpen] = useState<boolean>(false);
|
||||||
|
|
||||||
|
|
||||||
|
const [images, setImages] = useState<string[]>([]);
|
||||||
const getData = async () => {
|
const getData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/tiers');
|
||||||
|
if (response.ok) {
|
||||||
|
const data = await response.json();
|
||||||
|
setTiers(data);
|
||||||
|
} else {
|
||||||
|
console.error('failed to fetch tiers');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching users:', error);
|
||||||
|
}
|
||||||
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
const id = urlParams.get('id');
|
||||||
|
const galleryResponse = await fetch(`/api/galleries/admin/${id}`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const galleryData = await galleryResponse.json();
|
||||||
|
setGallery(galleryData.gallery);
|
||||||
|
|
||||||
|
const filesResponse = await fetch(`/api/galleries/${id}/images/names`, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const filesData = await filesResponse.json();
|
||||||
|
setFileNames(filesData);
|
||||||
|
|
||||||
|
setNsfw(galleryData.gallery.nsfw);
|
||||||
|
setTags(galleryData.gallery.tags);
|
||||||
|
setTier(galleryData.gallery.tier);
|
||||||
|
setGalleryName(galleryData.gallery.name);
|
||||||
|
if(originalName === ''){
|
||||||
|
setOriginalGalleryName(galleryData.gallery.name);
|
||||||
|
}
|
||||||
|
const imagesResponse = await fetch('/api/galleries/' + galleryData.gallery.name+ '/images');
|
||||||
|
const imagesUrls = await imagesResponse.json() as string[];
|
||||||
|
setImages(imagesUrls);
|
||||||
}
|
}
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getData();
|
getData();
|
||||||
}, [selectedGallery]);
|
}, []);
|
||||||
|
useEffect(() => {
|
||||||
|
}, [gallery]);
|
||||||
|
|
||||||
const closeGallery = () => {
|
useEffect(() => {
|
||||||
setSelectedGallery(null);
|
}, [gallery, ]);
|
||||||
|
useEffect(() => {
|
||||||
|
}, [ nsfw ]);
|
||||||
|
useEffect(() => {
|
||||||
|
}, [tags ]);
|
||||||
|
useEffect(() => {
|
||||||
|
}, [galleryName]);
|
||||||
|
useEffect(() => {
|
||||||
|
}, [ tier]);
|
||||||
|
|
||||||
|
const updateGallery = async () => {
|
||||||
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
|
const id = urlParams.get('id');
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('id', gallery.name);
|
||||||
|
formData.append('name', galleryName);
|
||||||
|
formData.append('thumbnail', thumbnail ?? '');
|
||||||
|
formData.append('originalName', originalName);
|
||||||
|
formData.append('tags', JSON.stringify(selectedTags));
|
||||||
|
formData.append('nsfw', nsfw.toString());
|
||||||
|
formData.append('tier', tier);
|
||||||
|
const response = await fetch(`/api/galleries/admin/${originalName}`, {
|
||||||
|
method: 'PUT',
|
||||||
|
body: formData
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
console.log(response)
|
||||||
|
const data = await response.json();
|
||||||
|
} else {
|
||||||
|
console.log(response)
|
||||||
|
}
|
||||||
|
if(originalName != galleryName){
|
||||||
|
router.push(`/gallery/admin/view?id=${galleryName}`)
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
window.location.reload();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
const deleteGallery = async () => {
|
||||||
const files = event.target.files;
|
const urlParams = new URLSearchParams(window.location.search);
|
||||||
if (files) {
|
const id = urlParams.get('id');
|
||||||
const previews: string[] = [];
|
const response = await fetch(`/api/gallery/admin/${gallery.name}`, {
|
||||||
for (let i = 0; i < files.length; i++) {
|
method: 'DELETE',
|
||||||
const file = files[i];
|
headers: {
|
||||||
const reader = new FileReader();
|
'Content-Type': 'application/json'
|
||||||
reader.onload = (e) => {
|
|
||||||
if (e.target && e.target.result) {
|
|
||||||
previews.push(e.target.result.toString());
|
|
||||||
if (previews.length === files.length) {
|
|
||||||
setFilePreviews(previews);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
reader.readAsDataURL(file);
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
if (response.ok) {
|
||||||
|
const data = await response.json();
|
||||||
|
router.push("/gallery/admin");
|
||||||
|
} else {
|
||||||
|
console.log(response)
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
const tierObj = tiers.find((tier) => tier.name == gallery.tier);
|
||||||
|
const subscriptionColor = tier ? tierObj.color : null;
|
||||||
return (
|
return (
|
||||||
<div className="w-full text-white flex justify-center items-center animate-in">
|
<div className="w-full p-8 h-screen text-white flex justify-center items-center animate-in">
|
||||||
<div className="w-1/2 rounded-md bg-primary p-12 mt-32">
|
<div className="w-full lg:w-1/2 rounded-md p-12 mt-14 ">
|
||||||
<div className="w-full flex pb-48">
|
<div className="w-full lg:pt-0 pt-32 flex pb-60 justify-center"> {/* Center the gallery thumbnail */}
|
||||||
<GalleryThumbnail id={selectedGallery as string} columns={3} onSelect={function (id: string, columns: number): void {
|
{gallery != null && (
|
||||||
} } title={""} subscription={""} tags={[]} showNsfw={false} nsfw={false} ></GalleryThumbnail>
|
<GalleryThumbnail
|
||||||
|
key={"galleryThumbnail"+galleryName+"-"+tags.join("")}
|
||||||
|
id={originalName}
|
||||||
|
columns={3}
|
||||||
|
onSelect={function (id: string, columns: number): void { setOpen(true) }}
|
||||||
|
title={galleryName}
|
||||||
|
subscription={tier}
|
||||||
|
tags={tags}
|
||||||
|
subscriptionColor={subscriptionColor}
|
||||||
|
showNsfw={false}
|
||||||
|
nsfw={nsfw}
|
||||||
|
></GalleryThumbnail>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full flex">
|
<div className="w-full opacity-90 backdrop-blur-lg bg-primary shadow-lg p-8 pb-0 rounded">
|
||||||
<input
|
<span className="text-2xl">Editing Gallery</span>
|
||||||
type="text"
|
<div className="w-full flex justify-end">
|
||||||
className="mb-8 mr-2 rounded-md bg-secondary p-2 w-1/2 text-white"
|
<div className="w-1/2 flex">
|
||||||
placeholder="Gallery Name"
|
<input
|
||||||
/>
|
type="text"
|
||||||
<div className="w-1/6">
|
className="mb-8 mr-2 rounded-md bg-secondary p-2 w-full text-white"
|
||||||
<button onClick={() => window.location.href = "/gallery/admin"} className="w-full bg-error hover:bg-error-light text-white rounded-md p-2">
|
placeholder="Gallery Name"
|
||||||
Delete
|
value={galleryName}
|
||||||
</button>
|
onChange={(e) => setGalleryName(e.target.value)}
|
||||||
</div>
|
/>
|
||||||
<div className="w-1/6">
|
</div>
|
||||||
<button onClick={() => window.location.href = "/gallery/admin"} className="w-full bg-error-dark hover:bg-error text-white rounded-md p-2 ml-2">
|
<div className="w-1/2 flex">
|
||||||
Back
|
<button
|
||||||
</button>
|
onClick={() => deleteGallery()}
|
||||||
</div>
|
className="h-10 text-center w-full bg-error hover:bg-error-light text-white rounded-md p-2 flex items-center justify-center"
|
||||||
<div className="w-1/4">
|
>
|
||||||
<button className="w-full bg-success hover:bg-success-light text-white rounded-md p-2 ml-4">
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5}
|
||||||
Save Gallery
|
stroke="currentColor" className="md:hidden size-6">
|
||||||
</button>
|
<path strokeLinecap="round" strokeLinejoin="round" d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<span className="md:block hidden">Delete</span>
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
onClick={() => (router.push("/gallery/admin"))}
|
||||||
|
className="h-10 w-full bg-error-dark hover:bg-error text-white rounded-md p-2 ml-2 flex items-center justify-center"
|
||||||
|
>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5}
|
||||||
|
stroke="currentColor" className="md:hidden size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
<span className="md:block hidden">Back</span>
|
||||||
|
</button>
|
||||||
|
<button onClick={()=>{updateGallery()}} className="h-10 w-full bg-warning hover:bg-warning-light text-white rounded-md p-2 ml-2">
|
||||||
|
<span>Update</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-full flex">
|
<div className="w-full lg:flex opacity-90 backdrop-blur-lg bg-primary shadow-lg p-8 pt-0 rounded">
|
||||||
<div className="w-1/2 mr-2">
|
<div className="w-full lg:w-1/2 mr-44">
|
||||||
|
<div className="w-1/2 fixed mr-8">
|
||||||
|
|
||||||
|
{gallery &&(
|
||||||
<SearchInput
|
<SearchInput
|
||||||
placeholderTags={[
|
placeholderTags={[
|
||||||
{ value: "tags", label: "❗️ click here to add tags" },
|
{ value: "tags", label: "❗️ click here to add tags" },
|
||||||
]}
|
]}
|
||||||
nsfwButtonEnabled={false}
|
startingTags={gallery.tags}
|
||||||
|
nsfwButtonEnabled={true}
|
||||||
searchChanged={(search) => {}}
|
searchChanged={(search) => {}}
|
||||||
nsfwChanged={(nsfw) => {}}
|
nsfwChanged={(nsfw) => {}}
|
||||||
tagsChanged={(tags) => {}}
|
tagsChanged={(tags) => { setSelectedTags(tags) }}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-1/2">
|
<div className="w-full lg:w-1/2 pt-4">
|
||||||
<select className="mb-2 rounded-md bg-secondary p-2 w-full text-white">
|
{gallery != null && (<>
|
||||||
<option value="" disabled selected> </option>
|
<select value={nsfw ? "NSFW" : "SFW"} className="mb-2 shadow-lg rounded-md bg-secondary p-2 w-full text-white" onChange={e=>{
|
||||||
{filePreviews.map((preview, index) => (
|
setNsfw(e.target.value == "NSFW");
|
||||||
<option key={index} value={preview}>{`Thumbnail ${index}`}</option>
|
}}>
|
||||||
|
<option value="" disabled >Set NSFW</option>
|
||||||
|
<option value="NSFW" selected={nsfw}>NSFW</option>
|
||||||
|
<option value="SFW" selected={!nsfw}>SFW</option>
|
||||||
|
</select>
|
||||||
|
<select onChange={e=>{
|
||||||
|
setTier(e.target.value);
|
||||||
|
|
||||||
|
}} className="mb-2 shadow-lg mr-2 rounded-md bg-secondary p-2 w-full text-white">
|
||||||
|
<option value="" disabled >Select New Tier</option>
|
||||||
|
{tiers.map((tier, index) => (
|
||||||
|
<option selected={tier.name==gallery.tier} key={index} value={tier.name}>{tier.name}</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
<select className="mb-2 mr-2 rounded-md bg-secondary p-2 w-full text-white">
|
<select onChange={e=>{setThumbnail(e.target.value)}} className="mb-2 shadow-lg mr-2 rounded-md bg-secondary p-2 w-full text-white">
|
||||||
<option value="" disabled selected>Select New Tier</option>
|
|
||||||
{filePreviews.map((preview, index) => (
|
|
||||||
<option key={index} value={preview}>{`Thumbnail ${index}`}</option>
|
|
||||||
))}
|
|
||||||
</select>
|
|
||||||
<select className="mb-2 mr-2 rounded-md bg-secondary p-2 w-full text-white">
|
|
||||||
<option value="" disabled selected>Select New Thumbnail</option>
|
<option value="" disabled selected>Select New Thumbnail</option>
|
||||||
{filePreviews.map((preview, index) => (
|
{fileNames.map((name, index) => (
|
||||||
<option key={index} value={preview}>{`Thumbnail ${index}`}</option>
|
<option selected={name==gallery.thumbnail_file} key={index} value={name}>{name}</option>
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
<Masonry breakpointCols={3} className="my-masonry-grid pl-6 col-span-2">
|
</>
|
||||||
{filePreviews.map((preview, index) => (
|
)}
|
||||||
<img key={index} src={preview} alt={`Preview ${index}`} />
|
|
||||||
))}
|
|
||||||
</Masonry>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{(open) && (
|
||||||
|
<>
|
||||||
|
{/*
|
||||||
|
This is the modal for holding the gallery
|
||||||
|
*/}
|
||||||
|
<div
|
||||||
|
className={`fixed inset-0 transition-opacity z-30 animate-in`}
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="absolute w-full h-full inset-0 bg-secondary-dark opacity-70 z-30"
|
||||||
|
onClick={() => setOpen(true)}
|
||||||
|
></div>
|
||||||
|
<div className="absolute inset-0 overflow-y-auto overflow-x-hidden no-scrollbar pt-2 w-full p-20 h-full z-30">
|
||||||
|
<Gallery
|
||||||
|
id={gallery.name}
|
||||||
|
columns={3}
|
||||||
|
closeMenu={() => setOpen(false)}
|
||||||
|
></Gallery>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -24,14 +24,7 @@ function PageComponent() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full">
|
<div className="w-full">
|
||||||
<div className="fixed w-full h-full overflow-hidden z-0 animate-fade-left animate-fade-left animate-once animate-duration-[2000ms] animate-normal animate-fill-forwards">
|
<div className="w-2/4">
|
||||||
<img
|
|
||||||
src="gallery_girl.png"
|
|
||||||
className="float-right object-cover h-screen w-full lg:w-5/6 xl:w-3/6 opacity-50 overflow-hidden"
|
|
||||||
alt="Background"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="w-2/3">
|
|
||||||
<Search gallerySelected={(gallery:string)=>{setSelectedGallery(gallery)}}/>
|
<Search gallerySelected={(gallery:string)=>{setSelectedGallery(gallery)}}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -79,3 +79,33 @@
|
|||||||
transform: translateY(0);
|
transform: translateY(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
button:disabled {
|
||||||
|
filter: grayscale(50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--color-primary: #201240;
|
||||||
|
--color-primary-light: #403260;
|
||||||
|
--color-primary-dark: #100120;
|
||||||
|
--color-secondary: #4F3D70;
|
||||||
|
--color-secondary-light: #6F5D90;
|
||||||
|
--color-secondary-dark: #2F1D50;
|
||||||
|
--color-error: #862117;
|
||||||
|
--color-error-light: #C44C4C;
|
||||||
|
--color-error-dark: #5C0D0D;
|
||||||
|
--color-success: #00C9A6;
|
||||||
|
--color-success-light: #20E9C6;
|
||||||
|
--color-success-dark: #00A986;
|
||||||
|
--color-warning: #E17558;
|
||||||
|
--color-warning-light: #E39578;
|
||||||
|
--color-warning-dark: #C15538;
|
||||||
|
--color-info: #222140;
|
||||||
|
--color-info-light: #424260;
|
||||||
|
--color-info-dark: #020120;
|
||||||
|
}
|
@ -1,8 +1,11 @@
|
|||||||
import { GeistSans } from "geist/font/sans";
|
import { GeistSans } from "geist/font/sans";
|
||||||
import "./globals.css";
|
import "./globals.css";
|
||||||
|
import { createClient } from "@/utils/supabase/client";
|
||||||
import NavigationBar from "@/components/neroshitron/navigation_bar";
|
import NavigationBar from "@/components/neroshitron/navigation_bar";
|
||||||
import { SpeedInsights } from "@vercel/speed-insights/next"
|
import { SpeedInsights } from "@vercel/speed-insights/next"
|
||||||
import { Analytics } from "@vercel/analytics/react"
|
import { Analytics } from "@vercel/analytics/react"
|
||||||
|
import RightHandLayoutImage from "@/components/neroshitron/right_hand_layout_image";
|
||||||
|
import Theme from "@/components/theme";
|
||||||
const defaultUrl = process.env.VERCEL_URL
|
const defaultUrl = process.env.VERCEL_URL
|
||||||
? `https://${process.env.VERCEL_URL}`
|
? `https://${process.env.VERCEL_URL}`
|
||||||
: "http://localhost:3000";
|
: "http://localhost:3000";
|
||||||
@ -13,6 +16,10 @@ export const metadata = {
|
|||||||
description: "The fastest way to build apps with Next.js and Supabase",
|
description: "The fastest way to build apps with Next.js and Supabase",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const supabase = createClient();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export default function RootLayout({
|
export default function RootLayout({
|
||||||
children,
|
children,
|
||||||
}: {
|
}: {
|
||||||
@ -21,6 +28,8 @@ export default function RootLayout({
|
|||||||
return (
|
return (
|
||||||
<html lang="en" className={GeistSans.className}>
|
<html lang="en" className={GeistSans.className}>
|
||||||
<body className="bg-background text-foreground">
|
<body className="bg-background text-foreground">
|
||||||
|
<Theme/>
|
||||||
|
<RightHandLayoutImage/>
|
||||||
<div className="w-full fixed z-30 text-white white">
|
<div className="w-full fixed z-30 text-white white">
|
||||||
<NavigationBar/>
|
<NavigationBar/>
|
||||||
<SpeedInsights/>
|
<SpeedInsights/>
|
||||||
|
@ -17,6 +17,7 @@ const Galleries = ({ nsfw, tags, search, gallerySelected }: TagProps) => {
|
|||||||
const [searchState, setSearchState] = useState<string>(search);
|
const [searchState, setSearchState] = useState<string>(search);
|
||||||
|
|
||||||
const [selectedGallery, setSelectedGallery] = useState<string | null>(null);
|
const [selectedGallery, setSelectedGallery] = useState<string | null>(null);
|
||||||
|
const [tiers, setTiers] = useState<any[]>([]);
|
||||||
|
|
||||||
const selectGallery = (gallery: string) => {
|
const selectGallery = (gallery: string) => {
|
||||||
setSelectedGallery(gallery);
|
setSelectedGallery(gallery);
|
||||||
@ -25,6 +26,17 @@ const Galleries = ({ nsfw, tags, search, gallerySelected }: TagProps) => {
|
|||||||
|
|
||||||
|
|
||||||
const getData = async () => {
|
const getData = async () => {
|
||||||
|
try {
|
||||||
|
const response = await fetch('/api/tiers');
|
||||||
|
if (response.ok) {
|
||||||
|
const data = await response.json();
|
||||||
|
setTiers(data);
|
||||||
|
} else {
|
||||||
|
console.error('failed to fetch tiers');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching users:', error);
|
||||||
|
}
|
||||||
const galleriesResponse = await fetch(`/api/galleries?search=` + searchState + '&nsfw=' + nsfwState, {
|
const galleriesResponse = await fetch(`/api/galleries?search=` + searchState + '&nsfw=' + nsfwState, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
@ -43,19 +55,25 @@ const Galleries = ({ nsfw, tags, search, gallerySelected }: TagProps) => {
|
|||||||
return (
|
return (
|
||||||
<div className="absolute inset-0 mx-auto ml-16 md:ml-0 pt-48 p-4 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-y-48 gap-x-4 animate-in overflow-y-scroll no-scrollbar z-0">
|
<div className="absolute inset-0 mx-auto ml-16 md:ml-0 pt-48 p-4 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-y-48 gap-x-4 animate-in overflow-y-scroll no-scrollbar z-0">
|
||||||
|
|
||||||
{galleries && galleries.map((gallery: any, index) => (
|
{galleries && galleries.map((gallery: any, index) => {
|
||||||
<GalleryThumbnail
|
const tier = tiers.find((tier) => tier.name == gallery.tier);
|
||||||
key={gallery.name + " " + nsfw}
|
const subscriptionColor = tier ? tier.color : null;
|
||||||
id={gallery.name}
|
|
||||||
title={gallery.name}
|
return (
|
||||||
tags={gallery.tags}
|
<GalleryThumbnail
|
||||||
columns={gallery.columns}
|
key={gallery.name + " " + nsfw}
|
||||||
showNsfw={nsfw}
|
id={gallery.name}
|
||||||
subscription={gallery.tier as string}
|
title={gallery.name}
|
||||||
onSelect={selectGallery}
|
tags={gallery.tags}
|
||||||
nsfw={gallery.nsfw}
|
columns={gallery.columns}
|
||||||
></GalleryThumbnail>
|
showNsfw={nsfw}
|
||||||
))}
|
subscription={gallery.tier as string}
|
||||||
|
subscriptionColor={subscriptionColor}
|
||||||
|
onSelect={selectGallery}
|
||||||
|
nsfw={gallery.nsfw}
|
||||||
|
></GalleryThumbnail>
|
||||||
|
);
|
||||||
|
})}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -88,10 +88,8 @@ const Gallery = ({ id, columns, closeMenu }: GalleryProps) => {
|
|||||||
setCurrentIndex(images.indexOf(image));
|
setCurrentIndex(images.indexOf(image));
|
||||||
};
|
};
|
||||||
|
|
||||||
const resetPanZoom = (event: any) => {
|
const resetPanZoom = () => {
|
||||||
if (panZoomRef.current && event.target.id != "image-container") {
|
panZoomRef.current.autoCenter();
|
||||||
panZoomRef.current.autoCenter();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const close = () => {
|
const close = () => {
|
||||||
@ -103,11 +101,17 @@ const Gallery = ({ id, columns, closeMenu }: GalleryProps) => {
|
|||||||
closeMenu();
|
closeMenu();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
const back_page = () => {
|
||||||
|
if (selectedImage != null) {
|
||||||
|
setSelectedImage(null);
|
||||||
|
setImages([]);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const renderButtons = () => {
|
const renderButtons = () => {
|
||||||
return (
|
return (
|
||||||
<div className="z-20 bottom-10 fixed text-white pt-4 bg-primary bg-opacity-90 animate-in rounded-md" style={{ backdropFilter: 'blur(10px)' }}>
|
<div className="z-20 bottom-10 fixed text-white pt-4 bg-primary bg-opacity-90 animate-in rounded-md" style={{ backdropFilter: 'blur(10px)' }}>
|
||||||
<div className='grid grid-cols-4 pl-4 gap-4 pr-4'>
|
<div className='grid grid-cols-5 pl-4 gap-4 pr-4'>
|
||||||
<button
|
<button
|
||||||
className={`justify-center text-center w-full animate-in animate-once animate-duration-1000 animate-ease-out animate-reverse mb-4 py-2 px-4 rounded-lg no-underline flex items-center z-50 bg-error hover:bg-error-light`}
|
className={`justify-center text-center w-full animate-in animate-once animate-duration-1000 animate-ease-out animate-reverse mb-4 py-2 px-4 rounded-lg no-underline flex items-center z-50 bg-error hover:bg-error-light`}
|
||||||
onClick={() => close()}
|
onClick={() => close()}
|
||||||
@ -116,6 +120,16 @@ const Gallery = ({ id, columns, closeMenu }: GalleryProps) => {
|
|||||||
<path strokeLinecap="round" strokeLinejoin="round" d="M6 18 18 6M6 6l12 12" />
|
<path strokeLinecap="round" strokeLinejoin="round" d="M6 18 18 6M6 6l12 12" />
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
className={`justify-center text-center w-full animate-in animate-once animate-duration-1000 animate-ease-out animate-reverse mb-4 py-2 px-4 rounded-lg no-underline flex items-center z-50 ${!selectedImage ? 'opacity-50 cursor-not-allowed bg-gray-800' : 'bg-secondary hover:bg-secondary-light'}`}
|
||||||
|
onClick={() => resetPanZoom()}
|
||||||
|
disabled={!selectedImage}
|
||||||
|
>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M9 9V4.5M9 9H4.5M9 9 3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5 5.25 5.25" />
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
className={`justify-center text-center w-full animate-in animate-once animate-duration-1000 animate-ease-out animate-reverse mb-4 py-2 px-4 rounded-lg no-underline flex items-center z-50 ${!selectedImage ? 'opacity-50 cursor-not-allowed bg-gray-800' : 'bg-secondary hover:bg-secondary-light'}`}
|
className={`justify-center text-center w-full animate-in animate-once animate-duration-1000 animate-ease-out animate-reverse mb-4 py-2 px-4 rounded-lg no-underline flex items-center z-50 ${!selectedImage ? 'opacity-50 cursor-not-allowed bg-gray-800' : 'bg-secondary hover:bg-secondary-light'}`}
|
||||||
onClick={() => previous()}
|
onClick={() => previous()}
|
||||||
@ -151,8 +165,7 @@ const Gallery = ({ id, columns, closeMenu }: GalleryProps) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div >
|
<div >
|
||||||
<div className="z-20"
|
<div className="z-20" style={{ width: selectedImage ? "100%" : "auto", height: selectedImage ? "100%" : "auto" }}>
|
||||||
onClick={resetPanZoom} style={{ width: selectedImage ? "100%" : "auto", height: selectedImage ? "100%" : "auto" }}>
|
|
||||||
<div className='flex justify-center items-center pt-2 pb-20'>
|
<div className='flex justify-center items-center pt-2 pb-20'>
|
||||||
{renderButtons()}
|
{renderButtons()}
|
||||||
</div>
|
</div>
|
||||||
@ -191,6 +204,7 @@ const Gallery = ({ id, columns, closeMenu }: GalleryProps) => {
|
|||||||
.filter((img) => img !== selectedImage)
|
.filter((img) => img !== selectedImage)
|
||||||
.map((image, index) => (
|
.map((image, index) => (
|
||||||
<img
|
<img
|
||||||
|
key={index}
|
||||||
src={image}
|
src={image}
|
||||||
onClick={() => handleClick(image)}
|
onClick={() => handleClick(image)}
|
||||||
className={`animate-in animate-once animate-duration-1000 animate-ease-out animate-reverse hover:scale-105 p-2 cursor-pointer my-2 transition-all opacity-100 duration-500 ease-in-out transform`}
|
className={`animate-in animate-once animate-duration-1000 animate-ease-out animate-reverse hover:scale-105 p-2 cursor-pointer my-2 transition-all opacity-100 duration-500 ease-in-out transform`}
|
||||||
|
@ -6,12 +6,13 @@ interface GalleryThumbnailProps {
|
|||||||
onSelect: (id: string, columns: number) => void;
|
onSelect: (id: string, columns: number) => void;
|
||||||
title: string;
|
title: string;
|
||||||
subscription: string;
|
subscription: string;
|
||||||
|
subscriptionColor: string;
|
||||||
tags: string[];
|
tags: string[];
|
||||||
showNsfw: boolean;
|
showNsfw: boolean;
|
||||||
nsfw: boolean;
|
nsfw: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const GalleryThumbnail = ({ id, columns, onSelect, title, showNsfw, nsfw, subscription, tags }: GalleryThumbnailProps) => {
|
const GalleryThumbnail = ({ id, columns, onSelect, title, showNsfw, nsfw, subscription, subscriptionColor, tags }: GalleryThumbnailProps) => {
|
||||||
const [galleryId, setGalleryId] = useState<string>(id);
|
const [galleryId, setGalleryId] = useState<string>(id);
|
||||||
const [thumbnailUrl, setThumbnailUrl] = useState<string>('');
|
const [thumbnailUrl, setThumbnailUrl] = useState<string>('');
|
||||||
const [isLoading, setIsLoading] = useState<boolean>(true);
|
const [isLoading, setIsLoading] = useState<boolean>(true);
|
||||||
@ -21,15 +22,16 @@ const GalleryThumbnail = ({ id, columns, onSelect, title, showNsfw, nsfw, subscr
|
|||||||
const [showNsfwState, setShowNsfw] = useState<boolean>(showNsfw);
|
const [showNsfwState, setShowNsfw] = useState<boolean>(showNsfw);
|
||||||
const [subscriptionState, setSubscription] = useState<string>(subscription);
|
const [subscriptionState, setSubscription] = useState<string>(subscription);
|
||||||
const [tagsState, setTags] = useState<string[]>(tags);
|
const [tagsState, setTags] = useState<string[]>(tags);
|
||||||
|
console.log(subscriptionColor)
|
||||||
const openGallery = () => {
|
const openGallery = () => {
|
||||||
onSelect(galleryId, galleryCollumns);
|
onSelect(galleryId, galleryCollumns);
|
||||||
};
|
};
|
||||||
|
|
||||||
const getData = async () => {
|
const getData = async () => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
const thumbnailResponse = await fetch('/api/galleries/' + title + '/thumbnail?nsfw=' + showNsfwState);
|
const thumbnailResponse = await fetch('/api/galleries/' + id + '/thumbnail?nsfw=' + showNsfwState);
|
||||||
const thumbnailUrl = await thumbnailResponse.text();
|
const thumbnailUrl = await thumbnailResponse.text();
|
||||||
const imagesCountResponse = await fetch('/api/galleries/' + title + '/images/count');
|
const imagesCountResponse = await fetch('/api/galleries/' + id + '/images/count');
|
||||||
const imageCount = await imagesCountResponse.json() as number;
|
const imageCount = await imagesCountResponse.json() as number;
|
||||||
setImageCount(imageCount);
|
setImageCount(imageCount);
|
||||||
setThumbnailUrl(thumbnailUrl);
|
setThumbnailUrl(thumbnailUrl);
|
||||||
@ -42,11 +44,11 @@ const GalleryThumbnail = ({ id, columns, onSelect, title, showNsfw, nsfw, subscr
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className=" py-3 sm:max-w-xl sm:mx-auto flex-3 animate-fade-up animate-once animate-duration-1000 animate-ease-out animate-normal animate-fill-forwards">
|
<div className=" py-3 sm:max-w-xl sm:mx-auto flex-3 animate-fade-up animate-once animate-duration-1000 animate-ease-out animate-normal animate-fill-forwards">
|
||||||
<div className="h-48 overflow-visible w-full relative hover:scale-95 rounded-3xl" style={{ cursor: 'pointer' }}>
|
<div className="h-48 overflow-visible w-full relative hover:scale-95 rounded-3xl" style={{ cursor: 'pointer'}}>
|
||||||
{!isLoading ? (
|
{!isLoading ? (
|
||||||
<>
|
<>
|
||||||
<img
|
<img
|
||||||
className={`aspect-content rounded-3xl`}
|
className={`aspect-content rounded-3xl shadow-lg`}
|
||||||
src={thumbnailUrl}
|
src={thumbnailUrl}
|
||||||
alt=""
|
alt=""
|
||||||
onClick={openGallery}
|
onClick={openGallery}
|
||||||
@ -72,18 +74,8 @@ const GalleryThumbnail = ({ id, columns, onSelect, title, showNsfw, nsfw, subscr
|
|||||||
{nsfwState && (
|
{nsfwState && (
|
||||||
<span className=" bg-error text-white px-2 py-1 mr-2 rounded-md text-sm h-full flex items-center">NSFW</span>
|
<span className=" bg-error text-white px-2 py-1 mr-2 rounded-md text-sm h-full flex items-center">NSFW</span>
|
||||||
)}
|
)}
|
||||||
{subscription === "Free" && (
|
<span className="text-white px-2 py-1 rounded-md text-sm h-full flex items-center" style={{ cursor: 'pointer', backgroundColor: subscriptionColor }}>Free</span>
|
||||||
<span className=" bg-free text-white px-2 py-1 rounded-md text-sm h-full flex items-center">Free</span>
|
|
||||||
)}
|
|
||||||
{subscription === "Tier 1" && (
|
|
||||||
<span className=" bg-tier1 text-white px-2 py-1 rounded-md text-sm h-full flex items-center">Tier 1</span>
|
|
||||||
)}
|
|
||||||
{subscription === "Tier 2" && (
|
|
||||||
<span className=" bg-tier2 text-white px-2 py-1 rounded-md text-sm h-full flex items-center">Tier 2</span>
|
|
||||||
)}
|
|
||||||
{subscription === "Tier 3" && (
|
|
||||||
<span className=" bg-tier3 text-white px-2 py-1 rounded-md text-sm h-full flex items-center">Tier 3</span>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/* <div className="text-white flex justify-between">
|
{/* <div className="text-white flex justify-between">
|
||||||
|
@ -22,7 +22,6 @@ export default async function AuthButton() {
|
|||||||
|
|
||||||
const heads = headers()
|
const heads = headers()
|
||||||
const currentPage = heads.get('x-path')
|
const currentPage = heads.get('x-path')
|
||||||
console.log(currentPage)
|
|
||||||
const getGravatarUrl = () => {
|
const getGravatarUrl = () => {
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return;
|
return;
|
||||||
@ -35,19 +34,49 @@ console.log(currentPage)
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
const url = getGravatarUrl();
|
const url = getGravatarUrl();
|
||||||
|
|
||||||
|
const admins = await supabase.from('admins').select('user_id');
|
||||||
|
let isAdmin = false;
|
||||||
|
if(!admins.error) {
|
||||||
|
for (const admin of admins.data) {
|
||||||
|
if (admin.user_id == user?.id) {
|
||||||
|
isAdmin = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex justify-center items-center pt-2 ">
|
<div className="flex justify-center items-center pt-2 ">
|
||||||
<nav className="w-auto bg-info bg-opacity-80 flex justify-center z-10 h-16 animate-in rounded-md" style={{ backdropFilter: 'blur(10px)' }}>
|
<nav className="w-auto bg-primary bg-opacity-40 flex justify-center z-10 h-16 animate-in rounded-md shadow-lg" style={{ backdropFilter: 'blur(10px)' }}>
|
||||||
<div className="w-auto flex justify-between items-center p-3 text-sm">
|
<div className="w-auto flex justify-between items-center p-3 text-sm">
|
||||||
<div className="flex items-center gap-2 z-10">
|
<div className="flex items-center gap-2 z-10">
|
||||||
|
|
||||||
{/* This is admin stuff */}
|
{/* This is admin stuff */}
|
||||||
<Link
|
|
||||||
href="/gallery/admin"
|
{(isAdmin) && (
|
||||||
className={`py-2 px-3 w-32 text-center flex rounded-md lg:block hidden no-underline ${currentPage!="gallery" ? 'bg-secondary hover:bg-secondary-light' : 'bg-secondary hover:bg-secondary-light'}`}
|
<>
|
||||||
>
|
<Link
|
||||||
<span className="hidden lg:block">Gallery Admin</span>
|
href="/gallery/admin/"
|
||||||
</Link>
|
className={`py-2 px-3 w-38 text-center flex rounded-md no-underline bg-secondary hover:bg-secondary-light`}
|
||||||
|
>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="lg:hidden size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M11.42 15.17 17.25 21A2.652 2.652 0 0 0 21 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 1 1-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 0 0 4.486-6.336l-3.276 3.277a3.004 3.004 0 0 1-2.25-2.25l3.276-3.276a4.5 4.5 0 0 0-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437 1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008Z" />
|
||||||
|
</svg>
|
||||||
|
<span className="hidden lg:block">Gallery Admin</span>
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
href="/admin/"
|
||||||
|
className={`py-2 px-3 w-38 text-center flex rounded-md no-underline bg-secondary hover:bg-secondary-light`}
|
||||||
|
>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="lg:hidden size-6">
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" />
|
||||||
|
<path strokeLinecap="round" strokeLinejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" />
|
||||||
|
</svg>
|
||||||
|
<span className="hidden lg:block">System Settings</span>
|
||||||
|
</Link>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
<Link
|
<Link
|
||||||
href="/gallery"
|
href="/gallery"
|
||||||
|
16
components/neroshitron/right_hand_layout_image.tsx
Normal file
16
components/neroshitron/right_hand_layout_image.tsx
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
"use client;"
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
const RightHandLayoutImage: React.FC = () => {
|
||||||
|
return (
|
||||||
|
<div className="fixed w-full h-full overflow-hidden z-0 animate-fade-left animate-once animate-duration-[2000ms] animate-normal animate-fill-forwards">
|
||||||
|
<img
|
||||||
|
src="/gallery_girl.png"
|
||||||
|
className="float-right object-cover h-screen w-full lg:w-5/6 xl:w-3/6 opacity-50 overflow-hidden"
|
||||||
|
alt="Background"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default RightHandLayoutImage;
|
@ -44,7 +44,10 @@ const Search = ({ gallerySelected }: SearchProps) => {
|
|||||||
<Galleries gallerySelected={(gallery: string) => { setGallery(gallery) }} key={search + "-" + tags.length + "-" + nsfw} search={search} nsfw={nsfw} tags={tags} />
|
<Galleries gallerySelected={(gallery: string) => { setGallery(gallery) }} key={search + "-" + tags.length + "-" + nsfw} search={search} nsfw={nsfw} tags={tags} />
|
||||||
<section className="fixed flex items-center w-full p-8 pt-20 opacity-90 animate-in animate-once animate-duration-500">
|
<section className="fixed flex items-center w-full p-8 pt-20 opacity-90 animate-in animate-once animate-duration-500">
|
||||||
<div className="container mx-auto py-8">
|
<div className="container mx-auto py-8">
|
||||||
<SearchInput placeholderTags={[
|
<SearchInput
|
||||||
|
|
||||||
|
startingTags={[]}
|
||||||
|
placeholderTags={[
|
||||||
{ value: "neroshi", label: "🧑🎨 neroshi" },
|
{ value: "neroshi", label: "🧑🎨 neroshi" },
|
||||||
{ value: "neroshi", label: "❗️ click here for tags to search!" },
|
{ value: "neroshi", label: "❗️ click here for tags to search!" },
|
||||||
]} nsfwButtonEnabled={true} searchChanged={(search) => { setSearch(search) }} nsfwChanged={(nsfw) => { setNsfw(nsfw) }} tagsChanged={(tags) => { setTags(tags); }} />
|
]} nsfwButtonEnabled={true} searchChanged={(search) => { setSearch(search) }} nsfwChanged={(nsfw) => { setNsfw(nsfw) }} tagsChanged={(tags) => { setTags(tags); }} />
|
||||||
|
@ -11,14 +11,18 @@ interface SearchInputProps {
|
|||||||
nsfwChanged: (nsfw: boolean) => void;
|
nsfwChanged: (nsfw: boolean) => void;
|
||||||
nsfwButtonEnabled: boolean | null;
|
nsfwButtonEnabled: boolean | null;
|
||||||
placeholderTags: Option[];
|
placeholderTags: Option[];
|
||||||
|
startingTags: string[] | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged, nsfwButtonEnabled, placeholderTags }: SearchInputProps) => {
|
const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged, nsfwButtonEnabled, placeholderTags, startingTags }: SearchInputProps) => {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const [tagSearch, setTagSearch] = useState<string>('');
|
const [tagSearch, setTagSearch] = useState<string>('');
|
||||||
const [nsfw, setNsfw] = useState<boolean>(false);
|
const [nsfw, setNsfw] = useState<boolean>(false);
|
||||||
const [selectedTags, setSelectedTags] = useState<string[]>([]);
|
const [selectedTags, setSelectedTags] = useState<string[]>(startingTags ?? []);
|
||||||
const [selectedTagsInput, setSelectedTagsInput] = useState<Option[]>(placeholderTags);
|
const [selectedTagsInput, setSelectedTagsInput] = useState<Option[]>([...placeholderTags, ...(startingTags ?? []).map((tag) => ({ value: tag, label: tag }))]);
|
||||||
const [selectingTags, setSelectingTags] = useState<boolean>(false);
|
const [selectingTags, setSelectingTags] = useState<boolean>(false);
|
||||||
const tagSelectorRef = React.useRef(null);
|
const tagSelectorRef = React.useRef(null);
|
||||||
const [tags, setTags] = useState<any[]>([]);
|
const [tags, setTags] = useState<any[]>([]);
|
||||||
@ -29,9 +33,6 @@ const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged, nsfwButtonEnable
|
|||||||
setTags(tagsData);
|
setTags(tagsData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const updateTags = (newTags: string[]) => {
|
const updateTags = (newTags: string[]) => {
|
||||||
setSelectedTags(newTags)
|
setSelectedTags(newTags)
|
||||||
}
|
}
|
||||||
@ -57,13 +58,47 @@ const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged, nsfwButtonEnable
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getData();
|
getData();
|
||||||
}, []);
|
}, []);
|
||||||
|
const [color, setColor] = useState('black');
|
||||||
|
const selectRef = useRef(null);
|
||||||
|
const [currentTag, setCurrentTag] = useState<string>('');
|
||||||
|
|
||||||
const tagOptions = tags.map((tag: { name: string; }) => ({ value: tag.name, label: "🏷️ "+tag.name }));
|
useEffect(() => {
|
||||||
|
const handleKeyDown = (event: KeyboardEvent) => {
|
||||||
|
|
||||||
|
if (event.key === 'ArrowUp') {
|
||||||
|
const currentIndex = tags.findIndex(tag => tag.name === currentTag);
|
||||||
|
const newIndex = currentIndex === 0 ? tags.length - 1 : currentIndex - 1;
|
||||||
|
setCurrentTag(tags[newIndex].name);
|
||||||
|
} else if (event.key === 'ArrowDown') {
|
||||||
|
const currentIndex = tags.findIndex(tag => tag.name === currentTag);
|
||||||
|
const newIndex = currentIndex === tags.length - 1 ? 0 : currentIndex + 1;
|
||||||
|
setCurrentTag(tags[newIndex].name);
|
||||||
|
} else if (event.key === 'Enter') {
|
||||||
|
const currentIndex = tags.findIndex(tag => tag.name === currentTag);
|
||||||
|
if (currentIndex !== -1 && !selectedTags.includes(tags[currentIndex].name)) {
|
||||||
|
setSelectedTags([...selectedTags, tags[currentIndex].name]);
|
||||||
|
const tagsInput = selectedTagsInput;
|
||||||
|
tagsInput.push({ value: tags[currentIndex].name, label: tags[currentIndex].name });
|
||||||
|
setSelectedTagsInput(tagsInput);
|
||||||
|
setCurrentTag('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener('keydown', handleKeyDown);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener('keydown', handleKeyDown);
|
||||||
|
};
|
||||||
|
}, [currentTag, tags]);
|
||||||
|
|
||||||
|
|
||||||
|
const tagOptions = tags.map((tag: { name: string; }) => ({ value: tag.name, label: tag.name }));
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="relative w-full flex flex-col items-center justify-center z-10">
|
<div className={` opacity 0 relative w-full flex flex-col items-center justify-center z-10`}>
|
||||||
<div className="search-box mx-auto my-auto w-full">
|
<div className="search-box mx-auto my-auto w-full">
|
||||||
<div className="flex flex-row">
|
<div className={`flex flex-row`}>
|
||||||
|
|
||||||
{(selectingTags) ? (
|
{(selectingTags) ? (
|
||||||
<>
|
<>
|
||||||
@ -79,6 +114,7 @@ const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged, nsfwButtonEnable
|
|||||||
)
|
)
|
||||||
: (
|
: (
|
||||||
<>
|
<>
|
||||||
|
<div className="w-full top-0">
|
||||||
<Select isMultiple isSearchable isClearable searchInputPlaceholder='Start typing to search tags...'
|
<Select isMultiple isSearchable isClearable searchInputPlaceholder='Start typing to search tags...'
|
||||||
options={tagOptions}
|
options={tagOptions}
|
||||||
placeholder="Select tags for your search"
|
placeholder="Select tags for your search"
|
||||||
@ -94,14 +130,42 @@ const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged, nsfwButtonEnable
|
|||||||
setSelectedTags([value.value]);
|
setSelectedTags([value.value]);
|
||||||
setSelectedTagsInput([value])
|
setSelectedTagsInput([value])
|
||||||
}
|
}
|
||||||
|
if (Array.isArray(value)) {
|
||||||
|
setSelectedTags(value.map((option) => option.value));
|
||||||
|
setSelectedTagsInput(value.filter((option) => option.value !== 'placeholder'));
|
||||||
|
} else if (value) {
|
||||||
|
setSelectedTags([value.value]);
|
||||||
|
setSelectedTagsInput([value]);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
onSearchInputChange={(value) => {
|
||||||
|
|
||||||
}}
|
}}
|
||||||
classNames={{
|
classNames={{
|
||||||
|
|
||||||
|
menu: "bg-secondary-dark text-white pb-4 rounded",
|
||||||
|
searchBox: "rounded-md bg-secondary w-1/2 text-white w-full mt-2 p-2 mb-2 animate-in",
|
||||||
|
searchIcon: "hidden",
|
||||||
|
tagItem: (value) => "hover:scale-95 bg-primary-light rounded-md pl-2 p-1 m-1 flex",
|
||||||
|
tagItemText: "text-white animate-in",
|
||||||
|
closeIcon: "text-white",
|
||||||
|
tagItemIconContainer:"animate-in"
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
formatOptionLabel={data => (
|
||||||
|
<li key={"tag-" + data.value}
|
||||||
|
className={`animate-in block transition rounded duration-200 px-2 py-2 cursor-pointer select-none truncate pt-2 bg-primary text-white ${currentTag==data.value ? "bg-primary-light" : ""} hover:bg-primary-light
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
{data.label}
|
||||||
|
</li>
|
||||||
|
)}
|
||||||
value={selectedTagsInput}
|
value={selectedTagsInput}
|
||||||
primaryColor={"indigo"} />
|
primaryColor={"indigo"} />
|
||||||
|
|
||||||
{(nsfwButtonEnabled) ?? (
|
</div>
|
||||||
<span className="flex items-center border-0 font-bold text-grey-100">
|
{(nsfwButtonEnabled) && (
|
||||||
|
<span className="w-1/6 border-0 font-bold text-grey-100">
|
||||||
<button
|
<button
|
||||||
onClick={() => { setNsfw(!nsfw) }}
|
onClick={() => { setNsfw(!nsfw) }}
|
||||||
type="button"
|
type="button"
|
||||||
|
37
components/theme.tsx
Normal file
37
components/theme.tsx
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
|
||||||
|
"use client";
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { createClient } from '@/utils/supabase/client';
|
||||||
|
|
||||||
|
interface GalleryThumbnailProps {}
|
||||||
|
|
||||||
|
const ThemeProvider = ({}: GalleryThumbnailProps) => {
|
||||||
|
const [data, setData] = useState<any[]>([]); // State to store the fetched data
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
const supabase = createClient();
|
||||||
|
const { data, error } = await supabase.from('interface_configurations').select('*');
|
||||||
|
if (error) {
|
||||||
|
console.error('Error fetching data:', error);
|
||||||
|
} else {
|
||||||
|
setData(data || []);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// Update variables when data changes
|
||||||
|
for (const config of data) {
|
||||||
|
if (config.type === 'color') {
|
||||||
|
document.documentElement.style.setProperty(`--color-${config.name}`, config.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
|
return <></>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ThemeProvider;
|
503
docs/.$diagrams.drawio.bkp
Normal file
503
docs/.$diagrams.drawio.bkp
Normal file
@ -0,0 +1,503 @@
|
|||||||
|
<mxfile host="Electron" modified="2024-06-04T04:27:05.636Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.2.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="x7V6P6bjO-UHE86F-Cl3" version="24.2.5" type="device">
|
||||||
|
<diagram name="Page-1" id="F3YAVjulPUqdYhbqfjdd">
|
||||||
|
<mxGraphModel dx="1877" dy="2420" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-28" value="<h1>Database Design</h1>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="332.5" y="-70" width="390" height="10" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-29" value="<h1>UX Flow</h1>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="30" y="620" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-37" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-33" target="9zziB1Dtd-V9IfowJO3V-36" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-33" value="Actor" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="35" y="690" width="30" height="60" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-39" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-36" target="9zziB1Dtd-V9IfowJO3V-38" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-36" value="Open Site" style="whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="105" y="705" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-42" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-41" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-43" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-42" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="0.2533" y="2" relative="1" as="geometry">
|
||||||
|
<mxPoint x="2" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-48" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-47" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-72" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-48" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="-0.2273" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-71" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="265" y="740" />
|
||||||
|
<mxPoint x="265" y="795" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-74" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-73" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="0.0411" y="1" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-81" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="305" y="890" />
|
||||||
|
<mxPoint x="93" y="890" />
|
||||||
|
<mxPoint x="93" y="940" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-83" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-82" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="-0.8649" y="-1" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-91" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-93" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-92" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="-0.6335" y="-2" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-38" value="<br>Logged<br>In" style="rhombus;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="265" y="680" width="80" height="80" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-46" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-41" target="9zziB1Dtd-V9IfowJO3V-45" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-41" value="Login/Signup Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#a20025;strokeColor=#6F0000;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="245" y="620" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-45" target="9zziB1Dtd-V9IfowJO3V-47" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-50" value="Click Activation<br>Email Link" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-49" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="0.1683" y="1" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-45" value="Send Confirmation Email" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#a20025;strokeColor=#6F0000;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="235" y="560" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-52" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-47" target="9zziB1Dtd-V9IfowJO3V-51" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="540" y="716.31" as="sourcePoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-47" value="Gallery Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="440" y="705" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-54" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-51" target="9zziB1Dtd-V9IfowJO3V-53" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-51" value="Search By Title &amp;<br>Filter By Tag" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="642" y="698.02" width="120" height="45" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-55" value="Refine Search" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-53" target="9zziB1Dtd-V9IfowJO3V-51" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-57" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-53" target="9zziB1Dtd-V9IfowJO3V-56" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-53" value="Browse Galleries" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="802" y="704.27" width="120" height="32.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-59" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-56" target="9zziB1Dtd-V9IfowJO3V-58" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-56" value="Open Gallery" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="802" y="780.52" width="120" height="32.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-61" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-60" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-63" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-62" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-65" value="Directional<br>Buttons" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-63" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="0.1714" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-69" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-68" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="742" y="850.52" />
|
||||||
|
<mxPoint x="742" y="840.52" />
|
||||||
|
<mxPoint x="732" y="840.52" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-58" value="Enlarge Image &amp;&nbsp;<br>Pan/Zoom" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="802" y="840.52" width="120" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-60" value="Download Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="802" y="900.52" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-62" target="9zziB1Dtd-V9IfowJO3V-58" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="672" y="960.52" />
|
||||||
|
<mxPoint x="782" y="960.52" />
|
||||||
|
<mxPoint x="782" y="870.52" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-62" value="Next/Previous<br>Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="612" y="890.52" width="120" height="40" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-70" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-68" target="9zziB1Dtd-V9IfowJO3V-56" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<mxPoint x="762" y="797.39" as="sourcePoint" />
|
||||||
|
<mxPoint x="792" y="796.14" as="targetPoint" />
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="762" y="796.52" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-68" value="Close Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="642" y="787.52" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-76" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-71" target="9zziB1Dtd-V9IfowJO3V-75" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-78" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-71" target="9zziB1Dtd-V9IfowJO3V-77" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-71" value="Livestream Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#d80073;strokeColor=#A50040;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="125" y="780" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-75" value="Watch Stream" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#d80073;strokeColor=#A50040;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="125" y="840" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-77" value="Chat" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#d80073;strokeColor=#A50040;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="12.5" y="780" width="75" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-85" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" source="9zziB1Dtd-V9IfowJO3V-81" target="9zziB1Dtd-V9IfowJO3V-84" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-87" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" source="9zziB1Dtd-V9IfowJO3V-81" target="9zziB1Dtd-V9IfowJO3V-86" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-81" value="Subscriptions Page" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;strokeColor=#3700CC;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="32.5" y="940" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-84" value="View Current Tier" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;strokeColor=#3700CC;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="32.5" y="990" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" source="9zziB1Dtd-V9IfowJO3V-86" target="9zziB1Dtd-V9IfowJO3V-88" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-86" value="View Available Tiers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;strokeColor=#3700CC;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="187.5" y="940" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-90" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" source="9zziB1Dtd-V9IfowJO3V-88" target="9zziB1Dtd-V9IfowJO3V-84" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-88" value="Upgrade Tier" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;strokeColor=#3700CC;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="187.5" y="990" width="120" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-95" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-91" target="9zziB1Dtd-V9IfowJO3V-94" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="410" y="810" />
|
||||||
|
<mxPoint x="360" y="810" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-100" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-91" target="9zziB1Dtd-V9IfowJO3V-99" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-91" value="Commissions Page" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="350" y="770" width="120" height="27.48" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-97" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-94" target="9zziB1Dtd-V9IfowJO3V-96" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-98" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-97" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="-0.6109" relative="1" as="geometry">
|
||||||
|
<mxPoint x="20" y="2" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-105" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-94" target="9zziB1Dtd-V9IfowJO3V-110" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-106" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-105" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="-0.1779" y="-2" relative="1" as="geometry">
|
||||||
|
<mxPoint y="-2" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-94" value="Has Existing<br>Commission" style="rhombus;whiteSpace=wrap;html=1;rounded=0;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="310" y="830.52" width="100" height="100" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-101" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-96" target="9zziB1Dtd-V9IfowJO3V-99" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-96" value="View Existing<br>Commission Status" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="350" y="970" width="120" height="60" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-99" value="View All Commissions" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="500" y="770" width="130" height="27.48" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-109" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-104" target="9zziB1Dtd-V9IfowJO3V-96" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="560" y="985" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-104" value="Request New<br>Commission" style="whiteSpace=wrap;html=1;fillColor=#60a917;strokeColor=#2D7600;rounded=0;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="470" y="817.52" width="120" height="39.48" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-111" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-110" target="9zziB1Dtd-V9IfowJO3V-96" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="440" y="930" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-112" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-111" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="0.0044" relative="1" as="geometry">
|
||||||
|
<mxPoint y="5" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-113" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-110" target="9zziB1Dtd-V9IfowJO3V-104" edge="1">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-114" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-113" vertex="1" connectable="0">
|
||||||
|
<mxGeometry x="-0.5043" y="1" relative="1" as="geometry">
|
||||||
|
<mxPoint x="3" y="-1" as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-110" value="Requests<br>Open" style="rhombus;whiteSpace=wrap;html=1;rounded=0;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
|
<mxGeometry x="440" y="860.52" width="79.48" height="79.48" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-5" value="public.tags" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="207.5" y="440" width="140" height="60" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-6" value="name" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-5">
|
||||||
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-9" value="public.admins" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="243" y="60" width="175" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-10" value="PK FK Unique uuid user_id" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-9">
|
||||||
|
<mxGeometry y="30" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-11" value="assigned_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-9">
|
||||||
|
<mxGeometry y="60" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-12" value="assigner_id:uuid?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-9">
|
||||||
|
<mxGeometry y="90" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-17" value="auth.users" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="10" y="120" width="140" height="60" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-18" value="id" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-17">
|
||||||
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-10">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-14">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-23" value="public.tier" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#a20025;fontColor=#ffffff;strokeColor=#6F0000;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="32.5" y="290" width="140" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-24" value="PK name:text" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-23">
|
||||||
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-25" value="price:decimal" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-23">
|
||||||
|
<mxGeometry y="60" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-26" value="stripe_product_id:string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-23">
|
||||||
|
<mxGeometry y="90" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#a20025;strokeColor=#6F0000;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-24" target="1AZqCnQGpeGdDfHHl4o8-15">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-34" value="public.galleries" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="497.5" y="320" width="140" height="180" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-35" value="PK string name" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-37" value="FK tier string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="60" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-38" value="string thumbnail_file" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="90" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-41" value="bool nsfw" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="120" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-39" value="text[] tags" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="150" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#a20025;strokeColor=#6F0000;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-24" target="1AZqCnQGpeGdDfHHl4o8-37">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="207.5" y="335" />
|
||||||
|
<mxPoint x="207.5" y="395" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-43" value="public.skibs" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="499.5" width="140" height="300" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-44" value="PK AI id:&nbsp;int8" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-46" value="amount:decimal" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="60" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-49" value="user_id:uuid" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="90" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-50" value="request_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="120" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-51" value="accepted:bool?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="150" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-58" value="processed_date:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="180" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-52" value="payment_url:string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="210" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-57" value="paidDate:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="240" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-59" value="completedDate:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="270" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-48" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;startArrow=classic;startFill=1;fillColor=#1ba1e2;strokeColor=#006EAF;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-6" target="1AZqCnQGpeGdDfHHl4o8-39">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-56" value="No FK Relationship" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontColor=#FFFFFF;labelBackgroundColor=none;" vertex="1" connectable="0" parent="1AZqCnQGpeGdDfHHl4o8-48">
|
||||||
|
<mxGeometry x="-0.0082" y="2" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-13" value="public.user_subscriptions" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="243" y="203" width="175" height="180" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-14" value="PK FK Unique user_id:uuid" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="30" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-15" value="FK tier:text" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="60" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-54" value="active:bool" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="90" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-53" value="last_paid_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="120" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-47" value="start_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="150" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-49">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="197.5" y="165" />
|
||||||
|
<mxPoint x="197.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="105" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-60" value="public.commissions" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="697.5" y="30" width="170" height="330" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-61" value="PK AI id:&nbsp;int8" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="30" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-62" value="amount:decimal" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="60" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-63" value="user_id:uuid" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="90" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-64" value="request_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="120" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-65" value="accepted:bool?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="150" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-66" value="processed_date:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="180" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-67" value="hours:number" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="210" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-70" value="pending_approval:bool false" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="240" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-68" value="paidDate:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="270" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-69" value="completedDate:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="300" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-71" value="public.comission_messages" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="957.5" y="180" width="210" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-72" value="PK AI id:int8" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-71">
|
||||||
|
<mxGeometry y="30" width="210" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-73" value="FK comission_id:int8" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-71">
|
||||||
|
<mxGeometry y="60" width="210" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-74" value="FK sender_id:uuid" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-71">
|
||||||
|
<mxGeometry y="90" width="210" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-63">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="197.5" y="165" />
|
||||||
|
<mxPoint x="197.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="-30" />
|
||||||
|
<mxPoint x="667.5" y="-30" />
|
||||||
|
<mxPoint x="667.5" y="135" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-80" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#1ba1e2;strokeColor=#006EAF;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-61" target="1AZqCnQGpeGdDfHHl4o8-73">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-81" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-74">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="197.5" y="165" />
|
||||||
|
<mxPoint x="197.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="-30" />
|
||||||
|
<mxPoint x="667.5" y="-30" />
|
||||||
|
<mxPoint x="667.5" y="400" />
|
||||||
|
<mxPoint x="897.5" y="400" />
|
||||||
|
<mxPoint x="897.5" y="285" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
@ -1,107 +1,44 @@
|
|||||||
<mxfile host="app.diagrams.net" modified="2024-05-28T00:00:21.084Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" etag="8DUvRLFdr2zWCX9JS4oW" version="24.2.5" type="device">
|
<mxfile host="Electron" modified="2024-06-04T04:27:06.049Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.2.5 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="nuI_NnP1br-4Uuhgp7xU" version="24.2.5" type="device">
|
||||||
<diagram name="Page-1" id="F3YAVjulPUqdYhbqfjdd">
|
<diagram name="Page-1" id="F3YAVjulPUqdYhbqfjdd">
|
||||||
<mxGraphModel dx="1314" dy="865" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
<mxGraphModel dx="1877" dy="2420" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
|
||||||
<root>
|
<root>
|
||||||
<mxCell id="0" />
|
<mxCell id="0" />
|
||||||
<mxCell id="1" parent="0" />
|
<mxCell id="1" parent="0" />
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-1" target="9zziB1Dtd-V9IfowJO3V-20">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-28" value="<h1>Database Design</h1>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry x="332.5" y="-70" width="390" height="10" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-1" value="auth.users.id" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-29" value="<h1>UX Flow</h1>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
|
||||||
<mxGeometry x="50" y="210" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-2" value="public.galleries" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="280" y="320" width="140" height="180" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-3" value="PK string name" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-2">
|
|
||||||
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-4" value="int8 columns" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-2">
|
|
||||||
<mxGeometry y="60" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-5" value="tier tier" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-2">
|
|
||||||
<mxGeometry y="90" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-6" value="bool nsfw" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-2">
|
|
||||||
<mxGeometry y="120" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-7" value="text[] tags" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-2">
|
|
||||||
<mxGeometry y="150" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-8" value="public.tags" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="50" y="440" width="140" height="60" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-9" value="name" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-8">
|
|
||||||
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-9" target="9zziB1Dtd-V9IfowJO3V-7">
|
|
||||||
<mxGeometry relative="1" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-13" value="Custom Type : Tier" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="50" y="260" width="140" height="150" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-14" value="Free" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-13">
|
|
||||||
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-15" value="Tier 1" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-13">
|
|
||||||
<mxGeometry y="60" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-16" value="Tier 2" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-13">
|
|
||||||
<mxGeometry y="90" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-17" value="Tier 3" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-13">
|
|
||||||
<mxGeometry y="120" width="140" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1.008;entryY=0.09;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-5" target="9zziB1Dtd-V9IfowJO3V-13">
|
|
||||||
<mxGeometry relative="1" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-19" value="public.user_subscriptions" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="280" y="180" width="160" height="90" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-20" value="FK PK user_id" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-19">
|
|
||||||
<mxGeometry y="30" width="160" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-21" value="tier tier" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-19">
|
|
||||||
<mxGeometry y="60" width="160" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.989;entryY=0.09;entryDx=0;entryDy=0;entryPerimeter=0;startArrow=classic;startFill=1;endArrow=none;endFill=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-21" target="9zziB1Dtd-V9IfowJO3V-13">
|
|
||||||
<mxGeometry relative="1" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-28" value="<h1>Database Design</h1>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="235" y="120" width="390" height="30" as="geometry" />
|
|
||||||
</mxCell>
|
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-29" value="<h1>UX Flow</h1>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
|
|
||||||
<mxGeometry x="30" y="620" width="175" height="30" as="geometry" />
|
<mxGeometry x="30" y="620" width="175" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-37" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-33" target="9zziB1Dtd-V9IfowJO3V-36">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-37" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-33" target="9zziB1Dtd-V9IfowJO3V-36" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-33" value="Actor" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-33" value="Actor" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1">
|
||||||
<mxGeometry x="35" y="690" width="30" height="60" as="geometry" />
|
<mxGeometry x="35" y="690" width="30" height="60" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-39" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-36" target="9zziB1Dtd-V9IfowJO3V-38">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-39" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-36" target="9zziB1Dtd-V9IfowJO3V-38" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-36" value="Open Site" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-36" value="Open Site" style="whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||||
<mxGeometry x="105" y="705" width="120" height="30" as="geometry" />
|
<mxGeometry x="105" y="705" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-42" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-41">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-42" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-41" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-43" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-42">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-43" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-42" vertex="1" connectable="0">
|
||||||
<mxGeometry x="0.2533" y="2" relative="1" as="geometry">
|
<mxGeometry x="0.2533" y="2" relative="1" as="geometry">
|
||||||
<mxPoint x="2" as="offset" />
|
<mxPoint x="2" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-48" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-47">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-48" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-47" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-72" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-48">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-72" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-48" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.2273" relative="1" as="geometry">
|
<mxGeometry x="-0.2273" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-71">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-73" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-71" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="265" y="740" />
|
<mxPoint x="265" y="740" />
|
||||||
@ -109,12 +46,12 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-74" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-73">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-74" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-73" vertex="1" connectable="0">
|
||||||
<mxGeometry x="0.0411" y="1" relative="1" as="geometry">
|
<mxGeometry x="0.0411" y="1" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-81">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-81" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="305" y="890" />
|
<mxPoint x="305" y="890" />
|
||||||
@ -123,80 +60,80 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-83" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-82">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-83" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-82" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.8649" y="-1" relative="1" as="geometry">
|
<mxGeometry x="-0.8649" y="-1" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-91">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-92" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-38" target="9zziB1Dtd-V9IfowJO3V-91" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-93" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-92">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-93" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-92" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.6335" y="-2" relative="1" as="geometry">
|
<mxGeometry x="-0.6335" y="-2" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-38" value="<br>Logged<br>In" style="rhombus;whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#666666;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-38" value="<br>Logged<br>In" style="rhombus;whiteSpace=wrap;html=1;verticalAlign=top;" parent="1" vertex="1">
|
||||||
<mxGeometry x="265" y="680" width="80" height="80" as="geometry" />
|
<mxGeometry x="265" y="680" width="80" height="80" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-46" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-41" target="9zziB1Dtd-V9IfowJO3V-45">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-46" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-41" target="9zziB1Dtd-V9IfowJO3V-45" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-41" value="Login/Signup Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-41" value="Login/Signup Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#a20025;strokeColor=#6F0000;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="245" y="620" width="120" height="30" as="geometry" />
|
<mxGeometry x="245" y="620" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-45" target="9zziB1Dtd-V9IfowJO3V-47">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-45" target="9zziB1Dtd-V9IfowJO3V-47" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-50" value="Click Activation<br>Email Link" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-49">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-50" value="Click Activation<br>Email Link" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-49" vertex="1" connectable="0">
|
||||||
<mxGeometry x="0.1683" y="1" relative="1" as="geometry">
|
<mxGeometry x="0.1683" y="1" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-45" value="Send Confirmation Email" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-45" value="Send Confirmation Email" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#a20025;strokeColor=#6F0000;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="235" y="560" width="140" height="30" as="geometry" />
|
<mxGeometry x="235" y="560" width="140" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-52" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-47" target="9zziB1Dtd-V9IfowJO3V-51">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-52" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-47" target="9zziB1Dtd-V9IfowJO3V-51" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<mxPoint x="540" y="716.31" as="sourcePoint" />
|
<mxPoint x="540" y="716.31" as="sourcePoint" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-47" value="Gallery Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-47" value="Gallery Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="440" y="705" width="120" height="30" as="geometry" />
|
<mxGeometry x="440" y="705" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-54" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-51" target="9zziB1Dtd-V9IfowJO3V-53">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-54" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-51" target="9zziB1Dtd-V9IfowJO3V-53" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-51" value="Search By Title &amp;<br>Filter By Tag" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-51" value="Search By Title &amp;<br>Filter By Tag" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="642" y="698.02" width="120" height="45" as="geometry" />
|
<mxGeometry x="642" y="698.02" width="120" height="45" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-55" value="Refine Search" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-53" target="9zziB1Dtd-V9IfowJO3V-51">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-55" value="Refine Search" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-53" target="9zziB1Dtd-V9IfowJO3V-51" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-57" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-53" target="9zziB1Dtd-V9IfowJO3V-56">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-57" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-53" target="9zziB1Dtd-V9IfowJO3V-56" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-53" value="Browse Galleries" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-53" value="Browse Galleries" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="802" y="704.27" width="120" height="32.5" as="geometry" />
|
<mxGeometry x="802" y="704.27" width="120" height="32.5" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-59" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-56" target="9zziB1Dtd-V9IfowJO3V-58">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-59" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-56" target="9zziB1Dtd-V9IfowJO3V-58" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-56" value="Open Gallery" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-56" value="Open Gallery" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="802" y="780.52" width="120" height="32.5" as="geometry" />
|
<mxGeometry x="802" y="780.52" width="120" height="32.5" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-61" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-60">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-61" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-60" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-63" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-62">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-63" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-62" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-65" value="Directional<br>Buttons" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-63">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-65" value="Directional<br>Buttons" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-63" vertex="1" connectable="0">
|
||||||
<mxGeometry x="0.1714" relative="1" as="geometry">
|
<mxGeometry x="0.1714" relative="1" as="geometry">
|
||||||
<mxPoint as="offset" />
|
<mxPoint as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-69" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-68">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-69" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-58" target="9zziB1Dtd-V9IfowJO3V-68" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="742" y="850.52" />
|
<mxPoint x="742" y="850.52" />
|
||||||
@ -205,13 +142,13 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-58" value="Enlarge Image &amp;&nbsp;<br>Pan/Zoom" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-58" value="Enlarge Image &amp;&nbsp;<br>Pan/Zoom" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="802" y="840.52" width="120" height="40" as="geometry" />
|
<mxGeometry x="802" y="840.52" width="120" height="40" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-60" value="Download Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-60" value="Download Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="802" y="900.52" width="120" height="30" as="geometry" />
|
<mxGeometry x="802" y="900.52" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-62" target="9zziB1Dtd-V9IfowJO3V-58">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-62" target="9zziB1Dtd-V9IfowJO3V-58" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="672" y="960.52" />
|
<mxPoint x="672" y="960.52" />
|
||||||
@ -220,10 +157,10 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-62" value="Next/Previous<br>Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-62" value="Next/Previous<br>Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="612" y="890.52" width="120" height="40" as="geometry" />
|
<mxGeometry x="612" y="890.52" width="120" height="40" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-70" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-68" target="9zziB1Dtd-V9IfowJO3V-56">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-70" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-68" target="9zziB1Dtd-V9IfowJO3V-56" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<mxPoint x="762" y="797.39" as="sourcePoint" />
|
<mxPoint x="762" y="797.39" as="sourcePoint" />
|
||||||
<mxPoint x="792" y="796.14" as="targetPoint" />
|
<mxPoint x="792" y="796.14" as="targetPoint" />
|
||||||
@ -232,49 +169,49 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-68" value="Close Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-68" value="Close Image" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="642" y="787.52" width="120" height="30" as="geometry" />
|
<mxGeometry x="642" y="787.52" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-76" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-71" target="9zziB1Dtd-V9IfowJO3V-75">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-76" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-71" target="9zziB1Dtd-V9IfowJO3V-75" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-78" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-71" target="9zziB1Dtd-V9IfowJO3V-77">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-78" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-71" target="9zziB1Dtd-V9IfowJO3V-77" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-71" value="Livestream Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#e1d5e7;strokeColor=#9673a6;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-71" value="Livestream Page" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#d80073;strokeColor=#A50040;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="125" y="780" width="120" height="30" as="geometry" />
|
<mxGeometry x="125" y="780" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-75" value="Watch Stream" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#e1d5e7;strokeColor=#9673a6;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-75" value="Watch Stream" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#d80073;strokeColor=#A50040;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="125" y="840" width="120" height="30" as="geometry" />
|
<mxGeometry x="125" y="840" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-77" value="Chat" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#e1d5e7;strokeColor=#9673a6;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-77" value="Chat" style="whiteSpace=wrap;html=1;verticalAlign=top;fillColor=#d80073;strokeColor=#A50040;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="12.5" y="780" width="75" height="30" as="geometry" />
|
<mxGeometry x="12.5" y="780" width="75" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-85" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-81" target="9zziB1Dtd-V9IfowJO3V-84">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-85" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" source="9zziB1Dtd-V9IfowJO3V-81" target="9zziB1Dtd-V9IfowJO3V-84" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-87" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-81" target="9zziB1Dtd-V9IfowJO3V-86">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-87" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" source="9zziB1Dtd-V9IfowJO3V-81" target="9zziB1Dtd-V9IfowJO3V-86" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-81" value="Subscriptions Page" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-81" value="Subscriptions Page" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;strokeColor=#3700CC;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="32.5" y="940" width="120" height="30" as="geometry" />
|
<mxGeometry x="32.5" y="940" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-84" value="View Current Tier" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-84" value="View Current Tier" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;strokeColor=#3700CC;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="32.5" y="990" width="120" height="30" as="geometry" />
|
<mxGeometry x="32.5" y="990" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-86" target="9zziB1Dtd-V9IfowJO3V-88">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-89" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" source="9zziB1Dtd-V9IfowJO3V-86" target="9zziB1Dtd-V9IfowJO3V-88" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-86" value="View Available Tiers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-86" value="View Available Tiers" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;strokeColor=#3700CC;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="187.5" y="940" width="120" height="30" as="geometry" />
|
<mxGeometry x="187.5" y="940" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-90" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-88" target="9zziB1Dtd-V9IfowJO3V-84">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-90" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" source="9zziB1Dtd-V9IfowJO3V-88" target="9zziB1Dtd-V9IfowJO3V-84" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-88" value="Upgrade Tier" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-88" value="Upgrade Tier" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#6a00ff;strokeColor=#3700CC;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="187.5" y="990" width="120" height="30" as="geometry" />
|
<mxGeometry x="187.5" y="990" width="120" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-95" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-91" target="9zziB1Dtd-V9IfowJO3V-94">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-95" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-91" target="9zziB1Dtd-V9IfowJO3V-94" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="410" y="810" />
|
<mxPoint x="410" y="810" />
|
||||||
@ -282,100 +219,282 @@
|
|||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-100" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-91" target="9zziB1Dtd-V9IfowJO3V-99">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-100" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-91" target="9zziB1Dtd-V9IfowJO3V-99" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-91" value="Commissions Page" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-91" value="Commissions Page" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="350" y="770" width="120" height="27.48" as="geometry" />
|
<mxGeometry x="350" y="770" width="120" height="27.48" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-97" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-94" target="9zziB1Dtd-V9IfowJO3V-96">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-97" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="9zziB1Dtd-V9IfowJO3V-94" target="9zziB1Dtd-V9IfowJO3V-96" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-98" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-97">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-98" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-97" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.6109" relative="1" as="geometry">
|
<mxGeometry x="-0.6109" relative="1" as="geometry">
|
||||||
<mxPoint x="20" y="2" as="offset" />
|
<mxPoint x="20" y="2" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-105" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-94" target="9zziB1Dtd-V9IfowJO3V-110">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-105" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-94" target="9zziB1Dtd-V9IfowJO3V-110" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-106" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-105">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-106" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-105" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.1779" y="-2" relative="1" as="geometry">
|
<mxGeometry x="-0.1779" y="-2" relative="1" as="geometry">
|
||||||
<mxPoint y="-2" as="offset" />
|
<mxPoint y="-2" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-94" value="Has Existing<br>Commission" style="rhombus;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-94" value="Has Existing<br>Commission" style="rhombus;whiteSpace=wrap;html=1;rounded=0;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="310" y="830.52" width="100" height="100" as="geometry" />
|
<mxGeometry x="310" y="830.52" width="100" height="100" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-101" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-96" target="9zziB1Dtd-V9IfowJO3V-99">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-101" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-96" target="9zziB1Dtd-V9IfowJO3V-99" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-96" value="View Existing<br>Commission Status" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-96" value="View Existing<br>Commission Status" style="whiteSpace=wrap;html=1;rounded=0;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="350" y="970" width="120" height="60" as="geometry" />
|
<mxGeometry x="350" y="970" width="120" height="60" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-99" value="View All Commissions" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-99" value="View All Commissions" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="500" y="770" width="130" height="27.48" as="geometry" />
|
<mxGeometry x="500" y="770" width="130" height="27.48" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-109" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-104" target="9zziB1Dtd-V9IfowJO3V-96">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-109" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-104" target="9zziB1Dtd-V9IfowJO3V-96" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="560" y="985" />
|
<mxPoint x="560" y="985" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-104" value="Request New<br>Commission" style="whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;rounded=0;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-104" value="Request New<br>Commission" style="whiteSpace=wrap;html=1;fillColor=#60a917;strokeColor=#2D7600;rounded=0;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="470" y="817.52" width="120" height="39.48" as="geometry" />
|
<mxGeometry x="470" y="817.52" width="120" height="39.48" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-111" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-110" target="9zziB1Dtd-V9IfowJO3V-96">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-111" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-110" target="9zziB1Dtd-V9IfowJO3V-96" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<Array as="points">
|
<Array as="points">
|
||||||
<mxPoint x="440" y="930" />
|
<mxPoint x="440" y="930" />
|
||||||
</Array>
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-112" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-111">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-112" value="No" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-111" vertex="1" connectable="0">
|
||||||
<mxGeometry x="0.0044" relative="1" as="geometry">
|
<mxGeometry x="0.0044" relative="1" as="geometry">
|
||||||
<mxPoint y="5" as="offset" />
|
<mxPoint y="5" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-113" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-110" target="9zziB1Dtd-V9IfowJO3V-104">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-113" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" parent="1" source="9zziB1Dtd-V9IfowJO3V-110" target="9zziB1Dtd-V9IfowJO3V-104" edge="1">
|
||||||
<mxGeometry relative="1" as="geometry" />
|
<mxGeometry relative="1" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-114" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="9zziB1Dtd-V9IfowJO3V-113">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-114" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="9zziB1Dtd-V9IfowJO3V-113" vertex="1" connectable="0">
|
||||||
<mxGeometry x="-0.5043" y="1" relative="1" as="geometry">
|
<mxGeometry x="-0.5043" y="1" relative="1" as="geometry">
|
||||||
<mxPoint x="3" y="-1" as="offset" />
|
<mxPoint x="3" y="-1" as="offset" />
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-110" value="Requests<br>Open" style="rhombus;whiteSpace=wrap;html=1;rounded=0;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1">
|
<mxCell id="9zziB1Dtd-V9IfowJO3V-110" value="Requests<br>Open" style="rhombus;whiteSpace=wrap;html=1;rounded=0;fillColor=#60a917;strokeColor=#2D7600;fontColor=#ffffff;" parent="1" vertex="1">
|
||||||
<mxGeometry x="440" y="860.52" width="79.48" height="79.48" as="geometry" />
|
<mxGeometry x="440" y="860.52" width="79.48" height="79.48" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-115" value="galleries Supabase Bucket" style="swimlane;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-5" value="public.tags" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
<mxGeometry x="519.48" y="180" width="291" height="230" as="geometry" />
|
<mxGeometry x="207.5" y="440" width="140" height="60" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-116" value="image" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-115">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-6" value="name" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-5">
|
||||||
<mxGeometry x="160.52" y="40" width="40" height="50" as="geometry" />
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-117" value="public.galleries.name" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.folder;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-115">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-9" value="public.admins" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
<mxGeometry x="40.519999999999996" y="60" width="78" height="71" as="geometry" />
|
<mxGeometry x="243" y="60" width="175" height="120" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-120" value="image" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-115">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-10" value="PK FK Unique uuid user_id" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-9">
|
||||||
<mxGeometry x="220.51999999999998" y="40" width="40" height="50" as="geometry" />
|
<mxGeometry y="30" width="175" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-121" value="image" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-115">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-11" value="assigned_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-9">
|
||||||
<mxGeometry x="160.51999999999998" y="100" width="40" height="50" as="geometry" />
|
<mxGeometry y="60" width="175" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-122" value="image" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-115">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-12" value="assigner_id:uuid?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-9">
|
||||||
<mxGeometry x="220.51999999999998" y="100" width="40" height="50" as="geometry" />
|
<mxGeometry y="90" width="175" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-123" value="image" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-115">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-17" value="auth.users" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;" vertex="1" parent="1">
|
||||||
<mxGeometry x="220.51999999999998" y="160" width="40" height="50" as="geometry" />
|
<mxGeometry x="10" y="120" width="140" height="60" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-124" value="image" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;" vertex="1" parent="9zziB1Dtd-V9IfowJO3V-115">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-18" value="id" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-17">
|
||||||
<mxGeometry x="160.51999999999998" y="160" width="40" height="50" as="geometry" />
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
</mxCell>
|
</mxCell>
|
||||||
<mxCell id="9zziB1Dtd-V9IfowJO3V-118" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="9zziB1Dtd-V9IfowJO3V-3" target="9zziB1Dtd-V9IfowJO3V-117">
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-10">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-14">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-23" value="public.tier" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#a20025;fontColor=#ffffff;strokeColor=#6F0000;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="32.5" y="290" width="140" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-24" value="PK name:text" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-23">
|
||||||
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-25" value="price:decimal" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-23">
|
||||||
|
<mxGeometry y="60" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-26" value="stripe_product_id:string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-23">
|
||||||
|
<mxGeometry y="90" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#a20025;strokeColor=#6F0000;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-24" target="1AZqCnQGpeGdDfHHl4o8-15">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-34" value="public.galleries" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="497.5" y="320" width="140" height="180" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-35" value="PK string name" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-37" value="FK tier string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="60" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-38" value="string thumbnail_file" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="90" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-41" value="bool nsfw" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="120" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-39" value="text[] tags" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-34">
|
||||||
|
<mxGeometry y="150" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#a20025;strokeColor=#6F0000;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-24" target="1AZqCnQGpeGdDfHHl4o8-37">
|
||||||
<mxGeometry relative="1" as="geometry">
|
<mxGeometry relative="1" as="geometry">
|
||||||
<mxPoint x="620" y="320" as="targetPoint" />
|
<Array as="points">
|
||||||
|
<mxPoint x="207.5" y="335" />
|
||||||
|
<mxPoint x="207.5" y="395" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-43" value="public.skibs" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="499.5" width="140" height="300" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-44" value="PK AI id:&nbsp;int8" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="30" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-46" value="amount:decimal" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="60" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-49" value="user_id:uuid" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="90" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-50" value="request_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="120" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-51" value="accepted:bool?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="150" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-58" value="processed_date:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="180" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-52" value="payment_url:string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="210" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-57" value="paidDate:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="240" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-59" value="completedDate:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-43">
|
||||||
|
<mxGeometry y="270" width="140" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-48" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;startArrow=classic;startFill=1;fillColor=#1ba1e2;strokeColor=#006EAF;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-6" target="1AZqCnQGpeGdDfHHl4o8-39">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-56" value="No FK Relationship" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontColor=#FFFFFF;labelBackgroundColor=none;" vertex="1" connectable="0" parent="1AZqCnQGpeGdDfHHl4o8-48">
|
||||||
|
<mxGeometry x="-0.0082" y="2" relative="1" as="geometry">
|
||||||
|
<mxPoint as="offset" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-13" value="public.user_subscriptions" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="243" y="203" width="175" height="180" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-14" value="PK FK Unique user_id:uuid" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="30" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-15" value="FK tier:text" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="60" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-54" value="active:bool" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="90" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-53" value="last_paid_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="120" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-47" value="start_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-13">
|
||||||
|
<mxGeometry y="150" width="175" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-49">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="197.5" y="165" />
|
||||||
|
<mxPoint x="197.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="105" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-60" value="public.commissions" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="697.5" y="30" width="170" height="330" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-61" value="PK AI id:&nbsp;int8" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="30" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-62" value="amount:decimal" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="60" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-63" value="user_id:uuid" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="90" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-64" value="request_date:date" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="120" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-65" value="accepted:bool?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="150" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-66" value="processed_date:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="180" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-67" value="hours:number" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="210" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-70" value="pending_approval:bool false" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="240" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-68" value="paidDate:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="270" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-69" value="completedDate:date?" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-60">
|
||||||
|
<mxGeometry y="300" width="170" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-71" value="public.comission_messages" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;fillColor=#1ba1e2;fontColor=#ffffff;strokeColor=#006EAF;" vertex="1" parent="1">
|
||||||
|
<mxGeometry x="957.5" y="180" width="210" height="120" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-72" value="PK AI id:int8" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-71">
|
||||||
|
<mxGeometry y="30" width="210" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-73" value="FK comission_id:int8" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-71">
|
||||||
|
<mxGeometry y="60" width="210" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-74" value="FK sender_id:uuid" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="1AZqCnQGpeGdDfHHl4o8-71">
|
||||||
|
<mxGeometry y="90" width="210" height="30" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-63">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="197.5" y="165" />
|
||||||
|
<mxPoint x="197.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="-30" />
|
||||||
|
<mxPoint x="667.5" y="-30" />
|
||||||
|
<mxPoint x="667.5" y="135" />
|
||||||
|
</Array>
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-80" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#1ba1e2;strokeColor=#006EAF;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-61" target="1AZqCnQGpeGdDfHHl4o8-73">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="1AZqCnQGpeGdDfHHl4o8-81" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fillColor=#0050ef;strokeColor=#001DBC;" edge="1" parent="1" source="1AZqCnQGpeGdDfHHl4o8-18" target="1AZqCnQGpeGdDfHHl4o8-74">
|
||||||
|
<mxGeometry relative="1" as="geometry">
|
||||||
|
<Array as="points">
|
||||||
|
<mxPoint x="197.5" y="165" />
|
||||||
|
<mxPoint x="197.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="30" />
|
||||||
|
<mxPoint x="447.5" y="-30" />
|
||||||
|
<mxPoint x="667.5" y="-30" />
|
||||||
|
<mxPoint x="667.5" y="400" />
|
||||||
|
<mxPoint x="897.5" y="400" />
|
||||||
|
<mxPoint x="897.5" y="285" />
|
||||||
|
</Array>
|
||||||
</mxGeometry>
|
</mxGeometry>
|
||||||
</mxCell>
|
</mxCell>
|
||||||
</root>
|
</root>
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
CREATE TYPE tier AS ENUM ('Free', 'Tier 1', 'Tier 2', 'Tier 3');
|
|
||||||
|
|
||||||
CREATE TABLE tags (
|
|
||||||
name text primary key,
|
|
||||||
gallery_name text
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE user_subscriptions (
|
|
||||||
user_id uuid primary key references auth.users(id),
|
|
||||||
tier tier
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE galleries (
|
|
||||||
name text primary key,
|
|
||||||
column_number int8,
|
|
||||||
tier tier,
|
|
||||||
nsfw boolean,
|
|
||||||
tags text[]
|
|
||||||
);
|
|
||||||
|
|
||||||
ALTER TABLE tags ADD FOREIGN KEY (gallery_name) REFERENCES galleries(name);
|
|
237
supabase/migrations/20240608231854_init.sql
Normal file
237
supabase/migrations/20240608231854_init.sql
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
|
||||||
|
SET statement_timeout = 0;
|
||||||
|
SET lock_timeout = 0;
|
||||||
|
SET idle_in_transaction_session_timeout = 0;
|
||||||
|
SET client_encoding = 'UTF8';
|
||||||
|
SET standard_conforming_strings = on;
|
||||||
|
SELECT pg_catalog.set_config('search_path', '', false);
|
||||||
|
SET check_function_bodies = false;
|
||||||
|
SET xmloption = content;
|
||||||
|
SET client_min_messages = warning;
|
||||||
|
SET row_security = off;
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "pg_net" WITH SCHEMA "extensions";
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "pgsodium" WITH SCHEMA "pgsodium";
|
||||||
|
|
||||||
|
COMMENT ON SCHEMA "public" IS 'standard public schema';
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "pg_graphql" WITH SCHEMA "graphql";
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "pg_stat_statements" WITH SCHEMA "extensions";
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "pgcrypto" WITH SCHEMA "extensions";
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "pgjwt" WITH SCHEMA "extensions";
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "supabase_vault" WITH SCHEMA "vault";
|
||||||
|
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA "extensions";
|
||||||
|
|
||||||
|
CREATE TYPE "public"."interface_config_option" AS ENUM (
|
||||||
|
'color',
|
||||||
|
'image'
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TYPE "public"."interface_config_option" OWNER TO "postgres";
|
||||||
|
|
||||||
|
CREATE TYPE "public"."tier" AS ENUM (
|
||||||
|
'Free',
|
||||||
|
'Tier 1',
|
||||||
|
'Tier 2',
|
||||||
|
'Tier 3'
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TYPE "public"."tier" OWNER TO "postgres";
|
||||||
|
|
||||||
|
SET default_tablespace = '';
|
||||||
|
|
||||||
|
SET default_table_access_method = "heap";
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "public"."admins" (
|
||||||
|
"user_id" "uuid" NOT NULL,
|
||||||
|
"created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
|
||||||
|
"assigner" "uuid"
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE "public"."admins" OWNER TO "postgres";
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "public"."galleries" (
|
||||||
|
"name" "text" NOT NULL,
|
||||||
|
"column_number" bigint,
|
||||||
|
"tier" "text" DEFAULT 'Free'::"text",
|
||||||
|
"nsfw" boolean,
|
||||||
|
"tags" "text"[],
|
||||||
|
"thumbnail_file" "text" DEFAULT ''::"text"
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE "public"."galleries" OWNER TO "postgres";
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "public"."interface_configurations" (
|
||||||
|
"name" "text" NOT NULL,
|
||||||
|
"value" "text" NOT NULL,
|
||||||
|
"type" "public"."interface_config_option" DEFAULT 'color'::"public"."interface_config_option" NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE "public"."interface_configurations" OWNER TO "postgres";
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "public"."tags" (
|
||||||
|
"name" "text" NOT NULL,
|
||||||
|
"gallery_name" "text"
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE "public"."tags" OWNER TO "postgres";
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "public"."tiers" (
|
||||||
|
"name" "text" NOT NULL,
|
||||||
|
"price" double precision NOT NULL,
|
||||||
|
"color" "text" NOT NULL,
|
||||||
|
"description" "text" NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE "public"."tiers" OWNER TO "postgres";
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "public"."user_subscriptions" (
|
||||||
|
"user_id" "uuid" NOT NULL,
|
||||||
|
"tier" "public"."tier"
|
||||||
|
);
|
||||||
|
|
||||||
|
ALTER TABLE "public"."user_subscriptions" OWNER TO "postgres";
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."admins"
|
||||||
|
ADD CONSTRAINT "admins_pkey" PRIMARY KEY ("user_id");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."galleries"
|
||||||
|
ADD CONSTRAINT "galleries_pkey" PRIMARY KEY ("name");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."interface_configurations"
|
||||||
|
ADD CONSTRAINT "interface_configurations_pkey" PRIMARY KEY ("name");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."tags"
|
||||||
|
ADD CONSTRAINT "tags_pkey" PRIMARY KEY ("name");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."tiers"
|
||||||
|
ADD CONSTRAINT "tiers_pkey" PRIMARY KEY ("name");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."user_subscriptions"
|
||||||
|
ADD CONSTRAINT "user_subscriptions_pkey" PRIMARY KEY ("user_id");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."admins"
|
||||||
|
ADD CONSTRAINT "admins_assigner_fkey" FOREIGN KEY ("assigner") REFERENCES "auth"."users"("id");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."admins"
|
||||||
|
ADD CONSTRAINT "admins_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."tags"
|
||||||
|
ADD CONSTRAINT "tags_gallery_name_fkey" FOREIGN KEY ("gallery_name") REFERENCES "public"."galleries"("name");
|
||||||
|
|
||||||
|
ALTER TABLE ONLY "public"."user_subscriptions"
|
||||||
|
ADD CONSTRAINT "user_subscriptions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id");
|
||||||
|
|
||||||
|
CREATE POLICY "Enable delete for admins" ON "public"."tags" FOR DELETE TO "authenticated" USING ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
CREATE POLICY "Enable delete for users based on admins" ON "public"."galleries" FOR DELETE TO "authenticated" USING ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
CREATE POLICY "Enable insert for admins" ON "public"."tags" FOR INSERT TO "authenticated" WITH CHECK ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
CREATE POLICY "Enable insert for users based admins" ON "public"."galleries" FOR INSERT WITH CHECK ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
CREATE POLICY "Enable read access for all users" ON "public"."admins" FOR SELECT USING (true);
|
||||||
|
|
||||||
|
CREATE POLICY "Enable read access for all users" ON "public"."galleries" FOR SELECT USING (true);
|
||||||
|
|
||||||
|
CREATE POLICY "Enable read access for all users" ON "public"."interface_configurations" FOR SELECT USING (true);
|
||||||
|
|
||||||
|
CREATE POLICY "Enable read access for all users" ON "public"."tags" FOR SELECT USING (true);
|
||||||
|
|
||||||
|
CREATE POLICY "Enable read access for all users" ON "public"."tiers" FOR SELECT USING (true);
|
||||||
|
|
||||||
|
CREATE POLICY "Enable read for users based on user_id" ON "public"."user_subscriptions" FOR SELECT USING (true);
|
||||||
|
|
||||||
|
CREATE POLICY "admin insert" ON "public"."tiers" FOR INSERT WITH CHECK ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
CREATE POLICY "admin update" ON "public"."tiers" FOR UPDATE USING ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
ALTER TABLE "public"."admins" ENABLE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
CREATE POLICY "delete for admin" ON "public"."tiers" FOR DELETE USING ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
ALTER TABLE "public"."galleries" ENABLE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
ALTER TABLE "public"."interface_configurations" ENABLE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
ALTER TABLE "public"."tags" ENABLE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
ALTER TABLE "public"."tiers" ENABLE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
CREATE POLICY "update for admin" ON "public"."galleries" FOR UPDATE USING ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
CREATE POLICY "update theme admin" ON "public"."interface_configurations" FOR UPDATE USING ((EXISTS ( SELECT 1
|
||||||
|
FROM "public"."admins"
|
||||||
|
WHERE ("admins"."user_id" = "auth"."uid"()))));
|
||||||
|
|
||||||
|
ALTER TABLE "public"."user_subscriptions" ENABLE ROW LEVEL SECURITY;
|
||||||
|
|
||||||
|
ALTER PUBLICATION "supabase_realtime" OWNER TO "postgres";
|
||||||
|
|
||||||
|
GRANT USAGE ON SCHEMA "public" TO "postgres";
|
||||||
|
GRANT USAGE ON SCHEMA "public" TO "anon";
|
||||||
|
GRANT USAGE ON SCHEMA "public" TO "authenticated";
|
||||||
|
GRANT USAGE ON SCHEMA "public" TO "service_role";
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."admins" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."admins" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."admins" TO "service_role";
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."galleries" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."galleries" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."galleries" TO "service_role";
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."interface_configurations" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."interface_configurations" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."interface_configurations" TO "service_role";
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."tags" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."tags" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."tags" TO "service_role";
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."tiers" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."tiers" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."tiers" TO "service_role";
|
||||||
|
|
||||||
|
GRANT ALL ON TABLE "public"."user_subscriptions" TO "anon";
|
||||||
|
GRANT ALL ON TABLE "public"."user_subscriptions" TO "authenticated";
|
||||||
|
GRANT ALL ON TABLE "public"."user_subscriptions" TO "service_role";
|
||||||
|
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "postgres";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "anon";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "authenticated";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "service_role";
|
||||||
|
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "postgres";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "anon";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "authenticated";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "service_role";
|
||||||
|
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "postgres";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "anon";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "authenticated";
|
||||||
|
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "service_role";
|
||||||
|
|
||||||
|
RESET ALL;
|
@ -43,7 +43,106 @@ INSERT INTO "auth"."audit_log_entries" ("instance_id", "id", "payload", "created
|
|||||||
('00000000-0000-0000-0000-000000000000', 'e878d51d-2524-4796-9288-88bcf8d1982b', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-27 21:11:27.314657+00', ''),
|
('00000000-0000-0000-0000-000000000000', 'e878d51d-2524-4796-9288-88bcf8d1982b', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-27 21:11:27.314657+00', ''),
|
||||||
('00000000-0000-0000-0000-000000000000', '0d3f4871-8215-4ae7-920b-c261ba7eaf11', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-27 21:11:27.315598+00', ''),
|
('00000000-0000-0000-0000-000000000000', '0d3f4871-8215-4ae7-920b-c261ba7eaf11', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-27 21:11:27.315598+00', ''),
|
||||||
('00000000-0000-0000-0000-000000000000', 'f70081c9-673b-4e8e-84c6-574d4a6fc095', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-28 00:06:54.425581+00', ''),
|
('00000000-0000-0000-0000-000000000000', 'f70081c9-673b-4e8e-84c6-574d4a6fc095', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-28 00:06:54.425581+00', ''),
|
||||||
('00000000-0000-0000-0000-000000000000', 'ff4e9892-902a-4e6f-9493-976acd87e5ad', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-28 00:06:54.426626+00', '');
|
('00000000-0000-0000-0000-000000000000', 'ff4e9892-902a-4e6f-9493-976acd87e5ad', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-28 00:06:54.426626+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '13891f74-fb79-45bd-a202-3c3846723eb3', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-28 01:11:09.34946+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '6125acd2-6bd2-4ae1-8b41-4b54b8097a64', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-05-28 01:11:09.350568+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '904b1ae0-83cb-4bce-a1b9-65f4215e0095', '{"action":"logout","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account"}', '2024-05-28 01:45:53.937368+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '16bba433-9af2-4328-b0d2-d59a9d072edb', '{"action":"user_signedup","actor_id":"e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd","actor_username":"damienostler1@gmail.com","actor_via_sso":false,"log_type":"team","traits":{"provider":"email"}}', '2024-05-28 02:01:35.369669+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'a80de210-524f-41a2-b437-a0a68a5b0dc5', '{"action":"login","actor_id":"e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd","actor_username":"damienostler1@gmail.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-05-28 02:01:35.372417+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '56e9bcfc-28ea-4fbf-aae2-a6c611da2536', '{"action":"token_refreshed","actor_id":"e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd","actor_username":"damienostler1@gmail.com","actor_via_sso":false,"log_type":"token"}', '2024-05-28 03:03:11.47339+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'f661df3e-4600-4254-a606-dab87b0bf241', '{"action":"token_revoked","actor_id":"e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd","actor_username":"damienostler1@gmail.com","actor_via_sso":false,"log_type":"token"}', '2024-05-28 03:03:11.474173+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'eccb045f-3fa3-4cc4-92b5-2181ae4c684e', '{"action":"token_refreshed","actor_id":"e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd","actor_username":"damienostler1@gmail.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 01:54:12.341648+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'bdca3f89-401a-40b5-b1bd-7b053f72f15a', '{"action":"token_revoked","actor_id":"e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd","actor_username":"damienostler1@gmail.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 01:54:12.342909+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'a76ea115-0732-45e4-a05f-cbf9aec04dab', '{"action":"logout","actor_id":"e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd","actor_username":"damienostler1@gmail.com","actor_via_sso":false,"log_type":"account"}', '2024-06-01 01:54:44.965028+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '73e58d43-80dc-4c40-93b8-66debb2d79f2', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-01 01:54:50.928035+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'a7b0b5b0-42d0-4970-a799-f918e320a460', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 02:52:51.499031+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'dd70c686-fc1b-42da-8aa1-91a6d7fbcc14', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 02:52:51.50256+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '09161c6c-3f38-4405-b26e-67fe90bc0005', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 03:51:46.507091+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '7fd17052-1b4a-4178-98b8-3b16b9de930a', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 03:51:46.5081+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '727021f7-1385-43eb-9139-5c8d0984fb07', '{"action":"logout","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account"}', '2024-06-01 04:28:20.313782+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '7df2cdbc-1c84-4847-8142-90477524ee7a', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-01 04:32:18.045015+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'abb0a2d8-d525-4612-a364-9ba3ea22eabf', '{"action":"logout","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account"}', '2024-06-01 04:32:21.789565+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '21e30d5b-7f03-459f-814d-43757cf3f8bf', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-01 04:33:07.034577+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '1d8fca22-6ef6-42eb-a1e9-659e702e0568', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 05:31:30.614051+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '3a9c811c-fad9-4739-9e2f-807a65f92ebc', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 05:31:30.614956+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '7620c8d4-9662-4c6b-b04f-8bcf5fc37cd2', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 07:21:44.28552+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '4cfcd7b6-8a95-4713-9409-317734ae7b38', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 07:21:44.286437+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '41cd74f2-8882-4e30-ae82-b743901cae3a', '{"action":"logout","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account"}', '2024-06-01 07:37:28.737433+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'a490a17d-b47e-4820-923d-e7c8bc88efb5', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-01 07:37:35.302764+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '3c44829d-3ec7-4698-95c3-b53597422759', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 08:36:15.774+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '5b2c215f-bfd1-4b59-a782-eaac62d1c458', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 08:36:15.775505+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '0a5a278a-9fd1-4bcc-a041-66f1302ac7e6', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 09:34:29.572756+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '89b87acd-362b-4c51-8c3a-5a5e356ed8e2', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 09:34:29.573904+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '8c413fec-a827-4ede-a533-2409f855d2e0', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 10:35:29.39825+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '786f5ba3-670c-4799-8b5d-9e2536b75ca0', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 10:35:29.399482+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'da188f51-e5c3-467c-b9c4-7e2ba8430981', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 20:10:45.655684+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'c415ee23-3497-4445-9b18-b3698dd35e16', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 20:10:45.656475+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '4c5c4c36-a506-4c80-b467-68618dbf10db', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 22:05:34.985137+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '52eb3774-6624-4987-b357-fb07ff22e368', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-01 22:05:34.986175+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '4c493923-b97a-4ca7-ad59-801212c59692', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 03:42:48.403833+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '04114bf3-53c5-447b-bb9d-0cf0e97411ce', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 03:42:48.405516+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '59785eb8-3a22-4596-b534-c76d0aaadf9b', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 04:41:14.398806+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '1da856fa-1582-447b-a033-6dfd6e91ee5b', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 04:41:14.399986+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '3790f005-05d8-439d-a828-fb8e6a22356f', '{"action":"logout","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account"}', '2024-06-02 05:20:51.896435+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '903ece4b-635c-4fd0-9a6d-c60103328e11', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-02 05:21:03.760977+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'ab8d42bd-c9df-4782-8cbd-14279592fe94', '{"action":"logout","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account"}', '2024-06-02 06:18:43.051255+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '008ae3d1-61c4-4456-8e70-8a2030acbbc4', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-02 07:19:23.344522+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'bf042910-d447-4f27-bb63-fbd6b80c266f', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 08:17:36.070061+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '55f64c6a-d6bd-4dd4-8627-3c35caa6dc7e', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 08:17:36.071183+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '578dc04e-5665-410c-8c0e-bbf40b397b18', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 09:23:17.276185+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '4ccf2be5-8ecd-48ee-9400-7fef1004dc56', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 09:23:17.277357+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '824ccdf1-4dc0-4cee-8c01-ac66cdea101f', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 10:21:37.85499+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '98aa3855-f2ff-4118-9618-041c82318963', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 10:21:37.856028+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'f1599f7e-e1c1-4861-87e5-9b8e5e9fa8f7', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 11:20:00.113655+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '84f7562d-151d-4e30-b810-70891f3a8a2b', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 11:20:00.115274+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '7451f114-d011-4552-9b21-bcf6d6df6243', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 20:49:23.877784+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '24b82857-e2fd-4732-a2e8-ac99f67fffa9', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 20:49:23.878598+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'bf2935a0-244a-449d-925c-ca7ad6bf91d6', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 21:49:06.535623+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '88b130fb-5418-49ec-9e54-7db1df9b9353', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 21:49:06.536554+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '2aafc337-642d-4f4c-b550-b1c88b0f698a', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 22:47:33.949246+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '7b7bc3c1-3751-4e00-a08c-14b5bb3cf892', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-02 22:47:33.950537+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '7b3b5a37-ed60-4b75-84ae-0caba9254581', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-03 00:10:51.713229+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'd984ff2d-6d96-43d9-9a39-703de7400fd1', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 01:10:47.663131+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'e996a172-f818-489a-84b3-8dc8b8a1068b', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 01:10:47.663668+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '0f07359e-4c78-40a7-8711-4127dc74c0fb', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 02:08:53.524332+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'b8f1d6e8-4e3f-473c-b0be-98f4540da6f3', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 02:08:53.525533+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '1043d8ee-0301-46e0-a451-2bb043fe6634', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 03:07:09.462821+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '6924eb3a-0588-46ff-94dc-b45f29a06e74', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 03:07:09.463674+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '3995cc04-3976-47bd-aafb-04fcf8a533db', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 04:05:10.557103+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'd5cb3c9b-aa2d-4ca6-9067-4c31ecbb7827', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 04:05:10.558474+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '8c7ca4b6-0b87-4704-9508-8cdfaac13c65', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 05:04:07.678559+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '7a1eb770-9f3c-4ac2-a13a-fafe80704bef', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 05:04:07.679535+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'c4c2ae8b-62eb-4dde-8023-bb4a52fd8402', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 06:02:18.158106+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'f3deb712-a27b-4652-b3dc-bb782188943c', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-03 06:02:18.159666+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'db502a30-3a84-4151-8c02-7be7eba0f8d1', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-04 00:29:24.732764+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'a24f4f60-00aa-48eb-8318-ed131fd44b2e', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-04 00:29:24.734165+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'f1d4e360-3355-4850-9f9e-64961bb1cadf', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-04 01:27:58.415574+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '45e4135f-e65c-4011-bd07-c6a5bcb33860', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-04 01:27:58.416715+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '95c4b03d-1f15-4ad9-83c1-79f079407908', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-04 02:26:28.440011+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '9b5db737-976a-459f-8f12-eed61184218d', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-04 02:26:28.441438+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '2bbe5699-d14f-4c3f-9c87-52b7f01ed087', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-05 00:52:31.052995+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'b54ff1b9-6254-43d2-a210-b5d9d2701974', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-05 00:52:31.055077+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'b0611a51-8bb8-4fab-937e-68a413e02b5e', '{"action":"logout","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account"}', '2024-06-05 01:03:30.844197+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '57f72aa6-2609-4efe-bf06-950681c975f9', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-05 01:03:39.551264+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '3e6b6d3e-c8bd-4cd6-a7ac-b55c59269df1', '{"action":"login","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"account","traits":{"provider":"email"}}', '2024-06-05 01:06:08.194567+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '59805a05-bfba-4dbe-8021-8db6d6b71a4e', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-05 02:02:22.65237+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'eaf050ba-9bdc-4771-8dcb-1534c38d68b9', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-05 02:02:22.653268+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'a326a1f9-92f7-472c-bbb7-f10c6f3c1dff', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-05 03:00:26.781265+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '473362fc-dc06-43d5-99df-065c9e671347', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-05 03:00:26.782565+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '3a82cdde-76bf-4cc4-a5e2-b818601100a1', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-07 23:35:28.284863+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'c3ecf585-5984-4b7e-8115-f57523a31e23', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-07 23:35:28.285858+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'cc3425df-b1e8-4e7b-8729-80e66eae2b27', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 00:33:56.442635+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'd991bd91-d600-457c-a887-67a3be188c83', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 00:33:56.44418+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'a8bd8737-8115-4643-b9a7-f288be170b28', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 02:07:59.069381+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '495056f7-149e-43b3-bc58-1712e3787215', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 02:07:59.070256+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '27ca0341-280d-474a-a3da-39fa4c69748e', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 03:06:06.149018+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'aa06c3b0-cd66-440a-a184-d44795552f11', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 03:06:06.15067+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '398046e7-2dc1-49e0-92ad-4823c0001271', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 04:04:06.664163+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 'eb481c2d-2f96-4efa-84cb-e715ee547913', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 04:04:06.665465+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '088f4537-0025-44e9-a499-dc85d7034ed3', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 22:08:31.582227+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '7f476998-602e-4d2e-9129-92ea021b1d50', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 22:08:31.583859+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '1c9bf13b-7ecf-4432-a83e-8dcd95eeb6c9', '{"action":"token_refreshed","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 23:06:38.987497+00', ''),
|
||||||
|
('00000000-0000-0000-0000-000000000000', '07c85a08-4a4b-4238-ac4c-047350db4b7f', '{"action":"token_revoked","actor_id":"893c7701-d5df-4415-80bd-1ec089764400","actor_username":"damienostler1@outlook.com","actor_via_sso":false,"log_type":"token"}', '2024-06-08 23:06:38.988275+00', '');
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
@ -57,8 +156,8 @@ INSERT INTO "auth"."audit_log_entries" ("instance_id", "id", "payload", "created
|
|||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "auth"."users" ("instance_id", "id", "aud", "role", "email", "encrypted_password", "email_confirmed_at", "invited_at", "confirmation_token", "confirmation_sent_at", "recovery_token", "recovery_sent_at", "email_change_token_new", "email_change", "email_change_sent_at", "last_sign_in_at", "raw_app_meta_data", "raw_user_meta_data", "is_super_admin", "created_at", "updated_at", "phone", "phone_confirmed_at", "phone_change", "phone_change_token", "phone_change_sent_at", "email_change_token_current", "email_change_confirm_status", "banned_until", "reauthentication_token", "reauthentication_sent_at", "is_sso_user", "deleted_at", "is_anonymous") VALUES
|
INSERT INTO "auth"."users" ("instance_id", "id", "aud", "role", "email", "encrypted_password", "email_confirmed_at", "invited_at", "confirmation_token", "confirmation_sent_at", "recovery_token", "recovery_sent_at", "email_change_token_new", "email_change", "email_change_sent_at", "last_sign_in_at", "raw_app_meta_data", "raw_user_meta_data", "is_super_admin", "created_at", "updated_at", "phone", "phone_confirmed_at", "phone_change", "phone_change_token", "phone_change_sent_at", "email_change_token_current", "email_change_confirm_status", "banned_until", "reauthentication_token", "reauthentication_sent_at", "is_sso_user", "deleted_at", "is_anonymous") VALUES
|
||||||
('00000000-0000-0000-0000-000000000000', 'e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd', 'authenticated', 'authenticated', 'damienostler1@gmail.com', '', NULL, '2024-05-27 15:44:27.171961+00', 'dd81fbfd6a7ad5d261d7f98fb37620afb3f954f350dacd2cac9f4b56', '2024-05-27 15:44:27.171961+00', '', NULL, '', '', NULL, NULL, '{"provider": "email", "providers": ["email"]}', '{}', NULL, '2024-05-27 15:44:27.167772+00', '2024-05-27 15:44:27.174941+00', NULL, NULL, '', '', NULL, '', 0, NULL, '', NULL, false, NULL, false),
|
('00000000-0000-0000-0000-000000000000', 'e11e6fda-d1fc-4b0a-bd61-80233fcb5cdd', 'authenticated', 'authenticated', 'damienostler1@gmail.com', '', '2024-05-28 02:01:35.370491+00', '2024-05-27 15:44:27.171961+00', '', '2024-05-27 15:44:27.171961+00', '', NULL, '', '', NULL, '2024-05-28 02:01:35.372861+00', '{"provider": "email", "providers": ["email"]}', '{}', NULL, '2024-05-27 15:44:27.167772+00', '2024-06-01 01:54:12.344577+00', NULL, NULL, '', '', NULL, '', 0, NULL, '', NULL, false, NULL, false),
|
||||||
('00000000-0000-0000-0000-000000000000', '893c7701-d5df-4415-80bd-1ec089764400', 'authenticated', 'authenticated', 'damienostler1@outlook.com', '$2a$10$ISYdoWsKL7gxfRz7c5IKDOTsmcjNpGgg9OOApYLMOvtOoNTo4HGM6', '2024-05-27 14:10:29.639017+00', NULL, '', NULL, '', NULL, '', '', NULL, '2024-05-27 17:18:49.039562+00', '{"provider": "email", "providers": ["email"]}', '{"sub": "893c7701-d5df-4415-80bd-1ec089764400", "email": "damienostler1@outlook.com", "email_verified": false, "phone_verified": false}', NULL, '2024-05-27 14:10:29.634157+00', '2024-05-28 00:06:54.428256+00', NULL, NULL, '', '', NULL, '', 0, NULL, '', NULL, false, NULL, false);
|
('00000000-0000-0000-0000-000000000000', '893c7701-d5df-4415-80bd-1ec089764400', 'authenticated', 'authenticated', 'damienostler1@outlook.com', '$2a$10$ISYdoWsKL7gxfRz7c5IKDOTsmcjNpGgg9OOApYLMOvtOoNTo4HGM6', '2024-05-27 14:10:29.639017+00', NULL, '', NULL, '', NULL, '', '', NULL, '2024-06-05 01:06:08.194961+00', '{"provider": "email", "providers": ["email"]}', '{"sub": "893c7701-d5df-4415-80bd-1ec089764400", "email": "damienostler1@outlook.com", "email_verified": false, "phone_verified": false}', NULL, '2024-05-27 14:10:29.634157+00', '2024-06-08 23:06:38.990134+00', NULL, NULL, '', '', NULL, '', 0, NULL, '', NULL, false, NULL, false);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
@ -81,7 +180,8 @@ INSERT INTO "auth"."identities" ("provider_id", "user_id", "identity_data", "pro
|
|||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "auth"."sessions" ("id", "user_id", "created_at", "updated_at", "factor_id", "aal", "not_after", "refreshed_at", "user_agent", "ip", "tag") VALUES
|
INSERT INTO "auth"."sessions" ("id", "user_id", "created_at", "updated_at", "factor_id", "aal", "not_after", "refreshed_at", "user_agent", "ip", "tag") VALUES
|
||||||
('ab123eaa-eab2-4fac-a018-82ee972401fd', '893c7701-d5df-4415-80bd-1ec089764400', '2024-05-27 17:18:49.039625+00', '2024-05-28 00:06:54.429202+00', NULL, 'aal1', NULL, '2024-05-28 00:06:54.429127', 'Next.js Middleware', '192.168.65.1', NULL);
|
('88176780-1709-4810-92de-36f909e3fafb', '893c7701-d5df-4415-80bd-1ec089764400', '2024-06-05 01:06:08.19499+00', '2024-06-05 01:06:08.19499+00', NULL, 'aal1', NULL, NULL, 'node', '192.168.65.1', NULL),
|
||||||
|
('8de4dae9-a9f9-44ad-bf2a-c42356feb0e2', '893c7701-d5df-4415-80bd-1ec089764400', '2024-06-05 01:03:39.551694+00', '2024-06-08 23:06:38.991049+00', NULL, 'aal1', NULL, '2024-06-08 23:06:38.990997', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36', '192.168.65.1', NULL);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
@ -89,7 +189,8 @@ INSERT INTO "auth"."sessions" ("id", "user_id", "created_at", "updated_at", "fac
|
|||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "auth"."mfa_amr_claims" ("session_id", "created_at", "updated_at", "authentication_method", "id") VALUES
|
INSERT INTO "auth"."mfa_amr_claims" ("session_id", "created_at", "updated_at", "authentication_method", "id") VALUES
|
||||||
('ab123eaa-eab2-4fac-a018-82ee972401fd', '2024-05-27 17:18:49.041915+00', '2024-05-27 17:18:49.041915+00', 'password', 'be546f0f-4e91-4f94-97e1-cc15c25191be');
|
('8de4dae9-a9f9-44ad-bf2a-c42356feb0e2', '2024-06-05 01:03:39.553156+00', '2024-06-05 01:03:39.553156+00', 'password', '70b28b1d-9c1c-42ed-b9b6-4629b4dc6610'),
|
||||||
|
('88176780-1709-4810-92de-36f909e3fafb', '2024-06-05 01:06:08.195749+00', '2024-06-05 01:06:08.195749+00', 'password', '2d748036-15f9-49a1-ba18-a9636803f795');
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
@ -104,17 +205,28 @@ INSERT INTO "auth"."mfa_amr_claims" ("session_id", "created_at", "updated_at", "
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Data for Name: one_time_tokens; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
|
||||||
|
--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Data for Name: refresh_tokens; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
|
-- Data for Name: refresh_tokens; Type: TABLE DATA; Schema: auth; Owner: supabase_auth_admin
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "auth"."refresh_tokens" ("instance_id", "id", "token", "user_id", "revoked", "created_at", "updated_at", "parent", "session_id") VALUES
|
INSERT INTO "auth"."refresh_tokens" ("instance_id", "id", "token", "user_id", "revoked", "created_at", "updated_at", "parent", "session_id") VALUES
|
||||||
('00000000-0000-0000-0000-000000000000', 5, 'vG2zuPl4y7OvEwgeItgotw', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-05-27 17:18:49.040453+00', '2024-05-27 18:17:16.201027+00', NULL, 'ab123eaa-eab2-4fac-a018-82ee972401fd'),
|
('00000000-0000-0000-0000-000000000000', 83, 'c6bYIcVnSBosWtn4QX8F6w', '893c7701-d5df-4415-80bd-1ec089764400', false, '2024-06-05 01:06:08.195296+00', '2024-06-05 01:06:08.195296+00', NULL, '88176780-1709-4810-92de-36f909e3fafb'),
|
||||||
('00000000-0000-0000-0000-000000000000', 6, 'd1l7CJUy3osp97yqDTyibw', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-05-27 18:17:16.201648+00', '2024-05-27 19:15:16.232194+00', 'vG2zuPl4y7OvEwgeItgotw', 'ab123eaa-eab2-4fac-a018-82ee972401fd'),
|
('00000000-0000-0000-0000-000000000000', 82, 'vgibpWzclaC1SiIWnkWFTw', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-05 01:03:39.55241+00', '2024-06-05 02:02:22.653721+00', NULL, '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
('00000000-0000-0000-0000-000000000000', 7, 'jrCD6NCqj5WFyjkiWG6BTw', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-05-27 19:15:16.232976+00', '2024-05-27 20:13:20.141029+00', 'd1l7CJUy3osp97yqDTyibw', 'ab123eaa-eab2-4fac-a018-82ee972401fd'),
|
('00000000-0000-0000-0000-000000000000', 84, 'kcsINvcmhD18guzedNei0Q', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-05 02:02:22.654159+00', '2024-06-05 03:00:26.783216+00', 'vgibpWzclaC1SiIWnkWFTw', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
('00000000-0000-0000-0000-000000000000', 8, 'zFVkt2ATfYlYT0nzRKmX0A', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-05-27 20:13:20.141361+00', '2024-05-27 21:11:27.316138+00', 'jrCD6NCqj5WFyjkiWG6BTw', 'ab123eaa-eab2-4fac-a018-82ee972401fd'),
|
('00000000-0000-0000-0000-000000000000', 85, '4eJVeDMlvmAUk20ZqwdGQA', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-05 03:00:26.784329+00', '2024-06-07 23:35:28.286039+00', 'kcsINvcmhD18guzedNei0Q', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
('00000000-0000-0000-0000-000000000000', 9, 'OWwpxx1Pg11r5r4c2ZUhaw', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-05-27 21:11:27.316818+00', '2024-05-28 00:06:54.426908+00', 'zFVkt2ATfYlYT0nzRKmX0A', 'ab123eaa-eab2-4fac-a018-82ee972401fd'),
|
('00000000-0000-0000-0000-000000000000', 86, 'Nb0zuvJjDL8keK1lF1xX9Q', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-07 23:35:28.28691+00', '2024-06-08 00:33:56.445064+00', '4eJVeDMlvmAUk20ZqwdGQA', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
('00000000-0000-0000-0000-000000000000', 10, 'a7ykvMnMcqG4qFeQK6WX5g', '893c7701-d5df-4415-80bd-1ec089764400', false, '2024-05-28 00:06:54.427389+00', '2024-05-28 00:06:54.427389+00', 'OWwpxx1Pg11r5r4c2ZUhaw', 'ab123eaa-eab2-4fac-a018-82ee972401fd');
|
('00000000-0000-0000-0000-000000000000', 119, 'y9oA8pEThLtPyEJW2IK3eA', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-08 00:33:56.446127+00', '2024-06-08 02:07:59.070607+00', 'Nb0zuvJjDL8keK1lF1xX9Q', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 120, 'TwWGx47OPQs1BNtkLs9JSA', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-08 02:07:59.07107+00', '2024-06-08 03:06:06.151386+00', 'y9oA8pEThLtPyEJW2IK3eA', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 121, 'mL_eZQCxVdYq7SR-UjEJgQ', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-08 03:06:06.154686+00', '2024-06-08 04:04:06.666124+00', 'TwWGx47OPQs1BNtkLs9JSA', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 122, 'cFLCDOB1QfKd_ydDNLRmoQ', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-08 04:04:06.667264+00', '2024-06-08 22:08:31.584256+00', 'mL_eZQCxVdYq7SR-UjEJgQ', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 123, 'G5KZsQQhC6kFqd0Xht2ypg', '893c7701-d5df-4415-80bd-1ec089764400', true, '2024-06-08 22:08:31.584969+00', '2024-06-08 23:06:38.988706+00', 'cFLCDOB1QfKd_ydDNLRmoQ', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2'),
|
||||||
|
('00000000-0000-0000-0000-000000000000', 124, '4p4Q-c4t1ZH2PUvl_mcYtQ', '893c7701-d5df-4415-80bd-1ec089764400', false, '2024-06-08 23:06:38.989251+00', '2024-06-08 23:06:38.989251+00', 'G5KZsQQhC6kFqd0Xht2ypg', '8de4dae9-a9f9-44ad-bf2a-c42356feb0e2');
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
@ -147,29 +259,63 @@ INSERT INTO "auth"."refresh_tokens" ("instance_id", "id", "token", "user_id", "r
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Data for Name: admins; Type: TABLE DATA; Schema: public; Owner: postgres
|
||||||
|
--
|
||||||
|
|
||||||
|
INSERT INTO "public"."admins" ("user_id", "created_at", "assigner") VALUES
|
||||||
|
('893c7701-d5df-4415-80bd-1ec089764400', '2024-06-02 21:12:58.507093+00', NULL);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Data for Name: galleries; Type: TABLE DATA; Schema: public; Owner: postgres
|
-- Data for Name: galleries; Type: TABLE DATA; Schema: public; Owner: postgres
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "public"."galleries" ("name", "column_number", "tier", "tags", "nsfw") VALUES
|
INSERT INTO "public"."galleries" ("name", "column_number", "tier", "nsfw", "tags", "thumbnail_file") VALUES
|
||||||
('Another Test Gallery', 3, 'Free', '{Hentai}', true),
|
('Test', 3, 'Free', false, '{twatwat}', ''),
|
||||||
('Test Gallery', 3, 'Tier 1', '{Dojin}', true),
|
('Testsdadas', 3, 'Free', false, '{}', '');
|
||||||
('More Test Gallery', 3, 'Tier 3', '{Hentai,VTuber}', true),
|
|
||||||
('Some More Testing', 3, 'Tier 2', '{Hentai,Dojin}', false),
|
|
||||||
('Even More Testing', 3, 'Free', '{VTuber}', false),
|
--
|
||||||
('Killa Testing Here', 3, 'Tier 1', '{VTuber,Dojin}', false),
|
-- Data for Name: interface_configurations; Type: TABLE DATA; Schema: public; Owner: postgres
|
||||||
('Popcorn Tester', 3, 'Free', '{Hentai}', true);
|
--
|
||||||
|
|
||||||
|
INSERT INTO "public"."interface_configurations" ("name", "value", "type") VALUES
|
||||||
|
('primary-dark', '#100120', 'color'),
|
||||||
|
('secondary-light', '#6F5D90', 'color'),
|
||||||
|
('secondary-dark', '#2F1D50', 'color'),
|
||||||
|
('primary', '#18161d', 'color'),
|
||||||
|
('secondary', '#4F3D70', 'color'),
|
||||||
|
('primary-light', '#403260', 'color'),
|
||||||
|
('error-dark', '#5C0D0D', 'color'),
|
||||||
|
('error', '#862117', 'color'),
|
||||||
|
('success-dark', '#00A986', 'color'),
|
||||||
|
('error-light', '#C44C4C', 'color'),
|
||||||
|
('success-light', '#20E9C6', 'color'),
|
||||||
|
('success', '#00C9A6', 'color'),
|
||||||
|
('warning', '#E17558', 'color'),
|
||||||
|
('warning-light', '#E39578', 'color'),
|
||||||
|
('info-light', '#424260', 'color'),
|
||||||
|
('warning-dark', '#C15538', 'color'),
|
||||||
|
('info-dark', '#020120', 'color'),
|
||||||
|
('info', '#222140', 'color');
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Data for Name: tags; Type: TABLE DATA; Schema: public; Owner: postgres
|
-- Data for Name: tags; Type: TABLE DATA; Schema: public; Owner: postgres
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "public"."tags" ("name") VALUES
|
INSERT INTO "public"."tags" ("name", "gallery_name") VALUES
|
||||||
('Hentai'),
|
('twatwat', NULL),
|
||||||
('Dojin
|
('', NULL);
|
||||||
'),
|
|
||||||
('VTuber');
|
|
||||||
|
--
|
||||||
|
-- Data for Name: tiers; Type: TABLE DATA; Schema: public; Owner: postgres
|
||||||
|
--
|
||||||
|
|
||||||
|
INSERT INTO "public"."tiers" ("name", "price", "color", "description") VALUES
|
||||||
|
('Free', 0, '#8f6eaa', 'This is a test tier.dasdasd');
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
@ -180,11 +326,54 @@ INSERT INTO "public"."user_subscriptions" ("user_id", "tier") VALUES
|
|||||||
('893c7701-d5df-4415-80bd-1ec089764400', 'Tier 2');
|
('893c7701-d5df-4415-80bd-1ec089764400', 'Tier 2');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Data for Name: buckets; Type: TABLE DATA; Schema: storage; Owner: supabase_storage_admin
|
-- Data for Name: objects; Type: TABLE DATA; Schema: storage; Owner: supabase_storage_admin
|
||||||
--
|
--
|
||||||
|
|
||||||
INSERT INTO "storage"."buckets" ("id", "name", "owner", "created_at", "updated_at", "public", "avif_autodetection", "file_size_limit", "allowed_mime_types", "owner_id") VALUES
|
|
||||||
('galleries', 'galleries', NULL, '2024-05-27 13:06:16.360824+00', '2024-05-27 13:06:16.360824+00', false, false, NULL, NULL, NULL);
|
--
|
||||||
|
-- Data for Name: s3_multipart_uploads; Type: TABLE DATA; Schema: storage; Owner: supabase_storage_admin
|
||||||
|
--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Data for Name: s3_multipart_uploads_parts; Type: TABLE DATA; Schema: storage; Owner: supabase_storage_admin
|
||||||
|
--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Data for Name: hooks; Type: TABLE DATA; Schema: supabase_functions; Owner: supabase_functions_admin
|
||||||
|
--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Data for Name: secrets; Type: TABLE DATA; Schema: vault; Owner: supabase_admin
|
||||||
|
--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: refresh_tokens_id_seq; Type: SEQUENCE SET; Schema: auth; Owner: supabase_auth_admin
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT pg_catalog.setval('"auth"."refresh_tokens_id_seq"', 124, true);
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Name: key_key_id_seq; Type: SEQUENCE SET; Schema: pgsodium; Owner: supabase_admin
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT pg_catalog.setval('"pgsodium"."key_key_id_seq"', 1, false);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
-- PostgreSQL database dump complete
|
||||||
|
--
|
||||||
|
|
||||||
|
RESET ALL;
|
||||||
|
@ -19,39 +19,24 @@ module.exports = {
|
|||||||
// 'pink-glow': '0 0 4px #524FFD, 0 0 4px #524FFD, 0 0 4px #524FFD, 0 0 4px #524FFD',
|
// 'pink-glow': '0 0 4px #524FFD, 0 0 4px #524FFD, 0 0 4px #524FFD, 0 0 4px #524FFD',
|
||||||
},
|
},
|
||||||
colors: {
|
colors: {
|
||||||
'primary': '#201240',
|
'primary': 'var(--color-primary)',
|
||||||
'primary-light': '#403260',
|
'primary-light': 'var(--color-primary-light)',
|
||||||
'primary-dark': '#100120',
|
'primary-dark': 'var(--color-primary-dark)',
|
||||||
'secondary': '#4F3D70',
|
'secondary': 'var(--color-secondary)',
|
||||||
'secondary-light': '#6F5D90',
|
'secondary-light': 'var(--color-secondary-light)',
|
||||||
'secondary-dark': '#2F1D50',
|
'secondary-dark': 'var(--color-secondary-dark)',
|
||||||
'free': '#04396F',
|
'error': 'var(--color-error)',
|
||||||
'free-light': '#04396F',
|
'error-light': 'var(--color-error-light)',
|
||||||
'free-dark': '#001A35',
|
'error-dark': 'var(--color-error-dark)',
|
||||||
'tier1': '#006197',
|
'success': 'var(--color-success)',
|
||||||
'tier1-light': '#006197',
|
'success-light': 'var(--color-success-light)',
|
||||||
'tier1-dark': '#003D5E',
|
'success-dark': 'var(--color-success-dark)',
|
||||||
'tier2': '#008BB3',
|
'warning': 'var(--color-warning)',
|
||||||
'tier2-light': '#4AC8E1',
|
'warning-light': 'var(--color-warning-light)',
|
||||||
'tier2-dark': '#005F7A',
|
'warning-dark': 'var(--color-warning-dark)',
|
||||||
'tier3': '#00B5C0',
|
'info': 'var(--color-info)',
|
||||||
'tier3-light': '#6CE2E8',
|
'info-light': 'var(--color-info-light)',
|
||||||
'tier3-dark': '#008B94',
|
'info-dark': 'var(--color-info-dark)',
|
||||||
'error': '#862117',
|
|
||||||
'error-light': '#C44C4C',
|
|
||||||
'error-dark': '#5C0D0D',
|
|
||||||
'success': '#00C9A6',
|
|
||||||
'success-light': '#20E9C6',
|
|
||||||
'success-dark': '#00A986',
|
|
||||||
'warning': '#E17558',
|
|
||||||
'warning-light': '#E39578',
|
|
||||||
'warning-dark': '#C15538',
|
|
||||||
'info': '#222140',
|
|
||||||
'info-light': '#424260',
|
|
||||||
'info-dark': '#020120',
|
|
||||||
'neutral': '#78639A',
|
|
||||||
'neutral-light': '#9883BA',
|
|
||||||
'neutral-dark': '#58427A',
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user