Add UUID V4 to PostgreSQL

This commit is contained in:
KarimTamani
2026-08-05 23:42:16 +01:00
parent 994c797195
commit e169b84ade
10 changed files with 76 additions and 26 deletions
@@ -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);
+2
View File
@@ -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: "وقت مخصص",
+2
View File
@@ -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",
+6 -4
View File
@@ -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.",
+2
View File
@@ -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 -5
View File
@@ -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 danalyse 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.",
+2
View File
@@ -100,6 +100,8 @@ export const hi = {
type_enter: "टाइप करें और एंटर दबाएं",
precision_def: "कुल अनुमत अंक (दशमलव से पहले और बाद)।",
scale_def: "दशमलव के बाद अनुमत अंक।",
no_default: "कोई डिफ़ॉल्ट मान नहीं",
random_uuid: "रैंडम UUID",
time_default_value: {
no_value: "कोई मान नहीं",
custom: "कस्टम समय",
+2
View File
@@ -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",
+2
View File
@@ -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: "Произвольное время",
+2
View File
@@ -101,6 +101,8 @@ export const zh = {
type_enter: "输入并按回车",
precision_def: "允许的总位数(小数点前+后)。",
scale_def: "小数点后的位数。",
no_default: "无默认值",
random_uuid: "随机 UUID",
time_default_value: {
no_value: "无值",
custom: "自定义时间",