@bnsights/bbsf-controls 1.0.107 → 1.0.110

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 (297) hide show
  1. package/README.md +15 -0
  2. package/esm2022/bnsights-bbsf-controls.mjs +5 -0
  3. package/esm2022/lib/Shared/Components/app-base-component.mjs +226 -0
  4. package/esm2022/lib/Shared/Components/ng-tag-input.mjs +331 -0
  5. package/esm2022/lib/Shared/Directives/template-name.directive.mjs +18 -0
  6. package/{esm2015/lib/Shared/Enums/CalendarView.js → esm2022/lib/Shared/Enums/CalendarView.mjs} +7 -7
  7. package/{esm2015/lib/Shared/Enums/ControlLayout.js → esm2022/lib/Shared/Enums/ControlLayout.mjs} +5 -5
  8. package/{esm2015/lib/Shared/Enums/Countries.js → esm2022/lib/Shared/Enums/Countries.mjs} +246 -246
  9. package/{esm2015/lib/Shared/Enums/Enums.js → esm2022/lib/Shared/Enums/Enums.mjs} +32 -32
  10. package/{esm2015/lib/Shared/Enums/FileType.js → esm2022/lib/Shared/Enums/FileType.mjs} +21 -21
  11. package/{esm2015/lib/Shared/Enums/FilterType.js → esm2022/lib/Shared/Enums/FilterType.mjs} +10 -10
  12. package/{esm2015/lib/Shared/Enums/FontSize.js → esm2022/lib/Shared/Enums/FontSize.mjs} +6 -6
  13. package/{esm2015/lib/Shared/Enums/ForceDirection.js → esm2022/lib/Shared/Enums/ForceDirection.mjs} +5 -5
  14. package/{esm2015/lib/Shared/Enums/IconPosition.js → esm2022/lib/Shared/Enums/IconPosition.mjs} +5 -5
  15. package/{esm2015/lib/Shared/Enums/ImageType.js → esm2022/lib/Shared/Enums/ImageType.mjs} +9 -9
  16. package/{esm2015/lib/Shared/Enums/InputType.js → esm2022/lib/Shared/Enums/InputType.mjs} +9 -9
  17. package/{esm2015/lib/Shared/Enums/Insert.js → esm2022/lib/Shared/Enums/Insert.mjs} +8 -8
  18. package/{esm2015/lib/Shared/Enums/LanguageMode.js → esm2022/lib/Shared/Enums/LanguageMode.mjs} +10 -10
  19. package/{esm2015/lib/Shared/Enums/LanguageValidation.js → esm2022/lib/Shared/Enums/LanguageValidation.mjs} +5 -5
  20. package/{esm2015/lib/Shared/Enums/Misc.js → esm2022/lib/Shared/Enums/Misc.mjs} +6 -6
  21. package/{esm2015/lib/Shared/Enums/PagingActionMode.js → esm2022/lib/Shared/Enums/PagingActionMode.mjs} +5 -5
  22. package/{esm2015/lib/Shared/Enums/Para.js → esm2022/lib/Shared/Enums/Para.mjs} +8 -8
  23. package/{esm2015/lib/Shared/Enums/PickerType.js → esm2022/lib/Shared/Enums/PickerType.mjs} +6 -6
  24. package/{esm2015/lib/Shared/Enums/SelectMode.js → esm2022/lib/Shared/Enums/SelectMode.mjs} +5 -5
  25. package/{esm2015/lib/Shared/Enums/StartView.js → esm2022/lib/Shared/Enums/StartView.mjs} +6 -6
  26. package/{esm2015/lib/Shared/Enums/Style.js → esm2022/lib/Shared/Enums/Style.mjs} +7 -7
  27. package/{esm2015/lib/Shared/Enums/StyleConfirmationMode.js → esm2022/lib/Shared/Enums/StyleConfirmationMode.mjs} +6 -6
  28. package/{esm2015/lib/Shared/Enums/TagInputView.js → esm2022/lib/Shared/Enums/TagInputView.mjs} +6 -6
  29. package/{esm2015/lib/Shared/Enums/menu-list-enum.js → esm2022/lib/Shared/Enums/menu-list-enum.mjs} +5 -5
  30. package/{esm2015/lib/Shared/Models/Attribute.js → esm2022/lib/Shared/Models/Attribute.mjs} +2 -2
  31. package/{esm2015/lib/Shared/Models/AutocompleteDTO.js → esm2022/lib/Shared/Models/AutocompleteDTO.mjs} +7 -7
  32. package/{esm2015/lib/Shared/Models/AutocompleteOptions.js → esm2022/lib/Shared/Models/AutocompleteOptions.mjs} +23 -23
  33. package/{esm2015/lib/Shared/Models/CalendarEventDTO.js → esm2022/lib/Shared/Models/CalendarEventDTO.mjs} +2 -2
  34. package/{esm2015/lib/Shared/Models/CalendarOptions.js → esm2022/lib/Shared/Models/CalendarOptions.mjs} +18 -18
  35. package/{esm2015/lib/Shared/Models/CancelDTO.js → esm2022/lib/Shared/Models/CancelDTO.mjs} +6 -6
  36. package/{esm2015/lib/Shared/Models/CaptchaStyle.js → esm2022/lib/Shared/Models/CaptchaStyle.mjs} +2 -2
  37. package/{esm2015/lib/Shared/Models/CheckBoxOptions.js → esm2022/lib/Shared/Models/CheckBoxOptions.mjs} +10 -10
  38. package/{esm2015/lib/Shared/Models/ConfirmationModalOptions.js → esm2022/lib/Shared/Models/ConfirmationModalOptions.mjs} +38 -38
  39. package/{esm2015/lib/Shared/Models/ControlOptionsBase.js → esm2022/lib/Shared/Models/ControlOptionsBase.mjs} +12 -12
  40. package/{esm2015/lib/Shared/Models/CustomValidation.js → esm2022/lib/Shared/Models/CustomValidation.mjs} +13 -13
  41. package/{esm2015/lib/Shared/Models/DropdownListItem.js → esm2022/lib/Shared/Models/DropdownListItem.mjs} +3 -3
  42. package/{esm2015/lib/Shared/Models/DropdownOptions.js → esm2022/lib/Shared/Models/DropdownOptions.mjs} +15 -15
  43. package/{esm2015/lib/Shared/Models/EditPersonalImage.js → esm2022/lib/Shared/Models/EditPersonalImage.mjs} +6 -6
  44. package/{esm2015/lib/Shared/Models/EnglishArabicDTO.js → esm2022/lib/Shared/Models/EnglishArabicDTO.mjs} +10 -10
  45. package/{esm2015/lib/Shared/Models/FileDTO.js → esm2022/lib/Shared/Models/FileDTO.mjs} +1 -1
  46. package/{esm2015/lib/Shared/Models/FileUploadModel.js → esm2022/lib/Shared/Models/FileUploadModel.mjs} +2 -2
  47. package/{esm2015/lib/Shared/Models/FileUploadOptions.js → esm2022/lib/Shared/Models/FileUploadOptions.mjs} +10 -10
  48. package/{esm2015/lib/Shared/Models/FilterItem.js → esm2022/lib/Shared/Models/FilterItem.mjs} +7 -7
  49. package/{esm2015/lib/Shared/Models/FormOptions.js → esm2022/lib/Shared/Models/FormOptions.mjs} +27 -27
  50. package/{esm2015/lib/Shared/Models/HtmlEditorOptions.js → esm2022/lib/Shared/Models/HtmlEditorOptions.mjs} +11 -11
  51. package/{esm2015/lib/Shared/Models/ImageUploadOptions.js → esm2022/lib/Shared/Models/ImageUploadOptions.mjs} +13 -13
  52. package/{esm2015/lib/Shared/Models/MapAutoCompleteOptions.js → esm2022/lib/Shared/Models/MapAutoCompleteOptions.mjs} +3 -3
  53. package/{esm2015/lib/Shared/Models/MapAutocompleteDTO.js → esm2022/lib/Shared/Models/MapAutocompleteDTO.mjs} +5 -5
  54. package/{esm2015/lib/Shared/Models/MultiLingualHtmlEditorOptions.js → esm2022/lib/Shared/Models/MultiLingualHtmlEditorOptions.mjs} +8 -8
  55. package/{esm2015/lib/Shared/Models/MultiLingualTextAreaOptions.js → esm2022/lib/Shared/Models/MultiLingualTextAreaOptions.mjs} +8 -8
  56. package/{esm2015/lib/Shared/Models/MultilingualControlOptionsBase.js → esm2022/lib/Shared/Models/MultilingualControlOptionsBase.mjs} +15 -15
  57. package/{esm2015/lib/Shared/Models/MultilingualTextBoxOptions.js → esm2022/lib/Shared/Models/MultilingualTextBoxOptions.mjs} +13 -13
  58. package/{esm2015/lib/Shared/Models/MultipleFileUploadModel.js → esm2022/lib/Shared/Models/MultipleFileUploadModel.mjs} +8 -8
  59. package/{esm2015/lib/Shared/Models/PagingDTO.js → esm2022/lib/Shared/Models/PagingDTO.mjs} +12 -12
  60. package/{esm2015/lib/Shared/Models/PagingOptions.js → esm2022/lib/Shared/Models/PagingOptions.mjs} +46 -46
  61. package/{esm2015/lib/Shared/Models/PagingPayload.js → esm2022/lib/Shared/Models/PagingPayload.mjs} +2 -2
  62. package/{esm2015/lib/Shared/Models/PhoneOptions.js → esm2022/lib/Shared/Models/PhoneOptions.mjs} +12 -12
  63. package/{esm2015/lib/Shared/Models/ProfileImageUploadOptions.js → esm2022/lib/Shared/Models/ProfileImageUploadOptions.mjs} +10 -10
  64. package/{esm2015/lib/Shared/Models/ProfilePictureDTO.js → esm2022/lib/Shared/Models/ProfilePictureDTO.mjs} +2 -2
  65. package/{esm2015/lib/Shared/Models/RadioButtonItem.js → esm2022/lib/Shared/Models/RadioButtonItem.mjs} +2 -2
  66. package/{esm2015/lib/Shared/Models/RadioButtonOptions.js → esm2022/lib/Shared/Models/RadioButtonOptions.mjs} +3 -3
  67. package/{esm2015/lib/Shared/Models/RangeNumber.js → esm2022/lib/Shared/Models/RangeNumber.mjs} +2 -2
  68. package/{esm2015/lib/Shared/Models/Recaptcha.js → esm2022/lib/Shared/Models/Recaptcha.mjs} +5 -5
  69. package/{esm2015/lib/Shared/Models/RecaptchaOptions.js → esm2022/lib/Shared/Models/RecaptchaOptions.mjs} +21 -21
  70. package/{esm2015/lib/Shared/Models/RepeaterField.js → esm2022/lib/Shared/Models/RepeaterField.mjs} +2 -2
  71. package/{esm2015/lib/Shared/Models/RepeaterOptions.js → esm2022/lib/Shared/Models/RepeaterOptions.mjs} +12 -12
  72. package/{esm2015/lib/Shared/Models/SaveDTO.js → esm2022/lib/Shared/Models/SaveDTO.mjs} +6 -6
  73. package/{esm2015/lib/Shared/Models/TagsInputDTO.js → esm2022/lib/Shared/Models/TagsInputDTO.mjs} +2 -2
  74. package/{esm2015/lib/Shared/Models/TagsInputOptions.js → esm2022/lib/Shared/Models/TagsInputOptions.mjs} +40 -40
  75. package/{esm2015/lib/Shared/Models/TextAreaOptions.js → esm2022/lib/Shared/Models/TextAreaOptions.mjs} +3 -3
  76. package/{esm2015/lib/Shared/Models/TextBoxOptions.js → esm2022/lib/Shared/Models/TextBoxOptions.mjs} +22 -22
  77. package/{esm2015/lib/Shared/Models/ToggleslideOptions.js → esm2022/lib/Shared/Models/ToggleslideOptions.mjs} +8 -8
  78. package/{esm2015/lib/Shared/Models/UploadPersonalImage.js → esm2022/lib/Shared/Models/UploadPersonalImage.mjs} +6 -6
  79. package/{esm2015/lib/Shared/Models/bread-crumb.js → esm2022/lib/Shared/Models/bread-crumb.mjs} +7 -7
  80. package/{esm2015/lib/Shared/Models/control-filter-Item.js → esm2022/lib/Shared/Models/control-filter-Item.mjs} +5 -5
  81. package/{esm2015/lib/Shared/Models/datePickerOptions.js → esm2022/lib/Shared/Models/datePickerOptions.mjs} +22 -22
  82. package/{esm2015/lib/Shared/Models/filter-options.js → esm2022/lib/Shared/Models/filter-options.mjs} +8 -8
  83. package/{esm2015/lib/Shared/Models/page-header-options.js → esm2022/lib/Shared/Models/page-header-options.mjs} +77 -77
  84. package/esm2022/lib/Shared/Pipes/bbsf-date-time.pipe.mjs +21 -0
  85. package/esm2022/lib/Shared/Pipes/bbsf-date.pipe.mjs +21 -0
  86. package/{esm2015/lib/Shared/config/environment.js → esm2022/lib/Shared/config/environment.mjs} +11 -11
  87. package/esm2022/lib/Shared/default_intl.mjs +29 -0
  88. package/esm2022/lib/Shared/services/ControlUtility.mjs +162 -0
  89. package/esm2022/lib/Shared/services/GlobalSettings.service.mjs +30 -0
  90. package/esm2022/lib/Shared/services/OnPagingFiltersChange.service.mjs +24 -0
  91. package/esm2022/lib/Shared/services/render-component-service.service.mjs +30 -0
  92. package/esm2022/lib/Shared/services/validationErrorMassage.service.mjs +170 -0
  93. package/esm2022/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.mjs +262 -0
  94. package/esm2022/lib/controls/Calendar/Calendar.component.mjs +173 -0
  95. package/esm2022/lib/controls/CheckBox/CheckBox.component.mjs +117 -0
  96. package/esm2022/lib/controls/ConfirmationModal/ConfirmationModal.component.mjs +136 -0
  97. package/esm2022/lib/controls/DateTimePicker/DateTimePicker.component.mjs +223 -0
  98. package/esm2022/lib/controls/DropdownList/DropdownList.component.mjs +193 -0
  99. package/esm2022/lib/controls/FileUplaod/FileUplaod.component.mjs +447 -0
  100. package/esm2022/lib/controls/Form/Form.component.mjs +101 -0
  101. package/{esm2015/lib/controls/HtmlEditor/HtmlEditor.component.js → esm2022/lib/controls/HtmlEditor/HtmlEditor.component.mjs} +226 -226
  102. package/esm2022/lib/controls/ImageUpload/ImageUpload.component.mjs +350 -0
  103. package/esm2022/lib/controls/MapAutoComplete/MapAutoComplete.component.mjs +324 -0
  104. package/esm2022/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.mjs +427 -0
  105. package/esm2022/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.mjs +429 -0
  106. package/esm2022/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.mjs +428 -0
  107. package/esm2022/lib/controls/Paging/JwPagination.component.mjs +156 -0
  108. package/esm2022/lib/controls/Paging/Paging.component.mjs +312 -0
  109. package/esm2022/lib/controls/Phone/Phone.component.mjs +129 -0
  110. package/esm2022/lib/controls/ProfileImageUploader/ProfileImageUploader.component.mjs +376 -0
  111. package/esm2022/lib/controls/RadioButton/RadioButton.component.mjs +109 -0
  112. package/esm2022/lib/controls/Recaptcha/Recaptcha.component.mjs +135 -0
  113. package/esm2022/lib/controls/Repeater/repeater/repeater.component.mjs +125 -0
  114. package/esm2022/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.mjs +750 -0
  115. package/esm2022/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.mjs +21 -0
  116. package/esm2022/lib/controls/Repeater/repeater-table/repeater-table.component.mjs +108 -0
  117. package/esm2022/lib/controls/TagsInput/TagsInput.component.mjs +277 -0
  118. package/esm2022/lib/controls/TextArea/TextArea.component.mjs +196 -0
  119. package/esm2022/lib/controls/TextBox/TextBox.component.mjs +306 -0
  120. package/esm2022/lib/controls/Toggleslide/toggleslide.component.mjs +90 -0
  121. package/esm2022/lib/controls/bbsf-controls.module.mjs +350 -0
  122. package/esm2022/lib/controls/page-header-component/page-header-component.component.mjs +37 -0
  123. package/{esm2015/public-api.js → esm2022/public-api.mjs} +130 -130
  124. package/{fesm2015/bnsights-bbsf-controls.js → fesm2022/bnsights-bbsf-controls.mjs} +8876 -8851
  125. package/fesm2022/bnsights-bbsf-controls.mjs.map +1 -0
  126. package/index.d.ts +5 -0
  127. package/lib/Shared/Components/app-base-component.d.ts +58 -51
  128. package/lib/Shared/Components/ng-tag-input.d.ts +50 -47
  129. package/lib/Shared/Directives/template-name.directive.d.ts +9 -6
  130. package/lib/Shared/Enums/CalendarView.d.ts +6 -6
  131. package/lib/Shared/Enums/ControlLayout.d.ts +4 -4
  132. package/lib/Shared/Enums/Countries.d.ts +245 -245
  133. package/lib/Shared/Enums/Enums.d.ts +30 -30
  134. package/lib/Shared/Enums/FileType.d.ts +20 -20
  135. package/lib/Shared/Enums/FilterType.d.ts +9 -9
  136. package/lib/Shared/Enums/FontSize.d.ts +5 -5
  137. package/lib/Shared/Enums/ForceDirection.d.ts +4 -4
  138. package/lib/Shared/Enums/IconPosition.d.ts +4 -4
  139. package/lib/Shared/Enums/ImageType.d.ts +8 -8
  140. package/lib/Shared/Enums/InputType.d.ts +8 -8
  141. package/lib/Shared/Enums/Insert.d.ts +7 -7
  142. package/lib/Shared/Enums/LanguageMode.d.ts +9 -9
  143. package/lib/Shared/Enums/LanguageValidation.d.ts +4 -4
  144. package/lib/Shared/Enums/Misc.d.ts +5 -5
  145. package/lib/Shared/Enums/PagingActionMode.d.ts +4 -4
  146. package/lib/Shared/Enums/Para.d.ts +7 -7
  147. package/lib/Shared/Enums/PickerType.d.ts +5 -5
  148. package/lib/Shared/Enums/SelectMode.d.ts +4 -4
  149. package/lib/Shared/Enums/StartView.d.ts +5 -5
  150. package/lib/Shared/Enums/Style.d.ts +6 -6
  151. package/lib/Shared/Enums/StyleConfirmationMode.d.ts +5 -5
  152. package/lib/Shared/Enums/TagInputView.d.ts +5 -5
  153. package/lib/Shared/Enums/menu-list-enum.d.ts +4 -4
  154. package/lib/Shared/Models/Attribute.d.ts +4 -4
  155. package/lib/Shared/Models/AutocompleteDTO.d.ts +5 -5
  156. package/lib/Shared/Models/AutocompleteOptions.d.ts +40 -40
  157. package/lib/Shared/Models/CalendarEventDTO.d.ts +8 -8
  158. package/lib/Shared/Models/CalendarOptions.d.ts +23 -23
  159. package/lib/Shared/Models/CancelDTO.d.ts +5 -5
  160. package/lib/Shared/Models/CaptchaStyle.d.ts +7 -7
  161. package/lib/Shared/Models/CheckBoxOptions.d.ts +7 -7
  162. package/lib/Shared/Models/ConfirmationModalOptions.d.ts +21 -21
  163. package/lib/Shared/Models/ControlOptionsBase.d.ts +44 -44
  164. package/lib/Shared/Models/CustomValidation.d.ts +10 -10
  165. package/lib/Shared/Models/DropdownListItem.d.ts +4 -4
  166. package/lib/Shared/Models/DropdownOptions.d.ts +33 -33
  167. package/lib/Shared/Models/EditPersonalImage.d.ts +5 -5
  168. package/lib/Shared/Models/EnglishArabicDTO.d.ts +4 -4
  169. package/lib/Shared/Models/FileDTO.d.ts +19 -19
  170. package/lib/Shared/Models/FileUploadModel.d.ts +4 -4
  171. package/lib/Shared/Models/FileUploadOptions.d.ts +19 -19
  172. package/lib/Shared/Models/FilterItem.d.ts +13 -13
  173. package/lib/Shared/Models/FormOptions.d.ts +16 -16
  174. package/lib/Shared/Models/HtmlEditorOptions.d.ts +31 -31
  175. package/lib/Shared/Models/ImageUploadOptions.d.ts +23 -23
  176. package/lib/Shared/Models/MapAutoCompleteOptions.d.ts +6 -6
  177. package/lib/Shared/Models/MapAutocompleteDTO.d.ts +7 -7
  178. package/lib/Shared/Models/MultiLingualHtmlEditorOptions.d.ts +22 -22
  179. package/lib/Shared/Models/MultiLingualTextAreaOptions.d.ts +12 -12
  180. package/lib/Shared/Models/MultilingualControlOptionsBase.d.ts +77 -77
  181. package/lib/Shared/Models/MultilingualTextBoxOptions.d.ts +12 -12
  182. package/lib/Shared/Models/MultipleFileUploadModel.d.ts +7 -7
  183. package/lib/Shared/Models/PagingDTO.d.ts +11 -11
  184. package/lib/Shared/Models/PagingOptions.d.ts +56 -56
  185. package/lib/Shared/Models/PagingPayload.d.ts +5 -5
  186. package/lib/Shared/Models/PhoneOptions.d.ts +21 -21
  187. package/lib/Shared/Models/ProfileImageUploadOptions.d.ts +28 -28
  188. package/lib/Shared/Models/ProfilePictureDTO.d.ts +13 -13
  189. package/lib/Shared/Models/RadioButtonItem.d.ts +4 -4
  190. package/lib/Shared/Models/RadioButtonOptions.d.ts +8 -8
  191. package/lib/Shared/Models/RangeNumber.d.ts +4 -4
  192. package/lib/Shared/Models/Recaptcha.d.ts +6 -6
  193. package/lib/Shared/Models/RecaptchaOptions.d.ts +18 -18
  194. package/lib/Shared/Models/RepeaterField.d.ts +7 -7
  195. package/lib/Shared/Models/RepeaterOptions.d.ts +19 -19
  196. package/lib/Shared/Models/SaveDTO.d.ts +5 -5
  197. package/lib/Shared/Models/TagsInputDTO.d.ts +6 -6
  198. package/lib/Shared/Models/TagsInputOptions.d.ts +57 -57
  199. package/lib/Shared/Models/TextAreaOptions.d.ts +23 -23
  200. package/lib/Shared/Models/TextBoxOptions.d.ts +37 -37
  201. package/lib/Shared/Models/ToggleslideOptions.d.ts +9 -9
  202. package/lib/Shared/Models/UploadPersonalImage.d.ts +5 -5
  203. package/lib/Shared/Models/bread-crumb.d.ts +6 -6
  204. package/lib/Shared/Models/control-filter-Item.d.ts +6 -6
  205. package/lib/Shared/Models/datePickerOptions.d.ts +29 -29
  206. package/lib/Shared/Models/filter-options.d.ts +7 -7
  207. package/lib/Shared/Models/page-header-options.d.ts +71 -71
  208. package/lib/Shared/Pipes/bbsf-date-time.pipe.d.ts +10 -7
  209. package/lib/Shared/Pipes/bbsf-date.pipe.d.ts +10 -7
  210. package/lib/Shared/config/environment.d.ts +1 -1
  211. package/lib/Shared/default_intl.d.ts +21 -18
  212. package/lib/Shared/services/ControlUtility.d.ts +32 -29
  213. package/lib/Shared/services/GlobalSettings.service.d.ts +17 -14
  214. package/lib/Shared/services/OnPagingFiltersChange.service.d.ts +10 -7
  215. package/lib/Shared/services/render-component-service.service.d.ts +10 -7
  216. package/lib/Shared/services/validationErrorMassage.service.d.ts +14 -13
  217. package/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.d.ts +59 -56
  218. package/lib/controls/Calendar/Calendar.component.d.ts +42 -39
  219. package/lib/controls/CheckBox/CheckBox.component.d.ts +37 -34
  220. package/lib/controls/ConfirmationModal/ConfirmationModal.component.d.ts +29 -26
  221. package/lib/controls/DateTimePicker/DateTimePicker.component.d.ts +61 -58
  222. package/lib/controls/DropdownList/DropdownList.component.d.ts +55 -50
  223. package/lib/controls/FileUplaod/FileUplaod.component.d.ts +58 -55
  224. package/lib/controls/Form/Form.component.d.ts +28 -25
  225. package/lib/controls/HtmlEditor/HtmlEditor.component.d.ts +49 -46
  226. package/lib/controls/ImageUpload/ImageUpload.component.d.ts +70 -67
  227. package/lib/controls/MapAutoComplete/MapAutoComplete.component.d.ts +49 -51
  228. package/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.d.ts +65 -62
  229. package/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.d.ts +74 -71
  230. package/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.d.ts +73 -70
  231. package/lib/controls/Paging/JwPagination.component.d.ts +27 -24
  232. package/lib/controls/Paging/Paging.component.d.ts +57 -54
  233. package/lib/controls/Phone/Phone.component.d.ts +43 -40
  234. package/lib/controls/ProfileImageUploader/ProfileImageUploader.component.d.ts +69 -66
  235. package/lib/controls/RadioButton/RadioButton.component.d.ts +37 -34
  236. package/lib/controls/Recaptcha/Recaptcha.component.d.ts +41 -38
  237. package/lib/controls/Repeater/repeater/repeater.component.d.ts +29 -26
  238. package/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.d.ts +23 -20
  239. package/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.d.ts +11 -8
  240. package/lib/controls/Repeater/repeater-table/repeater-table.component.d.ts +19 -16
  241. package/lib/controls/TagsInput/TagsInput.component.d.ts +58 -55
  242. package/lib/controls/TextArea/TextArea.component.d.ts +51 -48
  243. package/lib/controls/TextBox/TextBox.component.d.ts +66 -63
  244. package/lib/controls/Toggleslide/toggleslide.component.d.ts +33 -30
  245. package/lib/controls/bbsf-controls.module.d.ts +68 -10
  246. package/lib/controls/page-header-component/page-header-component.component.d.ts +20 -17
  247. package/package.json +61 -78
  248. package/public-api.d.ts +117 -117
  249. package/src/lib/assets/Style.scss +4 -4
  250. package/bnsights-bbsf-controls-1.0.107.tgz +0 -0
  251. package/bnsights-bbsf-controls.d.ts +0 -5
  252. package/bnsights-bbsf-controls.metadata.json +0 -1
  253. package/bundles/bnsights-bbsf-controls.umd.js +0 -9636
  254. package/bundles/bnsights-bbsf-controls.umd.js.map +0 -1
  255. package/esm2015/bnsights-bbsf-controls.js +0 -6
  256. package/esm2015/lib/Shared/Components/app-base-component.js +0 -202
  257. package/esm2015/lib/Shared/Components/ng-tag-input.js +0 -323
  258. package/esm2015/lib/Shared/Directives/template-name.directive.js +0 -18
  259. package/esm2015/lib/Shared/Pipes/bbsf-date-time.pipe.js +0 -20
  260. package/esm2015/lib/Shared/Pipes/bbsf-date.pipe.js +0 -20
  261. package/esm2015/lib/Shared/default_intl.js +0 -29
  262. package/esm2015/lib/Shared/services/ControlUtility.js +0 -164
  263. package/esm2015/lib/Shared/services/GlobalSettings.service.js +0 -28
  264. package/esm2015/lib/Shared/services/OnPagingFiltersChange.service.js +0 -22
  265. package/esm2015/lib/Shared/services/render-component-service.service.js +0 -30
  266. package/esm2015/lib/Shared/services/validationErrorMassage.service.js +0 -172
  267. package/esm2015/lib/controls/AutocompleteTextBox/AutocompleteTextBox.component.js +0 -266
  268. package/esm2015/lib/controls/Calendar/Calendar.component.js +0 -177
  269. package/esm2015/lib/controls/CheckBox/CheckBox.component.js +0 -118
  270. package/esm2015/lib/controls/ConfirmationModal/ConfirmationModal.component.js +0 -139
  271. package/esm2015/lib/controls/DateTimePicker/DateTimePicker.component.js +0 -227
  272. package/esm2015/lib/controls/DropdownList/DropdownList.component.js +0 -192
  273. package/esm2015/lib/controls/FileUplaod/FileUplaod.component.js +0 -447
  274. package/esm2015/lib/controls/Form/Form.component.js +0 -106
  275. package/esm2015/lib/controls/ImageUpload/ImageUpload.component.js +0 -347
  276. package/esm2015/lib/controls/MapAutoComplete/MapAutoComplete.component.js +0 -325
  277. package/esm2015/lib/controls/MultiLingualHtmlEditor/MultiLingualHtmlEditor.component.js +0 -429
  278. package/esm2015/lib/controls/MultiLingualTextArea/MultiLingualTextArea.component.js +0 -434
  279. package/esm2015/lib/controls/MultiLingualTextBox/MultiLingualTextBox.component.js +0 -433
  280. package/esm2015/lib/controls/Paging/JwPagination.component.js +0 -129
  281. package/esm2015/lib/controls/Paging/Paging.component.js +0 -312
  282. package/esm2015/lib/controls/Phone/Phone.component.js +0 -129
  283. package/esm2015/lib/controls/ProfileImageUploader/ProfileImageUploader.component.js +0 -371
  284. package/esm2015/lib/controls/RadioButton/RadioButton.component.js +0 -111
  285. package/esm2015/lib/controls/Recaptcha/Recaptcha.component.js +0 -135
  286. package/esm2015/lib/controls/Repeater/repeater/repeater.component.js +0 -117
  287. package/esm2015/lib/controls/Repeater/repeater-field-builder/repeater-field-builder.component.js +0 -748
  288. package/esm2015/lib/controls/Repeater/repeater-item-field/repeater-item-field.component.js +0 -19
  289. package/esm2015/lib/controls/Repeater/repeater-table/repeater-table.component.js +0 -108
  290. package/esm2015/lib/controls/TagsInput/TagsInput.component.js +0 -278
  291. package/esm2015/lib/controls/TextArea/TextArea.component.js +0 -197
  292. package/esm2015/lib/controls/TextBox/TextBox.component.js +0 -309
  293. package/esm2015/lib/controls/Toggleslide/toggleslide.component.js +0 -90
  294. package/esm2015/lib/controls/bbsf-controls.module.js +0 -240
  295. package/esm2015/lib/controls/page-header-component/page-header-component.component.js +0 -32
  296. package/fesm2015/bnsights-bbsf-controls.js.map +0 -1
  297. package/src/lib/assets/.gitkeep +0 -0
@@ -0,0 +1,21 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class RepeaterItemFieldComponent {
5
+ constructor() { }
6
+ ngOnInit() {
7
+ }
8
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RepeaterItemFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: RepeaterItemFieldComponent, selector: "repeater-item-field", inputs: { templates: "templates", filedIndex: "filedIndex", itemIndex: "itemIndex" }, ngImport: i0, template: "<ng-container *ngFor=\"let template of templates ; index as i\">\r\n <ng-container *ngIf=\"i==filedIndex\" [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext] ={itemIndex:itemIndex,controlIndex:i}></ng-container>\r\n </ng-container>\r\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
10
+ }
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RepeaterItemFieldComponent, decorators: [{
12
+ type: Component,
13
+ args: [{ selector: 'repeater-item-field', template: "<ng-container *ngFor=\"let template of templates ; index as i\">\r\n <ng-container *ngIf=\"i==filedIndex\" [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext] ={itemIndex:itemIndex,controlIndex:i}></ng-container>\r\n </ng-container>\r\n" }]
14
+ }], ctorParameters: () => [], propDecorators: { templates: [{
15
+ type: Input
16
+ }], filedIndex: [{
17
+ type: Input
18
+ }], itemIndex: [{
19
+ type: Input
20
+ }] } });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXItaXRlbS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWNvbnRyb2xzL3NyYy9saWIvY29udHJvbHMvUmVwZWF0ZXIvcmVwZWF0ZXItaXRlbS1maWVsZC9yZXBlYXRlci1pdGVtLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9SZXBlYXRlci9yZXBlYXRlci1pdGVtLWZpZWxkL3JlcGVhdGVyLWl0ZW0tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXVCLE1BQU0sZUFBZSxDQUFDOzs7QUFNdEUsTUFBTSxPQUFPLDBCQUEwQjtJQUtyQyxnQkFBZ0IsQ0FBQztJQUVqQixRQUFRO0lBQ1IsQ0FBQzs4R0FSVSwwQkFBMEI7a0dBQTFCLDBCQUEwQixpSkNOdkMseVBBR0E7OzJGREdhLDBCQUEwQjtrQkFKdEMsU0FBUzsrQkFDRSxxQkFBcUI7d0RBSXRCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdyZXBlYXRlci1pdGVtLWZpZWxkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVwZWF0ZXItaXRlbS1maWVsZC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlcGVhdGVySXRlbUZpZWxkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSB0ZW1wbGF0ZXM6ICBBcnJheTxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuICBASW5wdXQoKSBmaWxlZEluZGV4OiBudW1iZXI7XHJcbiAgQElucHV0KCkgaXRlbUluZGV4OiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVtcGxhdGUgb2YgdGVtcGxhdGVzIDsgaW5kZXggYXMgaVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImk9PWZpbGVkSW5kZXhcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdID17aXRlbUluZGV4Oml0ZW1JbmRleCxjb250cm9sSW5kZXg6aX0+PC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbiJdfQ==
@@ -0,0 +1,108 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { FormGroup } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@bnsights/bbsf-utilities";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "../repeater-field-builder/repeater-field-builder.component";
7
+ export class RepeaterTableComponent {
8
+ constructor(utilityService) {
9
+ this.utilityService = utilityService;
10
+ this.items = [];
11
+ this.originalItems = [];
12
+ }
13
+ ngOnInit() {
14
+ this.repeaterGroup = new FormGroup({});
15
+ this.group.addControl(this.options.Name, this.repeaterGroup);
16
+ if (this.options.RepeaterValue.length > 0) {
17
+ this.originalItems = this.options.RepeaterValue;
18
+ for (let index = 0; index < this.options.RepeaterValue.length; index++) {
19
+ this.items.push(index);
20
+ }
21
+ }
22
+ else
23
+ for (let index = 0; index < this.options.MinRequiredItems; index++) {
24
+ this.items.push(index);
25
+ }
26
+ this.repeaterGroup.valueChanges.subscribe((res) => {
27
+ let result = [];
28
+ let rowNumber = [];
29
+ let addItems = [];
30
+ for (const key in this.repeaterGroup.controls) {
31
+ if (Object.prototype.hasOwnProperty.call(this.repeaterGroup.controls, key)) {
32
+ const keySplitArr = key.split('.');
33
+ let item = {
34
+ [keySplitArr[1]]: { [keySplitArr[0]]: this.group.controls[this.options.Name].value[key] }
35
+ };
36
+ addItems.push(item);
37
+ if (!rowNumber.includes(keySplitArr[1]))
38
+ rowNumber.push(keySplitArr[1]);
39
+ }
40
+ }
41
+ for (let index = 0; index < rowNumber.length; index++) {
42
+ const row = rowNumber[index];
43
+ let addObject = {};
44
+ let filteredElements = addItems.filter(item => item[row]);
45
+ for (let index = 0; index < filteredElements.length; index++) {
46
+ const filteredElement = filteredElements[index];
47
+ for (const key in filteredElement) {
48
+ if (Object.prototype.hasOwnProperty.call(filteredElement, key)) {
49
+ const element = filteredElement[key];
50
+ for (const key in element) {
51
+ if (Object.prototype.hasOwnProperty.call(element, key)) {
52
+ const value = element[key];
53
+ addObject[key] = value;
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+ result.push(addObject);
60
+ }
61
+ this.options.RepeaterValue = result;
62
+ });
63
+ }
64
+ deleteItem(Index) {
65
+ if (this.items.length == this.options.MinRequiredItems && this.options.IsRequired)
66
+ return;
67
+ let deletedControls = [];
68
+ let controlNames = this.options.RepeaterStructure.map(e => e.ControlOptions.Name);
69
+ for (const key in this.repeaterGroup.controls) {
70
+ if (Object.prototype.hasOwnProperty.call(this.repeaterGroup.controls, key)) {
71
+ for (let index = 0; index < controlNames.length; index++) {
72
+ const element = controlNames[index];
73
+ const keySplitArr = key.split('.');
74
+ if (keySplitArr[0] + keySplitArr[1] == `${element}${Index}`) {
75
+ const element = this.repeaterGroup.controls[key];
76
+ deletedControls.push({ [key]: element });
77
+ }
78
+ }
79
+ }
80
+ }
81
+ for (let index = 0; index < deletedControls.length; index++) {
82
+ const element = deletedControls[index];
83
+ for (const key in element) {
84
+ if (Object.prototype.hasOwnProperty.call(element, key)) {
85
+ this.repeaterGroup.removeControl(key);
86
+ }
87
+ }
88
+ }
89
+ this.items = this.items.filter((res) => res != this.items[Index]);
90
+ }
91
+ addItem() {
92
+ if (this.items.length == 0)
93
+ this.items.push(this.items.length);
94
+ else
95
+ this.items.push(this.items[this.items.length - 1] + 1);
96
+ }
97
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RepeaterTableComponent, deps: [{ token: i1.UtilityService }], target: i0.ɵɵFactoryTarget.Component }); }
98
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: RepeaterTableComponent, selector: "BBSF-repeater-table", inputs: { group: "group", options: "options" }, ngImport: i0, template: "<div class=\"form-group bbsf-control bbsf-repeater\">\r\n <!--table-->\r\n <div class=\"table-responsive\">\r\n <table class=\"bbsf-repeater-table table {{options.RepeaterTableExtraClasses}}\">\r\n <thead class=\"table-head\">\r\n <tr class=\"{{options.RepeaterTableRowExtraClasses}}\">\r\n <th *ngFor=\"let item of options.RepeaterStructure\" [hidden]=\"item.IsHiddenInput\">{{item.HeaderTitle}}</th>\r\n <th *ngIf=\"!options.DisableDeleteButton\" class=\"text-center\">{{utilityService.getResourceValue(options.ActionLabelKey)}}</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"table-body\">\r\n <tr *ngFor=\"let item of items ; index as i\">\r\n <td *ngFor=\"let RepeaterField of options.RepeaterStructure ; index as r\" [hidden]=\"RepeaterField.IsHiddenInput\">\r\n <repeater-field-builder [RepeaterField]=\"RepeaterField\" [itemNumber]=\"i\"\r\n [itemsValue]=\"originalItems\" [controlNumber]=\"r\" [group]=\"repeaterGroup\">\r\n </repeater-field-builder>\r\n </td>\r\n <td *ngIf=\"!options.DisableDeleteButton\" class=\"td-delete\">\r\n <button class=\"{{options.DeleteButtonExtraClasses}} btn btn-icon btn-sm btn-danger\" type=\"button\" (click)=\"deleteItem(i)\"\r\n [disabled]=\"(items.length ==options.MinRequiredItems&&options.IsRequired)\">\r\n <span [innerHTML]=\"options.DeleteButtonText\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <!--add button-->\r\n <div class=\"repeater-add-btn\" *ngIf=\"!options.DisableAddButton\">\r\n <button class=\"{{options.AddButtonExtraClasses}} btn btn-sm btn-brand\" type=\"button\" (click)=\"addItem()\">\r\n <span [innerHTML]=\"options.AddButtonText\"></span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n\r\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.RepeaterFieldBuilderComponent, selector: "repeater-field-builder", inputs: ["group", "itemNumber", "controlNumber", "RepeaterField", "itemsValue"] }] }); }
99
+ }
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: RepeaterTableComponent, decorators: [{
101
+ type: Component,
102
+ args: [{ selector: 'BBSF-repeater-table', template: "<div class=\"form-group bbsf-control bbsf-repeater\">\r\n <!--table-->\r\n <div class=\"table-responsive\">\r\n <table class=\"bbsf-repeater-table table {{options.RepeaterTableExtraClasses}}\">\r\n <thead class=\"table-head\">\r\n <tr class=\"{{options.RepeaterTableRowExtraClasses}}\">\r\n <th *ngFor=\"let item of options.RepeaterStructure\" [hidden]=\"item.IsHiddenInput\">{{item.HeaderTitle}}</th>\r\n <th *ngIf=\"!options.DisableDeleteButton\" class=\"text-center\">{{utilityService.getResourceValue(options.ActionLabelKey)}}</th>\r\n </tr>\r\n </thead>\r\n <tbody class=\"table-body\">\r\n <tr *ngFor=\"let item of items ; index as i\">\r\n <td *ngFor=\"let RepeaterField of options.RepeaterStructure ; index as r\" [hidden]=\"RepeaterField.IsHiddenInput\">\r\n <repeater-field-builder [RepeaterField]=\"RepeaterField\" [itemNumber]=\"i\"\r\n [itemsValue]=\"originalItems\" [controlNumber]=\"r\" [group]=\"repeaterGroup\">\r\n </repeater-field-builder>\r\n </td>\r\n <td *ngIf=\"!options.DisableDeleteButton\" class=\"td-delete\">\r\n <button class=\"{{options.DeleteButtonExtraClasses}} btn btn-icon btn-sm btn-danger\" type=\"button\" (click)=\"deleteItem(i)\"\r\n [disabled]=\"(items.length ==options.MinRequiredItems&&options.IsRequired)\">\r\n <span [innerHTML]=\"options.DeleteButtonText\"></span>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n <!--add button-->\r\n <div class=\"repeater-add-btn\" *ngIf=\"!options.DisableAddButton\">\r\n <button class=\"{{options.AddButtonExtraClasses}} btn btn-sm btn-brand\" type=\"button\" (click)=\"addItem()\">\r\n <span [innerHTML]=\"options.AddButtonText\"></span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n\r\n" }]
103
+ }], ctorParameters: () => [{ type: i1.UtilityService }], propDecorators: { group: [{
104
+ type: Input
105
+ }], options: [{
106
+ type: Input
107
+ }] } });
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXItdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1jb250cm9scy9zcmMvbGliL2NvbnRyb2xzL1JlcGVhdGVyL3JlcGVhdGVyLXRhYmxlL3JlcGVhdGVyLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9SZXBlYXRlci9yZXBlYXRlci10YWJsZS9yZXBlYXRlci10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBMkQsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQVMzQyxNQUFNLE9BQU8sc0JBQXNCO0lBT2pDLFlBQW1CLGNBQTZCO1FBQTdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBSmhELFVBQUssR0FBYSxFQUFFLENBQUE7UUFFcEIsa0JBQWEsR0FBUSxFQUFFLENBQUM7SUFFNEIsQ0FBQztJQUVyRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0QsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUN0QztZQUNFLElBQUksQ0FBQyxhQUFhLEdBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDL0MsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENB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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUmVwZWF0ZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vU2hhcmVkL01vZGVscy9SZXBlYXRlck9wdGlvbnMnO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdCQlNGLXJlcGVhdGVyLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcmVwZWF0ZXItdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwZWF0ZXJUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7IFxyXG4gIEBJbnB1dCgpIGdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgb3B0aW9uczogUmVwZWF0ZXJPcHRpb25zO1xyXG4gIGl0ZW1zOiBudW1iZXJbXSA9IFtdXHJcbiAgcmVwZWF0ZXJHcm91cDogRm9ybUdyb3VwO1xyXG4gIG9yaWdpbmFsSXRlbXM6YW55IFtdPVtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdXRpbGl0eVNlcnZpY2U6VXRpbGl0eVNlcnZpY2UpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVwZWF0ZXJHcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCB0aGlzLnJlcGVhdGVyR3JvdXApO1xyXG4gICAgaWYodGhpcy5vcHRpb25zLlJlcGVhdGVyVmFsdWUubGVuZ3RoPjApXHJcbiAgICB7XHJcbiAgICAgIHRoaXMub3JpZ2luYWxJdGVtcz0gdGhpcy5vcHRpb25zLlJlcGVhdGVyVmFsdWU7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuUmVwZWF0ZXJWYWx1ZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICB0aGlzLml0ZW1zLnB1c2goaW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgIFxyXG4gICAgZWxzZVxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMub3B0aW9ucy5NaW5SZXF1aXJlZEl0ZW1zOyBpbmRleCsrKSB7XHJcbiAgICAgIHRoaXMuaXRlbXMucHVzaChpbmRleCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlcGVhdGVyR3JvdXAudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgocmVzKSA9PiB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBbXTtcclxuICAgICAgbGV0IHJvd051bWJlciA9IFtdO1xyXG4gICAgICBsZXQgYWRkSXRlbXMgPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5yZXBlYXRlckdyb3VwLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLnJlcGVhdGVyR3JvdXAuY29udHJvbHMsIGtleSkpIHtcclxuICAgICAgICAgIGNvbnN0IGtleVNwbGl0QXJyID0ga2V5LnNwbGl0KCcuJylcclxuICAgICAgICAgIGxldCBpdGVtID0ge1xyXG4gICAgICAgICAgICBba2V5U3BsaXRBcnJbMV1dOiB7IFtrZXlTcGxpdEFyclswXV06IHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdLnZhbHVlW2tleV0gfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYWRkSXRlbXMucHVzaChpdGVtKVxyXG4gICAgICAgICAgaWYgKCFyb3dOdW1iZXIuaW5jbHVkZXMoa2V5U3BsaXRBcnJbMV0pKVxyXG4gICAgICAgICAgICByb3dOdW1iZXIucHVzaChrZXlTcGxpdEFyclsxXSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJvd051bWJlci5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCByb3cgPSByb3dOdW1iZXJbaW5kZXhdO1xyXG4gICAgICAgIGxldCBhZGRPYmplY3QgPSB7fVxyXG4gICAgICAgIGxldCBmaWx0ZXJlZEVsZW1lbnRzID0gYWRkSXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbVtyb3ddKVxyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmaWx0ZXJlZEVsZW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50ID0gZmlsdGVyZWRFbGVtZW50c1tpbmRleF07XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWx0ZXJlZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWx0ZXJlZEVsZW1lbnQsIGtleSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZmlsdGVyZWRFbGVtZW50W2tleV07XHJcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlbGVtZW50LCBrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudFtrZXldO1xyXG4gICAgICAgICAgICAgICAgICBhZGRPYmplY3Rba2V5XSA9IHZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5wdXNoKGFkZE9iamVjdClcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm9wdGlvbnMuUmVwZWF0ZXJWYWx1ZSA9IHJlc3VsdDtcclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZGVsZXRlSXRlbShJbmRleCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoID09IHRoaXMub3B0aW9ucy5NaW5SZXF1aXJlZEl0ZW1zICYmIHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKVxyXG4gICAgICByZXR1cm47XHJcbiAgICBsZXQgZGVsZXRlZENvbnRyb2xzOiBhbnlbXSA9IFtdXHJcbiAgICBsZXQgY29udHJvbE5hbWVzID0gdGhpcy5vcHRpb25zLlJlcGVhdGVyU3RydWN0dXJlLm1hcChlID0+IGUuQ29udHJvbE9wdGlvbnMuTmFtZSlcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMucmVwZWF0ZXJHcm91cC5jb250cm9scykge1xyXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMucmVwZWF0ZXJHcm91cC5jb250cm9scywga2V5KSkge1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb250cm9sTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29udHJvbE5hbWVzW2luZGV4XTtcclxuICAgICAgICAgIGNvbnN0IGtleVNwbGl0QXJyID0ga2V5LnNwbGl0KCcuJylcclxuICAgICAgICAgIGlmIChrZXlTcGxpdEFyclswXSArIGtleVNwbGl0QXJyWzFdID09IGAke2VsZW1lbnR9JHtJbmRleH1gKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnJlcGVhdGVyR3JvdXAuY29udHJvbHNba2V5XTtcclxuICAgICAgICAgICAgZGVsZXRlZENvbnRyb2xzLnB1c2goeyBba2V5XTogZWxlbWVudCB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRlbGV0ZWRDb250cm9scy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGRlbGV0ZWRDb250cm9sc1tpbmRleF07XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVsZW1lbnQsIGtleSkpIHtcclxuICAgICAgICAgIHRoaXMucmVwZWF0ZXJHcm91cC5yZW1vdmVDb250cm9sKGtleSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5maWx0ZXIoKHJlcykgPT4gcmVzICE9IHRoaXMuaXRlbXNbSW5kZXhdKVxyXG4gIH1cclxuXHJcbiAgYWRkSXRlbSgpIHtcclxuICAgIGlmKHRoaXMuaXRlbXMubGVuZ3RoPT0wKVxyXG4gICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuaXRlbXMubGVuZ3RoKTtcclxuICAgIGVsc2VcclxuICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLml0ZW1zW3RoaXMuaXRlbXMubGVuZ3RoLTFdKzEpO1xyXG59XHJcblxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBiYnNmLWNvbnRyb2wgYmJzZi1yZXBlYXRlclwiPlxyXG4gIDwhLS10YWJsZS0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICA8dGFibGUgY2xhc3M9XCJiYnNmLXJlcGVhdGVyLXRhYmxlIHRhYmxlICB7e29wdGlvbnMuUmVwZWF0ZXJUYWJsZUV4dHJhQ2xhc3Nlc319XCI+XHJcbiAgICAgIDx0aGVhZCBjbGFzcz1cInRhYmxlLWhlYWRcIj5cclxuICAgICAgICA8dHIgY2xhc3M9XCJ7e29wdGlvbnMuUmVwZWF0ZXJUYWJsZVJvd0V4dHJhQ2xhc3Nlc319XCI+XHJcbiAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGl0ZW0gb2Ygb3B0aW9ucy5SZXBlYXRlclN0cnVjdHVyZVwiIFtoaWRkZW5dPVwiaXRlbS5Jc0hpZGRlbklucHV0XCI+e3tpdGVtLkhlYWRlclRpdGxlfX08L3RoPlxyXG4gICAgICAgICAgPHRoICpuZ0lmPVwiIW9wdGlvbnMuRGlzYWJsZURlbGV0ZUJ1dHRvblwiIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUob3B0aW9ucy5BY3Rpb25MYWJlbEtleSl9fTwvdGg+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC90aGVhZD5cclxuICAgICAgPHRib2R5IGNsYXNzPVwidGFibGUtYm9keVwiPlxyXG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtcyAgOyBpbmRleCBhcyBpXCI+XHJcbiAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IFJlcGVhdGVyRmllbGQgb2Ygb3B0aW9ucy5SZXBlYXRlclN0cnVjdHVyZSAgOyBpbmRleCBhcyByXCIgW2hpZGRlbl09XCJSZXBlYXRlckZpZWxkLklzSGlkZGVuSW5wdXRcIj5cclxuICAgICAgICAgICAgPHJlcGVhdGVyLWZpZWxkLWJ1aWxkZXIgW1JlcGVhdGVyRmllbGRdPVwiUmVwZWF0ZXJGaWVsZFwiIFtpdGVtTnVtYmVyXT1cImlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbXNWYWx1ZV09XCJvcmlnaW5hbEl0ZW1zXCIgW2NvbnRyb2xOdW1iZXJdPVwiclwiIFtncm91cF09XCJyZXBlYXRlckdyb3VwXCI+XHJcbiAgICAgICAgICAgIDwvcmVwZWF0ZXItZmllbGQtYnVpbGRlcj5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8dGQgKm5nSWY9XCIhb3B0aW9ucy5EaXNhYmxlRGVsZXRlQnV0dG9uXCIgY2xhc3M9XCJ0ZC1kZWxldGVcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7b3B0aW9ucy5EZWxldGVCdXR0b25FeHRyYUNsYXNzZXN9fSBidG4gYnRuLWljb24gYnRuLXNtIGJ0bi1kYW5nZXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZUl0ZW0oaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoaXRlbXMubGVuZ3RoID09b3B0aW9ucy5NaW5SZXF1aXJlZEl0ZW1zJiZvcHRpb25zLklzUmVxdWlyZWQpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcHRpb25zLkRlbGV0ZUJ1dHRvblRleHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L3Rib2R5PlxyXG4gICAgPC90YWJsZT5cclxuICA8L2Rpdj5cclxuICA8IS0tYWRkIGJ1dHRvbi0tPlxyXG4gIDxkaXYgY2xhc3M9XCJyZXBlYXRlci1hZGQtYnRuXCIgKm5nSWY9XCIhb3B0aW9ucy5EaXNhYmxlQWRkQnV0dG9uXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwie3tvcHRpb25zLkFkZEJ1dHRvbkV4dHJhQ2xhc3Nlc319IGJ0biBidG4tc20gYnRuLWJyYW5kXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRJdGVtKClcIj5cclxuICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcHRpb25zLkFkZEJ1dHRvblRleHRcIj48L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuIl19
@@ -0,0 +1,277 @@
1
+ import { Component, Input, Optional, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { FormControl, Validators, FormGroup } from '@angular/forms';
3
+ import { EMPTY } from 'rxjs';
4
+ import { RequestOptionsModel } from '@bnsights/bbsf-utilities';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common/http";
7
+ import * as i2 from "../../Shared/services/ControlUtility";
8
+ import * as i3 from "@bnsights/bbsf-utilities";
9
+ import * as i4 from "@angular/forms";
10
+ import * as i5 from "../../Shared/services/GlobalSettings.service";
11
+ import * as i6 from "@angular/common";
12
+ import * as i7 from "@angular/cdk/bidi";
13
+ import * as i8 from "ngx-intl-tel-input";
14
+ import * as i9 from "../../Shared/Components/ng-tag-input";
15
+ export class TagsInputComponent {
16
+ static { this.controlContainerstatic = null; }
17
+ // tslint:disable-next-line: max-line-length
18
+ constructor(http, controlUtility, requestHandlerService, controlContainer, TagsInputControlHost, UtilityService, controlValidationService, globalSettings) {
19
+ this.http = http;
20
+ this.controlUtility = controlUtility;
21
+ this.requestHandlerService = requestHandlerService;
22
+ this.controlContainer = controlContainer;
23
+ this.TagsInputControlHost = TagsInputControlHost;
24
+ this.UtilityService = UtilityService;
25
+ this.controlValidationService = controlValidationService;
26
+ this.globalSettings = globalSettings;
27
+ this.OnChange = new EventEmitter();
28
+ // TagInputControl: AbstractControl;
29
+ this.SelectedId = [];
30
+ this.tags = [];
31
+ this.NewSelectionValidationKey = "";
32
+ this.markAllAsTouched = false;
33
+ this.validationRules = [];
34
+ this.validationRulesasync = [];
35
+ this.SearchResultHasItems = false;
36
+ this.resetError = () => {
37
+ this.controlValidationService.removeGlobalError();
38
+ };
39
+ //External Method
40
+ this.RemoveRequiredValidation = () => {
41
+ this.controlUtility.RemoveRequiredValidation(this.TagsFormControl, this.validationRules, this.options);
42
+ };
43
+ //External Method
44
+ this.AddRequiredValidation = () => {
45
+ this.controlUtility.AddRequiredValidation(this.TagsFormControl, this.validationRules, this.options);
46
+ };
47
+ //External Method
48
+ this.RemoveCustomValidation = (CustomValidation) => {
49
+ this.controlUtility.RemoveCustomValidation(this.TagsFormControl, this.validationRules, CustomValidation);
50
+ };
51
+ //External Method
52
+ this.AddCustomValidation = (CustomValidation) => {
53
+ this.controlUtility.AddCustomValidation(this.TagsFormControl, this.validationRules, CustomValidation);
54
+ };
55
+ //External Method
56
+ this.IsValid = () => {
57
+ this.controlUtility.IsValid(this.TagsFormControl);
58
+ };
59
+ TagsInputComponent.controlContainerstatic = this.controlContainer;
60
+ }
61
+ static showErrorOfInputs(errors) {
62
+ const controlContainerstatic = TagsInputComponent.controlContainerstatic;
63
+ const formGroup = controlContainerstatic.control;
64
+ for (const key in errors) {
65
+ if (errors.hasOwnProperty(key)) {
66
+ for (const iterator of errors[key]) {
67
+ const formControl = formGroup.get(key);
68
+ formControl.setErrors({ "FluentApi": iterator });
69
+ formControl.markAsTouched();
70
+ }
71
+ }
72
+ }
73
+ }
74
+ ngOnDestroy() {
75
+ if (this.changeValueSubscription)
76
+ this.changeValueSubscription.unsubscribe();
77
+ }
78
+ ngOnInit() {
79
+ if (this.options.IsReadonly && !this.options.Value)
80
+ this.options.Value = this.UtilityService.getResourceValue('NA');
81
+ if (this.options.ForceDirection)
82
+ this.textDir = this.options.ForceDirection == 2 ? 'rtl' : 'ltr';
83
+ else
84
+ this.textDir = localStorage.getItem('language') == 'ar' ? 'rtl' : 'ltr';
85
+ this.controlValidationService.isCreatedBefor = false;
86
+ this.options.DatasourceItemText = this.options.DatasourceItemText.toLowerCase();
87
+ this.TagsFormGroup = new FormGroup({});
88
+ ;
89
+ this.TagsFormGroup.addControl("tags", new FormControl(''));
90
+ this.TagsFormControl = this.TagsFormGroup.controls["tags"]; // new FormControl('',validationRules);
91
+ this.group.addControl(this.options.Name, this.TagsFormControl);
92
+ if (!this.options.ViewType)
93
+ this.options.ViewType = this.globalSettings.ViewType;
94
+ if (this.options.LabelKey != null && this.options.LabelKey != "")
95
+ this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
96
+ if (!this.options.NoResultText)
97
+ this.options.NoResultText = this.UtilityService.getResourceValue("NoItemsMatch");
98
+ // this.group.addControl(this.options.Name, new FormControl(''));
99
+ // this.TagInputControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
100
+ this.TagsFormControl.setValue(this.options.Value);
101
+ if (this.options.IsRequired) {
102
+ this.validationRules.push(Validators.required);
103
+ }
104
+ if (this.options.CustomValidation.length > 0) {
105
+ let Validations = this.options.CustomValidation;
106
+ for (let index = 0; index < Validations.length; index++) {
107
+ const Validation = Validations[index];
108
+ this.validationRules.push(Validation.functionBody);
109
+ }
110
+ }
111
+ this.TagsFormControl.setValidators(this.validationRules);
112
+ this.TagsFormControl.setAsyncValidators(this.validationRulesasync);
113
+ if (this.options.IsDisabled) {
114
+ this.TagsFormControl.disable();
115
+ }
116
+ if (this.options.Value != undefined && this.options.Value.length > 0) {
117
+ for (let index = 0; index < this.options.Value.length; index++) {
118
+ const element = this.options.Value[index];
119
+ this.SelectedId.push(element.id);
120
+ }
121
+ this.tags = this.options.Value;
122
+ this.TagsFormControl.setValue(this.options.Value);
123
+ }
124
+ this.TagsInputControlHost.ngSubmit.subscribe((value) => {
125
+ this.group.markAllAsTouched();
126
+ this.markAllAsTouched = true;
127
+ });
128
+ //Check for changing in value
129
+ this.changeValueSubscription = this.TagsFormControl.valueChanges.subscribe(c => {
130
+ this.tags = this.TagsFormControl.value;
131
+ this.SelectedId = this.tags?.filter(item => item.id).map(item => item.id);
132
+ if (this.tags == null) {
133
+ this.SearchKey.selected = "";
134
+ this.tags = [];
135
+ this.TagsFormControl.setValue([]);
136
+ }
137
+ });
138
+ }
139
+ ngAfterViewInit() {
140
+ if (this.options.AttributeList != null) {
141
+ var element = document.getElementById(this.options.Name);
142
+ for (let index = 0; index < this.options.AttributeList.length; index++) {
143
+ element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
144
+ }
145
+ }
146
+ let inputElement = document.getElementById(this.options.Name).getElementsByTagName("input")[0];
147
+ inputElement.setAttribute("autocomplete", "off");
148
+ }
149
+ showGlobalError() {
150
+ this.controlUtility.showGlobalError();
151
+ }
152
+ getErrorValidation(ErrorList) {
153
+ if (this.markAllAsTouched && this.group.invalid) {
154
+ this.showGlobalError();
155
+ this.markAllAsTouched = false;
156
+ }
157
+ return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
158
+ }
159
+ copyInputMessage(inputElement) {
160
+ this.controlUtility.CopyInputMessage(inputElement);
161
+ }
162
+ searchFunctionFactory(Text) {
163
+ //If no text then return empty observable
164
+ if (!Text)
165
+ return EMPTY;
166
+ let Url = `${this.options.ActionURL}?${this.options.QueryParamName}=${encodeURIComponent(Text)}&${this.options.SelectedItemsParamName}=${this.SelectedId}`;
167
+ if (this.options.ExtraFilters)
168
+ Url = Url + `&${this.options.ExtraFilters}`;
169
+ let requestOptionsModel = new RequestOptionsModel();
170
+ requestOptionsModel.disableBlockUI = true;
171
+ requestOptionsModel.disableSuccessNotification = true;
172
+ let Model = this.requestHandlerService.get(Url, null, null, requestOptionsModel);
173
+ return Model;
174
+ }
175
+ AddTag(event, key) {
176
+ //Check if input is yab press
177
+ if (event.key === "Tab")
178
+ return;
179
+ //Check if input is enter press
180
+ if (this.IsNoMatch == true && event.key == "Enter" && this.options.AllowNewSelection && key.selected) {
181
+ if (!(this.tags.length >= this.options.MaxNumberTags)) {
182
+ this.tags.push({ name: key.selected });
183
+ this.group.get(this.options.Name).setValue(this.tags);
184
+ this.group.get(this.options.Name).markAllAsTouched();
185
+ this.group.updateValueAndValidity();
186
+ if (this.group.get(this.options.Name).valid) {
187
+ key.selected = null;
188
+ return;
189
+ }
190
+ else
191
+ this.tags.pop();
192
+ }
193
+ }
194
+ //Check if input is charachter
195
+ else if (String.fromCharCode(event.keyCode).match(/(\w|\s)/g)) {
196
+ if (this.IsNoMatch && !this.options.AllowNewSelection && key.selected) {
197
+ this.TagsFormControl.setErrors({ "errorMassage": this.options.NoResultText });
198
+ this.TagsFormControl.markAsTouched();
199
+ }
200
+ else if (this.IsNoMatch == false && this.options.AllowNewSelection == false) {
201
+ this.TagsFormControl.clearValidators();
202
+ this.TagsFormControl.updateValueAndValidity();
203
+ }
204
+ }
205
+ //Remove unmatched error incase of deleting search value
206
+ else if (event.key === "Backspace" && key.selected?.length <= 1 && this.TagsFormControl.hasError('errorMassage')) {
207
+ this.TagsFormControl.setErrors({ "errorMassage": null });
208
+ this.TagsFormControl.updateValueAndValidity();
209
+ if (this.SelectedId?.length == 0 && this.options.IsRequired) {
210
+ this.TagsFormControl.setErrors({ required: "" });
211
+ this.TagsFormControl.markAsTouched();
212
+ }
213
+ }
214
+ }
215
+ onTagsChanged(result) {
216
+ //console.log(this.tags)
217
+ if (result["change"] == "add") {
218
+ this.SelectedId.push(result.tag.id);
219
+ }
220
+ if (result["change"] == "remove") {
221
+ this.SelectedId = this.SelectedId.filter((item) => item != result.tag.id);
222
+ if (this.SelectedId.length == 0 && this.options.IsRequired == true) {
223
+ this.TagsFormControl.setErrors({ required: "" });
224
+ this.TagsFormControl.markAsTouched();
225
+ this.TagsFormControl.invalid;
226
+ }
227
+ }
228
+ let originalValue = this.TagsFormControl.value.map(function (a) { return a.id; });
229
+ if (this.options.PatchFunction && this.options.PatchPath && this.TagsFormControl.valid) {
230
+ this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
231
+ }
232
+ this.options.Value = this.tags;
233
+ this.group.get(this.options.Name).setValue(this.tags);
234
+ this.TagsFormControl.updateValueAndValidity();
235
+ this.group.updateValueAndValidity();
236
+ this.OnChange.emit(originalValue);
237
+ }
238
+ onNoOptionsMatch(event) {
239
+ this.IsNoMatch = event;
240
+ }
241
+ onTagsInputBlur(SearchKey) {
242
+ if (SearchKey.selected && this.options.AllowNewSelection && this.IsNoMatch && this.tags.length < this.options.MaxNumberTags) {
243
+ this.tags.push({ name: SearchKey.selected });
244
+ this.group.get(this.options.Name).setValue(this.tags);
245
+ this.group.get(this.options.Name).markAllAsTouched();
246
+ this.group.updateValueAndValidity();
247
+ if (this.group.get(this.options.Name).valid) {
248
+ SearchKey.selected = null;
249
+ return;
250
+ }
251
+ else
252
+ this.tags.pop();
253
+ }
254
+ }
255
+ getTagsValue() {
256
+ if (this.tags.length > 0)
257
+ return this.tags.map(item => item.name);
258
+ }
259
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: TagsInputComponent, deps: [{ token: i1.HttpClient }, { token: i2.ControlUtility }, { token: i3.RequestHandlerService }, { token: i4.ControlContainer, optional: true }, { token: i4.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.ControlValidationService }, { token: i5.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component }); }
260
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: TagsInputComponent, selector: "BBSF-TagsInput", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "SearchKey", first: true, predicate: ["SearchKey"], descendants: true }], ngImport: i0, template: "\r\n<div [formGroup]=\"group\">\r\n <div class=\"form-group bbsf-control bbsf-tags-input\" [formGroup]=\"TagsFormGroup\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--input-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.IsReadonly\">\r\n <b-tags-input type=\"text\" class=\"form-control {{options.ExtraClasses}}\"\r\n [dir]=\"textDir\" [disabled]=\"options.IsDisabled\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"tags\"\r\n [class.is-invalid]=\"TagsFormControl.invalid && TagsFormControl.touched\" placeholder=\"{{options.Placeholder}}\"\r\n id=\"{{options.Name}}\" (onTagsChanged)=\"onTagsChanged($event)\" [(ngModel)]=\"tags\"\r\n [removeLastOnBackspace]=\"options.RemoveLastOnBackspace\" (onNoOptionsMatch)=\"onNoOptionsMatch($event)\"\r\n [options]=\"searchFunctionFactory(SearchKey.selected)\" #SearchKey\r\n [scrollableOptions]=\"options.ScrollableOptions\" [scrollableOptionsInView]=\"options.MaxSearchResultsCount\"\r\n (keydown)=\"AddTag($event,SearchKey)\" [ViewMode]=\"options.TagInputMode\"\r\n [maxTags]=\"options.MaxNumberTags\" [minLengthBeforeOptions]=\"options.MinSearchLength\"\r\n [showDescription]=\"options.ShowDescription\" [defaultImageURL]=\"options.DefaultImgUrl\" name=\"tags\"\r\n (onBlurInput)=\"onTagsInputBlur(SearchKey)\">\r\n </b-tags-input>\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.IsReadonly\"><span class=\"readonly-view\">{{getTagsValue()}}</span>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(TagsFormControl.invalid && TagsFormControl.touched)\">\r\n {{getErrorValidation(TagsFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">{{resetError()}}</div>\r\n </div>\r\n\r\n</div>\r\n", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "directive", type: i8.NativeElementInjectorDirective, selector: "[ngModel], [formControl], [formControlName]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i9.BTagsInputComponent, selector: "b-tags-input", inputs: ["maxTags", "removeLastOnBackspace", "canDeleteTags", "canAddTags", "ViewMode", "placeholder", "showDescription", "options", "defaultImageURL", "minLengthBeforeOptions", "scrollableOptions", "scrollableOptionsInView"], outputs: ["onTagsChanged", "onMaxTagsReached", "onNoOptionsMatch", "onBlurInput"] }, { kind: "pipe", type: i6.KeyValuePipe, name: "keyvalue" }] }); }
261
+ }
262
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: TagsInputComponent, decorators: [{
263
+ type: Component,
264
+ args: [{ selector: 'BBSF-TagsInput', template: "\r\n<div [formGroup]=\"group\">\r\n <div class=\"form-group bbsf-control bbsf-tags-input\" [formGroup]=\"TagsFormGroup\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--input-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.IsReadonly\">\r\n <b-tags-input type=\"text\" class=\"form-control {{options.ExtraClasses}}\"\r\n [dir]=\"textDir\" [disabled]=\"options.IsDisabled\" aria-describedby=\"email-error\"\r\n aria-invalid=\"true\" formControlName=\"tags\"\r\n [class.is-invalid]=\"TagsFormControl.invalid && TagsFormControl.touched\" placeholder=\"{{options.Placeholder}}\"\r\n id=\"{{options.Name}}\" (onTagsChanged)=\"onTagsChanged($event)\" [(ngModel)]=\"tags\"\r\n [removeLastOnBackspace]=\"options.RemoveLastOnBackspace\" (onNoOptionsMatch)=\"onNoOptionsMatch($event)\"\r\n [options]=\"searchFunctionFactory(SearchKey.selected)\" #SearchKey\r\n [scrollableOptions]=\"options.ScrollableOptions\" [scrollableOptionsInView]=\"options.MaxSearchResultsCount\"\r\n (keydown)=\"AddTag($event,SearchKey)\" [ViewMode]=\"options.TagInputMode\"\r\n [maxTags]=\"options.MaxNumberTags\" [minLengthBeforeOptions]=\"options.MinSearchLength\"\r\n [showDescription]=\"options.ShowDescription\" [defaultImageURL]=\"options.DefaultImgUrl\" name=\"tags\"\r\n (onBlurInput)=\"onTagsInputBlur(SearchKey)\">\r\n </b-tags-input>\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.IsReadonly\"><span class=\"readonly-view\">{{getTagsValue()}}</span>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(TagsFormControl.invalid && TagsFormControl.touched)\">\r\n {{getErrorValidation(TagsFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">{{resetError()}}</div>\r\n </div>\r\n\r\n</div>\r\n" }]
265
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.ControlUtility }, { type: i3.RequestHandlerService }, { type: i4.ControlContainer, decorators: [{
266
+ type: Optional
267
+ }] }, { type: i4.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.ControlValidationService }, { type: i5.GlobalSettings }], propDecorators: { group: [{
268
+ type: Input
269
+ }], options: [{
270
+ type: Input
271
+ }], OnChange: [{
272
+ type: Output
273
+ }], SearchKey: [{
274
+ type: ViewChild,
275
+ args: ['SearchKey', { static: false }]
276
+ }] } });
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFnc0lucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9UYWdzSW5wdXQvVGFnc0lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9UYWdzSW5wdXQvVGFnc0lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFXLFFBQVEsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFxRCxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDNUssT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUF5RCxNQUFNLGdCQUFnQixDQUFDO0FBSTNILE9BQU8sRUFBRSxLQUFLLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBbUQsbUJBQW1CLEVBQWtCLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7O0FBU2hJLE1BQU0sT0FBTyxrQkFBa0I7YUFDdEIsMkJBQXNCLEdBQUcsSUFBSSxBQUFQLENBQVE7SUFDckMsNENBQTRDO0lBQzVDLFlBQW9CLElBQWdCLEVBQVUsY0FBOEIsRUFBVSxxQkFBNEMsRUFBc0IsZ0JBQWtDLEVBQVMsb0JBQXdDLEVBQ2pPLGNBQThCLEVBQVUsd0JBQWtELEVBQzFGLGNBQThCO1FBRnBCLFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQXNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFBUyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQW9CO1FBQ2pPLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFVLDZCQUF3QixHQUF4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USxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzNDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixPQUFPO2FBQ1I7O2dCQUVDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzNDLENBQUM7OEdBblJVLGtCQUFrQjtrR0FBbEIsa0JBQWtCLGlQQ2YvQiwyckZBMENBOzsyRkQzQmEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUVFLGdCQUFnQjs7MEJBTTJHLFFBQVE7MktBTXBJLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0ksUUFBUTtzQkFBakIsTUFBTTtnQkFDb0MsU0FBUztzQkFBbkQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBEb0NoZWNrLCBPcHRpb25hbCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBTaW1wbGVDaGFuZ2UsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgRm9ybUdyb3VwLCBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xDb250YWluZXIsIEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29udHJvbFV0aWxpdHkgfSBmcm9tICcuLi8uLi9TaGFyZWQvc2VydmljZXMvQ29udHJvbFV0aWxpdHknO1xyXG5pbXBvcnQgeyBUYWdzSW5wdXRPcHRpb25zIH0gZnJvbSAnLi4vLi4vU2hhcmVkL01vZGVscy9UYWdzSW5wdXRPcHRpb25zJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsIFJlcXVlc3RIYW5kbGVyU2VydmljZSwgUmVxdWVzdE9wdGlvbnNNb2RlbCwgVXRpbGl0eVNlcnZpY2UgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9HbG9iYWxTZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ0JCU0YtVGFnc0lucHV0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vVGFnc0lucHV0LmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFnc0lucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyc3RhdGljID0gbnVsbDtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksIHByaXZhdGUgcmVxdWVzdEhhbmRsZXJTZXJ2aWNlOiBSZXF1ZXN0SGFuZGxlclNlcnZpY2UsIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lciwgcHVibGljIFRhZ3NJbnB1dENvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbiAgICBwcml2YXRlIFV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZ2xvYmFsU2V0dGluZ3M6IEdsb2JhbFNldHRpbmdzKSB7XHJcbiAgICBUYWdzSW5wdXRDb21wb25lbnQuY29udHJvbENvbnRhaW5lcnN0YXRpYyA9IHRoaXMuY29udHJvbENvbnRhaW5lcjtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgb3B0aW9uczogVGFnc0lucHV0T3B0aW9ucztcclxuICBAT3V0cHV0KCkgT25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQFZpZXdDaGlsZCgnU2VhcmNoS2V5JywgeyBzdGF0aWM6IGZhbHNlIH0pIFNlYXJjaEtleTogYW55O1xyXG5cclxuICAvLyBUYWdJbnB1dENvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBTZWxlY3RlZElkOiBhbnlbXSA9IFtdXHJcbiAgdGFncyA9IFtdO1xyXG4gIE5ld1NlbGVjdGlvblZhbGlkYXRpb25LZXk6IHN0cmluZyA9IFwiXCI7XHJcbiAgVGFnc0Zvcm1Hcm91cDogRm9ybUdyb3VwO1xyXG4gIFRhZ3NGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sXHJcbiAgSXNOb01hdGNoOiBhbnk7XHJcbiAgbWFya0FsbEFzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcbiAgY2hhbmdlVmFsdWVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuICBTZWFyY2hSZXN1bHRIYXNJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRleHREaXI7XHJcbiAgc3RhdGljIHNob3dFcnJvck9mSW5wdXRzKGVycm9yczogYW55KSB7XHJcbiAgICBjb25zdCBjb250cm9sQ29udGFpbmVyc3RhdGljID0gVGFnc0lucHV0Q29tcG9uZW50LmNvbnRyb2xDb250YWluZXJzdGF0aWM7XHJcbiAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sQ29udGFpbmVyc3RhdGljLmNvbnRyb2wgYXMgRm9ybUdyb3VwO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZXJyb3JzKSB7XHJcbiAgICAgIGlmIChlcnJvcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlcmF0b3Igb2YgZXJyb3JzW2tleV0pIHtcclxuICAgICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gZm9ybUdyb3VwLmdldChrZXkpIGFzIEZvcm1Db250cm9sO1xyXG4gICAgICAgICAgZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgXCJGbHVlbnRBcGlcIjogaXRlcmF0b3IgfSk7XHJcbiAgICAgICAgICBmb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2hhbmdlVmFsdWVTdWJzY3JpcHRpb24pXHJcbiAgICAgIHRoaXMuY2hhbmdlVmFsdWVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLklzUmVhZG9ubHkgJiYgIXRoaXMub3B0aW9ucy5WYWx1ZSlcclxuICAgICAgdGhpcy5vcHRpb25zLlZhbHVlID0gdGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdOQScpO1xyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMuRm9yY2VEaXJlY3Rpb24pXHJcbiAgICAgIHRoaXMudGV4dERpciA9IHRoaXMub3B0aW9ucy5Gb3JjZURpcmVjdGlvbiA9PSAyID8gJ3J0bCcgOiAnbHRyJztcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy50ZXh0RGlyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmd1YWdlJykgPT0gJ2FyJyA/ICdydGwnIDogJ2x0cic7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5pc0NyZWF0ZWRCZWZvciA9IGZhbHNlXHJcblxyXG4gICAgdGhpcy5vcHRpb25zLkRhdGFzb3VyY2VJdGVtVGV4dCA9IHRoaXMub3B0aW9ucy5EYXRhc291cmNlSXRlbVRleHQudG9Mb3dlckNhc2UoKTtcclxuICAgIHRoaXMuVGFnc0Zvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pOztcclxuICAgIHRoaXMuVGFnc0Zvcm1Hcm91cC5hZGRDb250cm9sKFwidGFnc1wiLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMuVGFnc0Zvcm1Db250cm9sID0gdGhpcy5UYWdzRm9ybUdyb3VwLmNvbnRyb2xzW1widGFnc1wiXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCB0aGlzLlRhZ3NGb3JtQ29udHJvbCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuVmlld1R5cGUpXHJcbiAgICAgIHRoaXMub3B0aW9ucy5WaWV3VHlwZSA9IHRoaXMuZ2xvYmFsU2V0dGluZ3MuVmlld1R5cGU7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBcIlwiKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuTGFiZWxWYWx1ZSA9IHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSh0aGlzLm9wdGlvbnMuTGFiZWxLZXkpO1xyXG5cclxuICAgIGlmICghdGhpcy5vcHRpb25zLk5vUmVzdWx0VGV4dClcclxuICAgICAgdGhpcy5vcHRpb25zLk5vUmVzdWx0VGV4dCA9IHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIk5vSXRlbXNNYXRjaFwiKTtcclxuXHJcbiAgICAvLyB0aGlzLmdyb3VwLmFkZENvbnRyb2wodGhpcy5vcHRpb25zLk5hbWUsIG5ldyBGb3JtQ29udHJvbCgnJykpO1xyXG4gICAgLy8gdGhpcy5UYWdJbnB1dENvbnRyb2wgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5OYW1lXTsgLy8gIG5ldyBGb3JtQ29udHJvbCgnJyx2YWxpZGF0aW9uUnVsZXMpO1xyXG5cclxuICAgIHRoaXMuVGFnc0Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucy5WYWx1ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5DdXN0b21WYWxpZGF0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IFZhbGlkYXRpb25zID0gdGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb25cclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IFZhbGlkYXRpb25zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IFZhbGlkYXRpb24gPSBWYWxpZGF0aW9uc1tpbmRleF07XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uUnVsZXMucHVzaChWYWxpZGF0aW9uLmZ1bmN0aW9uQm9keSk7XHJcbiAgICAgIH1cclxuXHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlRhZ3NGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMudmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuVGFnc0Zvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlc2FzeW5jKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNEaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLlRhZ3NGb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5WYWx1ZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5vcHRpb25zLlZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMub3B0aW9ucy5WYWx1ZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5vcHRpb25zLlZhbHVlW2luZGV4XTtcclxuICAgICAgICB0aGlzLlNlbGVjdGVkSWQucHVzaChlbGVtZW50LmlkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRhZ3MgPSB0aGlzLm9wdGlvbnMuVmFsdWVcclxuICAgICAgdGhpcy5UYWdzRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5vcHRpb25zLlZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlRhZ3NJbnB1dENvbnRyb2xIb3N0Lm5nU3VibWl0LnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgdGhpcy5ncm91cC5tYXJrQWxsQXNUb3VjaGVkKClcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICAvL0NoZWNrIGZvciBjaGFuZ2luZyBpbiB2YWx1ZVxyXG4gICAgdGhpcy5jaGFuZ2VWYWx1ZVN1YnNjcmlwdGlvbiA9IDxhbnk+dGhpcy5UYWdzRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShjID0+IHtcclxuICAgICAgdGhpcy50YWdzID0gdGhpcy5UYWdzRm9ybUNvbnRyb2wudmFsdWU7XHJcbiAgICAgIHRoaXMuU2VsZWN0ZWRJZCA9IHRoaXMudGFncz8uZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCkubWFwKGl0ZW0gPT4gaXRlbS5pZCk7XHJcbiAgICAgIGlmICh0aGlzLnRhZ3MgPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuU2VhcmNoS2V5LnNlbGVjdGVkID0gXCJcIjtcclxuICAgICAgICB0aGlzLnRhZ3MgPSBbXTtcclxuICAgICAgICB0aGlzLlRhZ3NGb3JtQ29udHJvbC5zZXRWYWx1ZShbXSlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5vcHRpb25zLk5hbWUpO1xyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3RbaW5kZXhdLktleSwgdGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3RbaW5kZXhdLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5OYW1lKS5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpWzBdXHJcbiAgICBpbnB1dEVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIsIFwib2ZmXCIpXHJcbiAgfVxyXG5cclxuICByZXNldEVycm9yID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVmFsaWRhdGlvblNlcnZpY2UucmVtb3ZlR2xvYmFsRXJyb3IoKTtcclxuICB9XHJcblxyXG4gIHNob3dHbG9iYWxFcnJvcigpIHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuc2hvd0dsb2JhbEVycm9yKClcclxuICB9XHJcblxyXG4gIGdldEVycm9yVmFsaWRhdGlvbihFcnJvckxpc3QpIHtcclxuICAgIGlmICh0aGlzLm1hcmtBbGxBc1RvdWNoZWQgJiYgdGhpcy5ncm91cC5pbnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dsb2JhbEVycm9yKClcclxuICAgICAgdGhpcy5tYXJrQWxsQXNUb3VjaGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sVXRpbGl0eS5nZXRFcnJvclZhbGlkYXRpb25NYXNzYWdlKEVycm9yTGlzdCwgdGhpcy5ncm91cCwgdGhpcy5vcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGNvcHlJbnB1dE1lc3NhZ2UoaW5wdXRFbGVtZW50KSB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkNvcHlJbnB1dE1lc3NhZ2UoaW5wdXRFbGVtZW50KVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoRnVuY3Rpb25GYWN0b3J5KFRleHQ6IGFueSk6IE9ic2VydmFibGU8b2JqZWN0PiB7XHJcbiAgICAvL0lmIG5vIHRleHQgdGhlbiByZXR1cm4gZW1wdHkgb2JzZXJ2YWJsZVxyXG4gICAgaWYgKCFUZXh0KVxyXG4gICAgICByZXR1cm4gRU1QVFk7XHJcblxyXG4gICAgbGV0IFVybCA9IGAke3RoaXMub3B0aW9ucy5BY3Rpb25VUkx9PyR7dGhpcy5vcHRpb25zLlF1ZXJ5UGFyYW1OYW1lfT0ke2VuY29kZVVSSUNvbXBvbmVudChUZXh0KX0mJHt0aGlzLm9wdGlvbnMuU2VsZWN0ZWRJdGVtc1BhcmFtTmFtZX09JHt0aGlzLlNlbGVjdGVkSWR9YFxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5FeHRyYUZpbHRlcnMpXHJcbiAgICAgIFVybCA9IFVybCArIGAmJHt0aGlzLm9wdGlvbnMuRXh0cmFGaWx0ZXJzfWBcclxuICAgIGxldCByZXF1ZXN0T3B0aW9uc01vZGVsID0gbmV3IFJlcXVlc3RPcHRpb25zTW9kZWwoKVxyXG4gICAgcmVxdWVzdE9wdGlvbnNNb2RlbC5kaXNhYmxlQmxvY2tVSSA9IHRydWU7XHJcbiAgICByZXF1ZXN0T3B0aW9uc01vZGVsLmRpc2FibGVTdWNjZXNzTm90aWZpY2F0aW9uID0gdHJ1ZTtcclxuICAgIGxldCBNb2RlbCA9IHRoaXMucmVxdWVzdEhhbmRsZXJTZXJ2aWNlLmdldChVcmwsIG51bGwsIG51bGwsIHJlcXVlc3RPcHRpb25zTW9kZWwpO1xyXG4gICAgcmV0dXJuIE1vZGVsIGFzIGFueTtcclxuICB9XHJcblxyXG4gIEFkZFRhZyhldmVudCwga2V5KSB7XHJcbiAgICAvL0NoZWNrIGlmIGlucHV0IGlzIHlhYiBwcmVzc1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIilcclxuICAgICAgcmV0dXJuO1xyXG4gICAgLy9DaGVjayBpZiBpbnB1dCBpcyBlbnRlciBwcmVzc1xyXG4gICAgaWYgKHRoaXMuSXNOb01hdGNoID09IHRydWUgJiYgZXZlbnQua2V5ID09IFwiRW50ZXJcIiAmJiB0aGlzLm9wdGlvbnMuQWxsb3dOZXdTZWxlY3Rpb24gJiYga2V5LnNlbGVjdGVkKSB7XHJcbiAgICAgIGlmICghKHRoaXMudGFncy5sZW5ndGggPj0gdGhpcy5vcHRpb25zLk1heE51bWJlclRhZ3MpKSB7XHJcbiAgICAgICAgdGhpcy50YWdzLnB1c2goeyBuYW1lOiBrZXkuc2VsZWN0ZWQgfSk7XHJcbiAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnNldFZhbHVlKHRoaXMudGFncyk7XHJcbiAgICAgICAgdGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICB0aGlzLmdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICBpZiAodGhpcy5ncm91cC5nZXQodGhpcy5vcHRpb25zLk5hbWUpLnZhbGlkKSB7XHJcbiAgICAgICAgICBrZXkuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLnRhZ3MucG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vQ2hlY2sgaWYgaW5wdXQgaXMgY2hhcmFjaHRlclxyXG4gICAgZWxzZSBpZiAoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5rZXlDb2RlKS5tYXRjaCgvKFxcd3xcXHMpL2cpKSB7XHJcbiAgICAgIGlmICh0aGlzLklzTm9NYXRjaCAmJiAhdGhpcy5vcHRpb25zLkFsbG93TmV3U2VsZWN0aW9uICYmIGtleS5zZWxlY3RlZCkge1xyXG4gICAgICAgIHRoaXMuVGFnc0Zvcm1Db250cm9sLnNldEVycm9ycyh7IFwiZXJyb3JNYXNzYWdlXCI6IHRoaXMub3B0aW9ucy5Ob1Jlc3VsdFRleHQgfSk7XHJcbiAgICAgICAgdGhpcy5UYWdzRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuSXNOb01hdGNoID09IGZhbHNlICYmIHRoaXMub3B0aW9ucy5BbGxvd05ld1NlbGVjdGlvbiA9PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuVGFnc0Zvcm1Db250cm9sLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIHRoaXMuVGFnc0Zvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9SZW1vdmUgdW5tYXRjaGVkIGVycm9yIGluY2FzZSBvZiBkZWxldGluZyBzZWFyY2ggdmFsdWVcclxuICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJCYWNrc3BhY2VcIiAmJiBrZXkuc2VsZWN0ZWQ/Lmxlbmd0aCA8PSAxICYmIHRoaXMuVGFnc0Zvcm1Db250cm9sLmhhc0Vycm9yKCdlcnJvck1hc3NhZ2UnKSkge1xyXG4gICAgICB0aGlzLlRhZ3NGb3JtQ29udHJvbC5zZXRFcnJvcnMoeyBcImVycm9yTWFzc2FnZVwiOiBudWxsIH0pO1xyXG4gICAgICB0aGlzLlRhZ3NGb3JtQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIGlmICh0aGlzLlNlbGVjdGVkSWQ/Lmxlbmd0aCA9PSAwICYmIHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgICAgdGhpcy5UYWdzRm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IFwiXCIgfSk7XHJcbiAgICAgICAgdGhpcy5UYWdzRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblRhZ3NDaGFuZ2VkKHJlc3VsdCkge1xyXG4gICAgLy9jb25zb2xlLmxvZyh0aGlzLnRhZ3MpXHJcbiAgICBpZiAocmVzdWx0W1wiY2hhbmdlXCJdID09IFwiYWRkXCIpIHtcclxuICAgICAgdGhpcy5TZWxlY3RlZElkLnB1c2gocmVzdWx0LnRhZy5pZCk7XHJcbiAgICB9XHJcbiAgICBpZiAocmVzdWx0W1wiY2hhbmdlXCJdID09IFwicmVtb3ZlXCIpIHtcclxuICAgICAgdGhpcy5TZWxlY3RlZElkID0gdGhpcy5TZWxlY3RlZElkLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPSByZXN1bHQudGFnLmlkKTtcclxuICAgICAgaWYgKHRoaXMuU2VsZWN0ZWRJZC5sZW5ndGggPT0gMCAmJiB0aGlzLm9wdGlvbnMuSXNSZXF1aXJlZCA9PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5UYWdzRm9ybUNvbnRyb2wuc2V0RXJyb3JzKHsgcmVxdWlyZWQ6IFwiXCIgfSk7XHJcbiAgICAgICAgdGhpcy5UYWdzRm9ybUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMuVGFnc0Zvcm1Db250cm9sLmludmFsaWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBvcmlnaW5hbFZhbHVlID0gdGhpcy5UYWdzRm9ybUNvbnRyb2wudmFsdWUubWFwKGZ1bmN0aW9uIChhKSB7IHJldHVybiBhLmlkOyB9KTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuUGF0Y2hGdW5jdGlvbiAmJiB0aGlzLm9wdGlvbnMuUGF0Y2hQYXRoICYmIHRoaXMuVGFnc0Zvcm1Db250cm9sLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbFV0aWxpdHkucGF0Y2hDb250cm9sVmFsdWUob3JpZ2luYWxWYWx1ZSwgdGhpcy5vcHRpb25zLlBhdGNoRnVuY3Rpb24sIHRoaXMub3B0aW9ucy5QYXRjaFBhdGgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vcHRpb25zLlZhbHVlID0gdGhpcy50YWdzXHJcbiAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkuc2V0VmFsdWUodGhpcy50YWdzKTtcclxuICAgIHRoaXMuVGFnc0Zvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuZ3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5PbkNoYW5nZS5lbWl0KG9yaWdpbmFsVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25Ob09wdGlvbnNNYXRjaChldmVudCkge1xyXG4gICAgdGhpcy5Jc05vTWF0Y2ggPSBldmVudDtcclxuICB9XHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5SZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5UYWdzRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgQWRkUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5UYWdzRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCB0aGlzLm9wdGlvbnMpXHJcbiAgfVxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcblxyXG4gIFJlbW92ZUN1c3RvbVZhbGlkYXRpb24gPSAoQ3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5SZW1vdmVDdXN0b21WYWxpZGF0aW9uKHRoaXMuVGFnc0Zvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgQ3VzdG9tVmFsaWRhdGlvbilcclxuICB9XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkQ3VzdG9tVmFsaWRhdGlvbih0aGlzLlRhZ3NGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pXHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG4gIElzVmFsaWQgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LklzVmFsaWQodGhpcy5UYWdzRm9ybUNvbnRyb2wpXHJcbiAgfVxyXG5cclxuICBvblRhZ3NJbnB1dEJsdXIoU2VhcmNoS2V5KSB7XHJcbiAgICBpZiAoU2VhcmNoS2V5LnNlbGVjdGVkICYmIHRoaXMub3B0aW9ucy5BbGxvd05ld1NlbGVjdGlvbiAmJiB0aGlzLklzTm9NYXRjaCAmJiB0aGlzLnRhZ3MubGVuZ3RoIDwgdGhpcy5vcHRpb25zLk1heE51bWJlclRhZ3MpIHtcclxuICAgICAgdGhpcy50YWdzLnB1c2goeyBuYW1lOiBTZWFyY2hLZXkuc2VsZWN0ZWQgfSk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS5zZXRWYWx1ZSh0aGlzLnRhZ3MpO1xyXG4gICAgICB0aGlzLmdyb3VwLmdldCh0aGlzLm9wdGlvbnMuTmFtZSkubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB0aGlzLmdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgaWYgKHRoaXMuZ3JvdXAuZ2V0KHRoaXMub3B0aW9ucy5OYW1lKS52YWxpZCkge1xyXG4gICAgICAgIFNlYXJjaEtleS5zZWxlY3RlZCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICB0aGlzLnRhZ3MucG9wKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldFRhZ3NWYWx1ZSgpIHtcclxuICAgIGlmICh0aGlzLnRhZ3MubGVuZ3RoID4gMClcclxuICAgICAgcmV0dXJuIHRoaXMudGFncy5tYXAoaXRlbSA9PiBpdGVtLm5hbWUpXHJcbiAgfVxyXG5cclxufVxyXG4iLCJcclxuPGRpdiBbZm9ybUdyb3VwXT1cImdyb3VwXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgYmJzZi1jb250cm9sIGJic2YtdGFncy1pbnB1dFwiIFtmb3JtR3JvdXBdPVwiVGFnc0Zvcm1Hcm91cFwiPlxyXG4gICAgPGRpdiBbbmdDbGFzc109XCIob3B0aW9ucy5WaWV3VHlwZT09MSk/J2Jic2YtdmVydGljYWwnOidiYnNmLWhvcml6b250YWwnXCI+XHJcbiAgICAgIDwhLS1sYWJlbC0tPlxyXG4gICAgICA8bGFiZWwgKm5nSWY9XCIhb3B0aW9ucy5IaWRlTGFiZWxcIiBjbGFzcz1cImJic2YtbGFiZWwge3tvcHRpb25zLkxhYmVsRXh0cmFDbGFzc2VzfX1cIj5cclxuICAgICAgICB7e29wdGlvbnMuTGFiZWxWYWx1ZX19XHJcbiAgICAgICAgPCEtLUFzdGVyaXNrLS0+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIoKG9wdGlvbnMuU2hvd0FzdGVyaXNrJiZvcHRpb25zLklzUmVxdWlyZWQpfHwob3B0aW9ucy5Jc1JlcXVpcmVkKSkmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPCEtLWlucHV0LS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLWlucHV0LWNvbnRhaW5lclwiICAqbmdJZj1cIiFvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgICAgICA8Yi10YWdzLWlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wge3tvcHRpb25zLkV4dHJhQ2xhc3Nlc319XCJcclxuICAgICAgICBbZGlyXT1cInRleHREaXJcIiBbZGlzYWJsZWRdPVwib3B0aW9ucy5Jc0Rpc2FibGVkXCIgYXJpYS1kZXNjcmliZWRieT1cImVtYWlsLWVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaW52YWxpZD1cInRydWVcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YWdzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cIlRhZ3NGb3JtQ29udHJvbC5pbnZhbGlkICYmIFRhZ3NGb3JtQ29udHJvbC50b3VjaGVkXCIgcGxhY2Vob2xkZXI9XCJ7e29wdGlvbnMuUGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7b3B0aW9ucy5OYW1lfX1cIiAob25UYWdzQ2hhbmdlZCk9XCJvblRhZ3NDaGFuZ2VkKCRldmVudClcIiBbKG5nTW9kZWwpXT1cInRhZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3JlbW92ZUxhc3RPbkJhY2tzcGFjZV09XCJvcHRpb25zLlJlbW92ZUxhc3RPbkJhY2tzcGFjZVwiIChvbk5vT3B0aW9uc01hdGNoKT1cIm9uTm9PcHRpb25zTWF0Y2goJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzZWFyY2hGdW5jdGlvbkZhY3RvcnkoU2VhcmNoS2V5LnNlbGVjdGVkKVwiICNTZWFyY2hLZXlcclxuICAgICAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlT3B0aW9uc109XCJvcHRpb25zLlNjcm9sbGFibGVPcHRpb25zXCIgW3Njcm9sbGFibGVPcHRpb25zSW5WaWV3XT1cIm9wdGlvbnMuTWF4U2VhcmNoUmVzdWx0c0NvdW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIkFkZFRhZygkZXZlbnQsU2VhcmNoS2V5KVwiIFtWaWV3TW9kZV09XCJvcHRpb25zLlRhZ0lucHV0TW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4VGFnc109XCJvcHRpb25zLk1heE51bWJlclRhZ3NcIiBbbWluTGVuZ3RoQmVmb3JlT3B0aW9uc109XCJvcHRpb25zLk1pblNlYXJjaExlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Rlc2NyaXB0aW9uXT1cIm9wdGlvbnMuU2hvd0Rlc2NyaXB0aW9uXCIgW2RlZmF1bHRJbWFnZVVSTF09XCJvcHRpb25zLkRlZmF1bHRJbWdVcmxcIiBuYW1lPVwidGFnc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAob25CbHVySW5wdXQpPVwib25UYWdzSW5wdXRCbHVyKFNlYXJjaEtleSlcIj5cclxuICAgICAgICA8L2ItdGFncy1pbnB1dD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gcmVhZG9ubHkgLS0+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zLklzUmVhZG9ubHlcIj48c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZpZXdcIj57e2dldFRhZ3NWYWx1ZSgpfX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAgKm5nSWY9XCIhb3B0aW9ucy5Jc1JlYWRvbmx5XCI+XHJcbiAgICAgIDwhLS0gTGFiZWxEZXNjcmlwdGlvbi0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmJzZi1jb250cm9sLWRlc2NcIiAqbmdJZj1cIm9wdGlvbnMuTGFiZWxEZXNjcmlwdGlvbiE9bnVsbFwiPnt7b3B0aW9ucy5MYWJlbERlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgICAgPCEtLSByZXF1aXJlZFRleHQtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImJic2YtdmFsaWRhdGlvblwiICpuZ0lmPVwiKFRhZ3NGb3JtQ29udHJvbC5pbnZhbGlkICYmIFRhZ3NGb3JtQ29udHJvbC50b3VjaGVkKVwiPlxyXG4gICAgICAgIHt7Z2V0RXJyb3JWYWxpZGF0aW9uKFRhZ3NGb3JtQ29udHJvbC5lcnJvcnN8a2V5dmFsdWUpfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCIoZ3JvdXAudmFsaWQmJmdyb3VwLmRpcnR5JiZncm91cC50b3VjaGVkICl8fChncm91cC51bnRvdWNoZWQmJmdyb3VwLmludmFsaWQmJmdyb3VwLmRpcnR5KVwiPnt7cmVzZXRFcnJvcigpfX08L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=