[Classroom] Update UI when a classroom user is created

This commit is contained in:
Araozu 2023-10-04 17:49:37 -05:00
parent 746775b563
commit 968b69dfa6
6 changed files with 31 additions and 15 deletions

View File

@ -1,6 +1,6 @@
use crate::{
json_result::JsonResult,
model::classroom_user::{ClassroomPersonCreate, ClassroomCourseRegistration},
model::{classroom_user::{ClassroomPersonCreate, ClassroomCourseRegistration}, person::PersonLink},
online_classroom::{create_user::create, get_courses::ClassroomCourse},
};
use rocket::{http::Status, serde::json::Json};
@ -12,9 +12,9 @@ pub fn create_user_options() -> Status {
}
#[post("/classroom/user", format = "json", data = "<data>")]
pub async fn create_user(data: Json<ClassroomPersonCreate>) -> (Status, Json<JsonResult<()>>) {
pub async fn create_user(data: Json<ClassroomPersonCreate>) -> (Status, Json<JsonResult<PersonLink>>) {
match create(&data.0).await {
Ok(_) => return (Status::Ok, JsonResult::ok(())),
Ok(p) => return (Status::Ok, JsonResult::ok(p)),
Err(err) => return (Status::InternalServerError, JsonResult::err(err)),
}
}

View File

@ -64,7 +64,7 @@ impl PersonCreate {
}
}
#[derive(Deserialize)]
#[derive(Serialize, Deserialize)]
pub struct PersonLink {
pub person_id: i32,
pub person_classroom_id: i32,

View File

@ -5,7 +5,7 @@ use scraper::{Html, Selector};
const CREATION_ERR: &str = "Creation successful, but linking failed";
/// Creates an online classroom user
pub async fn create(data: &ClassroomPersonCreate) -> Result<(), String> {
pub async fn create(data: &ClassroomPersonCreate) -> Result<PersonLink, String> {
let sec_token = get_form_sec_token().await?;
let body = get_request_body(
@ -35,15 +35,14 @@ pub async fn create(data: &ClassroomPersonCreate) -> Result<(), String> {
))
})?;
let result = PersonLink {
let person_link = PersonLink {
person_id: data.person_id,
person_classroom_id: user_id,
}
.insert()
.await;
};
let result = person_link.insert().await;
match result {
Ok(_) => return Ok(()),
Ok(_) => return Ok(person_link),
Err(reason) => return Err(format!("{}: {}", CREATION_ERR, reason)),
}
}

View File

@ -27,7 +27,10 @@ export function ClassroomRegistration(props: {
userId={props.userId}
selections={selections()}
deleteRegister={(course_key) => setSelections((course) => course.filter((v) => v !== course_key))}
onSuccess={props.onSuccess}
onSuccess={() => {
setSelections([]);
props.onSuccess();
}}
/>
</div>
);

View File

@ -7,7 +7,12 @@ import { LoadingStatus, backend, useLoading, wait } from "../utils/functions";
import { JsonResult } from "../types/JsonResult";
import { LoadingIcon } from "../icons/LoadingIcon";
export function ClassroomUserCreation(props: {person: Person}) {
type PersonLink = {
person_id: number,
person_classroom_id: number,
};
export function ClassroomUserCreation(props: {person: Person, onCreate: (classroom_id: number) => void}) {
const [email, setEmail] = createSignal("yuli.palo.apaza@gmail.com");
const [username, setUsername] = createSignal("USERNAME");
const {setError, status, setStatus} = useLoading();
@ -37,7 +42,7 @@ export function ClassroomUserCreation(props: {person: Person}) {
if (import.meta.env.DEV) await wait(1500);
backend.post<JsonResult<null>>("/api/classroom/user", {
backend.post<JsonResult<PersonLink>>("/api/classroom/user", {
person_id: props.person.person_id,
person_names: names(),
person_surnames: surnames(),
@ -50,6 +55,7 @@ export function ClassroomUserCreation(props: {person: Person}) {
if (response.status === 200) {
alert("Usuario creado con éxito");
setStatus(LoadingStatus.Ok);
props.onCreate(response.data.Ok.person_classroom_id);
} else {
console.error(response.data);
setError(response.data.Err.reason);

View File

@ -22,6 +22,7 @@ export function OnlineClassroom() {
<ClassroomUser
person={person()!}
onLink={(classroom_id) => setPerson((p) => ({...p!, person_classroom_id: classroom_id}))}
onCreate={(classroom_id) => setPerson((p) => ({...p!, person_classroom_id: classroom_id}))}
/>
</Show>
<Show when={person() !== null && person()!.person_classroom_id !== null}>
@ -43,7 +44,11 @@ export function OnlineClassroom() {
function ClassroomUser(props: {person: Person, onLink: (classroom_id: number) => void,}) {
function ClassroomUser(props: {
person: Person,
onLink: (classroom_id: number) => void,
onCreate: (classroom_id: number) => void,
}) {
const [active, setActive] = createSignal<TabType>("Vinculate");
return (
@ -63,7 +68,10 @@ function ClassroomUser(props: {person: Person, onLink: (classroom_id: number) =>
/>
</Show>
<Show when={active() === "Create"}>
<ClassroomUserCreation person={props.person} />
<ClassroomUserCreation
person={props.person}
onCreate={props.onCreate}
/>
</Show>
</div>