Skip to content
Snippets Groups Projects
Commit 0471708f authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

Administration des disciplines (Création à faire)

parent d76ea1f6
No related branches found
No related tags found
No related merge requests found
Pipeline #38887 passed
Showing
with 466 additions and 197 deletions
...@@ -30,6 +30,7 @@ use Oscar\Entity\TVA; ...@@ -30,6 +30,7 @@ use Oscar\Entity\TVA;
use Oscar\Exception\OscarException; use Oscar\Exception\OscarException;
use Oscar\Formatter\OscarFormatterConst; use Oscar\Formatter\OscarFormatterConst;
use Oscar\Provider\Privileges; use Oscar\Provider\Privileges;
use Oscar\Service\administration\AdminDisciplineAPIService;
use Oscar\Service\administration\AdministrationConfigService; use Oscar\Service\administration\AdministrationConfigService;
use Oscar\Service\administration\AdminRolePrivilegeServiceAPIService; use Oscar\Service\administration\AdminRolePrivilegeServiceAPIService;
use Oscar\Service\ConfigurationParser; use Oscar\Service\ConfigurationParser;
...@@ -528,32 +529,22 @@ class AdministrationController extends AbstractOscarController implements ...@@ -528,32 +529,22 @@ class AdministrationController extends AbstractOscarController implements
', ', ', ',
$this->getOscarConfigurationService()->getSpentAccountFilter() $this->getOscarConfigurationService()->getSpentAccountFilter()
), ),
OscarConfigurationService::activity_request_limit => $this->getOscarConfigurationService( OscarConfigurationService::activity_request_limit => $this->getOscarConfigurationService()->getActivityRequestLimit(),
)->getActivityRequestLimit(), 'timesheet_preview' => $this->getOscarConfigurationService()->getTimesheetPreview(),
'timesheet_preview' => $this->getOscarConfigurationService( 'timesheet_excel' => $this->getOscarConfigurationService()->getTimesheetExcel(),
)->getTimesheetPreview(), 'allow_numerotation_custom' => $this->getOscarConfigurationService()->getNumerotationEditable(),
'timesheet_excel' => $this->getOscarConfigurationService( 'themes' => $this->getOscarConfigurationService()->getConfiguration('themes'),
)->getTimesheetExcel(), 'theme' => $this->getOscarConfigurationService()->getTheme(),
'allow_numerotation_custom' => $this->getOscarConfigurationService(
)->getNumerotationEditable(),
'themes' => $this->getOscarConfigurationService(
)->getConfiguration('themes'),
'theme' => $this->getOscarConfigurationService()->getTheme(
),
'export' => [ 'export' => [
'separator' => $this->getOscarConfigurationService()->getExportSeparator(), 'separator' => $this->getOscarConfigurationService()->getExportSeparator(),
'dateformat' => $this->getOscarConfigurationService()->getExportDateFormat() 'dateformat' => $this->getOscarConfigurationService()->getExportDateFormat()
], ],
'organization_leader_role' => $organization_leader_role, 'organization_leader_role' => $organization_leader_role,
OscarConfigurationService::document_use_version_in_name => $this->getOscarConfigurationService( OscarConfigurationService::document_use_version_in_name => $this->getOscarConfigurationService()->getDocumentUseVersionInName(),
)->getDocumentUseVersionInName(), OscarConfigurationService::pfi_strict => $this->getOscarConfigurationService()->isPfiStrict(),
OscarConfigurationService::pfi_strict => $this->getOscarConfigurationService(
)->isPfiStrict(),
OscarConfigurationService::pfi_strict_format => $pfiFixed, OscarConfigurationService::pfi_strict_format => $pfiFixed,
"pfi_default_format" => $this->getOscarConfigurationService( "pfi_default_format" => $this->getOscarConfigurationService()->getConfiguration('validation.pfi'),
)->getConfiguration('validation.pfi'), "allow_node_selection" => $this->getOscarConfigurationService()->isAllowNodeSelection(),
"allow_node_selection" => $this->getOscarConfigurationService(
)->isAllowNodeSelection(),
"organizationRequire" => [ "organizationRequire" => [
"type" => $this->getOscarConfigurationService()->getOrganizationRequired()['type'], "type" => $this->getOscarConfigurationService()->getOrganizationRequired()['type'],
"country" => $this->getOscarConfigurationService()->getOrganizationRequired()['country'] "country" => $this->getOscarConfigurationService()->getOrganizationRequired()['country']
...@@ -609,8 +600,7 @@ class AdministrationController extends AbstractOscarController implements ...@@ -609,8 +600,7 @@ class AdministrationController extends AbstractOscarController implements
default: default:
return $this->getResponseInternalError(); return $this->getResponseInternalError();
} }
} } else {
else {
switch ($method) { switch ($method) {
case 'GET': case 'GET':
$numerotation = $this->getOscarConfigurationService()->getEditableConfKey('numerotation', []); $numerotation = $this->getOscarConfigurationService()->getEditableConfKey('numerotation', []);
...@@ -693,8 +683,7 @@ class AdministrationController extends AbstractOscarController implements ...@@ -693,8 +683,7 @@ class AdministrationController extends AbstractOscarController implements
if (!$tva) { if (!$tva) {
return $this->getResponseInternalError("Impossible de charger la TVA '$id'"); return $this->getResponseInternalError("Impossible de charger la TVA '$id'");
} }
} } else {
else {
return $this->getResponseBadRequest(""); return $this->getResponseBadRequest("");
} }
$this->getEntityManager()->remove($tva); $this->getEntityManager()->remove($tva);
...@@ -721,8 +710,7 @@ class AdministrationController extends AbstractOscarController implements ...@@ -721,8 +710,7 @@ class AdministrationController extends AbstractOscarController implements
if (!$tva) { if (!$tva) {
throw new OscarException("Impossible de charger la TVA '$id'"); throw new OscarException("Impossible de charger la TVA '$id'");
} }
} } else {
else {
$tva = new TVA(); $tva = new TVA();
$this->getEntityManager()->persist($tva); $this->getEntityManager()->persist($tva);
} }
...@@ -801,63 +789,12 @@ class AdministrationController extends AbstractOscarController implements ...@@ -801,63 +789,12 @@ class AdministrationController extends AbstractOscarController implements
public function disciplineAction() public function disciplineAction()
{ {
$this->getOscarUserContextService()->check(Privileges::MAINTENANCE_DISCIPLINE_MANAGE); $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_DISCIPLINE_MANAGE);
$disciplineConfigApi = new AdminDisciplineAPIService();
$disciplines = $this->getEntityManager()->getRepository(Discipline::class)->getDisciplinesCounted(); $disciplineConfigApi->setServiceContainer($this->getServiceLocator());
$method = $this->getHttpXMethod(); if ($this->isAjax() || $this->getRequest()->getQuery('f') === 'json') {
return $disciplineConfigApi->entrypoint($this->getRequest());
switch ($method) {
case 'PUT' :
$label = $this->params()->fromPost('label');
$discipline = new Discipline();
$this->getEntityManager()->persist($discipline);
$discipline->setLabel($label);
try {
$this->getEntityManager()->flush($discipline);
$data = $discipline->toJson();
$data['actyivitiesLng'] = 0;
return $this->ajaxResponse(['discipline' => $data]);
} catch (\Exception $e) {
return $this->getResponseInternalError("Impossible d'ajouter la discipline : " . $e->getMessage());
}
break;
case 'POST' :
$label = $this->params()->fromPost('label');
$id = $this->params()->fromPost('id');
try {
$discipline = $this->getEntityManager()->getRepository(Discipline::class)->find($id);
$discipline->setLabel($label);
$this->getEntityManager()->flush($discipline);
$data = $discipline->toJson();
return $this->ajaxResponse(['discipline' => $data]);
} catch (\Exception $e) {
return $this->getResponseInternalError("Impossible d'ajouter la discipline : " . $e->getMessage());
}
return $this->getResponseNotImplemented("MODIFICATION Pas encore implanté");
break;
case 'DELETE' :
$id = $this->params()->fromQuery('id');
try {
$discipline = $this->getEntityManager()->getRepository(Discipline::class)->find($id);
$this->getEntityManager()->remove($discipline);
$this->getEntityManager()->flush();
return $this->getResponseOk();
} catch (\Exception $exception) {
return $this->getResponseInternalError(
"Impossible de supprimer la discipline : " . $exception->getMessage()
);
}
} }
return [];
$datas = [
'disciplines' => $disciplines
];
return $datas;
} }
public function motsclesAction() public function motsclesAction()
...@@ -1069,7 +1006,8 @@ class AdministrationController extends AbstractOscarController implements ...@@ -1069,7 +1006,8 @@ class AdministrationController extends AbstractOscarController implements
} }
} }
public function activityStatusAction() { public function activityStatusAction()
{
$this->getOscarUserContextService()->check(Privileges::MAINTENANCE_PARAMETERS_MANAGE); $this->getOscarUserContextService()->check(Privileges::MAINTENANCE_PARAMETERS_MANAGE);
/** @var AdministrationConfigService $administrationService */ /** @var AdministrationConfigService $administrationService */
...@@ -1643,8 +1581,7 @@ class AdministrationController extends AbstractOscarController implements ...@@ -1643,8 +1581,7 @@ class AdministrationController extends AbstractOscarController implements
$this->getLoggerService()->critical("Action $datas->action inconnue !"); $this->getLoggerService()->critical("Action $datas->action inconnue !");
return $this->getResponseNotImplemented(); return $this->getResponseNotImplemented();
} }
} } else {
else {
// Contrôle du Role // Contrôle du Role
$roleId = trim($datas->get('label')); $roleId = trim($datas->get('label'));
if ($roleId == "") { if ($roleId == "") {
...@@ -1668,8 +1605,7 @@ class AdministrationController extends AbstractOscarController implements ...@@ -1668,8 +1605,7 @@ class AdministrationController extends AbstractOscarController implements
return $this->ajaxResponse($role->toArray()); return $this->ajaxResponse($role->toArray());
} }
} }
} } else {
else {
$method = $this->getHttpXMethod(); $method = $this->getHttpXMethod();
$this->getOscarUserContextService()->check(Privileges::DROIT_ROLEORGA_EDITION); $this->getOscarUserContextService()->check(Privileges::DROIT_ROLEORGA_EDITION);
$role = $this->getEntityManager()->getRepository(OrganizationRole::class)->find($roleId); $role = $this->getEntityManager()->getRepository(OrganizationRole::class)->find($roleId);
...@@ -1868,8 +1804,7 @@ class AdministrationController extends AbstractOscarController implements ...@@ -1868,8 +1804,7 @@ class AdministrationController extends AbstractOscarController implements
'declarersRelanceJour1' => $this->getOscarConfigurationService()->getDeclarersRelanceJour1(), 'declarersRelanceJour1' => $this->getOscarConfigurationService()->getDeclarersRelanceJour1(),
'declarersRelance2' => $this->getOscarConfigurationService()->getDeclarersRelance2(), 'declarersRelance2' => $this->getOscarConfigurationService()->getDeclarersRelance2(),
'declarersRelanceJour2' => $this->getOscarConfigurationService()->getDeclarersRelanceJour2(), 'declarersRelanceJour2' => $this->getOscarConfigurationService()->getDeclarersRelanceJour2(),
'declarersRelanceConflitMessage' => $this->getOscarConfigurationService( 'declarersRelanceConflitMessage' => $this->getOscarConfigurationService()->getDeclarersRelanceConflitMessage(),
)->getDeclarersRelanceConflitMessage(),
'declarersRelanceConflitJour' => $this->getOscarConfigurationService()->getDeclarersRelanceConflitJour(), 'declarersRelanceConflitJour' => $this->getOscarConfigurationService()->getDeclarersRelanceConflitJour(),
/** **/ /** **/
'validatorsRelance1' => $this->getOscarConfigurationService()->getValidatorsRelance1(), 'validatorsRelance1' => $this->getOscarConfigurationService()->getValidatorsRelance1(),
...@@ -1952,8 +1887,7 @@ class AdministrationController extends AbstractOscarController implements ...@@ -1952,8 +1887,7 @@ class AdministrationController extends AbstractOscarController implements
} }
return []; return [];
} } elseif ($method == "POST") {
elseif ($method == "POST") {
// Enregistrement des associations TYPE OSCAR <> TYPE PCRU // Enregistrement des associations TYPE OSCAR <> TYPE PCRU
$datas = $this->getJsonPosted(); $datas = $this->getJsonPosted();
$idTypeActivity = $datas['oscar_id']; $idTypeActivity = $datas['oscar_id'];
...@@ -1965,8 +1899,7 @@ class AdministrationController extends AbstractOscarController implements ...@@ -1965,8 +1899,7 @@ class AdministrationController extends AbstractOscarController implements
$this->getLoggerService()->error($e->getMessage()); $this->getLoggerService()->error($e->getMessage());
return $this->getResponseInternalError($e->getMessage()); return $this->getResponseInternalError($e->getMessage());
} }
} } else {
else {
return $this->getResponseBadRequest("La méthode de transmission ne fonctionne pas"); return $this->getResponseBadRequest("La méthode de transmission ne fonctionne pas");
} }
} }
......
...@@ -38,6 +38,14 @@ class Discipline ...@@ -38,6 +38,14 @@ class Discipline
*/ */
private $label; private $label;
/**
* Est disponible à la selection
*
* @var boolean
* @ORM\Column(type="boolean", nullable=false, options={"default"=true})
*/
protected $active = false;
/** /**
* @var \Doctrine\Common\Collections\Collection * @var \Doctrine\Common\Collections\Collection
* @ORM\ManyToMany(targetEntity="Activity", mappedBy="disciplines") * @ORM\ManyToMany(targetEntity="Activity", mappedBy="disciplines")
...@@ -70,6 +78,17 @@ class Discipline ...@@ -70,6 +78,17 @@ class Discipline
return $this; return $this;
} }
public function isActive(): bool
{
return $this->active;
}
public function setActive(bool $active): self
{
$this->active = $active;
return $this;
}
/** /**
* @return string * @return string
*/ */
......
...@@ -30,7 +30,10 @@ class DisciplineRepository extends EntityRepository ...@@ -30,7 +30,10 @@ class DisciplineRepository extends EntityRepository
*/ */
public function getDisciplinesCounted() public function getDisciplinesCounted()
{ {
$dql = "SELECT d.id, d.label, count(a.id) as activitiesLng FROM Oscar\Entity\Discipline d LEFT JOIN d.activities a GROUP BY d.id ORDER BY d.label"; $dql = "SELECT d.id, d.label, d.active, count(a.id) as count FROM Oscar\Entity\Discipline d
LEFT JOIN d.activities a
GROUP BY d.id
ORDER BY d.label";
$query = $this->getEntityManager()->createQuery($dql); $query = $this->getEntityManager()->createQuery($dql);
return $query->getArrayResult(); return $query->getArrayResult();
} }
......
<?php
namespace Oscar\Service\administration;
use Doctrine\ORM\EntityManager;
use Laminas\Http\Request;
use Laminas\Http\Response;
use Laminas\View\Model\JsonModel;
use Oscar\Entity\Discipline;
use Oscar\Entity\DisciplineRepository;
use Oscar\Entity\Role;
use Oscar\Entity\RoleRepository;
use Oscar\Exception\OscarException;
use Oscar\Service\core\AbstractAPIService;
/**
* Administration des Rôles/Privilèges
*/
class AdminDisciplineAPIService extends AbstractAPIService
{
protected function get(Request $request): JsonModel|Response|array
{
return $this->getDisciplineRepository()->getDisciplinesCounted();
}
protected function put(Request $request): JsonModel|Response|array
{
$data = $this->getRequestData($request);
/** @var Discipline $entity */
$entity = $this->getDisciplineRepository()->findOneBy(['id' => $data['id']]);
$entity->setLabel($data['label']);
$entity->setActive($data['active'] === true);
$this->getEntityManager()->flush($entity);
return $this->responseData(null);
}
protected function post(Request $request): JsonModel|Response|array
{
$data = $this->getRequestData($request);
/** @var Discipline $entity */
$entity = new Discipline();
$this->getEntityManager()->persist($entity);
$entity->setLabel($data['label']);
$entity->setActive($data['active'] === true);
$this->getEntityManager()->flush($entity);
return $this->responseData(null);
}
protected function getDisciplineRepository(): DisciplineRepository
{
return $this->getEntityManager()->getRepository(Discipline::class);
}
}
\ No newline at end of file
...@@ -56,7 +56,6 @@ class AdministrationConfigService implements ...@@ -56,7 +56,6 @@ class AdministrationConfigService implements
$disabled = $this->getOscarConfigurationService()->getEditableConfKey("status_disabled", []); $disabled = $this->getOscarConfigurationService()->getEditableConfKey("status_disabled", []);
$out = []; $out = [];
foreach ($status as $code => $label) { foreach ($status as $code => $label) {
$disabledStatus = in_array($code, $disabled); $disabledStatus = in_array($code, $disabled);
$use = 0; $use = 0;
foreach ($usage as $dt) { foreach ($usage as $dt) {
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
namespace Oscar\Service\core; namespace Oscar\Service\core;
use Doctrine\ORM\EntityManager;
use Laminas\Http\Request; use Laminas\Http\Request;
use Laminas\Http\Response; use Laminas\Http\Response;
use Laminas\View\Model\JsonModel; use Laminas\View\Model\JsonModel;
...@@ -17,9 +18,8 @@ abstract class AbstractAPIService implements UseServiceContainer ...@@ -17,9 +18,8 @@ abstract class AbstractAPIService implements UseServiceContainer
public function entrypoint(Request $request) :JsonModel|Response public function entrypoint(Request $request) :JsonModel|Response
{ {
$this->getlogger()->info("ICI");
$this->request = $request; $this->request = $request;
try {
$response = null; $response = null;
switch ($request->getMethod()) { switch ($request->getMethod()) {
case Request::METHOD_GET: case Request::METHOD_GET:
...@@ -39,6 +39,10 @@ abstract class AbstractAPIService implements UseServiceContainer ...@@ -39,6 +39,10 @@ abstract class AbstractAPIService implements UseServiceContainer
} else { } else {
return $response; return $response;
} }
} catch (\Exception $e) {
$this->getlogger()->error("API Exception : " . $e->getMessage());
return $this->responseError($e->getMessage());
}
} }
...@@ -60,6 +64,11 @@ abstract class AbstractAPIService implements UseServiceContainer ...@@ -60,6 +64,11 @@ abstract class AbstractAPIService implements UseServiceContainer
} }
protected function getRequestData( Request $request ) : array
{
return json_decode($request->getContent(), true);
}
protected function responseError(?string $message = "Unknown error", int $code = 500) : Response protected function responseError(?string $message = "Unknown error", int $code = 500) : Response
{ {
$response = new Response(); $response = new Response();
...@@ -86,4 +95,9 @@ abstract class AbstractAPIService implements UseServiceContainer ...@@ -86,4 +95,9 @@ abstract class AbstractAPIService implements UseServiceContainer
{ {
return $this->getServiceContainer()->get('Logger'); return $this->getServiceContainer()->get('Logger');
} }
protected function getEntityManager() :EntityManager
{
return $this->getServiceContainer()->get(EntityManager::class);
}
} }
\ No newline at end of file
...@@ -6,26 +6,6 @@ ...@@ -6,26 +6,6 @@
*/ */
?> ?>
<div class="container"> <div class="container">
<div id="disciplines"></div> <div id="disciplines" data-url="<?= $this->url('administration/discipline') ?>"></div>
<?php $this->Vite()->addJs('src/AdminDiscipline.js'); ?>
</div> </div>
\ No newline at end of file
<script>
require(['vue', 'vue-resource', 'DisciplineUI'], function(Vue, VueResource, DisciplineUI){
Vue.use(VueResource);
Vue.http.options.emulateJSON = true;
Vue.http.options.emulateHTTP = true;
new Vue({
el: "#disciplines",
render(h){
return h(DisciplineUI.default, {
props: {
disc: <?= json_encode($disciplines) ?>,
url: '<?= $this->url('administration/discipline') ?>'
}
});
}
})
})
</script>
import { createApp } from 'vue';
import AdminDiscipline from './views/administration/Discipline.vue';
let elemDatas = document.querySelector('#disciplines');
const app = createApp(AdminDiscipline, {
"url": elemDatas.dataset.url
});
app.mount('#disciplines');
\ No newline at end of file
...@@ -57,7 +57,6 @@ export default { ...@@ -57,7 +57,6 @@ export default {
}, },
handlerValid() { handlerValid() {
console.log("emit : modal-valid")
this.$emit("modal-valid"); this.$emit("modal-valid");
} }
} }
......
...@@ -96,10 +96,63 @@ body:not(.privatize) #btn-toggle-private .on { ...@@ -96,10 +96,63 @@ body:not(.privatize) #btn-toggle-private .on {
opacity: 1; opacity: 1;
} }
.card-state.card-disabled { .card-state.card-disabled {
opacity: 0.5; opacity: 0.7;
border-left-color: #cd1010; border-left-color: #cd1010;
} }
.usage {
background-color: #CCC;
display: inline-block;
position: relative;
padding: 4px;
top: -4px;
border-radius: 4px;
line-height: 1em;
font-weight: bold;
color: #555;
}
.usage.usage--used {
background-color: #5bc0de;
}
.card .card-header {
display: flex;
}
.card .card-header code, .card .card-header nav.fixed {
flex: 0;
}
.card .card-header strong, .card .card-header .fluid {
flex: 1;
}
.card.disabled .card-header strong {
text-decoration: line-through;
}
.btn-iconed:before, .btn-edit:before, .btn-delete:before, .btn-save:before {
font-family: fontello;
content: "\e871";
}
.btn-edit:before {
content: "\e882";
}
.btn-delete:before {
content: "\e866";
}
.btn-save:before {
content: "\e890";
}
.btn-lock:before {
content: "\e8a5";
}
.btn-unlock:before {
content: "\e8a6";
}
.activity-header .activity-description { .activity-header .activity-description {
font-size: 1.2em; font-size: 1.2em;
max-height: 4em; max-height: 4em;
......
{"version":3,"sourceRoot":"","sources":["oscar-css.scss"],"names":[],"mappings":"AAQA;EACE;EACA;;;AAIE;EACE;;;AAKN;EACE;;AACA;EACE;EACA;;AAEF;EACE;EACA;EACA;;AAGF;EACE;;;AAKF;EACE;;;AAKF;EACE;EACA;;AAEF;EACE;;AAIA;EACE;;;AAQF;EACE;;;AAKN;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EAUA;EACA;;AATA;EACE;EACA;EACA;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AAEF;EACE;EACA;;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;;AAQF;EAME;EACA;EACA;EACA;EACA;EACA;;AAVA;EACE;EACA;EACA;;AAQF;EACE;;AACA;EACE;EACA;EACA;EACA;;AAIN;EACE","file":"oscar-css.css"} {"version":3,"sourceRoot":"","sources":["oscar-css.scss"],"names":[],"mappings":"AAoCA;EACE;EACA;;;AAIE;EACE;;;AAKN;EACE;;AACA;EACE;EACA;;AAEF;EACE;EACA;EACA;;AAGF;EACE;;;AAKF;EACE;;;AAKF;EACE;EACA;;AAEF;EACE;;AAIA;EACE;;;AAQF;EACE;;;AAKN;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EAUA;EACA;;AATA;EACE;EACA;EACA;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;;AAEF;EACE;EACA;;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;;AAIJ;EACE,kBAzIiB;EA0IjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OA9Ic;;AA+Id;EACE,kBApKS;;;AA0KX;EACE;;AACA;EACE;;AAEF;EACE;;AAIF;EACE;;;AAQJ;EACE;EACA;;;AAQJ;EAAsB;;;AACtB;EAAsB;;;AACtB;EAAoB;;;AACpB;EAAoB;;;AACpB;EAAsB;;;AAMpB;EAME;EACA;EACA;EACA;EACA;EACA;;AAVA;EACE;EACA;EACA;;AAQF;EACE;;AACA;EACE;EACA;EACA;EACA;;AAIN;EACE","file":"oscar-css.css"}
\ No newline at end of file \ No newline at end of file
body { $brand-primary: #455790 !default;
$brand-complementary: #27556C !default;
} $bg-image: 'bg.jpg' !default;
//rgb(255 - red($brand-primary), 255 - green($brand-primary), 255 - blue($brand-primary));
$brand-secondary1: #6a5999;
$brand-secondary2: #ff6600;
$brand-success: #5cb85c !default;
$brand-info: #5bc0de !default;
$brand-warning: #f0ad4e !default;
$brand-danger: #d9534f !default;
$brand-error: #cb0b05 !default;
$colorGreyUltraLight: #CCC;
$colorGreyLight: #AAA;
$font-size-smallest: 9px;
$font-size-smaller: 10px;
$font-size-smaller: 10px;
$font-size-small: 12px;
$font-size-base: 14px;
$font-size-big: 16px;
$font-size-bigger: 18px;
$font-size-biggest: 20px;
$grey-ultra-light: #CCC;
$grid-float-breakpoint: 1024px;
$colorGreyMedium: #999;
$colorGreyDark: #555;
$colorGreyBlack: #222;
$colorGreyM: #999; $colorGreyM: #999;
...@@ -127,11 +155,63 @@ body:not(.privatize){ ...@@ -127,11 +155,63 @@ body:not(.privatize){
} }
&.card-disabled { &.card-disabled {
opacity: .5; opacity: .7;
border-left-color: #cd1010; border-left-color: #cd1010;
} }
} }
.usage {
background-color: $grey-ultra-light;
display: inline-block;
position: relative;
padding: 4px;
top: -4px;
border-radius: 4px;
line-height: 1em;
font-weight: bold;
color: $colorGreyDark;
&.usage--used {
background-color: $brand-info;
}
}
// CARDS
.card {
.card-header {
display: flex;
code,nav.fixed {
flex: 0;
}
strong,.fluid {
flex: 1;
}
}
&.disabled {
.card-header strong {
text-decoration: line-through;
}
}
}
// BOUTONS
.btn-iconed {
&:before {
font-family: fontello;
content: '\e871';
}
}
.btn-edit, .btn-delete, .btn-save {
@extend .btn-iconed;
}
.btn-edit:before { content: '\e882';}
.btn-delete:before { content: '\e866';}
.btn-save:before { content: '\e890';}
.btn-lock:before { content: '\e8a5';}
.btn-unlock:before { content: '\e8a6';}
// Fiche ACTIVITY // Fiche ACTIVITY
.activity-header { .activity-header {
......
...@@ -74,6 +74,7 @@ export default { ...@@ -74,6 +74,7 @@ export default {
}, },
put: (url, params = {}, options = {}) => { put: (url, params = {}, options = {}) => {
console.log(url, params);
pendingOn(options); pendingOn(options);
let response = axios.put(url, params); let response = axios.put(url, params);
response.catch((error) => { response.catch((error) => {
......
<template>
<h1>Discipline</h1>
<Modal :visible="edited" @modal-cancel="edited = null" @modal-valid="handlerSave">
<DisciplineAdminForm v-model="edited"></DisciplineAdminForm>
</Modal>
<nav>
<input type="search" v-model="searched" class="form-control"/>
<button class="btn btn-primary">
Nouvelle discipline
</button>
<button class="btn btn-default" @click="handlerFetch">
Fetch
</button>
</nav>
<section class="admin discipline">
<article class="card card-state" v-for="item in filtered" :key="item.id" :class="{'card-disabled': !item.active}">
<h3 class="card-header">{{ item.name }}
<code>
[{{ item.id }}]
</code>
<strong class="fluid">
<i class="icon-block" v-if="!item.active"></i>
{{ item.label }}
<small class="usage" :class="{'usage--used': item.count > 0}">
{{ item.count }} utilisation(s)
</small>
</strong>
<nav class="btn-group btn-group-xs">
<button class="btn btn-danger btn-delete" @click="handlerDeleteItem(item)">
Supprimer
</button>
<button class="btn btn-secondary btn-edit" @click="handlerEditItem(item)">
Editer
</button>
<button class="btn btn-secondary" @click="handlerToggleUse(item)">
<span v-if="item.active">
<i class="icon-eye-off"></i>
Rendre indisponible
</span>
<span v-else>
<i class="icon-eye"></i>
Rendre disponible
</span>
</button>
</nav>
</h3>
</article>
</section>
</template>
<script setup>
import {ref, defineComponent, defineProps, onMounted, computed} from "vue";
import AxiosOscar from "../../utils/AxiosOscar.js";
import Modal from "../../components/Modal.vue";
import DisciplineAdminForm from "./form/DisciplineAdminForm.vue";
defineComponent({ Modal });
// PROPS
let props = defineProps({
url: { required: true }
});
// DATAS
let items = ref([]);
let edited = ref(null);
let searched = ref("");
let filtered = computed(()=> {
if( searched.value ){
return items.value.filter(item => item.label.toLowerCase().indexOf(searched.value.toLowerCase())>=0);
} else {
return items.value;
}
});
// HANDLERS
function handlerDeleteItem(item) {
}
function handlerFetch() {
AxiosOscar.get(props.url).then((response) => {
items.value = response.data;
})
}
function handlerEditItem(item) {
edited.value = JSON.parse(JSON.stringify(item));
}
function handlerSave() {
let dt = JSON.parse(JSON.stringify(edited.value));
AxiosOscar.put(props.url, dt).then((response) => {
handlerFetch()
})
}
function handlerToggleUse(item) {
let dt = JSON.parse(JSON.stringify(item));
dt.active = !dt.active;
AxiosOscar.put(props.url, dt).then((response) => {
handlerFetch()
})
}
onMounted(() => {
handlerFetch()
})
</script>
\ No newline at end of file
<template>
<div class="form-group form-group-lg">
<label for="intitule" class="form-label">
Intitulé
</label>
<input type="text" v-model="model.label" class="form-control" placeholder="Intitulé" id="intitule" />
</div>
<div class="form-group form-group-lg">
<label for="active" class="form-label">
Active
</label>
<input type="checkbox" v-model="model.active" class="form-control" placeholder="Intitulé" id="active" />
</div>
</template>
<script setup>
import { defineModel } from "vue";
const model = defineModel();
</script>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment