diff --git a/imports/ui/Codis.jsx b/imports/ui/Codis.jsx index 9eb3bfd..5fe280f 100644 --- a/imports/ui/Codis.jsx +++ b/imports/ui/Codis.jsx @@ -1,7 +1,9 @@ import React, { Suspense, useEffect, useState, useRef, lazy } from 'react'; -import { Meteor } from 'meteor/meteor';; +import { Meteor } from 'meteor/meteor'; +import { Random } from 'meteor/random'; import { NecessitatsCollection } from '/imports/api/necessitats.js'; import { PoblesCollection } from '../api/pobles'; +import { CodisCollection } from '../api/codis'; // import { TipusCollection } from '../api/tipus'; import { useSubscribe, useTracker, useFind } from 'meteor/react-meteor-data/suspense'; import { Roles } from 'meteor/roles'; @@ -12,6 +14,12 @@ import CreatableSelect from 'react-select/creatable'; // import AsyncCreatableSelect from 'react-select/async-creatable'; // import { BarraNav } from "./BarraNav/BarraNav"; +// import InfiniteCalendar from 'react-infinite-calendar'; +import 'react-infinite-calendar/styles.css'; + +function generaCodi() { + return Random.id().slice(0, 5); +} export const Codis = () => { @@ -33,6 +41,9 @@ export const Codis = () => { useSubscribe('necessitats'); const necessitats = useTracker("necessitats", () => NecessitatsCollection.find().fetchAsync()); + useSubscribe('codis'); + const codis = useTracker("codis", () => CodisCollection.find().fetchAsync()); + useSubscribe('pobles'); const pobles = useTracker("pobles", () => PoblesCollection.find().fetchAsync()); const ambits = pobles?.map(p => p?.ambitAssociat); @@ -60,6 +71,7 @@ export const Codis = () => { return <> Rol: necessitats.find(nec => nec.tipus === tipusSeleccionat._id)} @@ -97,6 +109,10 @@ export const Codis = () => { } const QuadreInfo_Codis = () => { + + const [actCond, setActCond] = useState(true); + const [codiGenerat, setCodiGenerat] = useState(generaCodi()?.toUpperCase()); + return { {ambitSeleccionat && {ambitSeleccionat?.value}} Codis - Tria el rol que adquirirà qui utilitze el codi. + {/* { + ev.preventDefault(); + ev.stopPropagation(); + + setCodiGenerat(generaCodi()); + }} + >Genera el codi */} + + + {codiGenerat} + + + + Tria el rol que adquirirà qui utilitze el codi anterior una vegada activat + { // if (d.get('selTipus')) try { - Meteor.callAsync('editaOAfigNecessitat', { - ...tipusSeleccionat || [], - titol: d.get('titol'), - tipus: d.get('selTipus') || "", - poble: d.get('selPoble') + Meteor.callAsync('editaOAfigCodi', { + ...codiGenerat || [], + codi: codiGenerat, + ambit: d.get('selAmbit') || "", + rol: d.get('selRol'), + act_abs: d.get('activ_abs'), + act_cond: d.get('activ_cond'), + periode_validesa_ini: d.get('periode_validesa_ini'), + periode_validesa_fi: d.get('periode_validesa_fi') }) .then(() => setAmbitSeleccionat(null)) .catch(err => console.error(err)) @@ -138,6 +186,7 @@ export const Codis = () => { */} "Crear nou tipus..."} // filterOption={filterAmbit} @@ -178,37 +227,75 @@ export const Codis = () => { - - - Actiu? - - Periode de validesa: - + + + TEMPS REAL: + Activació absoluta: + + + + + {/* L'activació condicionada desactivada fa que no siguen 'required' les dates d'inici i final */} + + Activació condicionada: + setActCond(!actCond)} + /> + ATENCIÓ al format! (mm/dd/aaaa) + + Des de: + + Fins a: + + - {/* + {/* { pobles.map((v,i) => {v.nomPoble}) } */} - - - - {ambitSeleccionat && esEditor && { + + + + + {/* {ambitSeleccionat && esEditor && { ev.preventDefault(); if (confirm(`Vas a eliminar el poble "${pobleSeleccionat.nomPoble}". És una operació irreversible. Procedir?`)) { Meteor.callAsync('eliminaPoble', pobleSeleccionat._id).catch(err => console.error(err)); setNecessitatSeleccionada(null); } - }}>Elimina} + }}>Elimina} */} ; }; + const + today = new Date(), + lastWeek = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 7) + ; + + console.log("codis: ", codis); + return Carregant...>} > @@ -232,10 +319,11 @@ export const Codis = () => { rowGap: `.3em`, alignContent: `space-around` }}>{ - ambits - .sort((a,b) => a.toLowerCase() > b.toLowerCase()) - .map(amb => a?.codi?.editedAt < b?.codi?.editedAt) + .map(cod => { backgroundColor: `${'lightgreen' || 'lightcoral'}` }} > - {amb}{esEditor && {setAmbitSeleccionat({value: amb, label: amb})}}>Edita} + {cod.codi} + {/* {esEditor && {setAmbitSeleccionat({value: cod, label: cod})}}>Edita} */} ) } + + {/* */} ; }; \ No newline at end of file diff --git a/imports/ui/Info.jsx b/imports/ui/Info.jsx index a9a7a45..5af8d58 100644 --- a/imports/ui/Info.jsx +++ b/imports/ui/Info.jsx @@ -1,23 +1,23 @@ -import React from 'react'; -import { useFind, useSubscribe } from 'meteor/react-meteor-data'; -import { LinksCollection } from '../api/links'; +// import React from 'react'; +// import { useFind, useSubscribe } from 'meteor/react-meteor-data'; +// import { LinksCollection } from '../api/links'; -export const Info = () => { - const isLoading = useSubscribe('links'); - const links = useFind(() => LinksCollection.find()); +// export const Info = () => { +// const isLoading = useSubscribe('links'); +// const links = useFind(() => LinksCollection.find()); - if(isLoading()) { - return Loading...; - } +// if(isLoading()) { +// return Loading...; +// } - return ( - - Learn Meteor! - {links.map( - link => - {link.title} - - )} - - ); -}; +// return ( +// +// Learn Meteor! +// {links.map( +// link => +// {link.title} +// +// )} +// +// ); +// }; diff --git a/server/main.js b/server/main.js index 98febb9..9b6925e 100644 --- a/server/main.js +++ b/server/main.js @@ -6,6 +6,7 @@ import { Roles } from 'meteor/roles'; import { ROLS_GLOBALS, ROLS_DE_POBLE } from '../imports/roles'; import { NecessitatsCollection } from '../imports/api/necessitats'; import { TipusCollection } from '../imports/api/tipus'; +import { CodisCollection } from '../imports/api/codis'; async function insertPoble({ nomPoble, cp, comarca }) { await PoblesCollection.insertAsync({ nomPoble, cp, comarca, createdAt: new Date() }); @@ -201,6 +202,27 @@ Meteor.startup(async () => { return TipusCollection.find(); }); + Meteor.publish('codis', async function (uid) { + + const esAdmin = await Roles.userIsInRoleAsync(this.userId, "admin", null); + const userRoles = await Roles.getRolesForUserAsync(this.userId); + + // console.log("userRoles: ", userRoles); + // console.log("esAdmin: ", esAdmin); + + if (esAdmin) { + return CodisCollection.find({}); + } + + return false; + + // if (uid) { + // return Meteor.users.find({_id: uid}, {fields: {username: 1, avatarId: 1, avatarLink: 1}}); + // } + + return Meteor.users.find({},{fields: {username: 1, avatarId: 1, avatarLink: 1}}); + }); + Meteor.publish('usuaris', async function (uid) { const esAdmin = await Roles.userIsInRoleAsync(this.userId, "admin", null); @@ -379,6 +401,31 @@ Meteor.methods({ console.error(e); } }, + + 'editaOAfigCodi': async function (codiObj) { + const esAdmin = await Roles.userIsInRoleAsync(Meteor.userId(), "admin"); + try { + console.log(`CREACIÓ DE CODI sol·licitada per a "${codiObj.codi}". Comprovant si ${Meteor.userId()} és Admin: `, esAdmin); + + if (esAdmin && codiObj.codi) { + return await CodisCollection.upsertAsync( + { + _id: codiObj._id + }, { + $set: { + ...codiObj, + usuari: Meteor.userId(), + editedAt: new Date() + } + } + ); + } else { + throw new Error("El valor del codi no és vàlid"); + } + } catch (e) { + console.error(e); + } + }, }); }); \ No newline at end of file
Tria el rol que adquirirà qui utilitze el codi.
Tria el rol que adquirirà qui utilitze el codi anterior una vegada activat
TEMPS REAL:
ATENCIÓ al format! (mm/dd/aaaa)