Compare commits
17 Commits
173303de27
...
7f0ea4f04c
| Author | SHA1 | Date | |
|---|---|---|---|
| 7f0ea4f04c | |||
| 49d27e5849 | |||
| 03b9dfc60a | |||
| 433f8384a0 | |||
| 2c0b6356b6 | |||
| c6c984c34c | |||
| c84fb50087 | |||
| 79ce616781 | |||
| e4a1817d7f | |||
| 2a69c89065 | |||
| 0899835fab | |||
| cf5848491b | |||
| 33748e3233 | |||
| cc0b6a2547 | |||
| 2433b21888 | |||
| c433934d68 | |||
| 209cfe8965 |
146
geneit_app/package-lock.json
generated
146
geneit_app/package-lock.json
generated
@@ -2004,11 +2004,11 @@
|
||||
"integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.22.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
|
||||
"integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==",
|
||||
"version": "7.22.11",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz",
|
||||
"integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.13.11"
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
@@ -2026,6 +2026,11 @@
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/runtime/node_modules/regenerator-runtime": {
|
||||
"version": "0.14.0",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
|
||||
"integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
|
||||
},
|
||||
"node_modules/@babel/template": {
|
||||
"version": "7.22.5",
|
||||
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
|
||||
@@ -2573,10 +2578,44 @@
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/core": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz",
|
||||
"integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==",
|
||||
"dependencies": {
|
||||
"@floating-ui/utils": "^0.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/dom": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz",
|
||||
"integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==",
|
||||
"dependencies": {
|
||||
"@floating-ui/core": "^1.4.1",
|
||||
"@floating-ui/utils": "^0.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/react-dom": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz",
|
||||
"integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==",
|
||||
"dependencies": {
|
||||
"@floating-ui/dom": "^1.5.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8.0",
|
||||
"react-dom": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@floating-ui/utils": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz",
|
||||
"integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw=="
|
||||
},
|
||||
"node_modules/@fontsource/roboto": {
|
||||
"version": "5.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.4.tgz",
|
||||
"integrity": "sha512-4aVlY+8u/8V15zP8Z4tscGebdD62trVo1CVNW8OsvLWYduebFxxETj7yzfkR/131fVGy/lO1RTeLf6CT7eD8CQ=="
|
||||
"version": "5.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz",
|
||||
"integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA=="
|
||||
},
|
||||
"node_modules/@humanwhocodes/config-array": {
|
||||
"version": "0.11.10",
|
||||
@@ -3035,14 +3074,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/base": {
|
||||
"version": "5.0.0-beta.11",
|
||||
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz",
|
||||
"integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==",
|
||||
"version": "5.0.0-beta.13",
|
||||
"resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.13.tgz",
|
||||
"integrity": "sha512-uC0l97pBspfDAp+iz2cJq8YZ8Sd9i73V77+WzUiOAckIVEyCm5dyVDZCCO2/phmzckVEeZCGcytybkjMQuhPQw==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.22.6",
|
||||
"@babel/runtime": "^7.22.10",
|
||||
"@emotion/is-prop-valid": "^1.2.1",
|
||||
"@floating-ui/react-dom": "^2.0.1",
|
||||
"@mui/types": "^7.2.4",
|
||||
"@mui/utils": "^5.14.5",
|
||||
"@mui/utils": "^5.14.7",
|
||||
"@popperjs/core": "^2.11.8",
|
||||
"clsx": "^2.0.0",
|
||||
"prop-types": "^15.8.1",
|
||||
@@ -3075,9 +3115,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/core-downloads-tracker": {
|
||||
"version": "5.14.5",
|
||||
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz",
|
||||
"integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==",
|
||||
"version": "5.14.7",
|
||||
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.7.tgz",
|
||||
"integrity": "sha512-sCWTUNElBPgB30iLvWe3PU7SIlTKZNf6/E/sko85iHVeHCM6WPkDw+y89CrZYjhFNmPqt2fIQM/pZu+rP2lFLA==",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/mui"
|
||||
@@ -3109,15 +3149,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/lab": {
|
||||
"version": "5.0.0-alpha.140",
|
||||
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.140.tgz",
|
||||
"integrity": "sha512-k75jos6jklCD8tA20PAK2H4RSCKycTcR4Pbfz7JbdxIkWXJ+y2MRalwMcen1vpB99v0yZHNUo6BtGz6rvs2jlQ==",
|
||||
"version": "5.0.0-alpha.142",
|
||||
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.142.tgz",
|
||||
"integrity": "sha512-JDrT5G3QBZ0nzkKMFWzJY5KN8WcyDx4p7qOjg6hs7yKLq90VSdsqIOmyhvWDxJR7zPNQjo0WRYBAaRaQ5FlGxg==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.22.6",
|
||||
"@mui/base": "5.0.0-beta.11",
|
||||
"@mui/system": "^5.14.5",
|
||||
"@babel/runtime": "^7.22.10",
|
||||
"@mui/base": "5.0.0-beta.13",
|
||||
"@mui/system": "^5.14.7",
|
||||
"@mui/types": "^7.2.4",
|
||||
"@mui/utils": "^5.14.5",
|
||||
"@mui/utils": "^5.14.7",
|
||||
"clsx": "^2.0.0",
|
||||
"prop-types": "^15.8.1",
|
||||
"react-is": "^18.2.0"
|
||||
@@ -3158,16 +3198,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/material": {
|
||||
"version": "5.14.5",
|
||||
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz",
|
||||
"integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==",
|
||||
"version": "5.14.7",
|
||||
"resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.7.tgz",
|
||||
"integrity": "sha512-jIZj9F7zMv6IlyaYDVv5M2Kp20jIX8c0kzuwteySHS/A0IvPVyomQEPtWc51MCbpDNCqzwoZUp3rQtA2lI8k7A==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.22.6",
|
||||
"@mui/base": "5.0.0-beta.11",
|
||||
"@mui/core-downloads-tracker": "^5.14.5",
|
||||
"@mui/system": "^5.14.5",
|
||||
"@babel/runtime": "^7.22.10",
|
||||
"@mui/base": "5.0.0-beta.13",
|
||||
"@mui/core-downloads-tracker": "^5.14.7",
|
||||
"@mui/system": "^5.14.7",
|
||||
"@mui/types": "^7.2.4",
|
||||
"@mui/utils": "^5.14.5",
|
||||
"@mui/utils": "^5.14.7",
|
||||
"@types/react-transition-group": "^4.4.6",
|
||||
"clsx": "^2.0.0",
|
||||
"csstype": "^3.1.2",
|
||||
@@ -3210,12 +3250,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/private-theming": {
|
||||
"version": "5.14.5",
|
||||
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz",
|
||||
"integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==",
|
||||
"version": "5.14.7",
|
||||
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.7.tgz",
|
||||
"integrity": "sha512-Y86+hmDnJab2Ka42PgxKpK3oL7EiacbeeX3X/lG9LGO0wSc45wZjHeTfIlVSkkUCkexiMKEJp5NlSjZhr27NRQ==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.22.6",
|
||||
"@mui/utils": "^5.14.5",
|
||||
"@babel/runtime": "^7.22.10",
|
||||
"@mui/utils": "^5.14.7",
|
||||
"prop-types": "^15.8.1"
|
||||
},
|
||||
"engines": {
|
||||
@@ -3236,11 +3276,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/styled-engine": {
|
||||
"version": "5.13.2",
|
||||
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz",
|
||||
"integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==",
|
||||
"version": "5.14.7",
|
||||
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.7.tgz",
|
||||
"integrity": "sha512-hKBETEDsIAkL8/mBwPiQj/vw28OeIhMXC3Tvj4J2bb9snxAKpiZioR1PwqP+6P41twsC/GKBd0Vr9oaWYaHuMg==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.21.0",
|
||||
"@babel/runtime": "^7.22.10",
|
||||
"@emotion/cache": "^11.11.0",
|
||||
"csstype": "^3.1.2",
|
||||
"prop-types": "^15.8.1"
|
||||
@@ -3267,15 +3307,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/system": {
|
||||
"version": "5.14.5",
|
||||
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz",
|
||||
"integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==",
|
||||
"version": "5.14.7",
|
||||
"resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.7.tgz",
|
||||
"integrity": "sha512-jeZtHglc+Pi6qjGoopT6O4RqYXVBMqHVOsjMGP0hxGSSPm1T4gsAu7jU8eqGx9YwwjvvJ0eotTjFqw7iJ6qE2Q==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.22.6",
|
||||
"@mui/private-theming": "^5.14.5",
|
||||
"@mui/styled-engine": "^5.13.2",
|
||||
"@babel/runtime": "^7.22.10",
|
||||
"@mui/private-theming": "^5.14.7",
|
||||
"@mui/styled-engine": "^5.14.7",
|
||||
"@mui/types": "^7.2.4",
|
||||
"@mui/utils": "^5.14.5",
|
||||
"@mui/utils": "^5.14.7",
|
||||
"clsx": "^2.0.0",
|
||||
"csstype": "^3.1.2",
|
||||
"prop-types": "^15.8.1"
|
||||
@@ -3327,11 +3367,11 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@mui/utils": {
|
||||
"version": "5.14.5",
|
||||
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.5.tgz",
|
||||
"integrity": "sha512-6Hzw63VR9C5xYv+CbjndoRLU6Gntal8rJ5W+GUzkyHrGWIyYPWZPa6AevnyGioySNETATe1H9oXS8f/7qgIHJA==",
|
||||
"version": "5.14.7",
|
||||
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.7.tgz",
|
||||
"integrity": "sha512-RtheP/aBoPogVdi8vj8Vo2IFnRa4mZVmnD0RGlVZ49yF60rZs+xP4/KbpIrTr83xVs34QmHQ2aQ+IX7I0a0dDw==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.22.6",
|
||||
"@babel/runtime": "^7.22.10",
|
||||
"@types/prop-types": "^15.7.5",
|
||||
"@types/react-is": "^18.2.1",
|
||||
"prop-types": "^15.8.1",
|
||||
@@ -4144,9 +4184,9 @@
|
||||
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "16.18.38",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.38.tgz",
|
||||
"integrity": "sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ=="
|
||||
"version": "16.18.46",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.46.tgz",
|
||||
"integrity": "sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg=="
|
||||
},
|
||||
"node_modules/@types/parse-json": {
|
||||
"version": "4.0.0",
|
||||
|
||||
@@ -170,6 +170,13 @@ export class Member implements MemberDataApi {
|
||||
return birthDeath.join(" - ");
|
||||
}
|
||||
|
||||
get displayBirthDeathShort(): string {
|
||||
let birthDeath = [];
|
||||
if (this.birth_year) birthDeath.push(this.birth_year.toString());
|
||||
if (this.death_year) birthDeath.push(this.death_year.toString());
|
||||
return birthDeath.join(" - ");
|
||||
}
|
||||
|
||||
get hasContactInfo(): boolean {
|
||||
return this.email ||
|
||||
this.phone ||
|
||||
|
||||
@@ -25,6 +25,7 @@ import { MemberInput } from "../../widgets/forms/MemberInput";
|
||||
import { PropSelect } from "../../widgets/forms/PropSelect";
|
||||
import { UploadPhotoButton } from "../../widgets/forms/UploadPhotoButton";
|
||||
import { useQuery } from "../../hooks/useQuery";
|
||||
import { useLoadingMessage } from "../../hooks/context_providers/LoadingMessageProvider";
|
||||
|
||||
/**
|
||||
* Create a new couple route
|
||||
@@ -165,7 +166,8 @@ export function FamilyEditCoupleRoute(): React.ReactElement {
|
||||
|
||||
const cancel = () => {
|
||||
setShouldQuit(true);
|
||||
n(-1);
|
||||
n(family.family.coupleURL(couple!));
|
||||
//n(-1);
|
||||
};
|
||||
|
||||
const save = async (c: Couple) => {
|
||||
@@ -210,13 +212,14 @@ export function CouplePage(p: {
|
||||
shouldAllowLeaving?: boolean;
|
||||
children?: Member[];
|
||||
onCancel?: () => void;
|
||||
onSave?: (m: Couple) => void;
|
||||
onSave?: (m: Couple) => Promise<void>;
|
||||
onRequestEdit?: () => void;
|
||||
onRequestDelete?: () => void;
|
||||
onForceReload?: () => void;
|
||||
}): React.ReactElement {
|
||||
const confirm = useConfirm();
|
||||
const snackbar = useSnackbar();
|
||||
const loadingMessage = useLoadingMessage();
|
||||
|
||||
const family = useFamily();
|
||||
|
||||
@@ -230,8 +233,12 @@ export function CouplePage(p: {
|
||||
setCouple(new Couple(structuredClone(couple)));
|
||||
};
|
||||
|
||||
const save = () => {
|
||||
p.onSave!(couple);
|
||||
const save = async () => {
|
||||
loadingMessage.show(
|
||||
"Enregistrement des informations du couple en cours..."
|
||||
);
|
||||
await p.onSave!(couple);
|
||||
loadingMessage.hide();
|
||||
};
|
||||
|
||||
const cancel = async () => {
|
||||
|
||||
@@ -39,6 +39,7 @@ import { UploadPhotoButton } from "../../widgets/forms/UploadPhotoButton";
|
||||
import { useQuery } from "../../hooks/useQuery";
|
||||
import { mdiFamilyTree } from "@mdi/js";
|
||||
import Icon from "@mdi/react";
|
||||
import { useLoadingMessage } from "../../hooks/context_providers/LoadingMessageProvider";
|
||||
|
||||
/**
|
||||
* Create a new member route
|
||||
@@ -185,8 +186,8 @@ export function FamilyEditMemberRoute(): React.ReactElement {
|
||||
|
||||
const cancel = () => {
|
||||
setShouldQuit(true);
|
||||
//n(family.family.URL(`member/${member!.id}`));
|
||||
n(-1);
|
||||
n(family.family.memberURL(member!));
|
||||
//n(-1);
|
||||
};
|
||||
|
||||
const save = async (m: Member) => {
|
||||
@@ -233,7 +234,7 @@ export function MemberPage(p: {
|
||||
siblings?: Member[];
|
||||
couples?: Couple[];
|
||||
onCancel?: () => void;
|
||||
onSave?: (m: Member) => void;
|
||||
onSave?: (m: Member) => Promise<void>;
|
||||
onRequestEdit?: () => void;
|
||||
onRequestDelete?: () => void;
|
||||
onForceReload?: () => void;
|
||||
@@ -241,6 +242,7 @@ export function MemberPage(p: {
|
||||
}): React.ReactElement {
|
||||
const confirm = useConfirm();
|
||||
const snackbar = useSnackbar();
|
||||
const loadingMessage = useLoadingMessage();
|
||||
|
||||
const family = useFamily();
|
||||
|
||||
@@ -254,8 +256,12 @@ export function MemberPage(p: {
|
||||
setMember(new Member(structuredClone(member)));
|
||||
};
|
||||
|
||||
const save = () => {
|
||||
p.onSave!(member);
|
||||
const save = async () => {
|
||||
loadingMessage.show(
|
||||
"Enregistrement des informations du membre en cours..."
|
||||
);
|
||||
await p.onSave!(member);
|
||||
loadingMessage.hide();
|
||||
};
|
||||
|
||||
const cancel = async () => {
|
||||
|
||||
@@ -4,7 +4,7 @@ import EditIcon from "@mui/icons-material/Edit";
|
||||
import FemaleIcon from "@mui/icons-material/Female";
|
||||
import MaleIcon from "@mui/icons-material/Male";
|
||||
import VisibilityIcon from "@mui/icons-material/Visibility";
|
||||
import { Button, TextField, Tooltip } from "@mui/material";
|
||||
import { Button, TextField, Tooltip, Typography } from "@mui/material";
|
||||
import { DataGrid, GridActionsCellItem, GridColDef } from "@mui/x-data-grid";
|
||||
import React from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
@@ -165,7 +165,8 @@ function MembersTable(p: {
|
||||
headerName: "Père",
|
||||
flex: 5,
|
||||
renderCell(params) {
|
||||
if (!params.row.father) return <></>;
|
||||
if (!params.row.father)
|
||||
return <Typography color="red">Non renseigné</Typography>;
|
||||
return family.members.get(params.row.father)!.fullName;
|
||||
},
|
||||
},
|
||||
@@ -174,7 +175,8 @@ function MembersTable(p: {
|
||||
headerName: "Mère",
|
||||
flex: 5,
|
||||
renderCell(params) {
|
||||
if (!params.row.mother) return <></>;
|
||||
if (!params.row.mother)
|
||||
return <Typography color="red">Non renseignée</Typography>;
|
||||
return family.members.get(params.row.mother)!.fullName;
|
||||
},
|
||||
},
|
||||
|
||||
@@ -35,7 +35,7 @@ const SPOUSE_SPACING = 10;
|
||||
/**
|
||||
* Space between two siblings hierachy
|
||||
*/
|
||||
const SIBLINGS_SPACING = 0;
|
||||
const SIBLINGS_SPACING = 15;
|
||||
|
||||
/**
|
||||
* Vertical space between two generations
|
||||
@@ -76,9 +76,10 @@ interface SimpleTreeNode {
|
||||
*/
|
||||
function memberCardWidth(m?: Member): number {
|
||||
if (!m) return 0;
|
||||
const nameWidth = getTextWidth(m.fullName, NAME_FONT);
|
||||
const firstNameWidth = getTextWidth(m.first_name ?? "", NAME_FONT);
|
||||
const lastNameWidth = getTextWidth(m.lastNameUpperCase ?? "", NAME_FONT);
|
||||
const birthDeathWidth = getTextWidth(m.displayBirthDeath, BIRTH_FONT);
|
||||
return Math.max(FACE_WIDTH, nameWidth, birthDeathWidth);
|
||||
return Math.max(FACE_WIDTH, firstNameWidth, lastNameWidth, birthDeathWidth);
|
||||
}
|
||||
|
||||
function center(container_width: number, el_width: number): number {
|
||||
@@ -161,7 +162,7 @@ export function SimpleFamilyTree(p: {
|
||||
console.info(`tree width=${tree.width} height=${height}`);
|
||||
|
||||
const doExport = async (onlySVG: boolean) => {
|
||||
const el = document.querySelector(".simpletree")!;
|
||||
const el: HTMLElement = document.querySelector(".simpletree")!;
|
||||
const svg = el.outerHTML;
|
||||
|
||||
// Download in SVG format
|
||||
@@ -177,10 +178,18 @@ export function SimpleFamilyTree(p: {
|
||||
|
||||
const PDF_MARGIN = 10;
|
||||
|
||||
const PDF_MAX_SIZE = 14400 - PDF_MARGIN * 2;
|
||||
|
||||
const tree_width = Math.min(tree.width, PDF_MAX_SIZE);
|
||||
const tree_height = Math.min(height, PDF_MAX_SIZE);
|
||||
|
||||
console.info(`pdf tree w=${tree_width} h=${tree_height}`);
|
||||
|
||||
// Download in PDF format
|
||||
const doc = new jsPDF({
|
||||
orientation: "l",
|
||||
format: [height + PDF_MARGIN * 2, tree.width + PDF_MARGIN * 2],
|
||||
unit: "px",
|
||||
format: [tree_height + PDF_MARGIN * 2, tree_width + PDF_MARGIN * 2],
|
||||
});
|
||||
|
||||
doc.setFont("Roboto", "normal");
|
||||
@@ -188,8 +197,8 @@ export function SimpleFamilyTree(p: {
|
||||
await doc.svg(el, {
|
||||
x: PDF_MARGIN,
|
||||
y: PDF_MARGIN,
|
||||
height: height,
|
||||
width: tree.width,
|
||||
height: tree_height,
|
||||
width: tree_width,
|
||||
});
|
||||
|
||||
// Save the created pdf
|
||||
@@ -245,6 +254,7 @@ function NodeArea(p: {
|
||||
let pers2 = p.node.spouse?.member;
|
||||
let didSwap = false;
|
||||
|
||||
// Show male of the left (all the time)
|
||||
if (pers2?.sex === "M") {
|
||||
let s = pers1;
|
||||
pers1 = pers2;
|
||||
@@ -284,10 +294,37 @@ function NodeArea(p: {
|
||||
let childrenLinkX: number;
|
||||
let childrenLinkY: number;
|
||||
|
||||
if (p.node.spouse) {
|
||||
// If the father is the father of all the children, while the
|
||||
// mother is not the mother of any of the children
|
||||
if (
|
||||
pers2 &&
|
||||
p.node.down.every(
|
||||
(n) => n.member.father === pers1.id && n.member.mother !== pers2!.id
|
||||
)
|
||||
) {
|
||||
childrenLinkX = parent_x_offset + Math.floor(memberCardWidth(pers1) / 2);
|
||||
childrenLinkY = p.y + CARD_HEIGHT + 2;
|
||||
}
|
||||
// If the mother is the mother of all the children, while the
|
||||
// father is not the father of any of the children
|
||||
else if (
|
||||
pers2 &&
|
||||
p.node.down.every(
|
||||
(n) => n.member.father !== pers1.id && n.member.mother === pers2!.id
|
||||
)
|
||||
) {
|
||||
childrenLinkX = beginSecondFaceX! + Math.floor(memberCardWidth(pers2) / 2);
|
||||
childrenLinkY = p.y + CARD_HEIGHT + 2;
|
||||
}
|
||||
|
||||
// Normal couple
|
||||
else if (p.node.spouse) {
|
||||
childrenLinkX = Math.floor((endFirstFaceX + beginSecondFaceX!) / 2);
|
||||
childrenLinkY = middleParentFaceY;
|
||||
} else {
|
||||
}
|
||||
|
||||
// Single person
|
||||
else {
|
||||
childrenLinkX = parent_x_offset + Math.floor(memberCardWidth(pers1) / 2);
|
||||
childrenLinkY = p.y + CARD_HEIGHT + 2;
|
||||
}
|
||||
@@ -389,12 +426,15 @@ function MemberCard(p: {
|
||||
{p.member.lastNameUpperCase ?? ""}
|
||||
</tspan>
|
||||
<tspan
|
||||
x={center(w, getTextWidth(p.member.displayBirthDeath, BIRTH_FONT))}
|
||||
x={center(
|
||||
w,
|
||||
getTextWidth(p.member.displayBirthDeathShort, BIRTH_FONT)
|
||||
)}
|
||||
dy="14"
|
||||
font-size="10"
|
||||
fontFamily="Roboto"
|
||||
>
|
||||
{p.member.displayBirthDeath}
|
||||
{p.member.displayBirthDeathShort}
|
||||
</tspan>
|
||||
</text>
|
||||
</g>
|
||||
|
||||
109
geneit_backend/Cargo.lock
generated
109
geneit_backend/Cargo.lock
generated
@@ -85,9 +85,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "actix-multipart"
|
||||
version = "0.6.0"
|
||||
version = "0.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dee489e3c01eae4d1c35b03c4493f71cb40d93f66b14558feb1b1a807671cc4e"
|
||||
checksum = "3b960e2aea75f49c8f069108063d12a48d329fc8b60b786dfc7552a9d5918d2d"
|
||||
dependencies = [
|
||||
"actix-multipart-derive",
|
||||
"actix-utils",
|
||||
@@ -110,15 +110,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "actix-multipart-derive"
|
||||
version = "0.6.0"
|
||||
version = "0.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2ec592f234db8a253cf80531246a4407c8a70530423eea80688a6c5a44a110e7"
|
||||
checksum = "0a0a77f836d869f700e5b47ac7c3c8b9c8bc82e4aec861954c6198abee3ebd4d"
|
||||
dependencies = [
|
||||
"darling 0.14.4",
|
||||
"darling",
|
||||
"parse-size",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -404,7 +404,7 @@ checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -681,7 +681,7 @@ dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -849,38 +849,14 @@ dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
|
||||
dependencies = [
|
||||
"darling_core 0.14.4",
|
||||
"darling_macro 0.14.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling"
|
||||
version = "0.20.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e"
|
||||
dependencies = [
|
||||
"darling_core 0.20.3",
|
||||
"darling_macro 0.20.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling_core"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"ident_case",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"strsim",
|
||||
"syn 1.0.109",
|
||||
"darling_core",
|
||||
"darling_macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -894,18 +870,7 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"strsim",
|
||||
"syn 2.0.23",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling_macro"
|
||||
version = "0.14.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
|
||||
dependencies = [
|
||||
"darling_core 0.14.4",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -914,9 +879,9 @@ version = "0.20.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
|
||||
dependencies = [
|
||||
"darling_core 0.20.3",
|
||||
"darling_core",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -954,7 +919,7 @@ dependencies = [
|
||||
"diesel_table_macro_syntax",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -963,7 +928,7 @@ version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5"
|
||||
dependencies = [
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1253,7 +1218,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1978,7 +1943,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2103,7 +2068,7 @@ dependencies = [
|
||||
"phf_shared",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2132,7 +2097,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2292,9 +2257,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "redis"
|
||||
version = "0.23.2"
|
||||
version = "0.23.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ffd6543a7bc6428396845f6854ccf3d1ae8823816592e2cbe74f20f50f209d02"
|
||||
checksum = "4f49cdc0bb3f412bf8e7d1bd90fe1d9eb10bc5c399ba90973c14662a27b3f8ba"
|
||||
dependencies = [
|
||||
"combine",
|
||||
"itoa",
|
||||
@@ -2548,22 +2513,22 @@ checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.166"
|
||||
version = "1.0.188"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d01b7404f9d441d3ad40e6a636a7782c377d2abdbe4fa2440e2edcc2f4f10db8"
|
||||
checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.166"
|
||||
version = "1.0.188"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5dd83d6dde2b6b2d466e14d9d1acce8816dedee94f735eac6395808b3483c6d6"
|
||||
checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2620,10 +2585,10 @@ version = "3.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea3cee93715c2e266b9338b7544da68a9f24e227722ba482bd1c024367c77c65"
|
||||
dependencies = [
|
||||
"darling 0.20.3",
|
||||
"darling",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2751,9 +2716,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.23"
|
||||
version = "2.0.29"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737"
|
||||
checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -2795,22 +2760,22 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.40"
|
||||
version = "1.0.47"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
|
||||
checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.40"
|
||||
version = "1.0.47"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
|
||||
checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3074,7 +3039,7 @@ dependencies = [
|
||||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
@@ -3108,7 +3073,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.23",
|
||||
"syn 2.0.29",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
@@ -13,19 +13,19 @@ lazy_static = "1.4.0"
|
||||
anyhow = "1.0.75"
|
||||
actix-web = "4.3.1"
|
||||
actix-cors = "0.6.4"
|
||||
actix-multipart = "0.6.0"
|
||||
actix-multipart = "0.6.1"
|
||||
actix-remote-ip = "0.1.0"
|
||||
futures-util = "0.3.28"
|
||||
diesel = { version = "2.0.4", features = ["postgres"] }
|
||||
serde = { version = "1.0.163", features = ["derive"] }
|
||||
serde = { version = "1.0.188", features = ["derive"] }
|
||||
serde_json = "1.0.96"
|
||||
mailchecker = "5.0.9"
|
||||
redis = "0.23.2"
|
||||
redis = "0.23.3"
|
||||
lettre = "0.10.4"
|
||||
rand = "0.8.5"
|
||||
bcrypt = "0.15.0"
|
||||
light-openid = "1.0.1"
|
||||
thiserror = "1.0.40"
|
||||
thiserror = "1.0.47"
|
||||
serde_with = "3.1.0"
|
||||
rust_iso3166 = "0.1.10"
|
||||
rust-s3 = "0.33.0"
|
||||
|
||||
@@ -103,8 +103,29 @@ fn check_opt_str_val(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn trim_opt_val(val: &mut Option<String>) {
|
||||
if let Some(s) = val {
|
||||
*val = Some(s.trim().to_string());
|
||||
}
|
||||
|
||||
if val.as_deref() == Some("") {
|
||||
*val = None;
|
||||
}
|
||||
}
|
||||
|
||||
impl MemberRequest {
|
||||
pub async fn to_member(self, member: &mut Member) -> anyhow::Result<()> {
|
||||
pub async fn to_member(mut self, member: &mut Member) -> anyhow::Result<()> {
|
||||
// Trim values before processing
|
||||
trim_opt_val(&mut self.first_name);
|
||||
trim_opt_val(&mut self.last_name);
|
||||
trim_opt_val(&mut self.birth_last_name);
|
||||
trim_opt_val(&mut self.email);
|
||||
trim_opt_val(&mut self.country);
|
||||
trim_opt_val(&mut self.address);
|
||||
trim_opt_val(&mut self.city);
|
||||
trim_opt_val(&mut self.note);
|
||||
trim_opt_val(&mut self.phone);
|
||||
|
||||
let c = StaticConstraints::default();
|
||||
check_opt_str_val(
|
||||
&self.first_name,
|
||||
|
||||
@@ -6,6 +6,7 @@ diesel::table! {
|
||||
family_id -> Int4,
|
||||
wife -> Nullable<Int4>,
|
||||
husband -> Nullable<Int4>,
|
||||
#[max_length = 1]
|
||||
state -> Nullable<Varchar>,
|
||||
photo_id -> Nullable<Int4>,
|
||||
time_create -> Int8,
|
||||
@@ -23,7 +24,9 @@ diesel::table! {
|
||||
families (id) {
|
||||
id -> Int4,
|
||||
time_create -> Int8,
|
||||
#[max_length = 30]
|
||||
name -> Varchar,
|
||||
#[max_length = 7]
|
||||
invitation_code -> Varchar,
|
||||
disable_couple_photos -> Bool,
|
||||
}
|
||||
@@ -33,16 +36,26 @@ diesel::table! {
|
||||
members (id) {
|
||||
id -> Int4,
|
||||
family_id -> Int4,
|
||||
#[max_length = 30]
|
||||
first_name -> Nullable<Varchar>,
|
||||
#[max_length = 30]
|
||||
last_name -> Nullable<Varchar>,
|
||||
#[max_length = 30]
|
||||
birth_last_name -> Nullable<Varchar>,
|
||||
photo_id -> Nullable<Int4>,
|
||||
#[max_length = 255]
|
||||
email -> Nullable<Varchar>,
|
||||
#[max_length = 30]
|
||||
phone -> Nullable<Varchar>,
|
||||
#[max_length = 155]
|
||||
address -> Nullable<Varchar>,
|
||||
#[max_length = 150]
|
||||
city -> Nullable<Varchar>,
|
||||
#[max_length = 12]
|
||||
postal_code -> Nullable<Varchar>,
|
||||
#[max_length = 2]
|
||||
country -> Nullable<Varchar>,
|
||||
#[max_length = 1]
|
||||
sex -> Nullable<Varchar>,
|
||||
time_create -> Int8,
|
||||
time_update -> Int8,
|
||||
@@ -71,11 +84,15 @@ diesel::table! {
|
||||
diesel::table! {
|
||||
photos (id) {
|
||||
id -> Int4,
|
||||
#[max_length = 36]
|
||||
file_id -> Varchar,
|
||||
time_create -> Int8,
|
||||
#[max_length = 150]
|
||||
mime_type -> Varchar,
|
||||
#[max_length = 130]
|
||||
sha512 -> Varchar,
|
||||
file_size -> Int4,
|
||||
#[max_length = 130]
|
||||
thumb_sha512 -> Varchar,
|
||||
}
|
||||
}
|
||||
@@ -83,12 +100,16 @@ diesel::table! {
|
||||
diesel::table! {
|
||||
users (id) {
|
||||
id -> Int4,
|
||||
#[max_length = 30]
|
||||
name -> Varchar,
|
||||
#[max_length = 255]
|
||||
email -> Varchar,
|
||||
password -> Nullable<Varchar>,
|
||||
time_create -> Int8,
|
||||
#[max_length = 150]
|
||||
reset_password_token -> Nullable<Varchar>,
|
||||
time_gen_reset_token -> Int8,
|
||||
#[max_length = 150]
|
||||
delete_account_token -> Nullable<Varchar>,
|
||||
time_gen_delete_account_token -> Int8,
|
||||
time_activate -> Int8,
|
||||
|
||||
Reference in New Issue
Block a user