Skip to content

Commit

Permalink
Merge branch 'release/0.21.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
polosson committed May 11, 2023
2 parents f9f23d6 + 55ff072 commit 8eb0070
Show file tree
Hide file tree
Showing 388 changed files with 13,466 additions and 7,370 deletions.
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,36 @@ Tous les changements notables sur le projet sont documentés dans ce fichier.

Ce projet adhère au principe du [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 0.21.0 (2023-05-11)

- Dans la liste du matériel, le champ "Afficher les quantités restantes à date" est pré-rempli avec
la date courante, et la quantité disponible est affichée à côté de la quantité totale en stock,
pour faciliter la comparaison.
- Corrige le comportement de la pagination des listings quand on essaye de charger une plage de données
qui n'existe pas ou plus (Premium #229).
- Les caractéristiques spéciales peuvent être totalisées en bas de la liste du matériel
de la fiche de sortie des événements et réservations (Premium #266). Un nouveau champ "Totalisable"
permet de contrôler si la caractéristique doit être utilisée ou non dans les totaux.
- Tous les champs des caractéristiques spéciales du matériel peuvent être modifiés, à l'exception du
champ "type", qui ne peut pas changer.
- Ajout de la possibilité de personnaliser les échantillons de couleurs proposés dans le sélecteur de
couleur via la clé `colorSwatches` dans configuration JSON du projet (`settings.json`).
- Il est maintenant possible de rattacher des documents aux techniciens, aux réservations et aux
événements (Premium #264, #298).
- L'URL de la partie "réservation en ligne" (/external) peut être copiée directement depuis la page des
paramètres de la réservation en ligne.
- Un nouvel onglet dans les paramètres du logiciel permet de contrôler le comportement des inventaires
de retour : soit l'inventaire est vide au départ, et doit être rempli manuellement (comportement par
défaut), soit les quantités retournées sont pré-remplies, et il faut décocher ce qui n'est pas revenu.
- Ajoute la possibilité de modifier la liste du matériel des réservations approuvées ou en attente,
tant que la facturation n'est pas activée (Premium #287).
- Les unités de matériel qui sont utilisées dans les événements ou les réservations sont à nouveau
affichées dans l'onglet "Périodes de réservation" de la fiche matériel (Premium #284).
- Les références des unités utilisées dans un événement ou une réservation sont affichées dans
l'onglet "materiel" de la fenêtre de l'événement ou réservation (Premium #284).
- Quand l'utilisateur connecté a des parcs restreints et qu'il n'a accès qu'à un seul parc de matériel,
le filtre par parc du calendrier est pré-rempli avec ce parc (Premium #163).

## 0.20.6 (2023-04-14)

- Pour les réservations en ligne, le comportement du délai minimum avant réservation a été revu
Expand Down
6 changes: 3 additions & 3 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ Cette commande vous permet de lancer un serveur de développement front-end, ave
qui servira les sources JS, CSS et les assets, à l'adresse `http://localhost:8081/`.

Pour travailler, créez un fichier `.env` dans le dossier `server/` qui contient la variable `APP_ENV=development`,
puis ouvrez l'application sur son serveur back-end (par ex. `http://robert2.local`).
puis ouvrez l'application sur son serveur back-end (par ex. `http://loxya.test`).

#### `yarn build`

Expand All @@ -109,11 +109,11 @@ _(Pensez à exécuter cette commande et à commiter le résultat dans votre PR l

## URL de l'API en développement

En développement, l'hôte par défaut utilisé par la partie client pour communiquer avec l'API est `http://robert2.local`.
En développement, l'hôte par défaut utilisé par la partie client pour communiquer avec l'API est `http://loxya.test/`.

Si vous souhaitez modifier ceci, vous pouvez créer un fichier `.env.development.local` à la racine du dossier
client et surcharger la variable d'environnement `VUE_APP_API_URL` avec votre propre URL d'API (par
exemple `http://localhost/robert2`).
exemple `http://localhost/loxya`).

## Migration de la base de données

Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.20.6
0.21.0
2 changes: 1 addition & 1 deletion client/.env.development
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VUE_APP_API_URL='http://robert2.local'
VUE_APP_API_URL='http://loxya.test'
21 changes: 18 additions & 3 deletions client/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
/* eslint-disable strict */

'use strict';

module.exports = {
extends: '@pulsanova/vue',

// - Globals
globals: {
require: 'readonly',
process: 'readonly',
},

// - Parseur
parserOptions: {
project: './tsconfig.json',
Expand Down Expand Up @@ -33,7 +37,7 @@ module.exports = {
},
},
{
files: ['**/tests/**/*', '**/__tests__/*'],
files: ['**/tests/**/*', '**/__tests__/*', '**/*.spec.*'],
env: { jest: true },
settings: {
'import/resolver': {
Expand All @@ -58,6 +62,17 @@ module.exports = {
'import/order': ['off'],
},
},
{
files: [
'**/jest.config.js',
'**/babel.config.js',
'**/eslint.config.js',
'**/postcss.config.js',
'**/vue.config.js',
'**/.eslintrc.js',
],
extends: '@pulsanova/node',
},
// - Autorise le `snake_case` dans les types d'API vu que pour le moment
// celle-ci accepte et retourne uniquement sous ce format.
{
Expand Down
2 changes: 1 addition & 1 deletion client/.gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
node_modules/

/dist/
/test/unit/coverage
/tests/coverage

# - Logs
npm-debug.log*
Expand Down
2 changes: 2 additions & 0 deletions client/babel.config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
'use strict';

module.exports = {
presets: [
'vca-jsx',
Expand Down
33 changes: 20 additions & 13 deletions client/jest.config.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,30 @@
'use strict';

module.exports = {
moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx', 'json', 'vue'],
transform: {
'^.+\\.vue$': 'vue-jest',
'.+\\.(css|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
'^.+\\.(j|t)sx?$': 'babel-jest',
},
transformIgnorePatterns: ['<rootDir>/node_modules/'],
rootDir: __dirname,
collectCoverageFrom: ['src/**/*.{js,ts,tsx}', '!src/**/*.d.ts'],
coverageDirectory: '<rootDir>/tests/coverage',
coverageReporters: ['lcov', 'html', 'text-summary'],
testMatch: [
'<rootDir>/tests/specs/**/*.{js,ts,tsx}',
'<rootDir>/src/**/__tests__/**/*.{js,ts,tsx}',
'<rootDir>/src/**/?(*.)spec.{js,ts,tsx}',
],
testEnvironment: 'jsdom',
testPathIgnorePatterns: ['/node_modules/'],
transformIgnorePatterns: ['[/\\\\]node_modules[/\\\\].+\\.(js|cts|mjs|ts|cts|mts|tsx)$'],
moduleFileExtensions: ['js', 'mjs', 'cjs', 'ts', 'tsx', 'mts', 'cts', 'json'],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'^@fixtures/(.*)$': '<rootDir>/tests/fixtures/$1',
},
snapshotSerializers: ['jest-serializer-vue'],
testMatch: [
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)',
'**/__tests__/*.(js|jsx|ts|tsx)',
],
testURL: 'http://localhost/',
transform: {
'^.+\\.(js|mjs|cjs|jsx|ts|mts|cts|tsx)$': 'babel-jest',
'^(?!.*\\.(js|mjs|cjs|ts|mts|cts|tsx|json)$)': 'jest-transform-stub',
},
watchPlugins: [
'jest-watch-typeahead/filename',
'jest-watch-typeahead/testname',
],
resetMocks: true,
};
58 changes: 35 additions & 23 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,66 +3,78 @@
"scripts": {
"start": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint:js": "eslint './**/*.{js,vue,ts,tsx}' --report-unused-disable-directives",
"lint:scss": "stylelint 'src/**/*.scss'",
"test": "npx cross-env TZ=UTC jest",
"check-types": "tsc",
"test": "npx cross-env TZ=UTC vue-cli-service test:unit"
"lint:js": "eslint './**/*.{js,vue,ts,tsx}' --report-unused-disable-directives",
"lint:scss": "stylelint 'src/**/*.scss'"
},
"dependencies": {
"@floating-ui/dom": "1.2.6",
"@fortawesome/fontawesome-free": "5.15.3",
"@loxya/vis-timeline": "file:./vendors/vis-timeline",
"@pulsanova/reboot.css": "2.1.3",
"@robert2/vis-timeline": "file:./vendors/vis-timeline",
"@vue/composition-api": "1.1.5",
"axios": "0.21.1",
"debounce": "1.2.1",
"decimal.js": "10.4.2",
"@vue/composition-api": "1.7.1",
"axios": "0.24.0",
"clsx": "1.2.1",
"decimal.js": "10.4.3",
"deep-freeze-strict": "1.1.1",
"invariant": "2.2.4",
"js-cookie": "2.2.1",
"js-cookie": "3.0.4",
"lodash": "^4.17.21",
"moment": "2.29.1",
"moment": "2.29.4",
"p-queue": "6.6.2",
"portal-vue": "2.1.7",
"status-code-enum": "~1.0.0",
"style-object-to-css-string": "1.0.1",
"sweetalert2": "11.0.20",
"tinycolor2": "1.6.0",
"v-tooltip": "2.1.3",
"vue": "2.6.14",
"vue-click-outside": "1.1.0",
"vue-js-modal": "2.0.0-rc.6",
"vue-query": "1.11.0",
"vue-js-modal": "2.0.1",
"vue-query": "1.26.0",
"vue-router": "3.5.2",
"vue-select": "3.12.1",
"vue-simple-calendar": "5.0.0",
"vue-tables-2": "2.3.4",
"vue-tables-2-premium": "2.3.6",
"vue-toasted": "1.1.28",
"vue2-datepicker": "3.11.0",
"vue2-datepicker": "3.11.1",
"vuex": "3.6.2",
"vuex-i18n": "1.13.1",
"warning": "4.0.3"
},
"devDependencies": {
"@babel/core": "7.20.12",
"@babel/preset-typescript": "7.18.6",
"@pulsanova/eslint-config-vue": "2.1.2",
"@babel/core": "7.21.4",
"@babel/preset-typescript": "7.21.4",
"@pulsanova/eslint-config-node": "2.3.0",
"@pulsanova/eslint-config-vue": "2.3.1",
"@pulsanova/stylelint-config-scss": "2.0.1",
"@types/debounce": "1.2",
"@types/invariant": "2.2",
"@types/lodash": "^4.14.191",
"@types/jest": "29",
"@types/js-cookie": "3.0",
"@types/lodash": "4",
"@types/tinycolor2": "1",
"@vue/babel-preset-app": "4.5.15",
"@vue/cli-plugin-babel": "4.5.13",
"@vue/cli-plugin-typescript": "4.5.13",
"@vue/cli-plugin-unit-jest": "4.5.13",
"@vue/cli-service": ">=4.5.13",
"@vue/test-utils": "1.2.2",
"babel-core": "7.0.0-bridge.0",
"babel-jest": "27.0.6",
"babel-jest": "29.5.0",
"babel-loader": "8.2.2",
"babel-preset-vca-jsx": "0.3.6",
"eslint": "8.3.0",
"eslint": "8.39.0",
"eslint-import-resolver-custom-alias": "1.3.0",
"eslint-import-resolver-webpack": "0.13.2",
"sass": "1.36.0",
"jest": "29.5.0",
"jest-environment-jsdom": "29.5.0",
"jest-transform-stub": "2.0.0",
"jest-watch-typeahead": "2.2.2",
"sass": "1.62.0",
"sass-loader": "10.2.0",
"stylelint": "14.1.0",
"typescript": "4.9.5",
"typescript": "5.0.4",
"vue-cli-plugin-svg": "0.1.3",
"vue-cli-plugin-yaml": "1.0.2",
"vue-template-compiler": "2.6.14"
Expand Down
2 changes: 2 additions & 0 deletions client/postcss.config.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
'use strict';

module.exports = {
plugins: {
autoprefixer: {},
Expand Down
File renamed without changes.
1 change: 1 addition & 0 deletions client/src/globals/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ const defaultConfig = {
defaultPaginationLimit: 100,
billingMode: 'partial',
maxFileUploadSize: 25 * 1024 * 1024,
colorSwatches: null,
};

const globalConfig = window.__SERVER_CONFIG__ || defaultConfig;
Expand Down
18 changes: 8 additions & 10 deletions client/src/globals/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,19 @@ import moment from 'moment';
const APP_NAME = 'Loxya (Robert2)';

const DATE_DB_FORMAT = 'YYYY-MM-DD HH:mm:ss';
const DEBOUNCE_WAIT = 500; // - in milliseconds
const DEBOUNCE_WAIT = 500; // - En millisecondes

const ALLOWED_IMAGE_TYPES = [
'image/jpeg',
'image/png',
'image/webp',
];

const AUTHORIZED_FILE_TYPES = [
...ALLOWED_IMAGE_TYPES,
'application/pdf',
'application/zip',
'application/x-rar-compressed',
'image/jpeg',
'image/png',
'image/webp',
'text/plain',
'application/vnd.oasis.opendocument.spreadsheet',
'application/vnd.ms-excel',
Expand All @@ -21,12 +25,6 @@ const AUTHORIZED_FILE_TYPES = [
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
];

const ALLOWED_IMAGE_TYPES = [
'image/jpeg',
'image/png',
'image/webp',
];

const TECHNICIAN_EVENT_STEP = moment.duration(15, 'minutes');
const TECHNICIAN_EVENT_MIN_DURATION = moment.duration(15, 'minutes');

Expand Down
2 changes: 1 addition & 1 deletion client/src/globals/queryClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { isRequestErrorStatusCode } from '@/utils/errors';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 10 * 60000, // - 10 minutes
staleTime: 10 * 60_000, // - 10 minutes
retry: (failureCount: number, error: unknown) => {
if (isRequestErrorStatusCode(error, HttpCode.ClientErrorNotFound)) {
return false;
Expand Down
1 change: 1 addition & 0 deletions client/src/globals/types/vendors/vue-click-outside.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
declare module 'vue-click-outside';
2 changes: 1 addition & 1 deletion client/src/globals/types/vendors/vue-tables-2.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
declare module 'vue-tables-2' {
declare module 'vue-tables-2-premium' {
import type { VNode } from 'vue';
import type { PaginationParams } from '@/stores/api/@types';

Expand Down
2 changes: 2 additions & 0 deletions client/src/globals/types/vendors/vue.d.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
declare module 'vue' {
import type { VueConstructor as VueConstructorCore } from 'vue';

export type { VNode } from 'vue';

export interface VueConstructor extends VueConstructorCore {
$store: any;
$router: any;
Expand Down
2 changes: 1 addition & 1 deletion client/src/hooks/useNow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { Ref } from '@vue/composition-api';
* Permet de récupérer le timestamp courant (équivalent à `Date.now()`).
* Ce timestamp sera mis à jour toutes les minutes.
*
* @return Le timestamp courant (voir `Date.now()`).
* @returns Le timestamp courant (voir `Date.now()`).
*/
const useNow = (): Ref<number> => {
const now = ref(Date.now());
Expand Down
Loading

0 comments on commit 8eb0070

Please sign in to comment.