Merge branch 'dev/tabulator-bugfix' into 'develop'

Dev/tabulator bugfix

See merge request easy-solutions/apps/easyportal!43
This commit is contained in:
Charles-Edouard MARGUERITE 2026-03-03 14:06:55 +00:00
commit 91f3e06dd5
9 changed files with 34 additions and 25 deletions

View File

@ -1,7 +1,7 @@
import {Controller} from '@hotwired/stimulus' import {Controller} from '@hotwired/stimulus'
// Important: include a build with Ajax + pagination (TabulatorFull is simplest) // Important: include a build with Ajax + pagination (TabulatorFull is simplest)
import {TabulatorFull as Tabulator} from 'tabulator-tables'; import {TabulatorFull as Tabulator} from 'tabulator-tables';
import {eyeIconLink, TABULATOR_FR_LANG} from "../js/global.js"; import {capitalizeFirstLetter, eyeIconLink, TABULATOR_FR_LANG} from "../js/global.js";
import { Modal } from "bootstrap"; import { Modal } from "bootstrap";
export default class extends Controller { export default class extends Controller {
@ -197,6 +197,7 @@ export default class extends Controller {
if (this.currentOrgId) { if (this.currentOrgId) {
formData.append('_method', 'PUT'); formData.append('_method', 'PUT');
} }
formData.set('name', capitalizeFirstLetter(formData.get('name')));
try { try {
const response = await fetch(url, { const response = await fetch(url, {

View File

@ -7,7 +7,8 @@ import {
eyeIconLink, eyeIconLink,
sendEmailIcon, sendEmailIcon,
TABULATOR_FR_LANG, TABULATOR_FR_LANG,
trashIconForm trashIconForm,
capitalizeFirstLetter
} from "../js/global.js"; } from "../js/global.js";
import { Modal } from "bootstrap"; import { Modal } from "bootstrap";
import base_controller from "./base_controller.js"; import base_controller from "./base_controller.js";
@ -161,8 +162,8 @@ export default class extends base_controller {
return wrapper; return wrapper;
}, },
}, },
{title: "<b>Nom</b>", field: "name", headerFilter: "input", widthGrow: 2, vertAlign: "middle"}, {title: "<b>Nom</b>", field: "surname", headerFilter: "input", widthGrow: 2, vertAlign: "middle"},
{title: "<b>Prénom</b>", field: "prenom", headerFilter: "input", widthGrow: 2, vertAlign: "middle"}, {title: "<b>Prénom</b>", field: "name", headerFilter: "input", widthGrow: 2, vertAlign: "middle"},
{title: "<b>Email</b>", field: "email", headerFilter: "input", widthGrow: 3, vertAlign: "middle"}, {title: "<b>Email</b>", field: "email", headerFilter: "input", widthGrow: 3, vertAlign: "middle"},
{ {
title: "<b>Statut</b>", field: "statut", vertAlign: "middle", title: "<b>Statut</b>", field: "statut", vertAlign: "middle",
@ -301,6 +302,7 @@ export default class extends base_controller {
// Add filters // Add filters
if (params.filter) { if (params.filter) {
params.filter.forEach(filter => { params.filter.forEach(filter => {
console.log("Adding filter to query:", filter.field, filter.value);
queryParams.append(`filter[${filter.field}]`, filter.value); queryParams.append(`filter[${filter.field}]`, filter.value);
}); });
} }
@ -639,8 +641,8 @@ export default class extends base_controller {
return wrapper; return wrapper;
}, },
}, },
{title: "<b>Nom</b>", field: "name", headerFilter: "input", widthGrow: 2, vertAlign: "middle"}, {title: "<b>Nom</b>", field: "surname", headerFilter: "input", widthGrow: 2, vertAlign: "middle"},
{title: "<b>Prénom</b>", field: "prenom", headerFilter: "input", widthGrow: 2, vertAlign: "middle"}, {title: "<b>Prénom</b>", field: "name", headerFilter: "input", widthGrow: 2, vertAlign: "middle"},
{title: "<b>Email</b>", field: "email", headerFilter: "input", widthGrow: 3, vertAlign: "middle"}, {title: "<b>Email</b>", field: "email", headerFilter: "input", widthGrow: 3, vertAlign: "middle"},
{ {
title: "<b>Statut</b>", field: "statut", vertAlign: "middle", title: "<b>Statut</b>", field: "statut", vertAlign: "middle",
@ -1032,6 +1034,7 @@ export default class extends base_controller {
const formData = new FormData(form); const formData = new FormData(form);
const ucSurname = formData.get('surname').toUpperCase(); const ucSurname = formData.get('surname').toUpperCase();
formData.set('surname', ucSurname); formData.set('surname', ucSurname);
formData.set('name', capitalizeFirstLetter(formData.get('name'))); // Capitalize first letter of name
try { try {
const response = await fetch('/user/new/ajax', { // Adjust path if prefix is different const response = await fetch('/user/new/ajax', { // Adjust path if prefix is different
@ -1101,6 +1104,7 @@ export default class extends base_controller {
// Force Uppercase on Surname as requested // Force Uppercase on Surname as requested
formData.set('surname', formData.get('surname').toUpperCase()); formData.set('surname', formData.get('surname').toUpperCase());
formData.set('name', capitalizeFirstLetter(formData.get('name'))); // Capitalize first letter of name
try { try {
const response = await fetch(`/user/edit/${this.currentUserId}/ajax`, { const response = await fetch(`/user/edit/${this.currentUserId}/ajax`, {

View File

@ -79,4 +79,8 @@ export function sendEmailIcon(userId, orgId) {
return `<a href="#" class="color-primary resend-invitation pt-3" data-id="${userId}" data-org-id="${orgId}" title="Renvoyer l'invitation" > return `<a href="#" class="color-primary resend-invitation pt-3" data-id="${userId}" data-org-id="${orgId}" title="Renvoyer l'invitation" >
<svg xmlns="http://www.w3.org/2000/svg" width="35px" height="35px" viewBox="0 0 24 24"><path fill="currentColor" d="M18.175 17H15q-.425 0-.712-.288T14 16t.288-.712T15 15h3.175l-.9-.9Q17 13.825 17 13.413t.3-.713q.275-.275.7-.275t.7.275l2.6 2.6q.125.125.2.312t.075.388t-.075.387t-.2.313l-2.6 2.6q-.275.275-.687.288T17.3 19.3q-.275-.275-.275-.7t.275-.7zM4 17q-.825 0-1.412-.587T2 15V5q0-.825.588-1.412T4 3h13q.825 0 1.413.588T19 5v4.075q0 .4-.3.7t-.7.3q-.425 0-.712-.288T17 9.076V6.4L10.4 11L4 6.425V15h7.075q.425 0 .713.288t.287.712t-.287.713t-.713.287zM5.45 5l4.95 3.55L15.5 5zM4 15V5z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" width="35px" height="35px" viewBox="0 0 24 24"><path fill="currentColor" d="M18.175 17H15q-.425 0-.712-.288T14 16t.288-.712T15 15h3.175l-.9-.9Q17 13.825 17 13.413t.3-.713q.275-.275.7-.275t.7.275l2.6 2.6q.125.125.2.312t.075.388t-.075.387t-.2.313l-2.6 2.6q-.275.275-.687.288T17.3 19.3q-.275-.275-.275-.7t.275-.7zM4 17q-.825 0-1.412-.587T2 15V5q0-.825.588-1.412T4 3h13q.825 0 1.413.588T19 5v4.075q0 .4-.3.7t-.7.3q-.425 0-.712-.288T17 9.076V6.4L10.4 11L4 6.425V15h7.075q.425 0 .713.288t.287.712t-.287.713t-.713.287zM5.45 5l4.95 3.55L15.5 5zM4 15V5z"/></svg>
</a>` </a>`
}
export function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
} }

View File

@ -107,7 +107,7 @@ class OrganizationController extends AbstractController
} }
$organization->setProjectPrefix($this->organizationsService->generateUniqueProjectPrefix()); $organization->setProjectPrefix($this->organizationsService->generateUniqueProjectPrefix());
$organization->setName(ucFirst($organization->getName()));
$this->entityManager->persist($organization); $this->entityManager->persist($organization);
$this->entityManager->flush(); $this->entityManager->flush();
@ -165,6 +165,7 @@ class OrganizationController extends AbstractController
if ($logoFile) { if ($logoFile) {
$this->organizationsService->handleLogo($organization, $logoFile); $this->organizationsService->handleLogo($organization, $logoFile);
} }
$organization->setName(ucFirst($organization->getName()));
$this->entityManager->persist($organization); $this->entityManager->persist($organization);
$this->entityManager->flush(); $this->entityManager->flush();
$this->actionService->createAction("Edit Organization", $actingUser, $organization, $organization->getName()); $this->actionService->createAction("Edit Organization", $actingUser, $organization, $organization->getName());

View File

@ -531,8 +531,8 @@ class UserController extends AbstractController
return [ return [
'id' => $user->getId(), 'id' => $user->getId(),
'pictureUrl' => $user->getPictureUrl(), 'pictureUrl' => $user->getPictureUrl(),
'name' => $user->getSurname(), 'surname' => $user->getSurname(),
'prenom' => $user->getName(), 'name' => $user->getName(),
'email' => $user->getEmail(), 'email' => $user->getEmail(),
'isConnected' => $this->userService->isUserConnected($user->getUserIdentifier()), 'isConnected' => $this->userService->isUserConnected($user->getUserIdentifier()),
'showUrl' => $this->generateUrl('user_show', ['id' => $user->getId()]), 'showUrl' => $this->generateUrl('user_show', ['id' => $user->getId()]),

View File

@ -39,7 +39,7 @@ class OrganizationsRepository extends ServiceEntityRepository
// 2. Filters // 2. Filters
if (!empty($filters['name'])) { if (!empty($filters['name'])) {
$qb->andWhere('o.name LIKE :name') $qb->andWhere('o.name LIKE :name')
->setParameter('name', '%' . strtolower($filters['name']) . '%'); ->setParameter('name', '%' . ucfirst($filters['name']) . '%');
} }
if (!empty($filters['email'])) { if (!empty($filters['email'])) {
$qb->andWhere('o.email LIKE :email') $qb->andWhere('o.email LIKE :email')

View File

@ -45,14 +45,13 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader
$qb = $this->createQueryBuilder('u') $qb = $this->createQueryBuilder('u')
->where('u.isDeleted = :del') ->where('u.isDeleted = :del')
->setParameter('del', false); ->setParameter('del', false);
if (!empty($filters['surname'])) {
if (!empty($filters['name'])) { $qb->andWhere('u.surname LIKE :surname')
$qb->andWhere('u.surname LIKE :name') ->setParameter('surname', '%' . strtoupper($filters['surname']) . '%');
->setParameter('name', '%' . strtolower($filters['name']) . '%');
} }
if (!empty($filters['prenom'])) { if (!empty($filters['name'])) {
$qb->andWhere('u.name LIKE :prenom') $qb->andWhere('u.name LIKE :name')
->setParameter('prenom', '%' . strtolower($filters['prenom']) . '%'); ->setParameter('name', '%' . ucFirst($filters['name']) . '%');
} }
if (!empty($filters['email'])) { if (!empty($filters['email'])) {
$qb->andWhere('u.email LIKE :email') $qb->andWhere('u.email LIKE :email')

View File

@ -58,13 +58,13 @@ class UsersOrganizationsRepository extends ServiceEntityRepository
->setParameter('org', $org); ->setParameter('org', $org);
// Apply filters // Apply filters
if (!empty($filters['name'])) { if (!empty($filters['surname'])) {
$qb->andWhere('u.surname LIKE :name') $qb->andWhere('u.surname LIKE :surname')
->setParameter('name', '%' . strtolower($filters['name']) . '%'); ->setParameter('surname', '%' . strtoupper($filters['surname']) . '%');
} }
if (!empty($filters['prenom'])) { if (!empty($filters['name'])) {
$qb->andWhere('u.name LIKE :prenom') $qb->andWhere('u.name LIKE :name')
->setParameter('prenom', '%' . strtolower($filters['prenom']) . '%'); ->setParameter('name', '%' . ucFirst($filters['name']) . '%');
} }
if (!empty($filters['email'])) { if (!empty($filters['email'])) {
$qb->andWhere('u.email LIKE :email') $qb->andWhere('u.email LIKE :email')

View File

@ -418,8 +418,8 @@ class UserService
} }
return [ return [
'pictureUrl' => $user->getPictureUrl(), 'pictureUrl' => $user->getPictureUrl(),
'name' => $user->getSurname(), 'surname' => $user->getSurname(),
'prenom' => $user->getName(), 'name' => $user->getName(),
'email' => $user->getEmail(), 'email' => $user->getEmail(),
'isConnected' => $this->isUserConnected($user->getUserIdentifier()), 'isConnected' => $this->isUserConnected($user->getUserIdentifier()),
'statut' => $statut, 'statut' => $statut,