@mtes-mct/monitor-ui 4.1.0 → 5.1.0

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/CHANGELOG.md CHANGED
@@ -1,3 +1,29 @@
1
+ # [5.0.0](https://github.com/MTES-MCT/monitor-ui/compare/v4.1.0...v5.0.0) (2023-04-11)
2
+
3
+
4
+ * fix!: handle DST correctly in date-related utils & fields ([377450b](https://github.com/MTES-MCT/monitor-ui/commit/377450bca0f2c90d7cf1331da3e9f8a50042bb33))
5
+ * fix(fields)!: make DatePicker & DateRangePicker onChange value undefined when cleared ([b8a0f09](https://github.com/MTES-MCT/monitor-ui/commit/b8a0f09aae3638bebccced2c8c3a0f39d5caa8ab))
6
+
7
+
8
+ ### Features
9
+
10
+ * **fields:** add isEndDate prop to DatePicker ([418290e](https://github.com/MTES-MCT/monitor-ui/commit/418290e94f8f7eea9a282ac2d610b57761af2c8b))
11
+
12
+
13
+ ### BREAKING CHANGES
14
+
15
+ * `dayjs` export is now named `customDayjs`.
16
+ * rsuite-override.css doesn't include calendar-related CSS anymore.
17
+ * DatePicker & DateRangePicker onChange() value can now
18
+ be undefined.
19
+
20
+ # [4.1.0](https://github.com/MTES-MCT/monitor-ui/compare/v4.0.7...v4.1.0) (2023-04-05)
21
+
22
+
23
+ ### Features
24
+
25
+ * **fields:** Add isAddButtonDisabled to MultiZoneEditor ([3457bc5](https://github.com/MTES-MCT/monitor-ui/commit/3457bc5114de8f040b77daf78678eb8655448737))
26
+
1
27
  ## [4.0.7](https://github.com/MTES-MCT/monitor-ui/compare/v4.0.6...v4.0.7) (2023-04-03)
2
28
 
3
29
 
@@ -514,30 +514,6 @@ label:hover .rs-checkbox-wrapper .rs-checkbox-inner:before {
514
514
  border-color: transparent var(--slateGray) transparent transparent;
515
515
  }
516
516
 
517
- .rs-calendar-table-cell-is-today .rs-calendar-table-cell-content {
518
- border: 1px solid var(--slateGray) !important;
519
- }
520
-
521
- .rs-calendar,
522
- .rs-calendar-header,
523
- .rs-calendar-table-cell-content {
524
- box-sizing: border-box !important;
525
- }
526
-
527
- .rs-calendar-table-cell-content {
528
- border-radius: 2px !important;
529
- }
530
-
531
- .rs-calendar-table-cell-selected .rs-calendar-table-cell-content {
532
- color: #f0f0f0;
533
- border-color: var(--charcoal);
534
- background-color: var(--charcoal);
535
- }
536
-
537
- .rs-calendar-table-cell-in-range::before {
538
- background-color: #e0e0e0;
539
- }
540
-
541
517
  .rs-picker-toolbar-right-btn-ok {
542
518
  padding: 5px 10px;
543
519
  font-size: 13px;
@@ -0,0 +1 @@
1
+ export declare function fillDatePicker(fieldsetElement: HTMLElement, dateOrDateWithTimeTuple: Cypress.DateTuple | Cypress.DateWithTimeTuple | undefined): void;
@@ -1 +1 @@
1
- export declare function fillDateRangePicker(label: string, startDate: Date, endDate: Date): void;
1
+ export declare function fillDateRangePicker(fieldsetElement: HTMLElement, dateOrDateWithTimeTupleRange: [Cypress.DateTuple, Cypress.DateTuple] | [Cypress.DateWithTimeTuple, Cypress.DateWithTimeTuple] | undefined): void;
@@ -1 +1 @@
1
- export declare function fill(label: string | undefined, value: boolean | number | string | string[] | undefined, leftRetries?: number): void;
1
+ export declare function fill(label: string | undefined, value: boolean | number | string | string[] | (Cypress.DateTuple | Cypress.DateWithTimeTuple) | ([Cypress.DateTuple, Cypress.DateTuple] | [Cypress.DateWithTimeTuple, Cypress.DateWithTimeTuple]) | undefined, leftRetries?: number): void;
@@ -10,9 +10,22 @@ declare namespace Cypress {
10
10
  }>
11
11
  ): Chainable<JQuery<HTMLButtonElement>>
12
12
  clickLink(linkText: string): Chainable<JQuery<HTMLAnchorElement>>
13
- clickOutside(xPosition?: number, yPosition?: number): Chainable<JQuery<HTMLBodyElement>>
14
- fill(label: string, value: boolean | number | string | string[] | undefined): Chainable<Element>
13
+ clickOutside(xPosition?: number, yPosition?: number): void
14
+ fill(
15
+ label: string,
16
+ value:
17
+ | boolean
18
+ | number
19
+ | string
20
+ | string[]
21
+ | (DateTuple | DateWithTimeTuple)
22
+ | ([Cypress.DateTuple, Cypress.DateTuple] | [Cypress.DateWithTimeTuple, Cypress.DateWithTimeTuple])
23
+ | undefined
24
+ ): Chainable<Element>
15
25
  forceClick(): Chainable<JQuery<HTMLElement>>
16
26
  getDataCy(dataCy: string): Chainable<JQuery<HTMLElement>>
17
27
  }
28
+
29
+ type DateTuple = [number, number, number]
30
+ type DateWithTimeTuple = [number, number, number, number, number]
18
31
  }
package/cypress/index.js CHANGED
@@ -674,6 +674,114 @@ function checkMultiRadioOption(fieldsetElement, value) {
674
674
  return fieldsetElement;
675
675
  }
676
676
 
677
+ function fillDatePicker(fieldsetElement, dateOrDateWithTimeTuple) {
678
+ const inputElements = fieldsetElement.querySelectorAll('input');
679
+ if (inputElements.length !== 4 && inputElements.length !== 6) {
680
+ throw new Error(`Expected to find 4 or 6 inputs within in DatePicker but found ${inputElements.length}.`);
681
+ }
682
+ const hasTimeInput = inputElements.length !== 4;
683
+ const fieldsetElementOffsetLeft = fieldsetElement.offsetLeft
684
+ ? fieldsetElement.offsetLeft
685
+ : (() => {
686
+ if (!fieldsetElement.offsetParent) {
687
+ throw new Error('`fieldsetElement.offsetParent` is undefined.');
688
+ }
689
+ return fieldsetElement.offsetParent.offsetLeft;
690
+ })();
691
+ const fieldsetElementOffsetTop = fieldsetElement.offsetTop !== 0
692
+ ? fieldsetElement.offsetTop
693
+ : (() => {
694
+ if (!fieldsetElement.offsetParent) {
695
+ throw new Error('`fieldsetElement.offsetParent` is undefined.');
696
+ }
697
+ return fieldsetElement.offsetParent.offsetTop;
698
+ })();
699
+ if (!dateOrDateWithTimeTuple) {
700
+ cy.wrap(fieldsetElement).get('[aria-label="Jour"]').clear();
701
+ cy.wrap(fieldsetElement).get('[aria-label="Mois"]').clear();
702
+ cy.wrap(fieldsetElement).get('[aria-label="Année"]').clear();
703
+ if (hasTimeInput) {
704
+ cy.wrap(fieldsetElement).get('[aria-label="Heure"]').clear();
705
+ cy.wrap(fieldsetElement).get('[aria-label="Minute"]').clear();
706
+ }
707
+ cy.clickOutside(fieldsetElementOffsetLeft, fieldsetElementOffsetTop - 1);
708
+ cy.wait(250);
709
+ return;
710
+ }
711
+ const [year, month, day, hour, minute] = dateOrDateWithTimeTuple;
712
+ cy.wrap(fieldsetElement).get('[aria-label="Jour"]').type(String(day).padStart(2, '0'));
713
+ cy.wrap(fieldsetElement).get('[aria-label="Mois"]').type(String(month).padStart(2, '0'));
714
+ cy.wrap(fieldsetElement).get('[aria-label="Année"]').type(String(year));
715
+ if (hasTimeInput) {
716
+ cy.wrap(fieldsetElement).get('[aria-label="Heure"]').type(String(hour).padStart(2, '0'));
717
+ cy.wrap(fieldsetElement).get('[aria-label="Minute"]').type(String(minute).padStart(2, '0'));
718
+ }
719
+ cy.clickOutside(fieldsetElementOffsetLeft, fieldsetElementOffsetTop - 1);
720
+ cy.wait(250);
721
+ }
722
+
723
+ function fillDateRangePicker(fieldsetElement, dateOrDateWithTimeTupleRange) {
724
+ const inputElements = fieldsetElement.querySelectorAll('input');
725
+ if (inputElements.length !== 7 && inputElements.length !== 11) {
726
+ throw new Error(`Expected to find 7 or 11 inputs within in DatePicker but found ${inputElements.length}.`);
727
+ }
728
+ const hasTimeInput = inputElements.length !== 7;
729
+ const fieldsetElementOffsetLeft = fieldsetElement.offsetLeft
730
+ ? fieldsetElement.offsetLeft
731
+ : (() => {
732
+ if (!fieldsetElement.offsetParent) {
733
+ throw new Error('`fieldsetElement.offsetParent` is undefined.');
734
+ }
735
+ return fieldsetElement.offsetParent.offsetLeft;
736
+ })();
737
+ const fieldsetElementOffsetTop = fieldsetElement.offsetTop !== 0
738
+ ? fieldsetElement.offsetTop
739
+ : (() => {
740
+ if (!fieldsetElement.offsetParent) {
741
+ throw new Error('`fieldsetElement.offsetParent` is undefined.');
742
+ }
743
+ return fieldsetElement.offsetParent.offsetTop;
744
+ })();
745
+ if (!dateOrDateWithTimeTupleRange) {
746
+ cy.wrap(fieldsetElement).get('[aria-label="Jour de début"]').clear();
747
+ cy.wrap(fieldsetElement).get('[aria-label="Mois de début"]').clear();
748
+ cy.wrap(fieldsetElement).get('[aria-label="Année de début"]').clear();
749
+ if (hasTimeInput) {
750
+ cy.wrap(fieldsetElement).get('[aria-label="Heure de début"]').clear();
751
+ cy.wrap(fieldsetElement).get('[aria-label="Minute de début"]').clear();
752
+ }
753
+ cy.wrap(fieldsetElement).get('[aria-label="Jour de fin"]').clear();
754
+ cy.wrap(fieldsetElement).get('[aria-label="Mois de fin"]').clear();
755
+ cy.wrap(fieldsetElement).get('[aria-label="Année de fin"]').clear();
756
+ if (hasTimeInput) {
757
+ cy.wrap(fieldsetElement).get('[aria-label="Heure de fin"]').clear();
758
+ cy.wrap(fieldsetElement).get('[aria-label="Minute de fin"]').clear();
759
+ }
760
+ cy.clickOutside(fieldsetElementOffsetLeft, fieldsetElementOffsetTop - 1);
761
+ cy.wait(250);
762
+ return;
763
+ }
764
+ const [startDateOrDateWithTimeTuple, endDateOrDateWithTimeTuple] = dateOrDateWithTimeTupleRange;
765
+ const [startYear, startMonth, startDay, startHour, startMinute] = startDateOrDateWithTimeTuple;
766
+ const [endYear, endMonth, endDay, endHour, endMinute] = endDateOrDateWithTimeTuple;
767
+ cy.wrap(fieldsetElement).get('[aria-label="Jour de début"]').type(String(startDay).padStart(2, '0'));
768
+ cy.wrap(fieldsetElement).get('[aria-label="Mois de début"]').type(String(startMonth).padStart(2, '0'));
769
+ cy.wrap(fieldsetElement).get('[aria-label="Année de début"]').type(String(startYear));
770
+ if (hasTimeInput) {
771
+ cy.wrap(fieldsetElement).get('[aria-label="Heure de début"]').type(String(startHour).padStart(2, '0'));
772
+ cy.wrap(fieldsetElement).get('[aria-label="Minute de début"]').type(String(startMinute).padStart(2, '0'));
773
+ }
774
+ cy.wrap(fieldsetElement).get('[aria-label="Jour de fin"]').type(String(endDay).padStart(2, '0'));
775
+ cy.wrap(fieldsetElement).get('[aria-label="Mois de fin"]').type(String(endMonth).padStart(2, '0'));
776
+ cy.wrap(fieldsetElement).get('[aria-label="Année de fin"]').type(String(endYear));
777
+ if (hasTimeInput) {
778
+ cy.wrap(fieldsetElement).get('[aria-label="Heure de fin"]').type(String(endHour).padStart(2, '0'));
779
+ cy.wrap(fieldsetElement).get('[aria-label="Minute de fin"]').type(String(endMinute).padStart(2, '0'));
780
+ }
781
+ cy.clickOutside(fieldsetElementOffsetLeft, fieldsetElementOffsetTop - 1);
782
+ cy.wait(250);
783
+ }
784
+
677
785
  function fillTextarea(textareaElement, value) {
678
786
  if (value) {
679
787
  cy.wrap(textareaElement).scrollIntoView().type(value, { delay: 1, force: true });
@@ -697,6 +805,22 @@ function pickMultiSelectOptions(cypressMultiSelectInputElement, values) {
697
805
  if (!fieldElement) {
698
806
  throw new Error('`fieldElement` is undefined.');
699
807
  }
808
+ const fieldElementOffsetLeft = fieldElement.offsetLeft
809
+ ? fieldElement.offsetLeft
810
+ : (() => {
811
+ if (!fieldElement.offsetParent) {
812
+ throw new Error('`fieldElement.offsetParent` is undefined.');
813
+ }
814
+ return fieldElement.offsetParent.offsetLeft;
815
+ })();
816
+ const fieldElementOffsetTop = fieldElement.offsetTop !== 0
817
+ ? fieldElement.offsetTop
818
+ : (() => {
819
+ if (!fieldElement.offsetParent) {
820
+ throw new Error('`fieldElement.offsetParent` is undefined.');
821
+ }
822
+ return fieldElement.offsetParent.offsetTop;
823
+ })();
700
824
  cy.wrap(fieldElement).scrollIntoView();
701
825
  const maybeCleanButton = fieldElement.querySelector('.rs-picker-toggle-clean');
702
826
  if (maybeCleanButton) {
@@ -705,7 +829,7 @@ function pickMultiSelectOptions(cypressMultiSelectInputElement, values) {
705
829
  if (!values) {
706
830
  return;
707
831
  }
708
- cy.wrap(fieldElement).find('.rs-picker-toggle-caret').forceClick();
832
+ cy.wrap(fieldElement).find('.rs-picker-toggle').forceClick();
709
833
  cy.get('.rs-picker-picker-check-menu').then(([multiSelectMenuElement]) => {
710
834
  if (!multiSelectMenuElement) {
711
835
  throw new Error('`multiSelectMenuElement` is undefined.');
@@ -721,24 +845,8 @@ function pickMultiSelectOptions(cypressMultiSelectInputElement, values) {
721
845
  .scrollIntoView()
722
846
  .forceClick();
723
847
  });
724
- const offsetLeft = fieldElement.offsetLeft
725
- ? fieldElement.offsetLeft
726
- : (() => {
727
- if (!fieldElement.offsetParent) {
728
- throw new Error('`fieldElement.offsetParent` is undefined.');
729
- }
730
- return fieldElement.offsetParent.offsetLeft;
731
- })();
732
- const offsetTop = fieldElement.offsetTop !== 0
733
- ? fieldElement.offsetTop
734
- : (() => {
735
- if (!fieldElement.offsetParent) {
736
- throw new Error('`fieldElement.offsetParent` is undefined.');
737
- }
738
- return fieldElement.offsetParent.offsetTop;
739
- })();
740
848
  // TODO Investigate that (this should be -1).
741
- cy.clickOutside(offsetLeft, offsetTop - 16);
849
+ cy.clickOutside(fieldElementOffsetLeft, fieldElementOffsetTop - 16);
742
850
  cy.wait(250);
743
851
  });
744
852
  });
@@ -760,7 +868,7 @@ function pickSelectOption(cypressSelectInputElement, value) {
760
868
  if (!value) {
761
869
  return;
762
870
  }
763
- cy.wrap(fieldElement).find('.rs-picker-toggle-caret').click();
871
+ cy.wrap(fieldElement).find('.rs-picker-toggle').forceClick();
764
872
  cy.get('.rs-picker-select-menu').then(([selectMenuElement]) => {
765
873
  if (!selectMenuElement) {
766
874
  throw new Error('`selectMenuElement` is undefined.');
@@ -919,6 +1027,26 @@ function fill(label, value, leftRetries = RETRIES) {
919
1027
  if (!fieldsetElement || fieldsetElement.tagName !== 'FIELDSET') {
920
1028
  throw new Error(`Could not find parent fieldset of legend element with text "${label}".`);
921
1029
  }
1030
+ if (fieldsetElement.classList.contains('Field-DatePicker')) {
1031
+ if ((!Array.isArray(value) || (value.length !== 3 && value.length !== 5) || typeof value[0] !== 'number') &&
1032
+ value !== undefined) {
1033
+ throw new Error('`value` should be of type `[number, number, number]`, `[number, number, number, number, number]` or `undefined`.');
1034
+ }
1035
+ fillDatePicker(fieldsetElement, value);
1036
+ return;
1037
+ }
1038
+ if (fieldsetElement.classList.contains('Field-DateRangePicker')) {
1039
+ if ((!Array.isArray(value) ||
1040
+ value.length !== 2 ||
1041
+ !Array.isArray(value[0]) ||
1042
+ (value[0].length !== 3 && value[0].length !== 5) ||
1043
+ (value[1].length !== 3 && value[1].length !== 5)) &&
1044
+ value !== undefined) {
1045
+ throw new Error('`value` should be of type `[[number, number, number], [number, number, number]]` or ``[[number, number, number, number, number], [number, number, number, number, number]]`` or `undefined`.');
1046
+ }
1047
+ fillDateRangePicker(fieldsetElement, value);
1048
+ return;
1049
+ }
922
1050
  const isMultiCheckbox = Boolean(fieldsetElement.querySelector('input[type="checkbox"]'));
923
1051
  const isMultiRadio = Boolean(fieldsetElement.querySelector('input[type="radio"]'));
924
1052
  if (isMultiCheckbox) {