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 {
@@ -744,35 +746,79 @@ class DateFormatService {
744
746
  this.labels = labels;
745
747
  }
746
748
  getTimeMask(militaryTime) {
747
- let mask = [/\d/, /\d/, /:/, /\d/, /\d/];
748
- let timeFormatArray = [];
749
- const timeFormat = this.labels.timeFormatPlaceholderAM.toLowerCase();
750
- if (militaryTime) {
751
- return mask;
752
- }
753
- else {
754
- timeFormatArray = timeFormat.split('hh:mm');
755
- if (timeFormatArray && timeFormatArray.length) {
756
- mask = [];
757
- for (const timeFormatPart of timeFormatArray) {
758
- if (timeFormatPart === '') {
759
- mask = mask.concat([/\d/, /\d|:/, /:|\d/, /\d|\w|\s/, /\d|\s|\w/]);
760
- }
761
- else if (timeFormatPart.length) {
762
- for (let i = 0; i < timeFormatPart.length; i++) {
763
- mask.push(/\s|\w|\d|\./);
764
- }
765
- }
766
- }
767
- }
768
- }
749
+ const amFormat = this.labels.timeFormatAM.toUpperCase();
750
+ const pmFormat = this.labels.timeFormatPM.toUpperCase();
751
+ const mask = {
752
+ mask: Date,
753
+ pattern: militaryTime ? 'HH:mm' : 'hh:mm aa',
754
+ overwrite: true,
755
+ autofix: true,
756
+ lazy: false,
757
+ min: new Date(1970, 0, 1),
758
+ max: new Date(2030, 0, 1),
759
+ prepare(str) {
760
+ return str.toUpperCase();
761
+ },
762
+ format(date) {
763
+ return DateUtil.format(date, militaryTime ? 'HH:mm' : 'hh:mm A');
764
+ },
765
+ parse: (str) => {
766
+ const time = militaryTime ? str : this.convertTime12to24(str);
767
+ return DateUtil.parse(`${DateUtil.format(Date.now(), 'YYYY-MM-DD')}T${time}`);
768
+ },
769
+ blocks: {
770
+ HH: {
771
+ mask: MaskedRange,
772
+ placeholderChar: 'H',
773
+ maxLength: 2,
774
+ from: 0,
775
+ to: 23,
776
+ },
777
+ hh: {
778
+ mask: MaskedRange,
779
+ placeholderChar: 'h',
780
+ maxLength: 2,
781
+ from: 1,
782
+ to: 12,
783
+ },
784
+ mm: {
785
+ mask: MaskedRange,
786
+ placeholderChar: 'm',
787
+ maxLength: 2,
788
+ from: 0,
789
+ to: 59,
790
+ },
791
+ aa: {
792
+ mask: MaskedEnum,
793
+ placeholderChar: 'x',
794
+ enum: ['AM', 'PM', 'am', 'pm', amFormat, pmFormat],
795
+ },
796
+ },
797
+ };
769
798
  return mask;
770
799
  }
771
- getDateMask() {
772
- return [/\d/, /\d|\/|\.|\-/, /\/|\.|\-|\d/, /\d|\/|\.|\-/, /\d|\/|\.|\-/, /\d|\/|\.|\-/, /\d|\/|\.|\-/, /\d|\/|\.|\-/, /\d/, /\d/];
800
+ getDateMask(format) {
801
+ const mask = {
802
+ mask: Date,
803
+ pattern: 'm/`d/`Y',
804
+ overwrite: true,
805
+ autofix: 'pad',
806
+ min: new Date(1970, 0, 1),
807
+ max: new Date(2030, 0, 1),
808
+ prepare(str) {
809
+ return str.toUpperCase();
810
+ },
811
+ format(date) {
812
+ return DateUtil.format(date, format || 'MM/DD/YYYY');
813
+ },
814
+ parse: (str) => {
815
+ return DateUtil.parse(str);
816
+ },
817
+ };
818
+ return mask;
773
819
  }
774
820
  getDateTimeMask(militaryTime = false) {
775
- return [...this.getDateMask(), /\,?/, /\s/, ...this.getTimeMask(militaryTime)];
821
+ return [this.getDateMask(), /\,?/, /\s/, this.getTimeMask(militaryTime)];
776
822
  }
777
823
  getTimePlaceHolder(militaryTime) {
778
824
  if (militaryTime) {
@@ -780,6 +826,60 @@ class DateFormatService {
780
826
  }
781
827
  return this.labels.timeFormatPlaceholderAM;
782
828
  }
829
+ parseCustomDateString(dateString, customFormat) {
830
+ let isInvalidDate = true;
831
+ let date = null;
832
+ if (!customFormat) {
833
+ customFormat = this.labels.dateFormatString();
834
+ }
835
+ customFormat = convertTokens(customFormat);
836
+ const [cleanDateString, cleanFormat] = this.removeNonstandardFormatCharacters(dateString, customFormat);
837
+ try {
838
+ date = parse(cleanDateString, cleanFormat, new Date(), {
839
+ useAdditionalWeekYearTokens: false
840
+ });
841
+ if (isNaN(date.getTime())) {
842
+ date = null;
843
+ }
844
+ else if (cleanDateString !== dateString) {
845
+ // Verify that this parse matches the original dateString through this format. If not, then something may have mismatched -
846
+ // in which case we consider the date to be invalid.
847
+ // For instance, if we parsed "Fri Oct 18, 2023" as " Oct 18 2023" (removing the duplicative day-of-week) then it
848
+ // would re-format as "Wed Oct 18 2023" and is an invalid date.
849
+ const reformattedDate = format(date, customFormat);
850
+ if (reformattedDate !== dateString) {
851
+ date = null;
852
+ }
853
+ else {
854
+ isInvalidDate = false;
855
+ }
856
+ }
857
+ else {
858
+ isInvalidDate = false;
859
+ }
860
+ }
861
+ catch (err) {
862
+ // ignore error - keep isInvalidDate true and date null
863
+ }
864
+ return [date, dateString, isInvalidDate];
865
+ }
866
+ /**
867
+ * Certain date format characters are considered nonstandard. We can still use them, but remove them for date parsing to avoid errors
868
+ * @param dateString
869
+ * @param format
870
+ * @returns date string and format in array, both having had their
871
+ */
872
+ removeNonstandardFormatCharacters(dateString, format) {
873
+ const bannedChars = /[iIRoPp]+/;
874
+ // remove quotes
875
+ format = format.replace(/['"]/g, '');
876
+ let match = null;
877
+ while ((match = bannedChars.exec(format)) != null) {
878
+ format = format.substring(0, match.index) + format.substring(match.index + match[0].length);
879
+ dateString = dateString.substring(0, match.index) + dateString.substring(match.index + match[0].length);
880
+ }
881
+ return [dateString, format];
882
+ }
783
883
  parseDateString(dateString) {
784
884
  let dateFormat = this.labels.dateFormatString();
785
885
  const dateFormatRegex = /(\w+)[\/|\.|\-](\w+)[\/|\.|\-](\w+)/gi;
@@ -789,7 +889,7 @@ class DateFormatService {
789
889
  let year;
790
890
  let month;
791
891
  let day;
792
- let date = new Date();
892
+ let date = null;
793
893
  let isInvalidDate = true;
794
894
  if (Helpers.isEmpty(dateFormat)) {
795
895
  // Default to MM/dd/yyyy
@@ -822,10 +922,8 @@ class DateFormatService {
822
922
  const oneToken = /^(\d{1,4})$/.exec(dateString);
823
923
  const delimiter = /\w+(\/|\.|\-)\w+[\/|\.|\-]\w+/gi.exec(dateFormat);
824
924
  const dateStringWithDelimiter = dateString[dateString.length - 1].match(/\/|\.|\-/);
825
- if (twoTokens && twoTokens.length === 3 && this.isValidDatePart(twoTokens[2], dateFormatTokens[2]) && !dateStringWithDelimiter) {
826
- dateString = `${dateString}${delimiter[1]}`;
827
- }
828
- else if (oneToken && oneToken.length === 2 && this.isValidDatePart(oneToken[1], dateFormatTokens[1]) && !dateStringWithDelimiter) {
925
+ if ((twoTokens && twoTokens.length === 3 && this.isValidDatePart(twoTokens[2], dateFormatTokens[2]) && !dateStringWithDelimiter) ||
926
+ (oneToken && oneToken.length === 2 && this.isValidDatePart(oneToken[1], dateFormatTokens[1]) && !dateStringWithDelimiter)) {
829
927
  dateString = `${dateString}${delimiter[1]}`;
830
928
  }
831
929
  }
@@ -836,7 +934,7 @@ class DateFormatService {
836
934
  let timeStringParts;
837
935
  let amFormat = this.labels.timeFormatAM;
838
936
  let pmFormat = this.labels.timeFormatPM;
839
- if (!(timeString && timeString.includes(':'))) {
937
+ if (!(timeString === null || timeString === void 0 ? void 0 : timeString.includes(':'))) {
840
938
  return [value, timeString];
841
939
  }
842
940
  if (!militaryTime && amFormat && pmFormat) {
@@ -852,14 +950,14 @@ class DateFormatService {
852
950
  splits = timeString.split(pmFormat);
853
951
  pm = true;
854
952
  }
855
- if (splits && splits.length) {
953
+ if (splits === null || splits === void 0 ? void 0 : splits.length) {
856
954
  for (const item of splits) {
857
- if (item && item.trim().includes(':')) {
955
+ if (item === null || item === void 0 ? void 0 : item.trim().includes(':')) {
858
956
  timeStringParts = item.trim().split(':');
859
957
  }
860
958
  }
861
959
  }
862
- if (timeStringParts && timeStringParts.length && timeStringParts.length === 2) {
960
+ if ((timeStringParts === null || timeStringParts === void 0 ? void 0 : timeStringParts.length) && timeStringParts.length === 2) {
863
961
  let hours = parseInt(timeStringParts[0], 10);
864
962
  if (hours === 12 && pm) {
865
963
  hours = 12;
@@ -877,7 +975,7 @@ class DateFormatService {
877
975
  }
878
976
  else {
879
977
  timeStringParts = /(\d{1,2}):(\d{2})/.exec(timeString);
880
- if (timeStringParts && timeStringParts.length && timeStringParts.length === 3) {
978
+ if ((timeStringParts === null || timeStringParts === void 0 ? void 0 : timeStringParts.length) && timeStringParts.length === 3) {
881
979
  value.setHours(parseInt(timeStringParts[1], 10));
882
980
  value.setMinutes(parseInt(timeStringParts[2], 10));
883
981
  value.setSeconds(0);
@@ -886,6 +984,9 @@ class DateFormatService {
886
984
  return [value, timeString];
887
985
  }
888
986
  parseString(dateTimeString, militaryTime, type) {
987
+ if (!(dateTimeString === null || dateTimeString === void 0 ? void 0 : dateTimeString.length)) {
988
+ return null;
989
+ }
889
990
  switch (type) {
890
991
  case 'datetime':
891
992
  const str = dateTimeString.replace(/-/g, '/');
@@ -904,18 +1005,23 @@ class DateFormatService {
904
1005
  return;
905
1006
  }
906
1007
  }
907
- isValidDatePart(value, format) {
908
- const datePart = parseInt(value, 10);
909
- if (format.includes('m') && (datePart >= 2 || value.length === 2)) {
910
- return true;
911
- }
912
- else if (format.includes('d') && (datePart >= 4 || value.length === 2)) {
913
- return true;
1008
+ convertTime12to24(time12h) {
1009
+ const pmFormat = this.labels.timeFormatPM.toUpperCase();
1010
+ const [time, modifier] = time12h.split(' ');
1011
+ let [hours, minutes] = time.split(':');
1012
+ if (hours === '12') {
1013
+ hours = '00';
914
1014
  }
915
- else if (format.includes('y') && datePart >= 1000) {
916
- return true;
1015
+ if (['PM', pmFormat].includes(modifier)) {
1016
+ hours = `${parseInt(hours, 10) + 12}`.padStart(2, '0');
917
1017
  }
918
- return false;
1018
+ return `${hours}:${minutes}`;
1019
+ }
1020
+ isValidDatePart(value, format) {
1021
+ const datePart = parseInt(value, 10);
1022
+ return ((format.includes('m') && (datePart >= 2 || value.length === 2)) ||
1023
+ (format.includes('d') && (datePart >= 4 || value.length === 2)) ||
1024
+ (format.includes('y') && datePart >= 1000));
919
1025
  }
920
1026
  }
921
1027
  DateFormatService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DateFormatService, deps: [{ token: NovoLabelService }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -930,6 +1036,9 @@ class BrowserGlobalRef extends GlobalRef {
930
1036
  get nativeGlobal() {
931
1037
  return window;
932
1038
  }
1039
+ get nativeWindow() {
1040
+ return window;
1041
+ }
933
1042
  }
934
1043
  BrowserGlobalRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: BrowserGlobalRef, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
935
1044
  BrowserGlobalRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: BrowserGlobalRef });
@@ -941,6 +1050,9 @@ class NodeGlobalRef extends GlobalRef {
941
1050
  throw new Error(`global doesn't compile for some reason`);
942
1051
  // return global as Global;
943
1052
  }
1053
+ get nativeWindow() {
1054
+ throw new Error('Node does not have a window object');
1055
+ }
944
1056
  }
945
1057
 
946
1058
  // App