novo-elements 8.3.0 → 8.4.0-next.1

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.
Files changed (205) hide show
  1. package/addons/ace-editor/AceEditor.d.ts +4 -2
  2. package/addons/code-editor/CodeEditor.d.ts +31 -0
  3. package/addons/code-editor/CodeEditor.module.d.ts +9 -0
  4. package/addons/code-editor/CodeEditor.scss +5 -0
  5. package/addons/code-editor/index.d.ts +2 -0
  6. package/addons/code-editor/novo-elements-addons-code-editor.d.ts +5 -0
  7. package/addons/code-editor/package.json +10 -0
  8. package/addons/index.d.ts +1 -0
  9. package/elements/aside/aside.component.scss +1 -1
  10. package/elements/calendar/Calendar.module.d.ts +2 -3
  11. package/elements/checkbox/CheckList.scss +1 -1
  12. package/elements/checkbox/Checkbox.scss +1 -1
  13. package/elements/common/overlay/Overlay.d.ts +1 -0
  14. package/elements/date-picker/DatePicker.module.d.ts +2 -2
  15. package/elements/date-picker/DatePickerInput.d.ts +8 -5
  16. package/elements/date-picker/MultiDateInput.d.ts +0 -1
  17. package/elements/date-time-picker/DateTimePicker.module.d.ts +2 -3
  18. package/elements/drag-drop/drag-drop-box.d.ts +45 -0
  19. package/elements/drag-drop/drag-drop.module.d.ts +7 -0
  20. package/elements/drag-drop/index.d.ts +2 -0
  21. package/elements/drag-drop/novo-elements-elements-drag-drop.d.ts +5 -0
  22. package/elements/drag-drop/package.json +10 -0
  23. package/elements/dropdown/Dropdown.d.ts +7 -1
  24. package/elements/field/formats/date-time-format.d.ts +2 -2
  25. package/elements/form/Control.d.ts +9 -6
  26. package/elements/form/ControlTemplates.d.ts +1 -1
  27. package/elements/form/Form.module.d.ts +6 -6
  28. package/elements/form/controls/code-editor/CodeEditorControl.d.ts +5 -0
  29. package/elements/form/controls/code-editor/index.d.ts +1 -0
  30. package/elements/form/controls/index.d.ts +2 -1
  31. package/elements/form/extras/FormExtras.module.d.ts +4 -4
  32. package/elements/form/extras/file/FileInput.d.ts +15 -16
  33. package/elements/form/extras/file/FileInput.scss +58 -30
  34. package/elements/index.d.ts +1 -0
  35. package/elements/query-builder/condition-builder/condition-builder.component.scss +1 -1
  36. package/elements/query-builder/condition-definitions/address-condition.definition.d.ts +1 -1
  37. package/elements/select-search/select-search.component.scss +1 -1
  38. package/elements/table/Table.module.d.ts +5 -6
  39. package/elements/time-picker/TimePicker.d.ts +2 -3
  40. package/elements/time-picker/TimePicker.module.d.ts +3 -4
  41. package/elements/time-picker/TimePickerInput.d.ts +0 -1
  42. package/esm2020/addons/ace-editor/AceEditor.mjs +8 -4
  43. package/esm2020/addons/ckeditor/CKEditor.mjs +8 -1
  44. package/esm2020/addons/code-editor/CodeEditor.mjs +129 -0
  45. package/esm2020/addons/code-editor/CodeEditor.module.mjs +19 -0
  46. package/esm2020/addons/code-editor/index.mjs +3 -0
  47. package/esm2020/addons/code-editor/novo-elements-addons-code-editor.mjs +5 -0
  48. package/esm2020/addons/index.mjs +2 -1
  49. package/esm2020/elements/breadcrumbs/breadcrumb-item/BreadcrumbItem.mjs +1 -1
  50. package/esm2020/elements/calendar/Calendar.module.mjs +5 -7
  51. package/esm2020/elements/calendar/calendar.component.mjs +3 -3
  52. package/esm2020/elements/calendar/month-select/month-select.component.mjs +3 -3
  53. package/esm2020/elements/calendar/month-view/month-view.component.mjs +3 -3
  54. package/esm2020/elements/calendar/year-select/year-select.component.mjs +3 -3
  55. package/esm2020/elements/common/overlay/Overlay.mjs +11 -5
  56. package/esm2020/elements/data-table/cell-headers/data-table-header-cell.component.mjs +1 -1
  57. package/esm2020/elements/data-table/data-table-clear-button.component.mjs +1 -1
  58. package/esm2020/elements/data-table/data-table.component.mjs +2 -2
  59. package/esm2020/elements/date-picker/DatePicker.module.mjs +6 -6
  60. package/esm2020/elements/date-picker/DatePickerInput.mjs +50 -29
  61. package/esm2020/elements/date-picker/DateRangeInput.mjs +10 -16
  62. package/esm2020/elements/date-picker/MultiDateInput.mjs +1 -17
  63. package/esm2020/elements/date-time-picker/DateTimePicker.module.mjs +4 -5
  64. package/esm2020/elements/drag-drop/drag-drop-box.mjs +224 -0
  65. package/esm2020/elements/drag-drop/drag-drop.module.mjs +16 -0
  66. package/esm2020/elements/drag-drop/index.mjs +3 -0
  67. package/esm2020/elements/drag-drop/novo-elements-elements-drag-drop.mjs +5 -0
  68. package/esm2020/elements/dropdown/Dropdown.mjs +29 -4
  69. package/esm2020/elements/field/formats/date-format.mjs +5 -5
  70. package/esm2020/elements/field/formats/date-range-format.mjs +5 -5
  71. package/esm2020/elements/field/formats/date-time-format.mjs +12 -12
  72. package/esm2020/elements/field/formats/time-format.mjs +6 -6
  73. package/esm2020/elements/form/Control.mjs +20 -8
  74. package/esm2020/elements/form/ControlTemplates.mjs +54 -27
  75. package/esm2020/elements/form/Form.module.mjs +12 -13
  76. package/esm2020/elements/form/NovoFormControl.mjs +1 -2
  77. package/esm2020/elements/form/controls/code-editor/CodeEditorControl.mjs +9 -0
  78. package/esm2020/elements/form/controls/code-editor/index.mjs +2 -0
  79. package/esm2020/elements/form/controls/index.mjs +3 -2
  80. package/esm2020/elements/form/controls/timezone/TimezoneControl.mjs +2 -2
  81. package/esm2020/elements/form/extras/FormExtras.module.mjs +8 -9
  82. package/esm2020/elements/form/extras/file/FileInput.mjs +38 -261
  83. package/esm2020/elements/index.mjs +2 -1
  84. package/esm2020/elements/query-builder/condition-definitions/address-condition.definition.mjs +2 -2
  85. package/esm2020/elements/query-builder/condition-group/condition-group.component.mjs +1 -1
  86. package/esm2020/elements/simple-table/cell-header.mjs +2 -2
  87. package/esm2020/elements/simple-table/cell.mjs +1 -1
  88. package/esm2020/elements/tabbed-group-picker/TabbedGroupPicker.mjs +1 -1
  89. package/esm2020/elements/table/Table.mjs +1 -1
  90. package/esm2020/elements/table/Table.module.mjs +1 -6
  91. package/esm2020/elements/table/extras/dropdown-cell/DropdownCell.mjs +1 -1
  92. package/esm2020/elements/time-picker/TimePicker.mjs +5 -6
  93. package/esm2020/elements/time-picker/TimePicker.module.mjs +4 -5
  94. package/esm2020/elements/time-picker/TimePickerInput.mjs +3 -65
  95. package/esm2020/index.mjs +1 -1
  96. package/esm2020/novo-elements.module.mjs +9 -3
  97. package/esm2020/novo-elements.providers.mjs +2 -2
  98. package/esm2020/services/date-format/DateFormat.mjs +153 -47
  99. package/esm2020/services/global/global.service.mjs +7 -1
  100. package/esm2020/utils/date/Date.mjs +1 -1
  101. package/esm2020/utils/date/index.mjs +3 -2
  102. package/esm2020/utils/date/timezone-support.mjs +87 -0
  103. package/fesm2015/novo-elements-addons-ace-editor.mjs +7 -3
  104. package/fesm2015/novo-elements-addons-ace-editor.mjs.map +1 -1
  105. package/fesm2015/novo-elements-addons-ckeditor.mjs +7 -0
  106. package/fesm2015/novo-elements-addons-ckeditor.mjs.map +1 -1
  107. package/fesm2015/novo-elements-addons-code-editor.mjs +150 -0
  108. package/fesm2015/novo-elements-addons-code-editor.mjs.map +1 -0
  109. package/fesm2015/novo-elements-addons.mjs +155 -5
  110. package/fesm2015/novo-elements-addons.mjs.map +1 -1
  111. package/fesm2015/novo-elements-elements-breadcrumbs.mjs +1 -1
  112. package/fesm2015/novo-elements-elements-breadcrumbs.mjs.map +1 -1
  113. package/fesm2015/novo-elements-elements-calendar.mjs +12 -13
  114. package/fesm2015/novo-elements-elements-calendar.mjs.map +1 -1
  115. package/fesm2015/novo-elements-elements-common.mjs +10 -2
  116. package/fesm2015/novo-elements-elements-common.mjs.map +1 -1
  117. package/fesm2015/novo-elements-elements-data-table.mjs +3 -3
  118. package/fesm2015/novo-elements-elements-data-table.mjs.map +1 -1
  119. package/fesm2015/novo-elements-elements-date-picker.mjs +64 -62
  120. package/fesm2015/novo-elements-elements-date-picker.mjs.map +1 -1
  121. package/fesm2015/novo-elements-elements-date-time-picker.mjs +3 -4
  122. package/fesm2015/novo-elements-elements-date-time-picker.mjs.map +1 -1
  123. package/fesm2015/novo-elements-elements-drag-drop.mjs +245 -0
  124. package/fesm2015/novo-elements-elements-drag-drop.mjs.map +1 -0
  125. package/fesm2015/novo-elements-elements-dropdown.mjs +28 -3
  126. package/fesm2015/novo-elements-elements-dropdown.mjs.map +1 -1
  127. package/fesm2015/novo-elements-elements-field.mjs +19 -19
  128. package/fesm2015/novo-elements-elements-field.mjs.map +1 -1
  129. package/fesm2015/novo-elements-elements-form.mjs +124 -300
  130. package/fesm2015/novo-elements-elements-form.mjs.map +1 -1
  131. package/fesm2015/novo-elements-elements-query-builder.mjs +1 -1
  132. package/fesm2015/novo-elements-elements-query-builder.mjs.map +1 -1
  133. package/fesm2015/novo-elements-elements-simple-table.mjs +2 -2
  134. package/fesm2015/novo-elements-elements-simple-table.mjs.map +1 -1
  135. package/fesm2015/novo-elements-elements-tabbed-group-picker.mjs +1 -1
  136. package/fesm2015/novo-elements-elements-tabbed-group-picker.mjs.map +1 -1
  137. package/fesm2015/novo-elements-elements-table.mjs +2 -6
  138. package/fesm2015/novo-elements-elements-table.mjs.map +1 -1
  139. package/fesm2015/novo-elements-elements-time-picker.mjs +7 -71
  140. package/fesm2015/novo-elements-elements-time-picker.mjs.map +1 -1
  141. package/fesm2015/novo-elements-elements.mjs +1 -0
  142. package/fesm2015/novo-elements-elements.mjs.map +1 -1
  143. package/fesm2015/novo-elements-services.mjs +158 -46
  144. package/fesm2015/novo-elements-services.mjs.map +1 -1
  145. package/fesm2015/novo-elements-utils.mjs +88 -1
  146. package/fesm2015/novo-elements-utils.mjs.map +1 -1
  147. package/fesm2015/novo-elements.mjs +8 -2
  148. package/fesm2015/novo-elements.mjs.map +1 -1
  149. package/fesm2020/novo-elements-addons-ace-editor.mjs +7 -3
  150. package/fesm2020/novo-elements-addons-ace-editor.mjs.map +1 -1
  151. package/fesm2020/novo-elements-addons-ckeditor.mjs +7 -0
  152. package/fesm2020/novo-elements-addons-ckeditor.mjs.map +1 -1
  153. package/fesm2020/novo-elements-addons-code-editor.mjs +150 -0
  154. package/fesm2020/novo-elements-addons-code-editor.mjs.map +1 -0
  155. package/fesm2020/novo-elements-addons.mjs +155 -5
  156. package/fesm2020/novo-elements-addons.mjs.map +1 -1
  157. package/fesm2020/novo-elements-elements-breadcrumbs.mjs +1 -1
  158. package/fesm2020/novo-elements-elements-breadcrumbs.mjs.map +1 -1
  159. package/fesm2020/novo-elements-elements-calendar.mjs +12 -13
  160. package/fesm2020/novo-elements-elements-calendar.mjs.map +1 -1
  161. package/fesm2020/novo-elements-elements-common.mjs +8 -2
  162. package/fesm2020/novo-elements-elements-common.mjs.map +1 -1
  163. package/fesm2020/novo-elements-elements-data-table.mjs +3 -3
  164. package/fesm2020/novo-elements-elements-data-table.mjs.map +1 -1
  165. package/fesm2020/novo-elements-elements-date-picker.mjs +62 -62
  166. package/fesm2020/novo-elements-elements-date-picker.mjs.map +1 -1
  167. package/fesm2020/novo-elements-elements-date-time-picker.mjs +3 -4
  168. package/fesm2020/novo-elements-elements-date-time-picker.mjs.map +1 -1
  169. package/fesm2020/novo-elements-elements-drag-drop.mjs +244 -0
  170. package/fesm2020/novo-elements-elements-drag-drop.mjs.map +1 -0
  171. package/fesm2020/novo-elements-elements-dropdown.mjs +28 -3
  172. package/fesm2020/novo-elements-elements-dropdown.mjs.map +1 -1
  173. package/fesm2020/novo-elements-elements-field.mjs +19 -19
  174. package/fesm2020/novo-elements-elements-field.mjs.map +1 -1
  175. package/fesm2020/novo-elements-elements-form.mjs +125 -302
  176. package/fesm2020/novo-elements-elements-form.mjs.map +1 -1
  177. package/fesm2020/novo-elements-elements-query-builder.mjs +1 -1
  178. package/fesm2020/novo-elements-elements-query-builder.mjs.map +1 -1
  179. package/fesm2020/novo-elements-elements-simple-table.mjs +2 -2
  180. package/fesm2020/novo-elements-elements-simple-table.mjs.map +1 -1
  181. package/fesm2020/novo-elements-elements-tabbed-group-picker.mjs +1 -1
  182. package/fesm2020/novo-elements-elements-tabbed-group-picker.mjs.map +1 -1
  183. package/fesm2020/novo-elements-elements-table.mjs +2 -6
  184. package/fesm2020/novo-elements-elements-table.mjs.map +1 -1
  185. package/fesm2020/novo-elements-elements-time-picker.mjs +7 -71
  186. package/fesm2020/novo-elements-elements-time-picker.mjs.map +1 -1
  187. package/fesm2020/novo-elements-elements.mjs +1 -0
  188. package/fesm2020/novo-elements-elements.mjs.map +1 -1
  189. package/fesm2020/novo-elements-services.mjs +158 -46
  190. package/fesm2020/novo-elements-services.mjs.map +1 -1
  191. package/fesm2020/novo-elements-utils.mjs +88 -1
  192. package/fesm2020/novo-elements-utils.mjs.map +1 -1
  193. package/fesm2020/novo-elements.mjs +8 -2
  194. package/fesm2020/novo-elements.mjs.map +1 -1
  195. package/novo-elements.module.d.ts +1 -1
  196. package/novo-elements.scss +1 -1
  197. package/package.json +23 -4
  198. package/services/date-format/DateFormat.d.ts +62 -3
  199. package/services/global/global.service.d.ts +3 -0
  200. package/styles/content/root.scss +1 -1
  201. package/styles/themes/light-test.scss +1 -1
  202. package/styles/themes/light.scss +1 -1
  203. package/styles/variables.scss +1 -1
  204. package/utils/date/index.d.ts +2 -1
  205. package/utils/date/timezone-support.d.ts +5 -0
@@ -1,6 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injector, Injectable, EventEmitter, LOCALE_ID, Optional, Inject } from '@angular/core';
3
- import { Helpers } from 'novo-elements/utils';
3
+ import { Helpers, DateUtil, convertTokens } from 'novo-elements/utils';
4
+ import { parse, format } from 'date-fns';
5
+ import { MaskedRange, MaskedEnum } from 'imask';
4
6
 
5
7
  // NG2
6
8
  class ComponentUtils {
@@ -742,35 +744,79 @@ class DateFormatService {
742
744
  this.labels = labels;
743
745
  }
744
746
  getTimeMask(militaryTime) {
745
- let mask = [/\d/, /\d/, /:/, /\d/, /\d/];
746
- let timeFormatArray = [];
747
- const timeFormat = this.labels.timeFormatPlaceholderAM.toLowerCase();
748
- if (militaryTime) {
749
- return mask;
750
- }
751
- else {
752
- timeFormatArray = timeFormat.split('hh:mm');
753
- if (timeFormatArray && timeFormatArray.length) {
754
- mask = [];
755
- for (const timeFormatPart of timeFormatArray) {
756
- if (timeFormatPart === '') {
757
- mask = mask.concat([/\d/, /\d|:/, /:|\d/, /\d|\w|\s/, /\d|\s|\w/]);
758
- }
759
- else if (timeFormatPart.length) {
760
- for (let i = 0; i < timeFormatPart.length; i++) {
761
- mask.push(/\s|\w|\d|\./);
762
- }
763
- }
764
- }
765
- }
766
- }
747
+ const amFormat = this.labels.timeFormatAM.toUpperCase();
748
+ const pmFormat = this.labels.timeFormatPM.toUpperCase();
749
+ const mask = {
750
+ mask: Date,
751
+ pattern: militaryTime ? 'HH:mm' : 'hh:mm aa',
752
+ overwrite: true,
753
+ autofix: true,
754
+ lazy: false,
755
+ min: new Date(1970, 0, 1),
756
+ max: new Date(2030, 0, 1),
757
+ prepare(str) {
758
+ return str.toUpperCase();
759
+ },
760
+ format(date) {
761
+ return DateUtil.format(date, militaryTime ? 'HH:mm' : 'hh:mm A');
762
+ },
763
+ parse: (str) => {
764
+ const time = militaryTime ? str : this.convertTime12to24(str);
765
+ return DateUtil.parse(`${DateUtil.format(Date.now(), 'YYYY-MM-DD')}T${time}`);
766
+ },
767
+ blocks: {
768
+ HH: {
769
+ mask: MaskedRange,
770
+ placeholderChar: 'H',
771
+ maxLength: 2,
772
+ from: 0,
773
+ to: 23,
774
+ },
775
+ hh: {
776
+ mask: MaskedRange,
777
+ placeholderChar: 'h',
778
+ maxLength: 2,
779
+ from: 1,
780
+ to: 12,
781
+ },
782
+ mm: {
783
+ mask: MaskedRange,
784
+ placeholderChar: 'm',
785
+ maxLength: 2,
786
+ from: 0,
787
+ to: 59,
788
+ },
789
+ aa: {
790
+ mask: MaskedEnum,
791
+ placeholderChar: 'x',
792
+ enum: ['AM', 'PM', 'am', 'pm', amFormat, pmFormat],
793
+ },
794
+ },
795
+ };
767
796
  return mask;
768
797
  }
769
- getDateMask() {
770
- return [/\d/, /\d|\/|\.|\-/, /\/|\.|\-|\d/, /\d|\/|\.|\-/, /\d|\/|\.|\-/, /\d|\/|\.|\-/, /\d|\/|\.|\-/, /\d|\/|\.|\-/, /\d/, /\d/];
798
+ getDateMask(format) {
799
+ const mask = {
800
+ mask: Date,
801
+ pattern: 'm/`d/`Y',
802
+ overwrite: true,
803
+ autofix: 'pad',
804
+ min: new Date(1970, 0, 1),
805
+ max: new Date(2030, 0, 1),
806
+ prepare(str) {
807
+ return str.toUpperCase();
808
+ },
809
+ format(date) {
810
+ return DateUtil.format(date, format || 'MM/DD/YYYY');
811
+ },
812
+ parse: (str) => {
813
+ return DateUtil.parse(str);
814
+ },
815
+ };
816
+ return mask;
771
817
  }
772
818
  getDateTimeMask(militaryTime = false) {
773
- return [...this.getDateMask(), /\,?/, /\s/, ...this.getTimeMask(militaryTime)];
819
+ return [this.getDateMask(), /\,?/, /\s/, this.getTimeMask(militaryTime)];
774
820
  }
775
821
  getTimePlaceHolder(militaryTime) {
776
822
  if (militaryTime) {
@@ -778,6 +824,60 @@ class DateFormatService {
778
824
  }
779
825
  return this.labels.timeFormatPlaceholderAM;
780
826
  }
827
+ parseCustomDateString(dateString, customFormat) {
828
+ let isInvalidDate = true;
829
+ let date = null;
830
+ if (!customFormat) {
831
+ customFormat = this.labels.dateFormatString();
832
+ }
833
+ customFormat = convertTokens(customFormat);
834
+ const [cleanDateString, cleanFormat] = this.removeNonstandardFormatCharacters(dateString, customFormat);
835
+ try {
836
+ date = parse(cleanDateString, cleanFormat, new Date(), {
837
+ useAdditionalWeekYearTokens: false
838
+ });
839
+ if (isNaN(date.getTime())) {
840
+ date = null;
841
+ }
842
+ else if (cleanDateString !== dateString) {
843
+ // Verify that this parse matches the original dateString through this format. If not, then something may have mismatched -
844
+ // in which case we consider the date to be invalid.
845
+ // For instance, if we parsed "Fri Oct 18, 2023" as " Oct 18 2023" (removing the duplicative day-of-week) then it
846
+ // would re-format as "Wed Oct 18 2023" and is an invalid date.
847
+ const reformattedDate = format(date, customFormat);
848
+ if (reformattedDate !== dateString) {
849
+ date = null;
850
+ }
851
+ else {
852
+ isInvalidDate = false;
853
+ }
854
+ }
855
+ else {
856
+ isInvalidDate = false;
857
+ }
858
+ }
859
+ catch (err) {
860
+ // ignore error - keep isInvalidDate true and date null
861
+ }
862
+ return [date, dateString, isInvalidDate];
863
+ }
864
+ /**
865
+ * Certain date format characters are considered nonstandard. We can still use them, but remove them for date parsing to avoid errors
866
+ * @param dateString
867
+ * @param format
868
+ * @returns date string and format in array, both having had their
869
+ */
870
+ removeNonstandardFormatCharacters(dateString, format) {
871
+ const bannedChars = /[iIRoPp]+/;
872
+ // remove quotes
873
+ format = format.replace(/['"]/g, '');
874
+ let match = null;
875
+ while ((match = bannedChars.exec(format)) != null) {
876
+ format = format.substring(0, match.index) + format.substring(match.index + match[0].length);
877
+ dateString = dateString.substring(0, match.index) + dateString.substring(match.index + match[0].length);
878
+ }
879
+ return [dateString, format];
880
+ }
781
881
  parseDateString(dateString) {
782
882
  let dateFormat = this.labels.dateFormatString();
783
883
  const dateFormatRegex = /(\w+)[\/|\.|\-](\w+)[\/|\.|\-](\w+)/gi;
@@ -787,7 +887,7 @@ class DateFormatService {
787
887
  let year;
788
888
  let month;
789
889
  let day;
790
- let date = new Date();
890
+ let date = null;
791
891
  let isInvalidDate = true;
792
892
  if (Helpers.isEmpty(dateFormat)) {
793
893
  // Default to MM/dd/yyyy
@@ -820,10 +920,8 @@ class DateFormatService {
820
920
  const oneToken = /^(\d{1,4})$/.exec(dateString);
821
921
  const delimiter = /\w+(\/|\.|\-)\w+[\/|\.|\-]\w+/gi.exec(dateFormat);
822
922
  const dateStringWithDelimiter = dateString[dateString.length - 1].match(/\/|\.|\-/);
823
- if (twoTokens && twoTokens.length === 3 && this.isValidDatePart(twoTokens[2], dateFormatTokens[2]) && !dateStringWithDelimiter) {
824
- dateString = `${dateString}${delimiter[1]}`;
825
- }
826
- else if (oneToken && oneToken.length === 2 && this.isValidDatePart(oneToken[1], dateFormatTokens[1]) && !dateStringWithDelimiter) {
923
+ if ((twoTokens && twoTokens.length === 3 && this.isValidDatePart(twoTokens[2], dateFormatTokens[2]) && !dateStringWithDelimiter) ||
924
+ (oneToken && oneToken.length === 2 && this.isValidDatePart(oneToken[1], dateFormatTokens[1]) && !dateStringWithDelimiter)) {
827
925
  dateString = `${dateString}${delimiter[1]}`;
828
926
  }
829
927
  }
@@ -834,7 +932,7 @@ class DateFormatService {
834
932
  let timeStringParts;
835
933
  let amFormat = this.labels.timeFormatAM;
836
934
  let pmFormat = this.labels.timeFormatPM;
837
- if (!(timeString && timeString.includes(':'))) {
935
+ if (!(timeString?.includes(':'))) {
838
936
  return [value, timeString];
839
937
  }
840
938
  if (!militaryTime && amFormat && pmFormat) {
@@ -850,14 +948,14 @@ class DateFormatService {
850
948
  splits = timeString.split(pmFormat);
851
949
  pm = true;
852
950
  }
853
- if (splits && splits.length) {
951
+ if (splits?.length) {
854
952
  for (const item of splits) {
855
- if (item && item.trim().includes(':')) {
953
+ if (item?.trim().includes(':')) {
856
954
  timeStringParts = item.trim().split(':');
857
955
  }
858
956
  }
859
957
  }
860
- if (timeStringParts && timeStringParts.length && timeStringParts.length === 2) {
958
+ if (timeStringParts?.length && timeStringParts.length === 2) {
861
959
  let hours = parseInt(timeStringParts[0], 10);
862
960
  if (hours === 12 && pm) {
863
961
  hours = 12;
@@ -875,7 +973,7 @@ class DateFormatService {
875
973
  }
876
974
  else {
877
975
  timeStringParts = /(\d{1,2}):(\d{2})/.exec(timeString);
878
- if (timeStringParts && timeStringParts.length && timeStringParts.length === 3) {
976
+ if (timeStringParts?.length && timeStringParts.length === 3) {
879
977
  value.setHours(parseInt(timeStringParts[1], 10));
880
978
  value.setMinutes(parseInt(timeStringParts[2], 10));
881
979
  value.setSeconds(0);
@@ -884,6 +982,9 @@ class DateFormatService {
884
982
  return [value, timeString];
885
983
  }
886
984
  parseString(dateTimeString, militaryTime, type) {
985
+ if (!(dateTimeString?.length)) {
986
+ return null;
987
+ }
887
988
  switch (type) {
888
989
  case 'datetime':
889
990
  const str = dateTimeString.replace(/-/g, '/');
@@ -902,18 +1003,23 @@ class DateFormatService {
902
1003
  return;
903
1004
  }
904
1005
  }
905
- isValidDatePart(value, format) {
906
- const datePart = parseInt(value, 10);
907
- if (format.includes('m') && (datePart >= 2 || value.length === 2)) {
908
- return true;
909
- }
910
- else if (format.includes('d') && (datePart >= 4 || value.length === 2)) {
911
- return true;
1006
+ convertTime12to24(time12h) {
1007
+ const pmFormat = this.labels.timeFormatPM.toUpperCase();
1008
+ const [time, modifier] = time12h.split(' ');
1009
+ let [hours, minutes] = time.split(':');
1010
+ if (hours === '12') {
1011
+ hours = '00';
912
1012
  }
913
- else if (format.includes('y') && datePart >= 1000) {
914
- return true;
1013
+ if (['PM', pmFormat].includes(modifier)) {
1014
+ hours = `${parseInt(hours, 10) + 12}`.padStart(2, '0');
915
1015
  }
916
- return false;
1016
+ return `${hours}:${minutes}`;
1017
+ }
1018
+ isValidDatePart(value, format) {
1019
+ const datePart = parseInt(value, 10);
1020
+ return ((format.includes('m') && (datePart >= 2 || value.length === 2)) ||
1021
+ (format.includes('d') && (datePart >= 4 || value.length === 2)) ||
1022
+ (format.includes('y') && datePart >= 1000));
917
1023
  }
918
1024
  }
919
1025
  DateFormatService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DateFormatService, deps: [{ token: NovoLabelService }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -928,6 +1034,9 @@ class BrowserGlobalRef extends GlobalRef {
928
1034
  get nativeGlobal() {
929
1035
  return window;
930
1036
  }
1037
+ get nativeWindow() {
1038
+ return window;
1039
+ }
931
1040
  }
932
1041
  BrowserGlobalRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: BrowserGlobalRef, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
933
1042
  BrowserGlobalRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: BrowserGlobalRef });
@@ -939,6 +1048,9 @@ class NodeGlobalRef extends GlobalRef {
939
1048
  throw new Error(`global doesn't compile for some reason`);
940
1049
  // return global as Global;
941
1050
  }
1051
+ get nativeWindow() {
1052
+ throw new Error('Node does not have a window object');
1053
+ }
942
1054
  }
943
1055
 
944
1056
  // App