@movalib/movalib-commons 1.59.2 → 1.59.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -51,5 +51,5 @@ export { validateField, formatVehicleTire, formatFrenchVehiclePlate, isEmpty, ge
51
51
  export { validatePhoneNumber, validateText, validateEmail } from './src/helpers/Validator';
52
52
  export { formatDateByCountryCode, getLongFormattedDateTime } from './src/helpers/DateUtils';
53
53
  export { request, API_BASE_URL } from './src/helpers/ApiHelper';
54
- export { RoleType, MovaAppType, DayOfWeek, EventState, EventType, DocumentType, DigitalPassportIndex, DocumentState, Gender, DateFormatTypes, PartsApplicationType, ProductType, OrderPreference, OrderState, SlotAlgorithm, VehiclePlateFormat as VehiclePlateType, SubscriptionPaymentInterval, RegistrationState, PrestationType, PrestationState, CountryCode, SubscriptionState, SubscriptionType, APIMethod, } from './src/helpers/Enums';
54
+ export { CustomerType, RoleType, MovaAppType, DayOfWeek, EventState, EventType, DocumentType, DigitalPassportIndex, DocumentState, Gender, DateFormatTypes, PartsApplicationType, ProductType, OrderPreference, OrderState, SlotAlgorithm, VehiclePlateFormat as VehiclePlateType, SubscriptionPaymentInterval, RegistrationState, PrestationType, PrestationState, CountryCode, SubscriptionState, SubscriptionType, APIMethod, } from './src/helpers/Enums';
55
55
  export { openDialogPrint } from './src/utils/DialogPrint';
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.formatVehicleTire = exports.validateField = exports.deleteCookie = exports.readCookie = exports.CategoryPrestation = exports.VehicleTire = exports.Event = exports.Schedule = exports.Garage = exports.Document = exports.Vehicle = exports.Address = exports.Role = exports.User = exports.Customer = exports.Logger = exports.Operation = exports.Prestation = exports.Product = exports.Supplier = exports.Employee = exports.Absence = exports.Subscription = exports.PrintSize = exports.PLVComponent = exports.QrCodePLVContainer = exports.GenderSelector = exports.ConfirmationDialog = exports.MovaVehicleTireField = exports.MovaCopyright = exports.MovaSignUp = exports.MovaLogin = exports.MovaSnackbar = exports.TestButton = exports.VehiclePlateField = exports.QRCode = exports.MovaDialog = exports.Loader = exports.MovaDigitalPassport = exports.VehicleFullCard = exports.ScheduleFields = exports.AddressFields = exports.AccountValidation = exports.GaragePLV = exports.IbanInput = exports.DialogForgotPassword = exports.UserService = exports.GarageService = exports.AuthenticationService = exports.VehicleService = void 0;
8
- exports.openDialogPrint = exports.APIMethod = exports.SubscriptionType = exports.SubscriptionState = exports.CountryCode = exports.PrestationState = exports.PrestationType = exports.RegistrationState = exports.SubscriptionPaymentInterval = exports.VehiclePlateType = exports.SlotAlgorithm = exports.OrderState = exports.OrderPreference = exports.ProductType = exports.PartsApplicationType = exports.DateFormatTypes = exports.Gender = exports.DocumentState = exports.DigitalPassportIndex = exports.DocumentType = exports.EventType = exports.EventState = exports.DayOfWeek = exports.MovaAppType = exports.RoleType = exports.API_BASE_URL = exports.request = exports.getLongFormattedDateTime = exports.formatDateByCountryCode = exports.validateEmail = exports.validateText = exports.validatePhoneNumber = exports.getApplicationsShortLabels = exports.isSafariOniOS = exports.getDayOfWeekLabel = exports.findScheduleByDayOfWeek = exports.getFormattedIntervals = exports.getFormattedSchedule = exports.formatPhoneNumber = exports.flexLeftRow = exports.capitalizeFirstLetter = exports.getApplicationShortLabel = exports.isEmpty = exports.formatFrenchVehiclePlate = void 0;
8
+ exports.openDialogPrint = exports.APIMethod = exports.SubscriptionType = exports.SubscriptionState = exports.CountryCode = exports.PrestationState = exports.PrestationType = exports.RegistrationState = exports.SubscriptionPaymentInterval = exports.VehiclePlateType = exports.SlotAlgorithm = exports.OrderState = exports.OrderPreference = exports.ProductType = exports.PartsApplicationType = exports.DateFormatTypes = exports.Gender = exports.DocumentState = exports.DigitalPassportIndex = exports.DocumentType = exports.EventType = exports.EventState = exports.DayOfWeek = exports.MovaAppType = exports.RoleType = exports.CustomerType = exports.API_BASE_URL = exports.request = exports.getLongFormattedDateTime = exports.formatDateByCountryCode = exports.validateEmail = exports.validateText = exports.validatePhoneNumber = exports.getApplicationsShortLabels = exports.isSafariOniOS = exports.getDayOfWeekLabel = exports.findScheduleByDayOfWeek = exports.getFormattedIntervals = exports.getFormattedSchedule = exports.formatPhoneNumber = exports.flexLeftRow = exports.capitalizeFirstLetter = exports.getApplicationShortLabel = exports.isEmpty = exports.formatFrenchVehiclePlate = void 0;
9
9
  // Export des services
10
10
  var VehicleService_1 = require("./src/services/VehicleService");
11
11
  Object.defineProperty(exports, "VehicleService", { enumerable: true, get: function () { return __importDefault(VehicleService_1).default; } });
@@ -131,6 +131,7 @@ Object.defineProperty(exports, "request", { enumerable: true, get: function () {
131
131
  Object.defineProperty(exports, "API_BASE_URL", { enumerable: true, get: function () { return ApiHelper_1.API_BASE_URL; } });
132
132
  // Export des enums
133
133
  var Enums_1 = require("./src/helpers/Enums");
134
+ Object.defineProperty(exports, "CustomerType", { enumerable: true, get: function () { return Enums_1.CustomerType; } });
134
135
  Object.defineProperty(exports, "RoleType", { enumerable: true, get: function () { return Enums_1.RoleType; } });
135
136
  Object.defineProperty(exports, "MovaAppType", { enumerable: true, get: function () { return Enums_1.MovaAppType; } });
136
137
  Object.defineProperty(exports, "DayOfWeek", { enumerable: true, get: function () { return Enums_1.DayOfWeek; } });
@@ -231,7 +231,7 @@ var MovaSignUp = function (_a) {
231
231
  }
232
232
  } }), usePhoneNumber && (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.TextField, { type: "tel", margin: "normal", required: true, fullWidth: true, id: "phoneNumber", label: "N\u00B0 de t\u00E9l\u00E9phone", name: "phoneNumber", autoComplete: "tel", onChange: function (e) { return handleInputChange(e); }, value: userForm.phoneNumber.value, error: Boolean(userForm.phoneNumber.error), helperText: userForm.phoneNumber.error, InputProps: {
233
233
  endAdornment: ((0, jsx_runtime_1.jsx)(InputAdornment_1.default, __assign({ position: "end" }, { children: (0, jsx_runtime_1.jsx)(material_1.IconButton, __assign({ edge: "end", onClick: function () { return setOpenPhoneNumberInfo(!openPhoneNumberInfo); } }, { children: (0, jsx_runtime_1.jsx)(Info_1.default, {}) })) }))),
234
- } }), openPhoneNumberInfo && (0, jsx_runtime_1.jsx)(material_1.Alert, __assign({ severity: "info", variant: 'standard' }, { children: "Indispensable en cas d'impr\u00E9vu avec votre v\u00E9hicule." }))] }), (0, jsx_runtime_1.jsx)(material_1.TextField, { margin: "normal", required: true, fullWidth: true, id: "email", label: "Adresse email", name: "email", autoComplete: "email", onChange: function (e) { return handleInputChange(e); }, value: userForm.email.value, error: !userForm.email.isValid, helperText: userForm.email.error, sx: {
234
+ } }), openPhoneNumberInfo && (0, jsx_runtime_1.jsx)(material_1.Alert, __assign({ severity: "info", variant: 'standard' }, { children: "Entrez le num\u00E9ro de t\u00E9l\u00E9phone que vous avez utilis\u00E9 pour r\u00E9server, afin de suivre facilement vos rendez-vous." }))] }), (0, jsx_runtime_1.jsx)(material_1.TextField, { margin: "normal", required: true, fullWidth: true, id: "email", label: "Adresse email", name: "email", autoComplete: "email", onChange: function (e) { return handleInputChange(e); }, value: userForm.email.value, error: !userForm.email.isValid, helperText: userForm.email.error, sx: {
235
235
  '& .MuiOutlinedInput-notchedOutline': {
236
236
  borderColor: darkMode ? 'white' : 'default', // Couleur de la bordure
237
237
  }
@@ -33,6 +33,7 @@ var theme_1 = __importDefault(require("../theme")); // Import du thème personna
33
33
  var Enums_1 = require("./helpers/Enums");
34
34
  var Logger_1 = __importDefault(require("./helpers/Logger"));
35
35
  var Tools_1 = require("./helpers/Tools");
36
+ var DateUtils_1 = require("./helpers/DateUtils");
36
37
  var ContentCopy_1 = __importDefault(require("@mui/icons-material/ContentCopy"));
37
38
  var initialSchedules = [
38
39
  { day: Enums_1.DayOfWeek.MONDAY, checked: false, allDay: false, intervals: [{ startTime: null, endTime: null, countryCode: Enums_1.CountryCode.FR, error: null }] },
@@ -147,8 +148,8 @@ var ScheduleFields = function (_a) {
147
148
  newSchedule[dayIndex].intervals[intervalIndex].error = validateIntervals(newSchedule[dayIndex].intervals);
148
149
  }
149
150
  setSchedule(newSchedule);
150
- if (type === 'endTime') {
151
- // On invoque la callback de mise à jour uniquement sur l'intervalle de fin
151
+ if (type === 'endTime' || (type === 'startTime' && (0, DateUtils_1.isValidDate)(newSchedule[dayIndex].intervals[intervalIndex].endTime))) {
152
+ // On invoque la callback de mise à jour sur les deux intervalles, toutefois on contrôle que l'intervalle de fin est alimentée
152
153
  onChange(newSchedule);
153
154
  }
154
155
  };
@@ -188,7 +189,7 @@ var ScheduleFields = function (_a) {
188
189
  onChange(newSchedule);
189
190
  setSchedule(newSchedule);
190
191
  }; };
191
- return ((0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ container: true, spacing: 1, sx: { minWidth: '650px', maxWidth: '800px' } }, { children: schedule.map(function (daySchedule, dayIndex) { return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ item: true, xs: 2 }, { children: (0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { control: (0, jsx_runtime_1.jsx)(material_1.Checkbox, { checked: daySchedule.checked, onChange: handleDayChecked(dayIndex) }), label: (0, Tools_1.getDayOfWeekLabel)(daySchedule.day) }) }), dayIndex + 1), (0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ item: true, xs: 7 }, { children: daySchedule.intervals.map(function (interval, intervalIndex) { return ((0, jsx_runtime_1.jsxs)(material_1.Grid, __assign({ container: true, style: { paddingTop: intervalIndex > 0 ? theme_1.default.spacing(1) : 0 } }, { children: [(0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ item: true, xs: 6, sx: { textAlign: 'center' } }, { children: (0, jsx_runtime_1.jsx)(x_date_pickers_1.TimePicker, { views: ['hours', 'minutes'], minutesStep: timePickerStep !== null && timePickerStep !== void 0 ? timePickerStep : 30, disabled: !daySchedule.checked, value: interval.startTime, formatDensity: 'dense', closeOnSelect: false, onAccept: handleIntervalChange(dayIndex, intervalIndex, 'startTime'), slotProps: {
192
+ return ((0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ container: true, spacing: 1, sx: { minWidth: '650px', maxWidth: '800px' } }, { children: schedule.map(function (daySchedule, dayIndex) { return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ item: true, xs: 2 }, { children: (0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { control: (0, jsx_runtime_1.jsx)(material_1.Checkbox, { checked: daySchedule.checked, onChange: handleDayChecked(dayIndex) }), label: (0, Tools_1.getDayOfWeekLabel)(daySchedule.day) }) }), dayIndex + 1), (0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ item: true, xs: 7 }, { children: daySchedule.intervals.map(function (interval, intervalIndex) { return ((0, jsx_runtime_1.jsxs)(material_1.Grid, __assign({ container: true, style: { paddingTop: intervalIndex > 0 ? theme_1.default.spacing(1) : 0 } }, { children: [(0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ item: true, xs: 6, sx: { textAlign: 'center' } }, { children: (0, jsx_runtime_1.jsx)(x_date_pickers_1.TimePicker, { views: ['hours', 'minutes'], minutesStep: timePickerStep !== null && timePickerStep !== void 0 ? timePickerStep : 30, disabled: !daySchedule.checked, value: interval.startTime, formatDensity: 'dense', closeOnSelect: false, onChange: handleIntervalChange(dayIndex, intervalIndex, 'startTime'), slotProps: {
192
193
  textField: {
193
194
  size: 'small',
194
195
  sx: {
@@ -200,7 +201,7 @@ var ScheduleFields = function (_a) {
200
201
  actionBar: {
201
202
  sx: { display: 'none' },
202
203
  },
203
- } }) }), (intervalIndex + 1) * Math.random()), (0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ item: true, xs: 6, sx: { display: 'contents' } }, { children: (0, jsx_runtime_1.jsx)(x_date_pickers_1.TimePicker, { minutesStep: timePickerStep !== null && timePickerStep !== void 0 ? timePickerStep : 30, disabled: !(interval.startTime instanceof Date), value: interval.endTime, formatDensity: 'dense', onAccept: handleIntervalChange(dayIndex, intervalIndex, 'endTime'), closeOnSelect: false, slotProps: {
204
+ } }) }), (intervalIndex + 1) * Math.random()), (0, jsx_runtime_1.jsx)(material_1.Grid, __assign({ item: true, xs: 6, sx: { display: 'contents' } }, { children: (0, jsx_runtime_1.jsx)(x_date_pickers_1.TimePicker, { minutesStep: timePickerStep !== null && timePickerStep !== void 0 ? timePickerStep : 30, disabled: !(interval.startTime instanceof Date), value: interval.endTime, formatDensity: 'dense', onChange: handleIntervalChange(dayIndex, intervalIndex, 'endTime'), closeOnSelect: false, slotProps: {
204
205
  textField: {
205
206
  size: 'small',
206
207
  sx: {
@@ -211,7 +211,7 @@ var QrCodePLVContainer = function (_a) {
211
211
  page = _b.sent();
212
212
  canvas = document.createElement('canvas');
213
213
  context = canvas.getContext('2d');
214
- viewport = page.getViewport({ scale: 4 });
214
+ viewport = page.getViewport({ scale: 3 });
215
215
  canvas.width = viewport.width;
216
216
  canvas.height = viewport.height;
217
217
  renderContext = {
@@ -1,5 +1,6 @@
1
1
  /// <reference types="date-fns" />
2
2
  import { DateFormatTypes } from './Enums';
3
+ export declare function isValidDate(date: unknown): date is Date;
3
4
  export declare const countryTimeZones: {
4
5
  [key: string]: string;
5
6
  };
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getLongFormattedDateTime = exports.formatDateByCountryCode = exports.toUTCToLocaleDate = exports.countryTimeZones = void 0;
3
+ exports.getLongFormattedDateTime = exports.formatDateByCountryCode = exports.toUTCToLocaleDate = exports.countryTimeZones = exports.isValidDate = void 0;
4
4
  var date_fns_tz_1 = require("date-fns-tz");
5
5
  var locale_1 = require("date-fns/locale");
6
6
  var Enums_1 = require("./Enums");
7
7
  var Tools_1 = require("./Tools");
8
+ function isValidDate(date) {
9
+ return date instanceof Date && !isNaN(date.getTime());
10
+ }
11
+ exports.isValidDate = isValidDate;
8
12
  // Tableau de correspondance entre les codes de pays et les fuseaux horaires
9
13
  exports.countryTimeZones = {
10
14
  'FR': 'Europe/Paris',
@@ -1,3 +1,7 @@
1
+ export declare enum CustomerType {
2
+ INDIVIDUAL = "INDIVIDUAL",
3
+ PROFESSIONAL = "PROFESSIONAL"
4
+ }
1
5
  export declare enum SubscriptionType {
2
6
  PRO_FREE = "PRO_FREE",
3
7
  PRO_STANDARD = "PRO_STANDARD"
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RoleType = exports.MovaAppType = exports.DocumentType = exports.DocumentState = exports.DayOfWeek = exports.EventType = exports.EventState = exports.DigitalPassportIndex = exports.Gender = exports.DateFormatTypes = exports.APIMethod = exports.PartsApplicationType = exports.ProductType = exports.OrderPreference = exports.OrderState = exports.SlotAlgorithm = exports.VehiclePlateFormat = exports.RegistrationState = exports.SubscriptionPaymentInterval = exports.PrestationType = exports.PrestationState = exports.CountryCode = exports.SubscriptionState = exports.SubscriptionType = void 0;
3
+ exports.RoleType = exports.MovaAppType = exports.DocumentType = exports.DocumentState = exports.DayOfWeek = exports.EventType = exports.EventState = exports.DigitalPassportIndex = exports.Gender = exports.DateFormatTypes = exports.APIMethod = exports.PartsApplicationType = exports.ProductType = exports.OrderPreference = exports.OrderState = exports.SlotAlgorithm = exports.VehiclePlateFormat = exports.RegistrationState = exports.SubscriptionPaymentInterval = exports.PrestationType = exports.PrestationState = exports.CountryCode = exports.SubscriptionState = exports.SubscriptionType = exports.CustomerType = void 0;
4
+ var CustomerType;
5
+ (function (CustomerType) {
6
+ CustomerType["INDIVIDUAL"] = "INDIVIDUAL";
7
+ CustomerType["PROFESSIONAL"] = "PROFESSIONAL";
8
+ })(CustomerType = exports.CustomerType || (exports.CustomerType = {}));
4
9
  var SubscriptionType;
5
10
  (function (SubscriptionType) {
6
11
  SubscriptionType["PRO_FREE"] = "PRO_FREE";
@@ -1,3 +1,4 @@
1
+ import { CustomerType } from "../helpers/Enums";
1
2
  import Address from "./Address";
2
3
  import Role from "./Role";
3
4
  import User from "./User";
@@ -8,8 +9,24 @@ export default class Customer extends User {
8
9
  key: string;
9
10
  value: number;
10
11
  }[];
12
+ /**
13
+ * Type de client (professionnel / particulier)
14
+ */
15
+ type: CustomerType;
16
+ /**
17
+ * Raison sociale si client Professionnel
18
+ */
19
+ companyName: string;
20
+ /**
21
+ * Téléphone de contact additionnel (souvent un fixe pour les pro)
22
+ */
23
+ companyPhoneNumber: string;
24
+ /**
25
+ * Notes relatives au client
26
+ */
27
+ notes: string;
11
28
  constructor(id: string, roles: Role[] | undefined, firstname: string | undefined, lastname: string | undefined, avatar: string | undefined, addresses: Address[] | undefined, vehicles: Vehicle[], email: string | undefined, turnover: {
12
29
  key: string;
13
30
  value: number;
14
- }[]);
31
+ }[], type: CustomerType, companyName: string, companyPhoneNumber: string, notes: string);
15
32
  }
@@ -21,7 +21,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
21
21
  var User_1 = __importDefault(require("./User"));
22
22
  var Customer = /** @class */ (function (_super) {
23
23
  __extends(Customer, _super);
24
- function Customer(id, roles, firstname, lastname, avatar, addresses, vehicles, email, turnover) {
24
+ function Customer(id, roles, firstname, lastname, avatar, addresses, vehicles, email, turnover, type, companyName, companyPhoneNumber, notes) {
25
25
  if (roles === void 0) { roles = []; }
26
26
  if (firstname === void 0) { firstname = ''; }
27
27
  if (lastname === void 0) { lastname = ''; }
@@ -31,6 +31,10 @@ var Customer = /** @class */ (function (_super) {
31
31
  var _this = _super.call(this, id, roles, firstname, lastname, avatar, email) || this;
32
32
  _this.vehicles = vehicles;
33
33
  _this.turnover = turnover;
34
+ _this.type = type;
35
+ _this.companyName = companyName;
36
+ _this.companyPhoneNumber = companyPhoneNumber;
37
+ _this.notes = notes;
34
38
  return _this;
35
39
  }
36
40
  return Customer;
package/index.ts CHANGED
@@ -86,6 +86,7 @@ export { request, API_BASE_URL } from './src/helpers/ApiHelper';
86
86
 
87
87
  // Export des enums
88
88
  export {
89
+ CustomerType,
89
90
  RoleType,
90
91
  MovaAppType,
91
92
  DayOfWeek,
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@movalib/movalib-commons",
3
- "version": "1.59.2",
3
+ "version": "1.59.4",
4
4
  "description": "Bibliothèque d'objets communs à l'ensemble des projets React de Movalib",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "private": false,
8
8
  "scripts": {
9
- "start": "webpack-dev-server --entry ./devIndex.tsx --open",
9
+ "start": "webpack-dev-server --entry ./devIndex.tsx --open --https",
10
10
  "build": "rm -rf dist && tsc && npm run copy-assets",
11
11
  "copy-assets": "cp -r src/assets/ dist/src/assets/ && cp -r src/style/ dist/src/style/",
12
12
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -302,7 +302,7 @@ const MovaSignUp: FunctionComponent<MovaSignUpProps> = ({ loading, movaAppType,
302
302
  ),
303
303
  }}
304
304
  />
305
- {openPhoneNumberInfo && <Alert severity="info" variant='standard'>Indispensable en cas d'imprévu avec votre véhicule.</Alert>}
305
+ {openPhoneNumberInfo && <Alert severity="info" variant='standard'>Entrez le numéro de téléphone que vous avez utilisé pour réserver, afin de suivre facilement vos rendez-vous.</Alert>}
306
306
  </>
307
307
  }
308
308
  <TextField
@@ -9,7 +9,7 @@ import Schedule from './models/Schedule';
9
9
  import { CountryCode, DayOfWeek } from './helpers/Enums';
10
10
  import Logger from './helpers/Logger';
11
11
  import { flexCenter, getDayOfWeekIndex, getDayOfWeekLabel } from './helpers/Tools';
12
- import { toUTCToLocaleDate } from './helpers/DateUtils';
12
+ import { isValidDate, toUTCToLocaleDate } from './helpers/DateUtils';
13
13
  import ContentCopyIcon from '@mui/icons-material/ContentCopy';
14
14
 
15
15
 
@@ -160,7 +160,7 @@ const ScheduleFields: FunctionComponent<ScheduleFieldsProps> = ({ timePickerStep
160
160
 
161
161
  const handleIntervalChange = (dayIndex: number, intervalIndex: number, type: 'startTime' | 'endTime') =>
162
162
  (newValue: "" | Date | null) => {
163
-
163
+
164
164
  const newSchedule = [...schedule];
165
165
 
166
166
  newSchedule[dayIndex].intervals[intervalIndex][type] = newValue!;
@@ -180,8 +180,8 @@ const ScheduleFields: FunctionComponent<ScheduleFieldsProps> = ({ timePickerStep
180
180
 
181
181
  setSchedule(newSchedule);
182
182
 
183
- if(type === 'endTime'){
184
- // On invoque la callback de mise à jour uniquement sur l'intervalle de fin
183
+ if(type === 'endTime' || (type === 'startTime' && isValidDate(newSchedule[dayIndex].intervals[intervalIndex].endTime))){
184
+ // On invoque la callback de mise à jour sur les deux intervalles, toutefois on contrôle que l'intervalle de fin est alimentée
185
185
  onChange(newSchedule);
186
186
  }
187
187
 
@@ -264,7 +264,7 @@ const ScheduleFields: FunctionComponent<ScheduleFieldsProps> = ({ timePickerStep
264
264
  value={interval.startTime}
265
265
  formatDensity='dense'
266
266
  closeOnSelect={false}
267
- onAccept={handleIntervalChange(dayIndex, intervalIndex, 'startTime')}
267
+ onChange={handleIntervalChange(dayIndex, intervalIndex, 'startTime')}
268
268
  slotProps={{
269
269
  textField: {
270
270
  size: 'small',
@@ -286,7 +286,7 @@ const ScheduleFields: FunctionComponent<ScheduleFieldsProps> = ({ timePickerStep
286
286
  disabled={!(interval.startTime instanceof Date)}
287
287
  value={interval.endTime}
288
288
  formatDensity='dense'
289
- onAccept={handleIntervalChange(dayIndex, intervalIndex, 'endTime')}
289
+ onChange={handleIntervalChange(dayIndex, intervalIndex, 'endTime')}
290
290
  closeOnSelect={false}
291
291
  slotProps={{
292
292
  textField: {
@@ -161,7 +161,7 @@ export const QrCodePLVContainer = ({ data }: { data: string }) => {
161
161
  const canvas = document.createElement('canvas');
162
162
  const context = canvas.getContext('2d');
163
163
 
164
- const viewport = page.getViewport({ scale: 4});
164
+ const viewport = page.getViewport({ scale: 3});
165
165
  canvas.width = viewport.width;
166
166
  canvas.height = viewport.height;
167
167
 
@@ -3,6 +3,10 @@ import { fr } from 'date-fns/locale';
3
3
  import { DateFormatTypes } from './Enums';
4
4
  import { capitalizeFirstLetter } from './Tools';
5
5
 
6
+ export function isValidDate(date: unknown): date is Date {
7
+ return date instanceof Date && !isNaN(date.getTime());
8
+ }
9
+
6
10
  // Tableau de correspondance entre les codes de pays et les fuseaux horaires
7
11
  export const countryTimeZones: { [key: string]: string } = {
8
12
  'FR': 'Europe/Paris',
@@ -1,3 +1,7 @@
1
+ export enum CustomerType {
2
+ INDIVIDUAL = 'INDIVIDUAL',
3
+ PROFESSIONAL = 'PROFESSIONAL',
4
+ }
1
5
 
2
6
  export enum SubscriptionType {
3
7
  PRO_FREE = 'PRO_FREE',
@@ -1,3 +1,4 @@
1
+ import { CustomerType } from "../helpers/Enums";
1
2
  import Address from "./Address";
2
3
  import Role from "./Role";
3
4
  import User from "./User";
@@ -9,6 +10,25 @@ export default class Customer extends User {
9
10
  // Properties
10
11
  vehicles: Vehicle[];
11
12
  turnover: { key: string, value: number }[];
13
+ /**
14
+ * Type de client (professionnel / particulier)
15
+ */
16
+ type: CustomerType;
17
+
18
+ /**
19
+ * Raison sociale si client Professionnel
20
+ */
21
+ companyName: string;
22
+
23
+ /**
24
+ * Téléphone de contact additionnel (souvent un fixe pour les pro)
25
+ */
26
+ companyPhoneNumber: string;
27
+
28
+ /**
29
+ * Notes relatives au client
30
+ */
31
+ notes: string;
12
32
 
13
33
  constructor(
14
34
  id: string,
@@ -19,11 +39,19 @@ export default class Customer extends User {
19
39
  addresses : Address[] = [],
20
40
  vehicles: Vehicle[],
21
41
  email: string = '',
22
- turnover: { key: string, value: number }[]) {
42
+ turnover: { key: string, value: number }[],
43
+ type: CustomerType,
44
+ companyName: string,
45
+ companyPhoneNumber: string,
46
+ notes: string) {
23
47
 
24
48
  super(id, roles, firstname, lastname, avatar, email);
25
49
 
26
50
  this.vehicles = vehicles;
27
51
  this.turnover = turnover;
52
+ this.type = type;
53
+ this.companyName = companyName;
54
+ this.companyPhoneNumber = companyPhoneNumber;
55
+ this.notes = notes;
28
56
  }
29
57
  }
package/webpack.config.js CHANGED
@@ -41,4 +41,13 @@ module.exports = {
41
41
  'process.env.REACT_APP_MOVALIB_APP_URL': JSON.stringify(process.env.REACT_APP_MOVALIB_APP_URL)
42
42
  }),
43
43
  ],
44
+
45
+ devServer: {
46
+ https: {
47
+ cert: path.resolve(__dirname, '/Users/Dimitri/localhost.pem'),
48
+ key: path.resolve(__dirname, '/Users/Dimitri/localhost-key.pem'),
49
+ },
50
+ open: true,
51
+ port: 8080, // ou un autre port si nécessaire
52
+ },
44
53
  };