mirror of
https://github.com/stackrender/stackrender.git
synced 2026-09-09 18:55:42 +00:00
Add UUID V4 to PostgreSQL
This commit is contained in:
+49
-17
@@ -7,7 +7,7 @@ import { DataTypes, TimeDefaultValues } from "@/lib/field";
|
||||
|
||||
import { useDatabaseOperations } from "@/providers/database-provider/database-provider";
|
||||
import dayjs from 'dayjs';
|
||||
import { now } from "@internationalized/date";
|
||||
import { now } from "@internationalized/date";
|
||||
|
||||
import { Label } from "@/components/ui/label";
|
||||
import { Input } from "@/components/ui/input";
|
||||
@@ -16,6 +16,7 @@ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@
|
||||
|
||||
import { MultiSelect } from "@/components/multi-select";
|
||||
import { DatePicker } from "@/components/date-picker";
|
||||
import { DatabaseDialect } from "@/lib/database";
|
||||
|
||||
interface DefaultValueType {
|
||||
number?: boolean;
|
||||
@@ -23,7 +24,8 @@ interface DefaultValueType {
|
||||
boolean?: boolean;
|
||||
time?: boolean;
|
||||
select?: boolean;
|
||||
multiSelect?: boolean
|
||||
multiSelect?: boolean;
|
||||
uuid?: boolean
|
||||
}
|
||||
|
||||
interface FieldDefaultValueProps {
|
||||
@@ -64,8 +66,8 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
|
||||
const [defaultDateTime, setDefaultDateTime] = useState<any>(() => {
|
||||
try {
|
||||
if (field.type.name == "time" ) {
|
||||
return field.defaultValue ;
|
||||
if (field.type.name == "time") {
|
||||
return field.defaultValue;
|
||||
}
|
||||
|
||||
if (field.defaultValue) {
|
||||
@@ -78,7 +80,7 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
return undefined;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const defaultValueType: DefaultValueType = useMemo(() => {
|
||||
return {
|
||||
number: field.type?.type == DataTypes.INTEGER || field.type?.type == DataTypes.NUMERIC,
|
||||
@@ -86,7 +88,8 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
boolean: field.type?.type == DataTypes.BOOLEAN,
|
||||
time: field.type?.type == DataTypes.TIME && field.type?.name != "year",
|
||||
select: field.type?.type == DataTypes.ENUM && field.type?.name != "set",
|
||||
multiSelect: field.type?.type == DataTypes.ENUM && field.type?.name == "set"
|
||||
multiSelect: field.type?.type == DataTypes.ENUM && field.type?.name == "set",
|
||||
uuid: field.type.name == "uuid" || field.type.name == "uniqueidentifier"
|
||||
}
|
||||
}, [field]);
|
||||
|
||||
@@ -94,7 +97,7 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
|
||||
const [selectedValues, setSelectedValues] = useState<string[] | string>(() => {
|
||||
|
||||
if (defaultValueType.select) {
|
||||
if (defaultValueType.select || defaultValueType.uuid) {
|
||||
if (!field.defaultValue)
|
||||
return "none";
|
||||
else
|
||||
@@ -204,7 +207,7 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
|
||||
let value: string | undefined;
|
||||
|
||||
|
||||
|
||||
|
||||
if (field.type.name != "time" && date) {
|
||||
setDefaultDateTime(date);
|
||||
@@ -214,8 +217,8 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
else if (field.type.name == "datetime" || field.type.name == "timestamp" || field.type.name == "timestamptz")
|
||||
value = dayjs(date).format("YYYY-MM-DD HH:mm:ss")
|
||||
}
|
||||
else if ( field.type.name == "time") {
|
||||
value = defaultDateTime ;
|
||||
else if (field.type.name == "time") {
|
||||
value = defaultDateTime;
|
||||
}
|
||||
|
||||
|
||||
@@ -227,7 +230,7 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
|
||||
const enumValueChange = useCallback((selection: any) => {
|
||||
|
||||
if (defaultValueType.select) {
|
||||
if (defaultValueType.select || defaultValueType.uuid) {
|
||||
setSelectedValues(selection);
|
||||
editField({
|
||||
id: field.id,
|
||||
@@ -256,11 +259,11 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
|
||||
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
{
|
||||
!defaultValueType.boolean &&
|
||||
|
||||
<Label htmlFor="default_value">
|
||||
{t("db_controller.field_settings.default_value")}
|
||||
</Label>
|
||||
@@ -317,7 +320,7 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
|
||||
<SelectContent>
|
||||
<SelectItem value={"none"} >
|
||||
No Default value
|
||||
{t("db_controller.field_settings.no_default")}
|
||||
</SelectItem>
|
||||
|
||||
{
|
||||
@@ -333,6 +336,34 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
</SelectContent>
|
||||
</Select>
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
(defaultValueType.uuid) &&
|
||||
|
||||
<Select
|
||||
aria-label="value"
|
||||
value={selectedValues as any}
|
||||
onValueChange={enumValueChange as any}
|
||||
|
||||
>
|
||||
<SelectTrigger id="charset" className="w-full flex ">
|
||||
<SelectValue placeholder={t('db_controller.field_settings.pick_value')} />
|
||||
</SelectTrigger>
|
||||
|
||||
<SelectContent>
|
||||
<SelectItem value={"none"} >
|
||||
{t("db_controller.field_settings.no_default")}
|
||||
</SelectItem>
|
||||
<SelectItem value={"random"} >
|
||||
{t("db_controller.field_settings.random_uuid")}
|
||||
|
||||
</SelectItem>
|
||||
|
||||
|
||||
</SelectContent>
|
||||
</Select>
|
||||
}
|
||||
{
|
||||
(defaultValueType.multiSelect) &&
|
||||
<MultiSelect
|
||||
@@ -364,7 +395,7 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
</SelectItem>
|
||||
<SelectItem value={TimeDefaultValues.CUSTOM}>{t("db_controller.field_settings.time_default_value.custom")}</SelectItem>
|
||||
{
|
||||
(field.type.name == "datetime" || field.type.name?.includes("timestamp")) ?
|
||||
(field.type.name?.includes("datetime") || field.type.name?.includes("timestamp") || ((field.type.dialect == DatabaseDialect.ORACLE || field.type.dialect == DatabaseDialect.MSSQL) && field.type.name == "date")) ?
|
||||
<SelectItem value={TimeDefaultValues.NOW}>{t("db_controller.field_settings.time_default_value.now")}</SelectItem> : null
|
||||
}
|
||||
</SelectContent>
|
||||
@@ -389,12 +420,11 @@ const fieldDefautlValue: React.FC<FieldDefaultValueProps> = ({ field }) => {
|
||||
<Input
|
||||
id="time"
|
||||
type="time"
|
||||
step={1}
|
||||
step={1}
|
||||
defaultValue={defaultDateTime}
|
||||
onChange={(event) => setDefaultDateTime( event.target.value)}
|
||||
onChange={(event) => setDefaultDateTime(event.target.value)}
|
||||
onBlur={saveDefaultDateTime as any}
|
||||
className="bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none"
|
||||
|
||||
/>
|
||||
</>
|
||||
}
|
||||
@@ -411,3 +441,5 @@ export default React.memo(fieldDefautlValue);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -95,6 +95,8 @@ export const ar = {
|
||||
type_enter: "اكتب واضغط Enter",
|
||||
precision_def: "إجمالي الأرقام المسموحة (قبل + بعد الفاصلة).",
|
||||
scale_def: "عدد الأرقام بعد الفاصلة.",
|
||||
no_default: "لا توجد قيمة افتراضية",
|
||||
random_uuid: "معرّف UUID عشوائي",
|
||||
time_default_value: {
|
||||
no_value: "لا توجد قيمة",
|
||||
custom: "وقت مخصص",
|
||||
|
||||
@@ -95,6 +95,8 @@ export const de = {
|
||||
type_enter: "Tippen und Enter drücken",
|
||||
precision_def: "Zulässige Gesamtanzahl an Ziffern (vor + nach dem Dezimalpunkt).",
|
||||
scale_def: "Ziffern nach dem Dezimalpunkt.",
|
||||
no_default: "Kein Standardwert",
|
||||
random_uuid: "Zufällige UUID",
|
||||
time_default_value: {
|
||||
no_value: "Kein Wert",
|
||||
custom: "Benutzerdefinierte Zeit",
|
||||
|
||||
@@ -7,8 +7,8 @@ export const en = {
|
||||
sidebar: {
|
||||
tables: "Tables",
|
||||
relationships: "Relationships",
|
||||
database: "Database",
|
||||
documentation : "Docs"
|
||||
database: "Database",
|
||||
documentation: "Docs"
|
||||
},
|
||||
|
||||
color_picker: {
|
||||
@@ -104,6 +104,8 @@ export const en = {
|
||||
type_enter: "Type and press enter",
|
||||
precision_def: "Total digits allowed (before + after the decimal).",
|
||||
scale_def: "Digits allowed after the decimal.",
|
||||
no_default: "No Default value",
|
||||
random_uuid: "Random UUID",
|
||||
time_default_value: {
|
||||
no_value: "No value",
|
||||
custom: "Custom time",
|
||||
@@ -209,7 +211,7 @@ export const en = {
|
||||
import_database: {
|
||||
title: "Import your Database",
|
||||
import: "Import",
|
||||
view_docs : "View Docs" ,
|
||||
view_docs: "View Docs",
|
||||
import_options: "Would you like to import using :",
|
||||
import_error: "SQL Parsing Error",
|
||||
import_error_description: "We couldn't import your SQL because it contains invalid syntax.",
|
||||
@@ -277,7 +279,7 @@ export const en = {
|
||||
step5: "Finally, copy the contents of the <code>.sql</code> file into the <bold>code editor</bold> below."
|
||||
|
||||
},
|
||||
|
||||
|
||||
ssms: {
|
||||
"step1": "Open <bold>SQL Server Management Studio (SSMS)</bold>.",
|
||||
"step2": "Right-click your database, then select <bold>Tasks → Generate Scripts</bold> from the context menu.",
|
||||
|
||||
@@ -99,6 +99,8 @@ export const es = {
|
||||
type_enter: "Escribe y presiona enter",
|
||||
precision_def: "Total de dígitos permitidos (antes + después del decimal).",
|
||||
scale_def: "Dígitos permitidos después del decimal.",
|
||||
no_default: "Sin valor predeterminado",
|
||||
random_uuid: "UUID aleatorio",
|
||||
time_default_value: {
|
||||
no_value: "Sin valor",
|
||||
custom: "Hora personalizada",
|
||||
|
||||
@@ -7,7 +7,7 @@ export const fr = {
|
||||
tables: "Tables",
|
||||
relationships: "Relations",
|
||||
database: "Base de données",
|
||||
documentation : "Docs"
|
||||
documentation: "Docs"
|
||||
|
||||
},
|
||||
color_picker: {
|
||||
@@ -33,7 +33,7 @@ export const fr = {
|
||||
note: "Note",
|
||||
name: "Nom",
|
||||
type: "Type",
|
||||
required: "Obligatoire",
|
||||
required: "Obligatoire",
|
||||
|
||||
nullable: "Nullable",
|
||||
select_fields: "Sélectionner les champs",
|
||||
@@ -97,6 +97,8 @@ export const fr = {
|
||||
type_enter: "Tapez et appuyez sur Entrée",
|
||||
precision_def: "Nombre total de chiffres autorisés (avant + après la virgule).",
|
||||
scale_def: "Nombre de chiffres autorisés après la virgule.",
|
||||
no_default: "Aucune valeur par défaut",
|
||||
random_uuid: "UUID aléatoire",
|
||||
time_default_value: {
|
||||
no_value: "Aucune valeur",
|
||||
custom: "Heure personnalisée",
|
||||
@@ -173,7 +175,7 @@ export const fr = {
|
||||
theme: "Thème",
|
||||
light: "Clair",
|
||||
dark: "Sombre",
|
||||
system: "Système",
|
||||
system: "Système",
|
||||
|
||||
help: "Aide",
|
||||
show_docs: "Afficher la documentation",
|
||||
@@ -199,7 +201,7 @@ export const fr = {
|
||||
import_database: {
|
||||
title: "Importer votre base de données",
|
||||
import: "Importer",
|
||||
view_docs : "Voir la documentation" ,
|
||||
view_docs: "Voir la documentation",
|
||||
import_options: "Souhaitez-vous importer en utilisant :",
|
||||
import_error: "Erreur d’analyse SQL",
|
||||
import_error_description: "Nous n'avons pas pu importer votre SQL car il contient une syntaxe invalide.",
|
||||
@@ -263,7 +265,7 @@ export const fr = {
|
||||
step4: "Dans la fenêtre, sélectionnez <bold>Exporter uniquement le schéma</bold> et cliquez sur <bold>Enregistrer</bold>.",
|
||||
step5: "Enfin, copiez le contenu du fichier <code>.sql</code> dans l’éditeur de code ci-dessous."
|
||||
},
|
||||
ssms: {
|
||||
ssms: {
|
||||
"step1": "Ouvrez SQL Server Management Studio (SSMS).",
|
||||
"step2": "Faites un clic droit sur votre base de données, puis sélectionnez Tâches → Générer des scripts dans le menu contextuel.",
|
||||
"step3": "Dans l’étape Choisir les objets, sélectionnez Choisir des objets spécifiques de la base de données, puis cochez toutes les tables.",
|
||||
|
||||
@@ -100,6 +100,8 @@ export const hi = {
|
||||
type_enter: "टाइप करें और एंटर दबाएं",
|
||||
precision_def: "कुल अनुमत अंक (दशमलव से पहले और बाद)।",
|
||||
scale_def: "दशमलव के बाद अनुमत अंक।",
|
||||
no_default: "कोई डिफ़ॉल्ट मान नहीं",
|
||||
random_uuid: "रैंडम UUID",
|
||||
time_default_value: {
|
||||
no_value: "कोई मान नहीं",
|
||||
custom: "कस्टम समय",
|
||||
|
||||
@@ -101,6 +101,8 @@ export const pt = {
|
||||
type_enter: "Digite e pressione enter",
|
||||
precision_def: "Dígitos totais permitidos (antes + depois do decimal).",
|
||||
scale_def: "Dígitos permitidos após o decimal.",
|
||||
no_default: "Sem valor padrão",
|
||||
random_uuid: "UUID aleatório",
|
||||
time_default_value: {
|
||||
no_value: "Sem valor",
|
||||
custom: "Hora personalizada",
|
||||
|
||||
@@ -93,6 +93,8 @@ export const ru = {
|
||||
type_enter: "Введите и нажмите Enter",
|
||||
precision_def: "Общее количество допустимых цифр (до и после запятой).",
|
||||
scale_def: "Допустимое количество цифр после запятой.",
|
||||
no_default: "Нет значения по умолчанию",
|
||||
random_uuid: "Случайный UUID",
|
||||
time_default_value: {
|
||||
no_value: "Нет значения",
|
||||
custom: "Произвольное время",
|
||||
|
||||
@@ -101,6 +101,8 @@ export const zh = {
|
||||
type_enter: "输入并按回车",
|
||||
precision_def: "允许的总位数(小数点前+后)。",
|
||||
scale_def: "小数点后的位数。",
|
||||
no_default: "无默认值",
|
||||
random_uuid: "随机 UUID",
|
||||
time_default_value: {
|
||||
no_value: "无值",
|
||||
custom: "自定义时间",
|
||||
|
||||
Reference in New Issue
Block a user