diff --git a/app/Http/Controllers/AccountCountsController.php b/app/Http/Controllers/AccountCountsController.php index 8114d8da195555252a31d1ddda275d039389edbc..101a6fcca3182653785bb0dc3c9e397cb04aebd9 100644 --- a/app/Http/Controllers/AccountCountsController.php +++ b/app/Http/Controllers/AccountCountsController.php @@ -18,23 +18,7 @@ class AccountCountsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => AccountCount::with('transaction')->whereIn('id', $request->ids)->get()]; - } else { - $data = AccountCount::with('transaction') - ->orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, AccountCount::class); } /** @@ -121,6 +105,6 @@ class AccountCountsController extends Controller */ public function show($id) { - return ['data' => AccountCount::with('transaction')->findOrFail($id)]; + return ['data' => AccountCount::findOrFail($id)]; } } diff --git a/app/Http/Controllers/AccountsController.php b/app/Http/Controllers/AccountsController.php index 82c6d4b47b33c374f14e161d8a5d34f779e3353b..755cbb917abe2e648a97d6969eaa75028df6e1a3 100644 --- a/app/Http/Controllers/AccountsController.php +++ b/app/Http/Controllers/AccountsController.php @@ -14,22 +14,11 @@ class AccountsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Account::whereIn('id', $request->ids)->get()]; - } else { - $data = Account::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, Account::class, [ + "name" => "like:name", + "iban" => "like:iban", + "bic" => "like:bic" + ]); } /** diff --git a/app/Http/Controllers/ArchivedMembersController.php b/app/Http/Controllers/ArchivedMembersController.php index 60a151e2ec70af221864971baa0890161c08f56f..46046b7c0f51a1219325e6b33f8c731cb6391b00 100644 --- a/app/Http/Controllers/ArchivedMembersController.php +++ b/app/Http/Controllers/ArchivedMembersController.php @@ -14,30 +14,10 @@ class ArchivedMembersController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => ArchivedMember::whereIn('id', $request->ids)->get()]; - } else { - $data = ArchivedMember::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - if ($k == 'paid') { - if ($v) { - $data = $data->whereNotNull('transaction_id'); - } else { - $data = $data->whereNull('transaction_id'); - } - } else { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, ArchivedMember::class, [ + "person_id" => "equals:person_id", + "paid" => "has:transaction" + ]); } /** diff --git a/app/Http/Controllers/AutomatedTransactionsController.php b/app/Http/Controllers/AutomatedTransactionsController.php index c84b0d0ec5daba469ccb86aa27a71c4c528e7e03..e11e71b1b812bedf0c839d47f1d5126685cfcbd3 100644 --- a/app/Http/Controllers/AutomatedTransactionsController.php +++ b/app/Http/Controllers/AutomatedTransactionsController.php @@ -15,17 +15,13 @@ class AutomatedTransactionsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => AutomatedTransaction::whereIn('id', $request->ids)->get()]; - } else { - $data = AutomatedTransaction::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - return $data->paginate((int) $request->per_page); - } + return $this->commonIndex($request, AutomatedTransaction::class, [ + "name" => "like:name", + "account_id" => "equals:account_id", + "category_id" => "equals:category_id", + "user_id" => "equals:user_id", + "rectification" => "equals:rectification" + ]); } /** diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index a0a2a8a34a6221e4dceb24a759ed14e911f74c57..a0ede86fd6046cb54152a20dd5cf69a710cd3412 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -6,8 +6,67 @@ use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; + + private function getDefaultFilters() + { + return [ + "has" => function ($r, $a, $k, $v) { + return $v ? $r->has($a) : $r->doesntHave($a); + }, + "like" => function ($r, $a, $k, $v) { + return $r->where($a, 'like', '%' . $v . '%'); + }, + "equals" => function ($r, $a, $k, $v) { + return $r->where($a, '=', $v); + } + ]; + } + + protected function commonIndex(Request $request, $class, $filters = [], $with = null) + { + if (is_array($request->ids)) { + if ($with == null) { + return ["data" => $class::whereIn('id', $request->ids)->get()]; + } else { + return ["data" => $class::with($with)->whereIn('id', $request->ids)->get()]; + } + } else { + if ($with == null) { + $data = $class::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); + } else { + $data = $class::with($with)->orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); + } + + if (is_array($request->filter)) { + foreach ($request->filter as $k => $v) { + if (array_key_exists($k, $filters)) { + if (is_callable($filters[$k])) { + $data = $filters[$k]($data, $k, $v); + } else { + $args = explode(":", $filters[$k], 2); + if (count($args) != 2 || !array_key_exists($args[0], $this->getDefaultFilters())) { + abort(500); + } else { + $data = $this->getDefaultFilters()[$args[0]]($data, $args[1], $k, $v); + } + } + } else { + abort(400); + } + } + } + if (!is_null($request->per_page)) { + $data = $data->paginate((int) $request->per_page); + } else { + $data = ["data" => $data->get(), "total" => $data->count()]; + } + return $data; + } + } } diff --git a/app/Http/Controllers/MembersController.php b/app/Http/Controllers/MembersController.php index c83124edac84846cbaddc015cba35c0d425926c6..e1b02ca2af8d7b58bbd394f74ec40c73cd5a0fe0 100644 --- a/app/Http/Controllers/MembersController.php +++ b/app/Http/Controllers/MembersController.php @@ -16,30 +16,10 @@ class MembersController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Member::whereIn('id', $request->ids)->get()]; - } else { - $data = Member::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - if ($k == 'paid') { - if ($v) { - $data = $data->whereNotNull('transaction_id'); - } else { - $data = $data->whereNull('transaction_id'); - } - } else { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, Member::class, [ + "person_id" => "equals:person_id", + "paid" => "has:transaction" + ]); } /** diff --git a/app/Http/Controllers/MovementsController.php b/app/Http/Controllers/MovementsController.php index 59d95a38aca83a0b804272b2ef6d88cb01b86582..3dbde3602632dc63c6bee55f21a87d426a8f70df 100644 --- a/app/Http/Controllers/MovementsController.php +++ b/app/Http/Controllers/MovementsController.php @@ -15,22 +15,11 @@ class MovementsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Movement::whereIn('id', $request->ids)->get()]; - } else { - $data = Movement::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, Movement::class, [ + 'name' => "like:name", + 'rectification' => "equals:rectification", + 'user_id' => "equals:user_id" + ], 'products'); } /** @@ -41,7 +30,7 @@ class MovementsController extends Controller */ public function show($id) { - return ['data' => Movement::with(['products', 'products.product'])->findOrFail($id)]; + return ['data' => Movement::with(['products'])->findOrFail($id)]; } public function store(Request $request) diff --git a/app/Http/Controllers/PeopleController.php b/app/Http/Controllers/PeopleController.php index 1a8dd241a7ec604788ac75486807ef53c7163112..b00a19bdd089b4bf5bad3d994ef40d309d3b0496 100644 --- a/app/Http/Controllers/PeopleController.php +++ b/app/Http/Controllers/PeopleController.php @@ -16,43 +16,22 @@ class PeopleController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Person::whereIn('id', $request->ids)->get()]; - } else { - $data = Person::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - if ($k == 'fullname') { - $data = $data->where(DB::raw("CONCAT(`firstname`, ' ', `lastname`)"), 'like', '%' . $v . '%'); - } elseif ($k == 'is_member') { - if ($v) { - $data = $data->has('member'); - } else { - $data = $data->doesntHave('member'); - } - } elseif ($k == 'has_account') { - if ($v) { - $data = $data->has('personal_account'); - } else { - $data = $data->doesntHave('personal_account'); - } - } else { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, Person::class, [ + "fullname" => function ($r, $k, $v) { + return $r->where(DB::raw("CONCAT(`firstname`, ' ', `lastname`)"), 'like', '%' . $v . '%'); + }, + "is_member" => "has:member", + "has_account" => "has:personal_account", + "has_users" => "has:users", + "firstname" => "like:firstname", + "lastname" => "like:lastname", + "discord_id" => "equals:discord_id" + ]); } /** * Store a newly created resource in storage. - * + *I * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ diff --git a/app/Http/Controllers/PersonalAccountsController.php b/app/Http/Controllers/PersonalAccountsController.php index b71161e0015c4e376edb6ae1ba2dae4349235b56..c9b15b15fafa8462b5c172849f6b0710e984baa9 100644 --- a/app/Http/Controllers/PersonalAccountsController.php +++ b/app/Http/Controllers/PersonalAccountsController.php @@ -20,29 +20,9 @@ class PersonalAccountsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => PersonalAccount::with('person')->whereIn('id', $request->ids)->get()]; - } else { - $data = PersonalAccount::with('person')->orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - if ($k == 'fullname') { - $data->whereHas('person', function ($query) use ($v) { - // Todo: create a view ? - $query->where(DB::raw('CONCAT(firstname, " ", lastname)'), 'like', '%' . $v . '%'); - }); - } else { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, PersonalAccount::class, [ + 'person_id' => "equals:person_id" + ]); } /** diff --git a/app/Http/Controllers/PersonalTransactionsController.php b/app/Http/Controllers/PersonalTransactionsController.php index 77f9952a574d3aa6ee9c134ec4886021d05743ac..49b6a8ae460532af5a095eb24f8adc7c1b60837c 100644 --- a/app/Http/Controllers/PersonalTransactionsController.php +++ b/app/Http/Controllers/PersonalTransactionsController.php @@ -14,22 +14,10 @@ class PersonalTransactionsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => PersonalTransaction::whereIn('id', $request->ids)->get()]; - } else { - $data = PersonalTransaction::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, PersonalTransaction::class, [ + 'user_id' => "equals:user_id", + 'personal_account_id' => "equals:personal_account_id" + ]); } /** diff --git a/app/Http/Controllers/ProductCategoriesController.php b/app/Http/Controllers/ProductCategoriesController.php index 14e71b3dd614661b721fb616df8cce75d5d63e29..f8bc948dea38b684e27fc1cc2d9d225655db79a8 100644 --- a/app/Http/Controllers/ProductCategoriesController.php +++ b/app/Http/Controllers/ProductCategoriesController.php @@ -14,22 +14,9 @@ class ProductCategoriesController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => ProductCategory::whereIn('id', $request->ids)->get()]; - } else { - $data = ProductCategory::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, ProductCategory::class, [ + 'name' => "like:name" + ]); } /** diff --git a/app/Http/Controllers/ProductCountsController.php b/app/Http/Controllers/ProductCountsController.php index a05fe65a7a68b53a19d05999987643bb8c2ee913..ec5a11496d35255609ef6ff25df4e7e5089631c9 100644 --- a/app/Http/Controllers/ProductCountsController.php +++ b/app/Http/Controllers/ProductCountsController.php @@ -18,22 +18,7 @@ class ProductCountsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => ProductCount::with('movement')->whereIn('id', $request->ids)->get()]; - } else { - $data = ProductCount::with('movement')->orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, ProductCount::class); } /** diff --git a/app/Http/Controllers/ProductsController.php b/app/Http/Controllers/ProductsController.php index 190fb2289b5d44746eb8515702d7d2a118d4626e..222dff5e839ed0e0d62c039a1ddd09ddeb98ec22 100644 --- a/app/Http/Controllers/ProductsController.php +++ b/app/Http/Controllers/ProductsController.php @@ -14,30 +14,13 @@ class ProductsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Product::whereIn('id', $request->ids)->get()]; - } else { - $data = Product::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - if ($k == "alerts") { - if ($v) { - $data = $data->whereColumn('count', '<', 'alert_level'); - } else { - $data = $data->whereColumn('count', '>=', 'alert_level'); - } - } else { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; + return $this->commonIndex($request, Product::class, [ + 'name' => 'like:name', + 'category_id' => 'equals:category_id', + 'alerts' => function ($r, $k, $v) { + return $r->whereColumn('count', $v ? '<' : '>=', 'alert_level'); } - return $data; - } + ]); } /** diff --git a/app/Http/Controllers/PurchasesController.php b/app/Http/Controllers/PurchasesController.php index b4a266c748f085288ab5b05bd34eff7faf537661..9fa1b20c0a22eb2b7ea519cdd29c5c3cc7ce9c18 100644 --- a/app/Http/Controllers/PurchasesController.php +++ b/app/Http/Controllers/PurchasesController.php @@ -18,22 +18,9 @@ class PurchasesController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Purchase::with('transaction')->whereIn('id', $request->ids)->get()]; - } else { - $data = Purchase::with('transaction')->orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, Purchase::class, [ + 'name' => 'like:name' + ]); } /** @@ -117,8 +104,6 @@ class PurchasesController extends Controller */ public function show($id) { - return ['data' => Purchase::with( - ['movement', 'movement.products', 'movement.products.product', 'transaction'] - )->findOrFail($id)]; + return ['data' => Purchase::findOrFail($id)]; } } diff --git a/app/Http/Controllers/SalesController.php b/app/Http/Controllers/SalesController.php index aa6e012f1aa381c0782f9ebfe7ce5ab32c44bb55..2b3e0ac9e3436508fd14905e929e13886ca3de51 100644 --- a/app/Http/Controllers/SalesController.php +++ b/app/Http/Controllers/SalesController.php @@ -22,22 +22,7 @@ class SalesController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Sale::with('transaction')->whereIn('id', $request->ids)->get()]; - } else { - $data = Sale::with('transaction')->orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, Sale::class); } private function calculatePrice($products) @@ -174,8 +159,6 @@ class SalesController extends Controller */ public function show($id) { - return ['data' => Sale::with( - ['movement', 'movement.products', 'movement.products.product', 'transaction'] - )->findOrFail($id)]; + return ['data' => Sale::findOrFail($id)]; } } diff --git a/app/Http/Controllers/TransactionCategoriesController.php b/app/Http/Controllers/TransactionCategoriesController.php index 7e61e4dc98b5bf0ff01e3b1cbbd6a167d58b34e0..a70cd2b0505c7dfd4c14400c8e7b7a25a7ef5261 100644 --- a/app/Http/Controllers/TransactionCategoriesController.php +++ b/app/Http/Controllers/TransactionCategoriesController.php @@ -14,22 +14,9 @@ class TransactionCategoriesController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => TransactionCategory::whereIn('id', $request->ids)->get()]; - } else { - $data = TransactionCategory::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, TransactionCategory::class, [ + 'name' => "like:name" + ]); } /** diff --git a/app/Http/Controllers/TransactionsController.php b/app/Http/Controllers/TransactionsController.php index d449907aca0c46dce94c7ab7ec3f54c2784ba876..4d09b503316c1250ebbb2fade39aa252715e6bd9 100644 --- a/app/Http/Controllers/TransactionsController.php +++ b/app/Http/Controllers/TransactionsController.php @@ -14,22 +14,13 @@ class TransactionsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Transaction::whereIn('id', $request->ids)->get()]; - } else { - $data = Transaction::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, Transaction::class, [ + 'name' => "like:name", + 'rectification' => 'equals:rectification', + 'user_id' => 'equals:user_id', + 'account_id' => 'equals:account_id', + 'category_id' => 'equals:category_id' + ]); } /** diff --git a/app/Http/Controllers/TransfertsController.php b/app/Http/Controllers/TransfertsController.php index fd659c9daa1b22b132e39315538ef179cf6ae802..81d724cc68b98ee2c7baf444b942efc3fca40dc7 100644 --- a/app/Http/Controllers/TransfertsController.php +++ b/app/Http/Controllers/TransfertsController.php @@ -17,24 +17,7 @@ class TransfertsController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => Transfert::with(['sub_transaction', 'add_transaction']) - ->whereIn('id', $request->ids)->get()]; - } else { - $data = Transfert::with(['sub_transaction', 'add_transaction']) - ->orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, Transfert::class); } /** diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 521e6b5ea21d971c202d62d65743f9e32d53057e..4b12343777ef390dc54d242902a9cd6d99a87710 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -20,22 +20,11 @@ class UsersController extends Controller */ public function index(Request $request) { - if (is_array($request->ids)) { - return ["data" => User::with("person")->whereIn('id', $request->ids)->get()]; - } else { - $data = User::orderBy($request->order_by ?? 'id', $request->order_sort ?? 'asc'); - if (is_array($request->filter)) { - foreach ($request->filter as $k => $v) { - $data = $data->where($k, 'like', '%' . $v . '%'); - } - } - if (!is_null($request->per_page)) { - $data = $data->paginate((int) $request->per_page); - } else { - $data = ["data" => $data->get(), "total" => $data->count()]; - } - return $data; - } + return $this->commonIndex($request, User::class, [ + 'username' => "like:username", + 'email' => "like:email", + 'person_id' => 'equals:person_id' + ]); } /** diff --git a/app/Models/ArchivedMember.php b/app/Models/ArchivedMember.php index 2dba855263894018ac4d4989c6e6e6906a514f62..fb9c8dcb7435a5f7b9a2ca02cded8254dd3b47b3 100644 --- a/app/Models/ArchivedMember.php +++ b/app/Models/ArchivedMember.php @@ -32,4 +32,9 @@ class ArchivedMember extends Model { return ($this->year - 1) . '/' . ($this->year); } + + public function transaction() + { + return $this->belongsTo(Transaction::class); + } } diff --git a/composer.json b/composer.json index 8f6f0df24e3831ace5a0e07496740ff5fb96b0fb..d2c083d0b53eb441e775826f1f646f3f3b10d95e 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "type": "project", "description": "Management of stocks, member, accounting, sales, ...", "license": "AGPL-3.0-or-later", - "version": "1.8.2", + "version": "1.9.0", "require": { "php": "^7.3|^8.0", "doctrine/dbal": "^3.1", diff --git a/package.json b/package.json index 57960678c36c59435cdbd7cb061b1de306a7e86b..1ddc4995b9ad0f460c90d7b9dd952c0e02668424 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ }, "name": "seb", "description": "Management of stocks, member, accounting, sales, ...", - "version": "1.8.2", + "version": "1.9.0", "main": "webpack.mix.js", "directories": { "test": "tests" diff --git a/resources/js/src/components/DateTimeInput.js b/resources/js/src/components/DateTimeInput.js index c833163cda73d2a757245aae13f8bccc20b00fde..9c54f07542c7f2a7d60eaa3cdd01720fdf87d190 100644 --- a/resources/js/src/components/DateTimeInput.js +++ b/resources/js/src/components/DateTimeInput.js @@ -54,7 +54,6 @@ const Picker = ({ PickerComponent, ...fieldProps }) => { providerOptions, disabled, } = fieldProps; - console.log(fieldProps); const { input, meta } = useInput({ source }); diff --git a/resources/js/src/components/MultiProductCountInput.js b/resources/js/src/components/MultiProductCountInput.js index 43a623e9b8807314b4bb7aacb0417fd2c068e627..3093c687719bb8e182ed1e7ae3cd3ead079b0900 100644 --- a/resources/js/src/components/MultiProductCountInput.js +++ b/resources/js/src/components/MultiProductCountInput.js @@ -61,7 +61,7 @@ const MultiProductCountItem = ({ product, filterCategory, filterName, countZero, : ''} <Grid container style={{ justifyContent: "center" }}> <Grid item className={classes.rows}> - <IconButton aria-label="sub" onClick={(e) => { addCount(e.shiftKey ? -10 : -1) }}> + <IconButton aria-label="sub" onClick={(e) => { addCount(e.shiftKey ? -10 : -1) }} tabIndex="-1"> <RemoveIcon /> </IconButton> </Grid> @@ -91,7 +91,7 @@ const MultiProductCountItem = ({ product, filterCategory, filterName, countZero, </Grid> </Grid> <Grid item className={classes.rows}> - <IconButton aria-label="add" onClick={(e) => { addCount(e.shiftKey ? 10 : 1) }}> + <IconButton aria-label="add" onClick={(e) => { addCount(e.shiftKey ? 10 : 1) }} tabIndex="-1"> <AddIcon /> </IconButton> </Grid> @@ -201,7 +201,7 @@ const MultiProductCountInput = ({ total, children, countZero, onlysalable, price <Button color="primary" startIcon={<ClearIcon />} onClick={() => doRefresh(prev => prev + 1)}>{translate('actions.clear')}</Button> </Grid> </Grid> - <Grid container item xs={12} spacing={2} style={{ height: 'calc(100vh - 420px)', overflowY: 'scroll', width: 'auto', margin: '0' }}> + <Grid container item xs={12} spacing={2} style={{ height: 'calc(100vh - 420px)', minHeight: '400px', overflowY: 'scroll', width: 'auto', margin: '0' }}> {products_data.map((val, key) => { if (!onlysalable || onlysalable && val.salable) return React.cloneElement(React.Children.only(children), { key: key, product: val, refresh: refresh, filterCategory: filterCategory, filterName: filterName, updatePrice: updatePrice, countZero: countZero }); diff --git a/resources/js/src/layout/Menu.js b/resources/js/src/layout/Menu.js index 619279afb6144a43c6715e183661b60ced210ea9..882288fee71e35f487b37d39573ca2795f811794 100644 --- a/resources/js/src/layout/Menu.js +++ b/resources/js/src/layout/Menu.js @@ -131,7 +131,7 @@ const Menu = ({ onMenuClick, logout }) => { <Accordeon open={false} title={translate('menu.left.archives')} permissions={["archived_members.show"]}> <Item to="/archived_members" permissions="archived_members.show" primaryText={translate('menu.left.archived_members')} leftIcon={<GroupIcon />} /> </Accordeon> - {isXSmall && <Item to="/profile" primaryText={translate('menu.left.logout')} leftIcon={<AccountCircleIcon />} />} + {isXSmall && <Item to="/profile" primaryText={translate('menu.left.profile')} leftIcon={<AccountCircleIcon />} />} {isXSmall && logout} </> ); diff --git a/resources/js/src/providers/I18nProvider.js b/resources/js/src/providers/I18nProvider.js index 45a0df6bcfec4d186bf38913eb156b1fa8a6e58c..c26501a817091386c765cc1850b978c9208584e9 100644 --- a/resources/js/src/providers/I18nProvider.js +++ b/resources/js/src/providers/I18nProvider.js @@ -222,7 +222,7 @@ const messages = { user_id: 'Créateur', created_at: 'Créé le', updated_at: 'Modifié le', - product_id: '#', + product_id: 'Produit', 'product.name': 'Nom', count: 'Différence', products: 'Produits', @@ -331,10 +331,8 @@ const messages = { movement_id: 'Mouvement', transaction_id: 'Transaction', 'movement.products': 'Produits', - product_id: '#', - 'product_id.name': 'Nom', - 'product.name': 'Nom', - count: 'Nombre' + product_id: 'Produit', + count: 'Différence' } }, purchases: { @@ -350,9 +348,8 @@ const messages = { transaction_id: 'Transaction', 'movement_id.products': 'Produits', 'movement.products': 'Produits', - product_id: '#', - 'product.name': 'Nom', - count: 'Nombre', + product_id: 'Produit', + count: 'Différence', account_id: 'Compte', category_id: 'Catégorie', amount: 'Montant', diff --git a/resources/js/src/resources/Accounts.js b/resources/js/src/resources/Accounts.js index fee40fcb940d1ff979cf96de4f39512e28587ddf..dda930257cb8d824660e24e53ead914d6919fc55 100644 --- a/resources/js/src/resources/Accounts.js +++ b/resources/js/src/resources/Accounts.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { CreateButton, Datagrid, EditButton, ExportButton, FilterButton, List, SimpleForm, SimpleShowLayout, TextField, TextInput, TopToolbar } from 'react-admin'; +import { CreateButton, Datagrid, EditButton, ExportButton, FilterButton, List, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput, TopToolbar } from 'react-admin'; import DateField from '../components/DateField'; import DateInput from '../components/DateInput'; import { CreateDialog, EditDialog, ShowDialog } from '../components/DialogForm'; @@ -22,49 +23,60 @@ const AccountsListActions = ({ basePath, ...props }) => ( </TopToolbar> ); -const Accounts = (props) => ( - <> - <List {...props} filters={AccountsFilters} actions={<AccountsListActions />}> - <Datagrid> - <TextField source="id" /> - <TextField source="name" /> - <TextField source="iban" /> - <TextField source="bic" /> - <MoneyField noLabel={true} source="balance" /> - <EditButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="name" /> - <TextInput source="iban" /> - <TextInput source="bic" /> - </SimpleForm> - </CreateDialog> - <EditDialog {...props}> - <SimpleForm redirect="list"> - <TextInput disabled source="id" /> - <TextInput source="name" /> - <TextInput source="iban" /> - <TextInput source="bic" /> - <MoneyInput disabled source="balance" /> - <DateInput disabled source="created_at" /> - <DateInput disabled source="updated_at" /> - </SimpleForm> - </EditDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <TextField source="name" /> - <TextField source="iban" /> - <TextField source="bic" /> - <MoneyField source="balance" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const Accounts = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={AccountsFilters} actions={<AccountsListActions />}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <TextField source="name" /> + <TextField source="iban" /> + <TextField source="bic" /> + <MoneyField noLabel={true} source="balance" /> + <EditButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => record.name} + secondaryText={record => Number(record.balance).toLocaleString('fr-FR', { currency: "EUR", currencyDisplay: 'symbol', style: 'currency' })} + tertiaryText={record => "#" + record.id} + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="name" /> + <TextInput source="iban" /> + <TextInput source="bic" /> + </SimpleForm> + </CreateDialog> + <EditDialog {...props}> + <SimpleForm redirect="list"> + <TextInput disabled source="id" /> + <TextInput source="name" /> + <TextInput source="iban" /> + <TextInput source="bic" /> + <MoneyInput disabled source="balance" /> + <DateInput disabled source="created_at" /> + <DateInput disabled source="updated_at" /> + </SimpleForm> + </EditDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <TextField source="name" /> + <TextField source="iban" /> + <TextField source="bic" /> + <MoneyField source="balance" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: Accounts, diff --git a/resources/js/src/resources/AccountsCounts.js b/resources/js/src/resources/AccountsCounts.js index 7391960a6712d2781b499348bbc5093c6c5ff8e6..a78181a8340172d9a8bcc7ee5d34c0c8afa77283 100644 --- a/resources/js/src/resources/AccountsCounts.js +++ b/resources/js/src/resources/AccountsCounts.js @@ -1,6 +1,6 @@ -import { Table, TableBody, TableCell, TableRow } from '@material-ui/core'; +import { Table, TableBody, TableCell, TableRow, useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { Datagrid, Labeled, List, ReferenceField, ShowButton, SimpleShowLayout, TextField, useRecordContext, useTranslate } from 'react-admin'; +import { Datagrid, Labeled, List, ReferenceField, ShowButton, SimpleList, SimpleShowLayout, TextField, useRecordContext, useTranslate } from 'react-admin'; import DateField from '../components/DateField'; import { ShowDialog } from '../components/DialogForm'; import MoneyField from "../components/MoneyField"; @@ -46,46 +46,72 @@ const CountField = (props) => { </>); }; -const AccountsCounts = (props) => ( - <> - <List {...props} bulkActionButtons={false}> - <Datagrid> - <TextField source="id" /> - <TextField source="type" /> - <MoneyField noLabel={true} source="balance" /> - <ReferenceField source="transaction_id" reference="transactions" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="transaction.account_id" reference="accounts" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="transaction.user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <ShowButton /> - </Datagrid> - </List> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <TextField source="type" /> - <CountField source="data" /> - <ReferenceField source="transaction_id" reference="transactions" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="transaction.account_id" reference="accounts" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="transaction.user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const AccountsCounts = (props) => { + + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} bulkActionButtons={false}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <TextField source="type" /> + <MoneyField noLabel={true} source="balance" /> + <ReferenceField source="transaction_id" reference="transactions" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField label="Compte" source="transaction_id" reference="transactions" link={false}> + <ReferenceField source="account_id" reference="accounts" link="show"> + <TextField source="name" /> + </ReferenceField> + </ReferenceField> + <ReferenceField label="Créateur" source="transaction_id" reference="transactions" link={false}> + <ReferenceField source="user_id" reference="users" link="show"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <DateField source="created_at" /> + <ShowButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => + <ReferenceField record={record} label="Compte" source="transaction_id" reference="transactions" link={false}> + <ReferenceField source="account_id" reference="accounts" link={false}> + <TextField source="name" /> + </ReferenceField> + </ReferenceField>} + tertiaryText={record => Number(record.balance).toLocaleString('fr-FR', { currency: "EUR", currencyDisplay: 'symbol', style: 'currency' })} + secondaryText={record => new Date(record.created_at).toLocaleString()} + linkType="show" + /> + )} + </List> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <TextField source="type" /> + <CountField source="data" /> + <ReferenceField source="transaction_id" reference="transactions" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField label="Compte" source="transaction_id" reference="transactions" link="show"> + <ReferenceField source="account_id" reference="accounts" link="show"> + <TextField source="name" /> + </ReferenceField> + </ReferenceField> + <ReferenceField label="Créateur" source="transaction_id" reference="transactions" link="show"> + <ReferenceField source="user_id" reference="users" link="show"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: AccountsCounts, diff --git a/resources/js/src/resources/ArchivedMembers.js b/resources/js/src/resources/ArchivedMembers.js index d294af5b79bf9ec5ae9112b7aa8126669ed0b75c..6237962e43599664b2a32e4717b85e952db159d0 100644 --- a/resources/js/src/resources/ArchivedMembers.js +++ b/resources/js/src/resources/ArchivedMembers.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { AutocompleteInput, BooleanField, BooleanInput, Datagrid, ExportButton, FilterButton, FunctionField, List, ReferenceField, ReferenceInput, ShowButton, SimpleShowLayout, TextField, TopToolbar } from 'react-admin'; +import { AutocompleteInput, BooleanField, BooleanInput, Datagrid, ExportButton, FilterButton, FunctionField, List, ReferenceField, ReferenceInput, ShowButton, SimpleList, SimpleShowLayout, TextField, TopToolbar } from 'react-admin'; import DateField from '../components/DateField'; import { ShowDialog } from '../components/DialogForm'; @@ -17,39 +18,54 @@ const ArchivedMembersListActions = ({ basePath, ...props }) => ( </TopToolbar> ); -const ArchivedMembers = (props) => ( - <> - <List {...props} filters={ArchivedMembersFilters} bulkActionButtons={false} actions={<ArchivedMembersListActions />}> - <Datagrid> - <TextField source="id" /> - <ReferenceField source="person_id" reference="people" link="show" > - <FunctionField render={r => r.firstname + " " + r.lastname} /> - </ReferenceField> - <BooleanField source="paid" /> - <ReferenceField source="transaction_id" reference="transactions" link="show" > - <FunctionField render={r => "#" + r.id} /> - </ReferenceField> - <TextField source="school_year" /> - <ShowButton /> - </Datagrid> - </List> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <ReferenceField source="person_id" reference="people" link="show" > - <FunctionField render={r => r.firstname + " " + r.lastname} /> - </ReferenceField> - <BooleanField source="paid" /> - <ReferenceField source="transaction_id" reference="transactions" link="show" > - <FunctionField render={r => "#" + r.id} /> - </ReferenceField> - <TextField source="school_year" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const ArchivedMembers = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={ArchivedMembersFilters} bulkActionButtons={false} actions={<ArchivedMembersListActions />}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <ReferenceField source="person_id" reference="people" link="show" > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField> + <BooleanField source="paid" /> + <ReferenceField source="transaction_id" reference="transactions" link="show" > + <FunctionField render={r => "#" + r.id} /> + </ReferenceField> + <TextField source="school_year" /> + <ShowButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => + <ReferenceField record={record} source="person_id" reference="people" link={false} > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField>} + tertiaryText={record => <BooleanField record={record} source="paid" />} + secondaryText={record => record.school_year} + linkType="show" + /> + )} + </List> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <ReferenceField source="person_id" reference="people" link="show" > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField> + <BooleanField source="paid" /> + <ReferenceField source="transaction_id" reference="transactions" link="show" > + <FunctionField render={r => "#" + r.id} /> + </ReferenceField> + <TextField source="school_year" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: ArchivedMembers, diff --git a/resources/js/src/resources/AutomatedTransactions.js b/resources/js/src/resources/AutomatedTransactions.js index fac1a21146ca136fcc4f3d201fd7d49c982e9e2a..664d4d968e177bb5a861aee657a3ff577232d083 100644 --- a/resources/js/src/resources/AutomatedTransactions.js +++ b/resources/js/src/resources/AutomatedTransactions.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { AutocompleteInput, BooleanField, BooleanInput, Datagrid, DateInput, EditButton, List, NumberField, NumberInput, ReferenceField, ReferenceInput, SelectField, SelectInput, SimpleForm, SimpleShowLayout, TextField, TextInput, useTranslate } from 'react-admin'; +import { AutocompleteInput, BooleanField, BooleanInput, Datagrid, DateInput, EditButton, List, NumberField, NumberInput, ReferenceField, ReferenceInput, SelectField, SelectInput, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput, useTranslate } from 'react-admin'; import DateField from '../components/DateField'; import { CreateDialog, EditDialog, ShowDialog } from '../components/DialogForm'; import MoneyField from "../components/MoneyField"; @@ -21,9 +22,18 @@ const AutomatedTransactionsFilters = [ const AutomatedTransactions = (props) => { const translate = useTranslate(); + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + + const l = { + yearly: "année", + monthly: "mois", + weekly: "semaine" + } + return ( <> <List {...props} filters={AutomatedTransactionsFilters}> + {isDesktop ? ( <Datagrid> <TextField source="id" /> <TextField source="name" /> @@ -48,6 +58,13 @@ const AutomatedTransactions = (props) => { <DateField source="created_at" /> <EditButton /> </Datagrid> + ) : ( + <SimpleList + primaryText={record => record.name} + tertiaryText={record => Number(record.amount).toLocaleString('fr-FR', { currency: "EUR", currencyDisplay: 'symbol', style: 'currency' })} + secondaryText={record => record.frequency === 'dayly' ? 'Tous les jours' : `Le ${record.day} de chaque ${l[record.frequency]}`} + /> + )} </List> <CreateDialog {...props}> <SimpleForm redirect="list"> diff --git a/resources/js/src/resources/Members.js b/resources/js/src/resources/Members.js index 2df2c28a2db3d5a74b1d82a6a28f0870aa048f50..ac1721cbf20de435676ff7488ec8feea10fbc127 100644 --- a/resources/js/src/resources/Members.js +++ b/resources/js/src/resources/Members.js @@ -1,7 +1,8 @@ +import { useMediaQuery } from '@material-ui/core'; import AttachMoneyIcon from '@material-ui/icons/AttachMoney'; import * as React from "react"; import { Fragment } from 'react'; -import { AutocompleteInput, BooleanField, BooleanInput, BulkDeleteButton, BulkUpdateButton, CreateButton, Datagrid, EditButton, ExportButton, FilterButton, FunctionField, List, ReferenceField, ReferenceInput, SimpleForm, SimpleShowLayout, TextField, TextInput, TopToolbar, useTranslate } from 'react-admin'; +import { AutocompleteInput, BooleanField, BooleanInput, BulkDeleteButton, BulkUpdateButton, CreateButton, Datagrid, EditButton, ExportButton, FilterButton, FunctionField, List, ReferenceField, ReferenceInput, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput, TopToolbar, useTranslate } from 'react-admin'; import { ArchiveButton } from '../components/ArchiveButton'; import DateField from '../components/DateField'; import DateInput from '../components/DateInput'; @@ -33,53 +34,67 @@ const MembersBulkActionButtons = props => { ); }; -const Members = (props) => ( - <> - <List {...props} filters={MembersFilters} bulkActionButtons={<MembersBulkActionButtons />} actions={<MembersListActions />}> - <Datagrid> - <TextField source="id" /> - <ReferenceField source="person_id" reference="people" link="show" > - <FunctionField render={r => r.firstname + " " + r.lastname} /> - </ReferenceField> - <BooleanField source="paid" /> - <ReferenceField source="transaction_id" reference="transactions" link="show" > - <FunctionField render={r => "#" + r.id} /> - </ReferenceField> - <EditButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <ReferenceInput source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, is_member: false })}> - <AutocompleteInput optionText="fullname" /> - </ReferenceInput> - <BooleanInput source="paid" /> - </SimpleForm> - </CreateDialog> - <EditDialog {...props}> - <SimpleForm redirect="list"> - <TextInput disabled source="id" /> - <ReferenceField source="person_id" reference="people" > - <FunctionField render={r => r.firstname + " " + r.lastname} /> - </ReferenceField> - <BooleanInput source="paid" /> - <DateInput disabled source="created_at" /> - <DateInput disabled source="updated_at" /> - </SimpleForm> - </EditDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <ReferenceField source="person_id" reference="people" link="show" > - <FunctionField render={r => r.firstname + " " + r.lastname} /> - </ReferenceField> - <BooleanField source="paid" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const Members = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={MembersFilters} bulkActionButtons={<MembersBulkActionButtons />} actions={<MembersListActions />}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <ReferenceField source="person_id" reference="people" link="show" > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField> + <BooleanField source="paid" /> + <ReferenceField source="transaction_id" reference="transactions" link="show" > + <FunctionField render={r => "#" + r.id} /> + </ReferenceField> + <EditButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => + <ReferenceField record={record} source="person_id" reference="people" link={false} > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField>} + tertiaryText={record => <BooleanField record={record} source="paid" />} + linkType="show" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <ReferenceInput source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, is_member: false })}> + <AutocompleteInput optionText="fullname" /> + </ReferenceInput> + <BooleanInput source="paid" /> + </SimpleForm> + </CreateDialog> + <EditDialog {...props}> + <SimpleForm redirect="list"> + <TextInput disabled source="id" /> + <ReferenceField source="person_id" reference="people" > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField> + <BooleanInput source="paid" /> + <DateInput disabled source="created_at" /> + <DateInput disabled source="updated_at" /> + </SimpleForm> + </EditDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <ReferenceField source="person_id" reference="people" link="show" > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField> + <BooleanField source="paid" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: Members, diff --git a/resources/js/src/resources/Movements.js b/resources/js/src/resources/Movements.js index 55afd1b69b14da95b5734d225a48d35fee691733..64a6d662e5d29b03f3167972182b5055d2da4e19 100644 --- a/resources/js/src/resources/Movements.js +++ b/resources/js/src/resources/Movements.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import React from "react"; -import { ArrayField, ArrayInput, AutocompleteInput, BooleanField, BooleanInput, Datagrid, List, NumberInput, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleFormIterator, SimpleShowLayout, TextField, TextInput } from 'react-admin'; +import { ArrayField, ArrayInput, AutocompleteInput, BooleanField, BooleanInput, Datagrid, List, NumberInput, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleFormIterator, SimpleList, SimpleShowLayout, TextField, TextInput } from 'react-admin'; import DateField from '../components/DateField'; import { CreateDialog, ShowDialog } from '../components/DialogForm'; @@ -7,54 +8,67 @@ const MovementsFilters = [ <TextInput source="name" /> ]; -const Movements = (props) => ( - <> - <List {...props} filters={MovementsFilters} bulkActionButtons={false} > - <Datagrid> - <TextField source="id" /> - <TextField source="name" /> - <BooleanField source="rectification" /> - <ReferenceField source="user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <ShowButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="name" /> - <BooleanInput source="rectification" /> - <ArrayInput source="products"> - <SimpleFormIterator> - <ReferenceInput source="id" reference="products" filterToQuery={searchText => ({ name: searchText })}> - <AutocompleteInput optionText="name" /> - </ReferenceInput> - <NumberInput source="diff" /> - </SimpleFormIterator> - </ArrayInput> - </SimpleForm> - </CreateDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <TextField source="name" /> - <ArrayField source="products"> +const Movements = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={MovementsFilters} bulkActionButtons={false} > + {isDesktop ? ( <Datagrid> - <TextField source="product_id" /> - <TextField source="product.name" /> - <TextField source="count" /> + <TextField source="id" /> + <TextField source="name" /> + <BooleanField source="rectification" /> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + <DateField source="created_at" /> + <ShowButton /> </Datagrid> - </ArrayField> - <BooleanField source="rectification" /> - <ReferenceField source="user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); + ) : ( + <SimpleList + primaryText={record => record.name} + tertiaryText={record => "#" + record.id} + secondaryText={record => new Date(record.created_at).toLocaleString()} + linkType="show" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="name" /> + <BooleanInput source="rectification" /> + <ArrayInput source="products"> + <SimpleFormIterator> + <ReferenceInput source="id" reference="products" filterToQuery={searchText => ({ name: searchText })}> + <AutocompleteInput optionText="name" /> + </ReferenceInput> + <NumberInput source="diff" /> + </SimpleFormIterator> + </ArrayInput> + </SimpleForm> + </CreateDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <TextField source="name" /> + <ArrayField source="products" > + <Datagrid> + <ReferenceField source="product_id" reference="products" link="edit"> + <TextField source="name" /> + </ReferenceField> + <TextField source="count" /> + </Datagrid> + </ArrayField> + <BooleanField source="rectification" /> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + <DateField source="created_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: Movements, diff --git a/resources/js/src/resources/People.js b/resources/js/src/resources/People.js index 81501d7009f2c236a58e2fc3b5570dd2e443ff39..d7a24bc039672cd7ee89c94b190522a634444496 100644 --- a/resources/js/src/resources/People.js +++ b/resources/js/src/resources/People.js @@ -1,6 +1,7 @@ +import { useMediaQuery } from '@material-ui/core'; import GetAppIcon from '@material-ui/icons/GetApp'; import * as React from "react"; -import { Button, Datagrid, EditButton, List, SimpleForm, SimpleShowLayout, TextField, TextInput, useDataProvider, useNotify } from 'react-admin'; +import { Button, Datagrid, EditButton, List, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput, useDataProvider, useNotify } from 'react-admin'; import DateField from '../components/DateField'; import DateInput from '../components/DateInput'; import { CreateDialog, EditDialog, ShowDialog } from '../components/DialogForm'; @@ -31,12 +32,9 @@ const PeopleExportButton = ({ record, ...rest }) => { const notify = useNotify(); const onClick = () => { - console.log(record.id); dataProvider.export('people', { id: record.id }).then((response) => { download(JSON.stringify(response), "export.json", "application/json"); - notify('ra.notification.exported'); - console.log(response); }); } @@ -48,47 +46,54 @@ const PeopleExportButton = ({ record, ...rest }) => { ) }; -const People = (props) => ( - <> - <List {...props} filters={PeopleFilters}> - <Datagrid> - <TextField source="id" /> - <TextField source="firstname" /> - <TextField source="lastname" /> - <TextField source="discord_id" /> - <EditButton /> - <PeopleExportButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="firstname" /> - <TextInput source="lastname" /> - <TextInput source="discord_id" /> - </SimpleForm> - </CreateDialog> - <EditDialog {...props}> - <SimpleForm redirect="list"> - <TextInput disabled source="id" /> - <TextInput source="firstname" /> - <TextInput source="lastname" /> - <TextInput source="discord_id" /> - <DateInput disabled source="created_at" /> - <DateInput disabled source="updated_at" /> - </SimpleForm> - </EditDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <TextField source="firstname" /> - <TextField source="lastname" /> - <TextField source="discord_id" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const People = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={PeopleFilters}> + {isDesktop ? (<Datagrid> + <TextField source="id" /> + <TextField source="firstname" /> + <TextField source="lastname" /> + <TextField source="discord_id" /> + <EditButton /> + <PeopleExportButton /> + </Datagrid>) : (<SimpleList + primaryText={record => record.firstname + " " + record.lastname} + secondaryText={record => record.discord_id} + tertiaryText={record => "#" + record.id} + />)} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="firstname" /> + <TextInput source="lastname" /> + <TextInput source="discord_id" /> + </SimpleForm> + </CreateDialog> + <EditDialog {...props}> + <SimpleForm redirect="list"> + <TextInput disabled source="id" /> + <TextInput source="firstname" /> + <TextInput source="lastname" /> + <TextInput source="discord_id" /> + <DateInput disabled source="created_at" /> + <DateInput disabled source="updated_at" /> + </SimpleForm> + </EditDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <TextField source="firstname" /> + <TextField source="lastname" /> + <TextField source="discord_id" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: People, diff --git a/resources/js/src/resources/PersonalAccounts.js b/resources/js/src/resources/PersonalAccounts.js index a55ebfaeb8479f4913f99c210f6551f0d1ff575c..d326104340e93e12b13ba0217dc72c4615ce02fe 100644 --- a/resources/js/src/resources/PersonalAccounts.js +++ b/resources/js/src/resources/PersonalAccounts.js @@ -1,6 +1,7 @@ +import { useMediaQuery } from '@material-ui/core'; import AttachMoneyIcon from '@material-ui/icons/AttachMoney'; import * as React from "react"; -import { AutocompleteInput, Button, CreateButton, Datagrid, ExportButton, FilterButton, FunctionField, List, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleShowLayout, TextField, TopToolbar, useRedirect } from 'react-admin'; +import { AutocompleteInput, Button, CreateButton, Datagrid, ExportButton, FilterButton, FunctionField, List, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleList, SimpleShowLayout, TextField, TopToolbar, useRedirect } from 'react-admin'; import DateField from '../components/DateField'; import { CreateDialog, ShowDialog } from '../components/DialogForm'; import MoneyField from "../components/MoneyField"; @@ -30,39 +31,53 @@ const PersonalAccountsListActions = ({ basePath, ...props }) => { ); } -const PersonalAccounts = (props) => ( - <> - <List {...props} filters={PersonalAccountsFilters} actions={<PersonalAccountsListActions />}> - <Datagrid> - <TextField source="id" /> - <ReferenceField source="person_id" reference="people" link="show" > - <FunctionField render={r => r.firstname + " " + r.lastname} /> - </ReferenceField> - <MoneyField noLabel={true} source="balance" /> - <ShowButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <ReferenceInput source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, has_account: false })}> - <AutocompleteInput optionText="fullname" /> - </ReferenceInput> - <QRInput source="token" label="Scan Carte Étudiant" regexp="(?:https?:\/\/esc\.gg\/|core:\/\/)([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}).*" /> - </SimpleForm> - </CreateDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <ReferenceField source="person_id" reference="people" link="show" > - <FunctionField render={r => r.firstname + " " + r.lastname} /> - </ReferenceField> - <MoneyField noLabel={false} source="balance" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const PersonalAccounts = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={PersonalAccountsFilters} actions={<PersonalAccountsListActions />}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <ReferenceField source="person_id" reference="people" link="show" > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField> + <MoneyField noLabel={true} source="balance" /> + <ShowButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => + <ReferenceField record={record} source="person_id" reference="people" link={false} > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField>} + tertiaryText={record => Number(record.balance).toLocaleString('fr-FR', { currency: "EUR", currencyDisplay: 'symbol', style: 'currency' })} + linkType="show" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <ReferenceInput source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, has_account: false })}> + <AutocompleteInput optionText="fullname" /> + </ReferenceInput> + <QRInput source="token" label="Scan Carte Étudiant" regexp="(?:https?:\/\/esc\.gg\/|core:\/\/)([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}).*" /> + </SimpleForm> + </CreateDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <ReferenceField source="person_id" reference="people" link="show" > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField> + <MoneyField noLabel={false} source="balance" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: PersonalAccounts, diff --git a/resources/js/src/resources/PersonalTransactions.js b/resources/js/src/resources/PersonalTransactions.js index 020a04b077f8754a83aa5db2b2e6bb72d020a99a..e849fb46637b8fc7a46fe18c48e60a405d58e9df 100644 --- a/resources/js/src/resources/PersonalTransactions.js +++ b/resources/js/src/resources/PersonalTransactions.js @@ -1,56 +1,83 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { AutocompleteInput, Datagrid, List, ReferenceField, ReferenceInput, ShowButton, SimpleShowLayout, TextField } from 'react-admin'; +import { AutocompleteInput, Datagrid, List, ReferenceField, ReferenceInput, ShowButton, SimpleList, SimpleShowLayout, TextField } from 'react-admin'; import DateField from '../components/DateField'; import { ShowDialog } from '../components/DialogForm'; import MoneyField from "../components/MoneyField"; const PersonalTransactionsFilters = [ - <ReferenceInput source="personal_account_id" reference="personal_accounts" filterToQuery={searchText => ({ fullname: searchText })}> - <AutocompleteInput optionText="person.fullname" /> + <ReferenceInput source="personal_account_id" reference="personal_accounts"> + <ReferenceInput source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText })}> + <AutocompleteInput optionText="fullname" /> + </ReferenceInput> </ReferenceInput>, <ReferenceInput source="user_id" reference="users" filterToQuery={searchText => ({ username: searchText })}> <AutocompleteInput optionText="username" /> </ReferenceInput> ]; -const PersonalTransactions = (props) => ( - <> - <List {...props} filters={PersonalTransactionsFilters} bulkActionButtons={false}> - <Datagrid> - <TextField source="id" /> - <MoneyField noLabel={true} source="amount" /> - <ReferenceField source="transaction_id" reference="transactions" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="personal_account_id" reference="personal_accounts"> - <TextField source="person.fullname" /> - </ReferenceField> - <ReferenceField source="user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <ShowButton /> - </Datagrid> - </List> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <MoneyField source="amount" /> - <ReferenceField source="personal_account_id" reference="personal_accounts" link="show"> - <TextField source="person.fullname" /> - </ReferenceField> - <ReferenceField source="transaction_id" reference="transactions" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="user_id" reference="users" link="show"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const PersonalTransactions = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={PersonalTransactionsFilters} bulkActionButtons={false}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <MoneyField noLabel={true} source="amount" /> + <ReferenceField source="transaction_id" reference="transactions" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField source="personal_account_id" reference="personal_accounts" link={false}> + <ReferenceField source="person_id" reference="people" link="show"> + <TextField source="fullname" /> + </ReferenceField> + </ReferenceField> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + <DateField source="created_at" /> + <ShowButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => + <ReferenceField record={record} source="transaction_id" reference="transactions" link={false} > + <TextField source="name" /> + </ReferenceField>} + secondaryText={record => + <ReferenceField record={record} source="personal_account_id" reference="personal_accounts"> + <ReferenceField source="person_id" reference="people" link={false}> + <TextField source="fullname" /> + </ReferenceField> + </ReferenceField>} + tertiaryText={record => Number(record.amount).toLocaleString('fr-FR', { currency: "EUR", currencyDisplay: 'symbol', style: 'currency' })} + linkType="show" + /> + )} + </List> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <MoneyField source="amount" /> + <ReferenceField source="personal_account_id" reference="personal_accounts"> + <ReferenceField source="person_id" reference="people" link="show"> + <TextField source="fullname" /> + </ReferenceField> + </ReferenceField> + <ReferenceField source="transaction_id" reference="transactions" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField source="user_id" reference="users" link="show"> + <TextField source="username" /> + </ReferenceField> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: PersonalTransactions, diff --git a/resources/js/src/resources/Products.js b/resources/js/src/resources/Products.js index 03ab1436fdf4aa1e0f2b28278d177049e7db1715..e7a8bce36d57c4542ffd36ec42a4b552b0221a36 100644 --- a/resources/js/src/resources/Products.js +++ b/resources/js/src/resources/Products.js @@ -1,7 +1,8 @@ +import { useMediaQuery } from '@material-ui/core'; import RemoveShoppingCartIcon from '@material-ui/icons/RemoveShoppingCart'; import ShoppingCartIcon from '@material-ui/icons/ShoppingCart'; import * as React from "react"; -import { AutocompleteInput, BooleanField, BooleanInput, BulkDeleteButton, BulkUpdateButton, CreateButton, Datagrid, EditButton, ExportButton, FilterButton, List, NullableBooleanInput, NumberField, NumberInput, ReferenceField, ReferenceInput, SimpleForm, SimpleShowLayout, TextField, TextInput, TopToolbar, useTranslate } from 'react-admin'; +import { AutocompleteInput, BooleanField, BooleanInput, BulkDeleteButton, BulkUpdateButton, CreateButton, Datagrid, EditButton, ExportButton, FilterButton, List, NullableBooleanInput, NumberField, NumberInput, ReferenceField, ReferenceInput, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput, TopToolbar, useTranslate } from 'react-admin'; import DateField from '../components/DateField'; import DateInput from '../components/DateInput'; import { CreateDialog, EditDialog, ShowDialog } from '../components/DialogForm'; @@ -38,67 +39,82 @@ const ProductsBulkActionButtons = props => { ); }; -const Products = (props) => ( - <> - <List {...props} filters={ProductsFilters} bulkActionButtons={<ProductsBulkActionButtons />} actions={<ProductsListActions />}> - <Datagrid> - <TextField source="id" /> - <TextField source="name" /> - <ReferenceField source="category_id" reference="products_categories" > - <TextField source="name" /> - </ReferenceField> - <MoneyField noLabel={true} source="price" /> - <NumberField source="count" /> - <NumberField source="alert_level" /> - <BooleanField source="salable" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - <EditButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="name" /> - <ReferenceInput source="category_id" reference="products_categories" filterToQuery={searchText => ({ name: searchText })}> - <AutocompleteInput optionText="name" /> - </ReferenceInput> - <MoneyInput source="price" /> - <NumberInput source="alert_level" /> - <BooleanInput source="salable" defaultValue={true} /> - </SimpleForm> - </CreateDialog> - <EditDialog {...props}> - <SimpleForm redirect="list"> - <TextInput disabled source="id" /> - <TextInput source="name" /> - <ReferenceInput source="category_id" reference="products_categories" filterToQuery={searchText => ({ name: searchText })}> - <AutocompleteInput optionText="name" /> - </ReferenceInput> - <MoneyInput source="price" /> - <NumberInput disabled source="count" /> - <NumberInput source="alert_level" /> - <BooleanInput source="salable" /> - <DateInput disabled source="created_at" /> - <DateInput disabled source="updated_at" /> - </SimpleForm> - </EditDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <TextField source="name" /> - <ReferenceField source="category_id" reference="products_categories" > +const Products = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={ProductsFilters} bulkActionButtons={<ProductsBulkActionButtons />} actions={<ProductsListActions />}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <TextField source="name" /> + <ReferenceField source="category_id" reference="products_categories" > + <TextField source="name" /> + </ReferenceField> + <MoneyField noLabel={true} source="price" /> + <NumberField source="count" /> + <NumberField source="alert_level" /> + <BooleanField source="salable" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + <EditButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => record.name} + secondaryText={record => + <ReferenceField record={record} source="category_id" reference="products_categories" link={false}> + <TextField source="name" /> + </ReferenceField>} + tertiaryText={record => record.count} + linkType="edit" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="name" /> + <ReferenceInput source="category_id" reference="products_categories" filterToQuery={searchText => ({ name: searchText })}> + <AutocompleteInput optionText="name" /> + </ReferenceInput> + <MoneyInput source="price" /> + <NumberInput source="alert_level" /> + <BooleanInput source="salable" defaultValue={true} /> + </SimpleForm> + </CreateDialog> + <EditDialog {...props}> + <SimpleForm redirect="list"> + <TextInput disabled source="id" /> + <TextInput source="name" /> + <ReferenceInput source="category_id" reference="products_categories" filterToQuery={searchText => ({ name: searchText })}> + <AutocompleteInput optionText="name" /> + </ReferenceInput> + <MoneyInput source="price" /> + <NumberInput disabled source="count" /> + <NumberInput source="alert_level" /> + <BooleanInput source="salable" /> + <DateInput disabled source="created_at" /> + <DateInput disabled source="updated_at" /> + </SimpleForm> + </EditDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> <TextField source="name" /> - </ReferenceField> - <MoneyField source="price" /> - <NumberField source="count" /> - <NumberField source="alert_level" /> - <BooleanField source="salable" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); + <ReferenceField source="category_id" reference="products_categories" > + <TextField source="name" /> + </ReferenceField> + <MoneyField source="price" /> + <NumberField source="count" /> + <NumberField source="alert_level" /> + <BooleanField source="salable" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: Products, diff --git a/resources/js/src/resources/ProductsCategories.js b/resources/js/src/resources/ProductsCategories.js index ec73522a97a1a6c1ec42b80fe2b22fcd2b426e9f..5c93b4002e7c69036c6ccdd67b9503d6b07fd9dc 100644 --- a/resources/js/src/resources/ProductsCategories.js +++ b/resources/js/src/resources/ProductsCategories.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { Datagrid, EditButton, List, SimpleForm, SimpleShowLayout, TextField, TextInput } from 'react-admin'; +import { Datagrid, EditButton, List, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput } from 'react-admin'; import DateField from '../components/DateField'; import DateInput from '../components/DateInput'; import { CreateDialog, EditDialog, ShowDialog } from '../components/DialogForm'; @@ -8,40 +9,51 @@ const ProductsCategoriesFilters = [ <TextInput source="name" /> ]; -const ProductsCategories = (props) => ( - <> - <List {...props} filters={ProductsCategoriesFilters}> - <Datagrid> - <TextField source="id" /> - <TextField source="name" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - <EditButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="name" /> - </SimpleForm> - </CreateDialog> - <EditDialog {...props}> - <SimpleForm redirect="list"> - <TextInput disabled source="id" /> - <TextInput source="name" /> - <DateInput disabled source="created_at" /> - <DateInput disabled source="updated_at" /> - </SimpleForm> - </EditDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <TextField source="name" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const ProductsCategories = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={ProductsCategoriesFilters}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <TextField source="name" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + <EditButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => record.name} + tertiaryText={record => "#" + record.id} + linkType="edit" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="name" /> + </SimpleForm> + </CreateDialog> + <EditDialog {...props}> + <SimpleForm redirect="list"> + <TextInput disabled source="id" /> + <TextInput source="name" /> + <DateInput disabled source="created_at" /> + <DateInput disabled source="updated_at" /> + </SimpleForm> + </EditDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <TextField source="name" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: ProductsCategories, diff --git a/resources/js/src/resources/ProductsCounts.js b/resources/js/src/resources/ProductsCounts.js index 5d3c844e6d33625c382ca0b3e403d546838c73c2..5884d9cf4dd2a82742e7880531706a23a38a8f3d 100644 --- a/resources/js/src/resources/ProductsCounts.js +++ b/resources/js/src/resources/ProductsCounts.js @@ -1,47 +1,66 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { ArrayField, Create, Datagrid, List, ReferenceField, ShowButton, SimpleForm, SimpleShowLayout, TextField } from 'react-admin'; +import { ArrayField, Create, Datagrid, List, ReferenceField, ShowButton, SimpleForm, SimpleList, SimpleShowLayout, TextField } from 'react-admin'; import DateField from '../components/DateField'; import { ShowDialog } from '../components/DialogForm'; import { MultiProductCountInput, MultiProductCountItem } from "../components/MultiProductCountInput"; -const ProductsCounts = (props) => ( - <> - <List {...props} bulkActionButtons={false}> - <Datagrid> - <TextField source="id" /> - <ReferenceField source="movement_id" reference="movements" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="movement.user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <ShowButton /> - </Datagrid> - </List> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <ArrayField source="data"> +const ProductsCounts = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} bulkActionButtons={false}> + {isDesktop ? ( <Datagrid> - <ReferenceField source="id" reference="products" link="show"> + <TextField source="id" /> + <ReferenceField source="movement_id" reference="movements" link="show"> <TextField source="name" /> </ReferenceField> - <TextField source="count" /> + <ReferenceField label="Créateur" source="movement_id" reference="movements" link={false}> + <ReferenceField source="user_id" reference="users" link="show"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <DateField source="created_at" /> + <ShowButton /> </Datagrid> - </ArrayField> - <ReferenceField source="movement_id" reference="movements" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="movement.user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); + ) : ( + <SimpleList + primaryText={record => <ReferenceField record={record} source="movement_id" reference="movements" link={false}> + <TextField source="name" /> + </ReferenceField>} + secondaryText={record => new Date(record.created_at).toLocaleString()} + tertiaryText={record => "#" + record.id} + linkType="show" + /> + )} + </List> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <ArrayField source="data"> + <Datagrid> + <ReferenceField source="id" reference="products" link="show"> + <TextField source="name" /> + </ReferenceField> + <TextField source="count" /> + </Datagrid> + </ArrayField> + <ReferenceField source="movement_id" reference="movements" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField label="Créateur" source="movement_id" reference="movements" link="show"> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; const CountProducts = (props) => { return <> diff --git a/resources/js/src/resources/Purchases.js b/resources/js/src/resources/Purchases.js index 2364af436b44e41fd2b7541da997d721eb305cfc..bc6b17d82d54cf82477ee3e48ce4020d44502d52 100644 --- a/resources/js/src/resources/Purchases.js +++ b/resources/js/src/resources/Purchases.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import React from "react"; -import { ArrayField, AutocompleteInput, BooleanInput, Create, Datagrid, FormDataConsumer, List, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleShowLayout, TextField, TextInput } from 'react-admin'; +import { ArrayField, AutocompleteInput, BooleanInput, Create, Datagrid, FormDataConsumer, List, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput } from 'react-admin'; import DateField from '../components/DateField'; import { ShowDialog } from '../components/DialogForm'; import MoneyField from "../components/MoneyField"; @@ -7,41 +8,64 @@ import MoneyInput from '../components/MoneyInput'; import { MultiProductCountInput, MultiProductCountItem } from "../components/MultiProductCountInput"; const Purchases = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); return ( <> <List {...props} bulkActionButtons={false} > - <Datagrid> - <TextField source="id" /> - <TextField source="name" /> - <DateField source="created_at" /> - <MoneyField noLabel={true} source="transaction.amount" /> - <ReferenceField source="transaction.user_id" reference="users" link="show"> - <TextField source="username" /> - </ReferenceField> - <ReferenceField source="movement_id" reference="movements" link="show"> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> <TextField source="name" /> - </ReferenceField> - <ReferenceField source="transaction_id" reference="transactions" link="show"> - <TextField source="name" /> - </ReferenceField> - <ShowButton /> - </Datagrid> + <DateField source="created_at" /> + <ReferenceField label="Montant" source="transaction_id" reference="transactions" link="show"> + <MoneyField source="amount" noLabel={true} /> + </ReferenceField> + <ReferenceField label="Créateur" source="transaction_id" reference="transactions" link={false}> + <ReferenceField source="user_id" reference="users" link="show"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <ReferenceField source="movement_id" reference="movements" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField source="transaction_id" reference="transactions" link="show"> + <TextField source="name" /> + </ReferenceField> + <ShowButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => record.name} + secondaryText={record => new Date(record.created_at).toLocaleString()} + tertiaryText={record => <ReferenceField record={record} label="Montant" source="transaction_id" reference="transactions" link={false}> + <MoneyField source="amount" noLabel={true} /> + </ReferenceField>} + linkType="show" + /> + )} </List> <ShowDialog> <SimpleShowLayout> <TextField source="id" /> <TextField source="name" /> - <MoneyField source="transaction.amount" /> - <ReferenceField source="transaction.user_id" reference="users" link="show"> - <TextField source="username" /> + <ReferenceField label="Montant" source="transaction_id" reference="transactions" link="show"> + <MoneyField source="amount" noLabel="true" /> + </ReferenceField> + <ReferenceField label="Créateur" source="transaction_id" reference="transactions" link="show"> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <ReferenceField label="Produits" source="movement_id" reference="movements" link="show"> + <ArrayField source="products" > + <Datagrid> + <ReferenceField source="product_id" reference="products" link="edit"> + <TextField source="name" /> + </ReferenceField> + <TextField source="count" /> + </Datagrid> + </ArrayField> </ReferenceField> - <ArrayField source="movement.products" > - <Datagrid> - <TextField source="product_id" /> - <TextField source="product.name" /> - <TextField source="count" /> - </Datagrid> - </ArrayField> <DateField source="created_at" /> </SimpleShowLayout> </ShowDialog> diff --git a/resources/js/src/resources/Sales.js b/resources/js/src/resources/Sales.js index a27d8dad6afc5ffb2bd67ada7c42b7f8c876e9fa..38b6088fd1b023fd4556790dc046a5c43692916e 100644 --- a/resources/js/src/resources/Sales.js +++ b/resources/js/src/resources/Sales.js @@ -1,6 +1,6 @@ -import { TextField as MuiTextField } from "@material-ui/core"; +import { TextField as MuiTextField, useMediaQuery } from "@material-ui/core"; import React, { useState } from "react"; -import { ArrayField, Create, Datagrid, FormDataConsumer, FormTab, List, ReferenceField, SelectInput, ShowButton, SimpleShowLayout, TabbedForm, TextField, useNotify, useRefresh, useTranslate } from 'react-admin'; +import { ArrayField, Create, Datagrid, FormDataConsumer, FormTab, List, ReferenceField, SelectInput, ShowButton, SimpleList, SimpleShowLayout, TabbedForm, TextField, useNotify, useRefresh, useTranslate } from 'react-admin'; import DateField from '../components/DateField'; import { ShowDialog } from '../components/DialogForm'; import MoneyField from "../components/MoneyField"; @@ -8,31 +8,53 @@ import { MultiProductCountInput, MultiProductCountItem } from "../components/Mul import PersonalAccountSelector from "../components/PersonalAccountSelector"; const Sales = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); return ( <> <List {...props} bulkActionButtons={false} > - <Datagrid> - <TextField source="id" /> - <DateField source="created_at" /> - <MoneyField noLabel={true} source="transaction.amount" /> - <ReferenceField source="transaction.user_id" reference="users" link="show"> - <TextField source="username" /> - </ReferenceField> - <ReferenceField source="movement_id" reference="movements" link="show"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="transaction_id" reference="transactions" link="show"> - <TextField source="name" /> - </ReferenceField> - <ShowButton /> - </Datagrid> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <DateField source="created_at" /> + <ReferenceField label="Montant" source="transaction_id" reference="transactions" link="show"> + <MoneyField source="amount" noLabel={true} /> + </ReferenceField> + <ReferenceField label="Créateur" source="transaction_id" reference="transactions" link={false}> + <ReferenceField source="user_id" reference="users" link="show"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <ReferenceField source="movement_id" reference="movements" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField source="transaction_id" reference="transactions" link="show"> + <TextField source="name" /> + </ReferenceField> + <ShowButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => <ReferenceField record={record} source="movement_id" reference="movements" link={false}> + <TextField source="name" /> + </ReferenceField>} + secondaryText={record => new Date(record.created_at).toLocaleString()} + tertiaryText={record => <ReferenceField record={record} label="Montant" source="transaction_id" reference="transactions" link={false}> + <MoneyField source="amount" noLabel={true} /> + </ReferenceField>} + linkType="show" + /> + )} </List> <ShowDialog> <SimpleShowLayout> <TextField source="id" /> - <MoneyField source="transaction.amount" /> - <ReferenceField source="transaction.user_id" reference="users" link="show"> - <TextField source="username" /> + <ReferenceField label="Montant" source="transaction_id" reference="transactions" link="show"> + <MoneyField source="amount" noLabel={true} /> + </ReferenceField> + <ReferenceField label="Créateur" source="transaction_id" reference="transactions" link="show"> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> </ReferenceField> <ArrayField source="movement.products" > <Datagrid> diff --git a/resources/js/src/resources/Transactions.js b/resources/js/src/resources/Transactions.js index 9c85f1ada07c276c9c5cbc9668b92717e179f4bd..c7a20ec1467c68dff0f19d17b42a314d3eed3ec8 100644 --- a/resources/js/src/resources/Transactions.js +++ b/resources/js/src/resources/Transactions.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { AutocompleteInput, BooleanField, BooleanInput, Datagrid, List, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleShowLayout, TextField, TextInput } from 'react-admin'; +import { AutocompleteInput, BooleanField, BooleanInput, Datagrid, List, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput } from 'react-admin'; import DateField from '../components/DateField'; import { CreateDialog, ShowDialog } from '../components/DialogForm'; import MoneyField from "../components/MoneyField"; @@ -18,61 +19,73 @@ const TransactionsFilters = [ </ReferenceInput> ]; -const Transactions = (props) => ( - <> - <List {...props} filters={TransactionsFilters} bulkActionButtons={false}> - <Datagrid> - <TextField source="id" /> - <TextField source="name" /> - <MoneyField noLabel={true} source="amount" /> - <BooleanField source="rectification" /> - <ReferenceField source="account_id" reference="accounts"> +const Transactions = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={TransactionsFilters} bulkActionButtons={false}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <TextField source="name" /> + <MoneyField noLabel={true} source="amount" /> + <BooleanField source="rectification" /> + <ReferenceField source="account_id" reference="accounts"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField source="category_id" reference="transactions_categories"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + <DateField source="created_at" /> + <ShowButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => record.name} + secondaryText={record => new Date(record.created_at).toLocaleDateString()} + tertiaryText={record => <MoneyField record={record} source="amount" noLabel={true} />} + linkType="show" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="name" /> + <MoneyInput source="amount" /> + <BooleanInput source="rectification" /> + <ReferenceInput source="account_id" reference="accounts" filterToQuery={searchText => ({ name: searchText })}> + <AutocompleteInput optionText="name" /> + </ReferenceInput> + <ReferenceInput source="category_id" reference="transactions_categories" filterToQuery={searchText => ({ name: searchText })}> + <AutocompleteInput optionText="name" /> + </ReferenceInput> + </SimpleForm> + </CreateDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> <TextField source="name" /> - </ReferenceField> - <ReferenceField source="category_id" reference="transactions_categories"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <ShowButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="name" /> - <MoneyInput source="amount" /> - <BooleanInput source="rectification" /> - <ReferenceInput source="account_id" reference="accounts" filterToQuery={searchText => ({ name: searchText })}> - <AutocompleteInput optionText="name" /> - </ReferenceInput> - <ReferenceInput source="category_id" reference="transactions_categories" filterToQuery={searchText => ({ name: searchText })}> - <AutocompleteInput optionText="name" /> - </ReferenceInput> - </SimpleForm> - </CreateDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <TextField source="name" /> - <MoneyField source="amount" /> - <BooleanField source="rectification" /> - <ReferenceField source="account_id" reference="accounts"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="category_id" reference="transactions_categories"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); + <MoneyField source="amount" /> + <BooleanField source="rectification" /> + <ReferenceField source="account_id" reference="accounts"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField source="category_id" reference="transactions_categories"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: Transactions, diff --git a/resources/js/src/resources/TransactionsCategories.js b/resources/js/src/resources/TransactionsCategories.js index 5fc3f1dd555da73981b823f746010b216a1fd2f7..469d418808795f8082899baf2813e18d9fd40bee 100644 --- a/resources/js/src/resources/TransactionsCategories.js +++ b/resources/js/src/resources/TransactionsCategories.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { Datagrid, EditButton, List, SimpleForm, SimpleShowLayout, TextField, TextInput } from 'react-admin'; +import { Datagrid, EditButton, List, SimpleForm, SimpleList, SimpleShowLayout, TextField, TextInput } from 'react-admin'; import DateField from '../components/DateField'; import DateInput from '../components/DateInput'; import { CreateDialog, EditDialog, ShowDialog } from '../components/DialogForm'; @@ -8,40 +9,51 @@ const TransactionsCategoriesFilters = [ <TextInput source="name" /> ]; -const TransactionsCategories = (props) => ( - <> - <List {...props} filters={TransactionsCategoriesFilters}> - <Datagrid> - <TextField source="id" /> - <TextField source="name" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - <EditButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="name" /> - </SimpleForm> - </CreateDialog> - <EditDialog {...props}> - <SimpleForm redirect="list"> - <TextInput disabled source="id" /> - <TextInput source="name" /> - <DateInput disabled source="created_at" /> - <DateInput disabled source="updated_at" /> - </SimpleForm> - </EditDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <TextField source="name" /> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const TransactionsCategories = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={TransactionsCategoriesFilters}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <TextField source="name" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + <EditButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => record.name} + tertiaryText={record => "#" + record.id} + linkType="edit" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="name" /> + </SimpleForm> + </CreateDialog> + <EditDialog {...props}> + <SimpleForm redirect="list"> + <TextInput disabled source="id" /> + <TextInput source="name" /> + <DateInput disabled source="created_at" /> + <DateInput disabled source="updated_at" /> + </SimpleForm> + </EditDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <TextField source="name" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: TransactionsCategories, diff --git a/resources/js/src/resources/Transferts.js b/resources/js/src/resources/Transferts.js index f94f4463af6bdf79be43019da04ff0aa629418dd..f083c6039d633c37e2f48fd8eb44d6618bc83035 100644 --- a/resources/js/src/resources/Transferts.js +++ b/resources/js/src/resources/Transferts.js @@ -1,65 +1,108 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { AutocompleteInput, Datagrid, List, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleShowLayout, TextField } from 'react-admin'; +import { AutocompleteInput, Datagrid, List, ReferenceField, ReferenceInput, ShowButton, SimpleForm, SimpleList, SimpleShowLayout, TextField } from 'react-admin'; import DateField from '../components/DateField'; import { CreateDialog, ShowDialog } from '../components/DialogForm'; import MoneyField from "../components/MoneyField"; import MoneyInput from "../components/MoneyInput"; -const Transferts = (props) => ( - <> - <List {...props} bulkActionButtons={false}> - <Datagrid> - <TextField source="id" /> - <ReferenceField source="sub_transaction.account_id" reference="accounts"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="add_transaction.account_id" reference="accounts"> - <TextField source="name" /> - </ReferenceField> - <MoneyField noLabel={true} source="add_transaction.amount" /> - <ReferenceField source="sub_transaction.user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <ShowButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <MoneyInput source="amount" /> - <ReferenceInput source="from_account_id" reference="accounts" filterToQuery={searchText => ({ name: searchText })}> - <AutocompleteInput optionText="name" /> - </ReferenceInput> - <ReferenceInput source="to_account_id" reference="accounts" filterToQuery={searchText => ({ name: searchText })}> - <AutocompleteInput optionText="name" /> - </ReferenceInput> - </SimpleForm> - </CreateDialog> - <ShowDialog> - <SimpleShowLayout> - <TextField source="id" /> - <ReferenceField source="sub_transaction.account_id" reference="accounts"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="sub_transaction_id" reference="transactions"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="add_transaction.account_id" reference="accounts"> - <TextField source="name" /> - </ReferenceField> - <ReferenceField source="add_transaction_id" reference="transactions"> - <TextField source="name" /> - </ReferenceField> - <MoneyField source="add_transaction.amount" /> - <ReferenceField source="sub_transaction.user_id" reference="users"> - <TextField source="username" /> - </ReferenceField> - <DateField source="created_at" /> - <DateField source="updated_at" /> - </SimpleShowLayout> - </ShowDialog> - </> -); +const Transferts = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} bulkActionButtons={false}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <ReferenceField label="Depuis" source="sub_transaction_id" reference="transactions" link="show"> + <ReferenceField source="account_id" reference="accounts"> + <TextField source="name" /> + </ReferenceField> + </ReferenceField> + <ReferenceField label="Vers" source="add_transaction_id" reference="transactions" link="show"> + <ReferenceField source="account_id" reference="accounts"> + <TextField source="name" /> + </ReferenceField> + </ReferenceField> + <ReferenceField label="Montant" source="add_transaction_id" reference="transactions" link="show"> + <MoneyField source="amount" noLabel={true} /> + </ReferenceField> + <ReferenceField label="Créateur" source="add_transaction_id" reference="transactions" link="show"> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <DateField source="created_at" /> + <ShowButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => ( + <> + <ReferenceField record={record} label="Depuis" source="sub_transaction_id" reference="transactions" link={false}> + <ReferenceField source="account_id" reference="accounts" link={false}> + <TextField source="name" /> + </ReferenceField> + </ReferenceField> → <ReferenceField record={record} label="Vers" source="add_transaction_id" reference="transactions" link={false}> + <ReferenceField source="account_id" reference="accounts" link={false}> + <TextField source="name" /> + </ReferenceField> + </ReferenceField> + </> + )} + secondaryText={record => new Date(record.created_at).toLocaleDateString()} + tertiaryText={record => <ReferenceField record={record} label="Montant" source="add_transaction_id" reference="transactions" link={false}> + <MoneyField source="amount" noLabel={true} /> + </ReferenceField>} + linkType="show" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <MoneyInput source="amount" /> + <ReferenceInput source="from_account_id" reference="accounts" filterToQuery={searchText => ({ name: searchText })}> + <AutocompleteInput optionText="name" /> + </ReferenceInput> + <ReferenceInput source="to_account_id" reference="accounts" filterToQuery={searchText => ({ name: searchText })}> + <AutocompleteInput optionText="name" /> + </ReferenceInput> + </SimpleForm> + </CreateDialog> + <ShowDialog> + <SimpleShowLayout> + <TextField source="id" /> + <ReferenceField label="Depuis" source="sub_transaction_id" reference="transactions" link="show"> + <ReferenceField source="account_id" reference="accounts"> + <TextField source="name" /> + </ReferenceField> + </ReferenceField> + <ReferenceField label="Transaction soustraction" source="sub_transaction_id" reference="transactions" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField label="Vers" source="add_transaction_id" reference="transactions" link="show"> + <ReferenceField source="account_id" reference="accounts"> + <TextField source="name" /> + </ReferenceField> + </ReferenceField> + <ReferenceField label="Transaction addition" source="add_transaction_id" reference="transactions" link="show"> + <TextField source="name" /> + </ReferenceField> + <ReferenceField label="Montant" source="add_transaction_id" reference="transactions" link="show"> + <MoneyField source="amount" noLabel={true} /> + </ReferenceField> + <ReferenceField label="Créateur" source="add_transaction_id" reference="transactions" link="show"> + <ReferenceField source="user_id" reference="users"> + <TextField source="username" /> + </ReferenceField> + </ReferenceField> + <DateField source="created_at" /> + <DateField source="updated_at" /> + </SimpleShowLayout> + </ShowDialog> + </> + ); +}; export default { list: Transferts, diff --git a/resources/js/src/resources/Users.js b/resources/js/src/resources/Users.js index 006357381a797cfafee02678bea69975bf28353e..621a912f6e638b6f105426eb6a1efb1f2f8a9a36 100644 --- a/resources/js/src/resources/Users.js +++ b/resources/js/src/resources/Users.js @@ -1,5 +1,6 @@ +import { useMediaQuery } from '@material-ui/core'; import * as React from "react"; -import { AutocompleteArrayInput, AutocompleteInput, ChipField, Datagrid, EditButton, FunctionField, List, ReferenceArrayField, ReferenceArrayInput, ReferenceField, ReferenceInput, SimpleForm, SingleFieldList, TextField, TextInput } from 'react-admin'; +import { AutocompleteArrayInput, AutocompleteInput, Datagrid, EditButton, FunctionField, List, ReferenceArrayInput, ReferenceField, ReferenceInput, SimpleForm, SimpleList, TextField, TextInput } from 'react-admin'; import DateField from '../components/DateField'; import DateInput from '../components/DateInput'; import { CreateDialog, EditDialog } from '../components/DialogForm'; @@ -9,56 +10,65 @@ const UsersFilters = [ <TextInput label="Email" source="email" /> ]; -const Users = (props) => ( - <> - <List {...props} filters={UsersFilters}> - <Datagrid> - <TextField source="id" /> - <TextField source="username" /> - <ReferenceField source="person_id" reference="people" link="show" > - <FunctionField render={r => r.firstname + " " + r.lastname} /> - </ReferenceField> - <TextField source="email" /> - <ReferenceArrayField label="Permissions" reference="permissions" source="permissions"> - <SingleFieldList linkType={false}> - <ChipField source="name" /> - </SingleFieldList> - </ReferenceArrayField> - <DateField source="created_at" /> - <DateField source="updated_at" /> - <DateField source="password_changed_at" /> - <EditButton /> - </Datagrid> - </List> - <CreateDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="username" /> - <ReferenceInput source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, has_account: false })}> - <AutocompleteInput optionText="fullname" /> - </ReferenceInput> - <TextInput source="email" /> - <ReferenceArrayInput label="Permissions" reference="permissions" source="permissions"> - <AutocompleteArrayInput /> - </ReferenceArrayInput> - </SimpleForm> - </CreateDialog> - <EditDialog {...props}> - <SimpleForm redirect="list"> - <TextInput source="username" /> - <ReferenceInput disabled source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, has_account: false })}> - <AutocompleteInput optionText="fullname" /> - </ReferenceInput> - <TextInput source="email" /> - <ReferenceArrayInput label="Permissions" reference="permissions" source="permissions"> - <AutocompleteArrayInput /> - </ReferenceArrayInput> - <DateInput disabled source="created_at" /> - <DateInput disabled source="updated_at" /> - <DateInput disabled source="password_changed_at" /> - </SimpleForm> - </EditDialog> - </> -); +const Users = (props) => { + const isDesktop = useMediaQuery(theme => theme.breakpoints.up('md')); + return ( + <> + <List {...props} filters={UsersFilters}> + {isDesktop ? ( + <Datagrid> + <TextField source="id" /> + <TextField source="username" /> + <ReferenceField source="person_id" reference="people" link="show" > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField> + <TextField source="email" /> + <DateField source="created_at" /> + <DateField source="updated_at" /> + <DateField source="password_changed_at" /> + <EditButton /> + </Datagrid> + ) : ( + <SimpleList + primaryText={record => <ReferenceField record={record} source="person_id" reference="people" link={false} > + <FunctionField render={r => r.firstname + " " + r.lastname} /> + </ReferenceField>} + secondaryText={record => record.username} + tertiaryText={record => "#" + record.id} + linkType="show" + /> + )} + </List> + <CreateDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="username" /> + <ReferenceInput source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, has_account: false })}> + <AutocompleteInput optionText="fullname" /> + </ReferenceInput> + <TextInput source="email" /> + <ReferenceArrayInput label="Permissions" reference="permissions" source="permissions"> + <AutocompleteArrayInput /> + </ReferenceArrayInput> + </SimpleForm> + </CreateDialog> + <EditDialog {...props}> + <SimpleForm redirect="list"> + <TextInput source="username" /> + <ReferenceInput disabled source="person_id" reference="people" filterToQuery={searchText => ({ fullname: searchText, has_account: false })}> + <AutocompleteInput optionText="fullname" /> + </ReferenceInput> + <TextInput source="email" /> + <ReferenceArrayInput label="Permissions" reference="permissions" source="permissions"> + <AutocompleteArrayInput /> + </ReferenceArrayInput> + <DateInput disabled source="created_at" /> + <DateInput disabled source="updated_at" /> + <DateInput disabled source="password_changed_at" /> + </SimpleForm> + </EditDialog> + </> + ); +}; export default { list: Users,